/[svn]/qsampler/trunk/src/qsamplerChannel.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerChannel.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1510 by capela, Thu Nov 22 14:17:24 2007 UTC revision 3849 by capela, Thu Jan 7 16:18:02 2021 UTC
# Line 1  Line 1 
1  // qsamplerChannel.cpp  // qsamplerChannel.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2021, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, Christian Schoenebeck     Copyright (C) 2007, 2008 Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 31  Line 31 
31  #include <QComboBox>  #include <QComboBox>
32    
33  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
34    #pragma GCC diagnostic push
35    #pragma GCC diagnostic ignored "-Wunused-parameter"
36  #include "gig.h"  #include "gig.h"
37    #ifdef CONFIG_LIBGIG_SF2
38    #pragma GCC diagnostic ignored "-Wunused-variable"
39    #include "SF.h"
40    #endif
41    #pragma GCC diagnostic pop
42  #endif  #endif
43    
44  #define QSAMPLER_INSTRUMENT_MAX 100  namespace QSampler {
45    
46  #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))  #define QSAMPLER_INSTRUMENT_MAX 128
47    
48    #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))
49    
 using namespace QSampler;  
50    
51  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
52  // qsamplerChannel - Sampler channel structure.  // QSampler::Channel - Sampler channel structure.
53  //  //
54    
55  // Constructor.  // Constructor.
56  qsamplerChannel::qsamplerChannel ( int iChannelID )  Channel::Channel ( int iChannelID )
57  {  {
58          m_iChannelID = iChannelID;          m_iChannelID = iChannelID;
59    
# Line 68  qsamplerChannel::qsamplerChannel ( int i Line 75  qsamplerChannel::qsamplerChannel ( int i
75  }  }
76    
77  // Default destructor.  // Default destructor.
78  qsamplerChannel::~qsamplerChannel (void)  Channel::~Channel (void)
79  {  {
80  }  }
81    
82    
83  // Create a new sampler channel, if not already.  // Create a new sampler channel, if not already.
84  bool qsamplerChannel::addChannel (void)  bool Channel::addChannel (void)
85  {  {
86          MainForm* pMainForm = MainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
87          if (pMainForm == NULL)          if (pMainForm == nullptr)
88                  return false;                  return false;
89          if (pMainForm->client() == NULL)          if (pMainForm->client() == nullptr)
90                  return false;                  return false;
91    
92          // Are we a new channel?          // Are we a new channel?
# Line 99  bool qsamplerChannel::addChannel (void) Line 106  bool qsamplerChannel::addChannel (void)
106    
107    
108  // Remove sampler channel.  // Remove sampler channel.
109  bool qsamplerChannel::removeChannel (void)  bool Channel::removeChannel (void)
110  {  {
111          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
112          if (pMainForm == NULL)          if (pMainForm == nullptr)
113                  return false;                  return false;
114          if (pMainForm->client() == NULL)          if (pMainForm->client() == nullptr)
115                  return false;                  return false;
116    
117          // Are we an existing channel?          // Are we an existing channel?
# Line 125  bool qsamplerChannel::removeChannel (voi Line 132  bool qsamplerChannel::removeChannel (voi
132    
133    
134  // Channel-ID (aka Sammpler-Channel) accessors.  // Channel-ID (aka Sammpler-Channel) accessors.
135  int qsamplerChannel::channelID (void) const  int Channel::channelID (void) const
136  {  {
137          return m_iChannelID;          return m_iChannelID;
138  }  }
139    
140  void qsamplerChannel::setChannelID ( int iChannelID )  void Channel::setChannelID ( int iChannelID )
141  {  {
142          m_iChannelID = iChannelID;          m_iChannelID = iChannelID;
143  }  }
144    
145    
146  // Readable channel name.  // Readable channel name.
147  QString qsamplerChannel::channelName (void) const  QString Channel::channelName (void) const
148  {  {
149          return (m_iChannelID < 0 ? QObject::tr("New Channel") : QObject::tr("Channel %1").arg(m_iChannelID));          return (m_iChannelID < 0 ? QObject::tr("New Channel") : QObject::tr("Channel %1").arg(m_iChannelID));
150  }  }
151    
152    
153  // Engine name accessors.  // Engine name accessors.
154  const QString& qsamplerChannel::engineName (void) const  const QString& Channel::engineName (void) const
155  {  {
156          return m_sEngineName;          return m_sEngineName;
157  }  }
158    
159  bool qsamplerChannel::loadEngine ( const QString& sEngineName )  bool Channel::loadEngine ( const QString& sEngineName )
160  {  {
161          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
162          if (pMainForm == NULL)          if (pMainForm == nullptr)
163                  return false;                  return false;
164          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
165                  return false;                  return false;
166          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)
167                  return true;                  return true;
# Line 173  bool qsamplerChannel::loadEngine ( const Line 180  bool qsamplerChannel::loadEngine ( const
180    
181    
182  // Instrument filename accessor.  // Instrument filename accessor.
183  const QString& qsamplerChannel::instrumentFile (void) const  const QString& Channel::instrumentFile (void) const
184  {  {
185          return m_sInstrumentFile;          return m_sInstrumentFile;
186  }  }
187    
188  // Instrument index accessor.  // Instrument index accessor.
189  int qsamplerChannel::instrumentNr (void) const  int Channel::instrumentNr (void) const
190  {  {
191          return m_iInstrumentNr;          return m_iInstrumentNr;
192  }  }
193    
194  // Instrument name accessor.  // Instrument name accessor.
195  const QString& qsamplerChannel::instrumentName (void) const  const QString& Channel::instrumentName (void) const
196  {  {
197          return m_sInstrumentName;          return m_sInstrumentName;
198  }  }
199    
200  // Instrument status accessor.  // Instrument status accessor.
201  int qsamplerChannel::instrumentStatus (void) const  int Channel::instrumentStatus (void) const
202  {  {
203          return m_iInstrumentStatus;          return m_iInstrumentStatus;
204  }  }
205    
206  // Instrument file loader.  // Instrument file loader.
207  bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )  bool Channel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
208  {  {
209          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
210          if (pMainForm == NULL)          if (pMainForm == nullptr)
211                  return false;                  return false;
212          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
213                  return false;                  return false;
214          if (!isInstrumentFile(sInstrumentFile))          if (!QFileInfo(sInstrumentFile).exists())
215                  return false;                  return false;
216          if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)          if (m_iInstrumentStatus == 100
217                    && m_sInstrumentFile == sInstrumentFile
218                    && m_iInstrumentNr == iInstrumentNr)
219                  return true;                  return true;
220    
221          if (          if (::lscp_load_instrument_non_modal(
                 ::lscp_load_instrument_non_modal(  
222                          pMainForm->client(),                          pMainForm->client(),
223                          qsamplerUtilities::lscpEscapePath(                          qsamplerUtilities::lscpEscapePath(
224                                  sInstrumentFile).toUtf8().constData(),                                  sInstrumentFile).toUtf8().constData(),
225                          iInstrumentNr, m_iChannelID                          iInstrumentNr, m_iChannelID
226                  ) != LSCP_OK                  ) != LSCP_OK) {
         ) {  
227                  appendMessagesClient("lscp_load_instrument");                  appendMessagesClient("lscp_load_instrument");
228                  return false;                  return false;
229          }          }
# Line 229  bool qsamplerChannel::loadInstrument ( c Line 236  bool qsamplerChannel::loadInstrument ( c
236    
237    
238  // Special instrument file/name/number settler.  // Special instrument file/name/number settler.
239  bool qsamplerChannel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )  bool Channel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
240  {  {
241          m_sInstrumentFile = sInstrumentFile;          m_sInstrumentFile = sInstrumentFile;
242          m_iInstrumentNr = iInstrumentNr;          m_iInstrumentNr = iInstrumentNr;
243  #ifdef CONFIG_INSTRUMENT_NAME  #ifdef CONFIG_INSTRUMENT_NAME
244          m_sInstrumentName = QString::null;  // We'll get it, maybe later, on channel_info...          m_sInstrumentName.clear();  // We'll get it, maybe later, on channel_info...
245  #else  #else
246          m_sInstrumentName = getInstrumentName(sInstrumentFile, iInstrumentNr, true);          m_sInstrumentName = getInstrumentName(sInstrumentFile, iInstrumentNr, true);
247  #endif  #endif
# Line 245  bool qsamplerChannel::setInstrument ( co Line 252  bool qsamplerChannel::setInstrument ( co
252    
253    
254  // MIDI driver type accessors (DEPRECATED).  // MIDI driver type accessors (DEPRECATED).
255  const QString& qsamplerChannel::midiDriver (void) const  const QString& Channel::midiDriver (void) const
256  {  {
257          return m_sMidiDriver;          return m_sMidiDriver;
258  }  }
259    
260  bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )  bool Channel::setMidiDriver ( const QString& sMidiDriver )
261  {  {
262          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
263          if (pMainForm == NULL)          if (pMainForm == nullptr)
264                  return false;                  return false;
265          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
266                  return false;                  return false;
267          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)
268                  return true;                  return true;
# Line 274  bool qsamplerChannel::setMidiDriver ( co Line 281  bool qsamplerChannel::setMidiDriver ( co
281    
282    
283  // MIDI device accessors.  // MIDI device accessors.
284  int qsamplerChannel::midiDevice (void) const  int Channel::midiDevice (void) const
285  {  {
286          return m_iMidiDevice;          return m_iMidiDevice;
287  }  }
288    
289  bool qsamplerChannel::setMidiDevice ( int iMidiDevice )  bool Channel::setMidiDevice ( int iMidiDevice )
290  {  {
291          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
292          if (pMainForm == NULL)          if (pMainForm == nullptr)
293                  return false;                  return false;
294          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
295                  return false;                  return false;
296          if (m_iInstrumentStatus == 100 && m_iMidiDevice == iMidiDevice)          if (m_iInstrumentStatus == 100 && m_iMidiDevice == iMidiDevice)
297                  return true;                  return true;
# Line 302  bool qsamplerChannel::setMidiDevice ( in Line 309  bool qsamplerChannel::setMidiDevice ( in
309    
310    
311  // MIDI port number accessor.  // MIDI port number accessor.
312  int qsamplerChannel::midiPort (void) const  int Channel::midiPort (void) const
313  {  {
314          return m_iMidiPort;          return m_iMidiPort;
315  }  }
316    
317  bool qsamplerChannel::setMidiPort ( int iMidiPort )  bool Channel::setMidiPort ( int iMidiPort )
318  {  {
319          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
320          if (pMainForm == NULL)          if (pMainForm == nullptr)
321                  return false;                  return false;
322          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
323                  return false;                  return false;
324          if (m_iInstrumentStatus == 100 && m_iMidiPort == iMidiPort)          if (m_iInstrumentStatus == 100 && m_iMidiPort == iMidiPort)
325                  return true;                  return true;
# Line 330  bool qsamplerChannel::setMidiPort ( int Line 337  bool qsamplerChannel::setMidiPort ( int
337    
338    
339  // MIDI channel accessor.  // MIDI channel accessor.
340  int qsamplerChannel::midiChannel (void) const  int Channel::midiChannel (void) const
341  {  {
342          return m_iMidiChannel;          return m_iMidiChannel;
343  }  }
344    
345  bool qsamplerChannel::setMidiChannel ( int iMidiChannel )  bool Channel::setMidiChannel ( int iMidiChannel )
346  {  {
347          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
348          if (pMainForm == NULL)          if (pMainForm == nullptr)
349                  return false;                  return false;
350          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
351                  return false;                  return false;
352          if (m_iInstrumentStatus == 100 && m_iMidiChannel == iMidiChannel)          if (m_iInstrumentStatus == 100 && m_iMidiChannel == iMidiChannel)
353                  return true;                  return true;
# Line 358  bool qsamplerChannel::setMidiChannel ( i Line 365  bool qsamplerChannel::setMidiChannel ( i
365    
366    
367  // MIDI instrument map accessor.  // MIDI instrument map accessor.
368  int qsamplerChannel::midiMap (void) const  int Channel::midiMap (void) const
369  {  {
370          return m_iMidiMap;          return m_iMidiMap;
371  }  }
372    
373  bool qsamplerChannel::setMidiMap ( int iMidiMap )  bool Channel::setMidiMap ( int iMidiMap )
374  {  {
375          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
376          if (pMainForm == NULL)          if (pMainForm == nullptr)
377                  return false;                  return false;
378          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
379                  return false;                  return false;
380          if (m_iInstrumentStatus == 100 && m_iMidiMap == iMidiMap)          if (m_iInstrumentStatus == 100 && m_iMidiMap == iMidiMap)
381                  return true;                  return true;
# Line 386  bool qsamplerChannel::setMidiMap ( int i Line 393  bool qsamplerChannel::setMidiMap ( int i
393    
394    
395  // Audio device accessor.  // Audio device accessor.
396  int qsamplerChannel::audioDevice (void) const  int Channel::audioDevice (void) const
397  {  {
398          return m_iAudioDevice;          return m_iAudioDevice;
399  }  }
400    
401  bool qsamplerChannel::setAudioDevice ( int iAudioDevice )  bool Channel::setAudioDevice ( int iAudioDevice )
402  {  {
403          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
404          if (pMainForm == NULL)          if (pMainForm == nullptr)
405                  return false;                  return false;
406          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
407                  return false;                  return false;
408          if (m_iInstrumentStatus == 100 && m_iAudioDevice == iAudioDevice)          if (m_iInstrumentStatus == 100 && m_iAudioDevice == iAudioDevice)
409                  return true;                  return true;
# Line 414  bool qsamplerChannel::setAudioDevice ( i Line 421  bool qsamplerChannel::setAudioDevice ( i
421    
422    
423  // Audio driver type accessors (DEPRECATED).  // Audio driver type accessors (DEPRECATED).
424  const QString& qsamplerChannel::audioDriver (void) const  const QString& Channel::audioDriver (void) const
425  {  {
426          return m_sAudioDriver;          return m_sAudioDriver;
427  }  }
428    
429  bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )  bool Channel::setAudioDriver ( const QString& sAudioDriver )
430  {  {
431          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
432          if (pMainForm == NULL)          if (pMainForm == nullptr)
433                  return false;                  return false;
434          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
435                  return false;                  return false;
436          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)
437                  return true;                  return true;
# Line 443  bool qsamplerChannel::setAudioDriver ( c Line 450  bool qsamplerChannel::setAudioDriver ( c
450    
451    
452  // Channel volume accessors.  // Channel volume accessors.
453  float qsamplerChannel::volume (void) const  float Channel::volume (void) const
454  {  {
455          return m_fVolume;          return m_fVolume;
456  }  }
457    
458  bool qsamplerChannel::setVolume ( float fVolume )  bool Channel::setVolume ( float fVolume )
459  {  {
460          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
461          if (pMainForm == NULL)          if (pMainForm == nullptr)
462                  return false;                  return false;
463          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
464                  return false;                  return false;
465          if (m_iInstrumentStatus == 100 && m_fVolume == fVolume)          if (m_iInstrumentStatus == 100 && m_fVolume == fVolume)
466                  return true;                  return true;
# Line 471  bool qsamplerChannel::setVolume ( float Line 478  bool qsamplerChannel::setVolume ( float
478    
479    
480  // Sampler channel mute state.  // Sampler channel mute state.
481  bool qsamplerChannel::channelMute (void) const  bool Channel::channelMute (void) const
482  {  {
483          return m_bMute;          return m_bMute;
484  }  }
485    
486  bool qsamplerChannel::setChannelMute ( bool bMute )  bool Channel::setChannelMute ( bool bMute )
487  {  {
488          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
489          if (pMainForm == NULL)          if (pMainForm == nullptr)
490                  return false;                  return false;
491          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
492                  return false;                  return false;
493          if (m_iInstrumentStatus == 100 && ((m_bMute && bMute) || (!m_bMute && !bMute)))          if (m_iInstrumentStatus == 100 && ((m_bMute && bMute) || (!m_bMute && !bMute)))
494                  return true;                  return true;
# Line 501  bool qsamplerChannel::setChannelMute ( b Line 508  bool qsamplerChannel::setChannelMute ( b
508    
509    
510  // Sampler channel solo state.  // Sampler channel solo state.
511  bool qsamplerChannel::channelSolo (void) const  bool Channel::channelSolo (void) const
512  {  {
513          return m_bSolo;          return m_bSolo;
514  }  }
515    
516  bool qsamplerChannel::setChannelSolo ( bool bSolo )  bool Channel::setChannelSolo ( bool bSolo )
517  {  {
518          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
519          if (pMainForm == NULL)          if (pMainForm == nullptr)
520                  return false;                  return false;
521          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
522                  return false;                  return false;
523          if (m_iInstrumentStatus == 100 && ((m_bSolo && bSolo) || (!m_bSolo && !bSolo)))          if (m_iInstrumentStatus == 100 && ((m_bSolo && bSolo) || (!m_bSolo && !bSolo)))
524                  return true;                  return true;
# Line 531  bool qsamplerChannel::setChannelSolo ( b Line 538  bool qsamplerChannel::setChannelSolo ( b
538    
539    
540  // Audio routing accessors.  // Audio routing accessors.
541  int qsamplerChannel::audioChannel ( int iAudioOut ) const  int Channel::audioChannel ( int iAudioOut ) const
542  {  {
543          return m_audioRouting[iAudioOut];          return m_audioRouting[iAudioOut];
544  }  }
545    
546  bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )  bool Channel::setAudioChannel ( int iAudioOut, int iAudioIn )
547  {  {
548          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
549          if (pMainForm == NULL)          if (pMainForm == nullptr)
550                  return false;                  return false;
551          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
552                  return false;                  return false;
553          if (m_iInstrumentStatus == 100 &&          if (m_iInstrumentStatus == 100 &&
554                          m_audioRouting[iAudioOut] == iAudioIn)                          m_audioRouting[iAudioOut] == iAudioIn)
# Line 561  bool qsamplerChannel::setAudioChannel ( Line 568  bool qsamplerChannel::setAudioChannel (
568  }  }
569    
570  // The audio routing map itself.  // The audio routing map itself.
571  const qsamplerChannelRoutingMap& qsamplerChannel::audioRouting (void) const  const ChannelRoutingMap& Channel::audioRouting (void) const
572  {  {
573          return m_audioRouting;          return m_audioRouting;
574  }  }
575    
576    
577  // Istrument name remapper.  // Istrument name remapper.
578  void qsamplerChannel::updateInstrumentName (void)  void Channel::updateInstrumentName (void)
579  {  {
580  #ifndef CONFIG_INSTRUMENT_NAME  #ifndef CONFIG_INSTRUMENT_NAME
581          m_sInstrumentName = getInstrumentName(m_sInstrumentFile,          m_sInstrumentName = getInstrumentName(m_sInstrumentFile,
# Line 578  void qsamplerChannel::updateInstrumentNa Line 585  void qsamplerChannel::updateInstrumentNa
585    
586    
587  // Update whole channel info state.  // Update whole channel info state.
588  bool qsamplerChannel::updateChannelInfo (void)  bool Channel::updateChannelInfo (void)
589  {  {
590          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
591          if (pMainForm == NULL)          if (pMainForm == nullptr)
592                  return false;                  return false;
593          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
594                  return false;                  return false;
595    
596          // Read channel information.          // Read channel information.
597          lscp_channel_info_t *pChannelInfo = ::lscp_get_channel_info(pMainForm->client(), m_iChannelID);          lscp_channel_info_t *pChannelInfo = ::lscp_get_channel_info(pMainForm->client(), m_iChannelID);
598          if (pChannelInfo == NULL) {          if (pChannelInfo == nullptr) {
599                  appendMessagesClient("lscp_get_channel_info");                  appendMessagesClient("lscp_get_channel_info");
600                  appendMessagesError(QObject::tr("Could not get channel information.\n\nSorry."));                  appendMessagesError(QObject::tr("Could not get channel information.\n\nSorry."));
601                  return false;                  return false;
# Line 629  bool qsamplerChannel::updateChannelInfo Line 636  bool qsamplerChannel::updateChannelInfo
636  #endif  #endif
637          // Some sanity checks.          // Some sanity checks.
638          if (m_sEngineName == "NONE" || m_sEngineName.isEmpty())          if (m_sEngineName == "NONE" || m_sEngineName.isEmpty())
639                  m_sEngineName = QString::null;                  m_sEngineName.clear();
640          if (m_sInstrumentFile == "NONE" || m_sInstrumentFile.isEmpty()) {          if (m_sInstrumentFile == "NONE" || m_sInstrumentFile.isEmpty()) {
641                  m_sInstrumentFile = QString::null;                  m_sInstrumentFile.clear();
642                  m_sInstrumentName = QString::null;                  m_sInstrumentName.clear();
643          }          }
644    
645          // Time for device info grabbing...          // Time for device info grabbing...
# Line 640  bool qsamplerChannel::updateChannelInfo Line 647  bool qsamplerChannel::updateChannelInfo
647          const QString sNone = QObject::tr("(none)");          const QString sNone = QObject::tr("(none)");
648          // Audio device driver type.          // Audio device driver type.
649          pDeviceInfo = ::lscp_get_audio_device_info(pMainForm->client(), m_iAudioDevice);          pDeviceInfo = ::lscp_get_audio_device_info(pMainForm->client(), m_iAudioDevice);
650          if (pDeviceInfo == NULL) {          if (pDeviceInfo == nullptr) {
651                  appendMessagesClient("lscp_get_audio_device_info");                  appendMessagesClient("lscp_get_audio_device_info");
652                  m_sAudioDriver = sNone;                  m_sAudioDriver = sNone;
653          } else {          } else {
# Line 648  bool qsamplerChannel::updateChannelInfo Line 655  bool qsamplerChannel::updateChannelInfo
655          }          }
656          // MIDI device driver type.          // MIDI device driver type.
657          pDeviceInfo = ::lscp_get_midi_device_info(pMainForm->client(), m_iMidiDevice);          pDeviceInfo = ::lscp_get_midi_device_info(pMainForm->client(), m_iMidiDevice);
658          if (pDeviceInfo == NULL) {          if (pDeviceInfo == nullptr) {
659                  appendMessagesClient("lscp_get_midi_device_info");                  appendMessagesClient("lscp_get_midi_device_info");
660                  m_sMidiDriver = sNone;                  m_sMidiDriver = sNone;
661          } else {          } else {
# Line 672  bool qsamplerChannel::updateChannelInfo Line 679  bool qsamplerChannel::updateChannelInfo
679    
680    
681  // Reset channel method.  // Reset channel method.
682  bool qsamplerChannel::channelReset (void)  bool Channel::channelReset (void)
683  {  {
684          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
685          if (pMainForm == NULL)          if (pMainForm == nullptr)
686                  return false;                  return false;
687          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
688                  return false;                  return false;
689    
690          if (::lscp_reset_channel(pMainForm->client(), m_iChannelID) != LSCP_OK) {          if (::lscp_reset_channel(pMainForm->client(), m_iChannelID) != LSCP_OK) {
# Line 692  bool qsamplerChannel::channelReset (void Line 699  bool qsamplerChannel::channelReset (void
699    
700    
701  // Spawn instrument editor method.  // Spawn instrument editor method.
702  bool qsamplerChannel::editChannel (void)  bool Channel::editChannel (void)
703  {  {
704  #ifdef CONFIG_EDIT_INSTRUMENT  #ifdef CONFIG_EDIT_INSTRUMENT
705    
706          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
707          if (pMainForm == NULL)          if (pMainForm == nullptr)
708                  return false;                  return false;
709          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == nullptr || m_iChannelID < 0)
710                  return false;                  return false;
711    
712          if (::lscp_edit_channel_instrument(pMainForm->client(), m_iChannelID)          if (::lscp_edit_channel_instrument(pMainForm->client(), m_iChannelID)
# Line 707  bool qsamplerChannel::editChannel (void) Line 714  bool qsamplerChannel::editChannel (void)
714                  appendMessagesClient("lscp_edit_channel_instrument");                  appendMessagesClient("lscp_edit_channel_instrument");
715                  appendMessagesError(QObject::tr(                  appendMessagesError(QObject::tr(
716                          "Could not launch an appropriate instrument editor "                          "Could not launch an appropriate instrument editor "
717                          "for the given instrument!\n"                          "for the given instrument!\n\n"
718                          "Make sure you have an appropriate "                          "Make sure you have an appropriate "
719                          "instrument editor like 'gigedit' installed\n"                          "instrument editor like 'gigedit' installed "
720                          "and that it placed its mandatory DLL file "                          "and that it placed its mandatory DLL file "
721                          "into the sampler's plugin directory.")                          "into the sampler's plugin directory.")
722                  );                  );
# Line 724  bool qsamplerChannel::editChannel (void) Line 731  bool qsamplerChannel::editChannel (void)
731    
732          appendMessagesError(QObject::tr(          appendMessagesError(QObject::tr(
733                  "Sorry, QSampler was compiled for a version of liblscp "                  "Sorry, QSampler was compiled for a version of liblscp "
734                  "which lacks this feature.\n"                  "which lacks this feature.\n\n"
735                  "You may want to update liblscp and recompile QSampler afterwards.")                  "You may want to update liblscp and recompile QSampler afterwards.")
736          );          );
737    
# Line 735  bool qsamplerChannel::editChannel (void) Line 742  bool qsamplerChannel::editChannel (void)
742    
743    
744  // Channel setup dialog form.  // Channel setup dialog form.
745  bool qsamplerChannel::channelSetup ( QWidget *pParent )  bool Channel::channelSetup ( QWidget *pParent )
746  {  {
747          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
748          if (pMainForm == NULL)          if (pMainForm == nullptr)
749                  return false;                  return false;
750    
751          bool bResult = false;          bool bResult = false;
# Line 757  bool qsamplerChannel::channelSetup ( QWi Line 764  bool qsamplerChannel::channelSetup ( QWi
764    
765    
766  // Redirected messages output methods.  // Redirected messages output methods.
767  void qsamplerChannel::appendMessages( const QString& s ) const  void Channel::appendMessages ( const QString& sText ) const
768  {  {
769          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
770          if (pMainForm)          if (pMainForm)
771                  pMainForm->appendMessages(channelName() + ' ' + s);                  pMainForm->appendMessages(channelName() + ' ' + sText);
772  }  }
773    
774  void qsamplerChannel::appendMessagesColor( const QString& s,  void Channel::appendMessagesColor (
775          const QString& c ) const          const QString& sText, const QColor& rgb ) const
776  {  {
777          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
778          if (pMainForm)          if (pMainForm)
779                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);                  pMainForm->appendMessagesColor(channelName() + ' ' + sText, rgb);
780  }  }
781    
782  void qsamplerChannel::appendMessagesText( const QString& s ) const  void Channel::appendMessagesText ( const QString& sText ) const
783  {  {
784          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
785          if (pMainForm)          if (pMainForm)
786                  pMainForm->appendMessagesText(channelName() + ' ' + s);                  pMainForm->appendMessagesText(channelName() + ' ' + sText);
787  }  }
788    
789  void qsamplerChannel::appendMessagesError( const QString& s ) const  void Channel::appendMessagesError ( const QString& sText ) const
790  {  {
791          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
792          if (pMainForm)          if (pMainForm)
793                  pMainForm->appendMessagesError(channelName() + "\n\n" + s);                  pMainForm->appendMessagesError(channelName() + "\n\n" + sText);
794  }  }
795    
796  void qsamplerChannel::appendMessagesClient( const QString& s ) const  void Channel::appendMessagesClient ( const QString& sText ) const
797  {  {
798          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
799          if (pMainForm)          if (pMainForm)
800                  pMainForm->appendMessagesClient(channelName() + ' ' + s);                  pMainForm->appendMessagesClient(channelName() + ' ' + sText);
801  }  }
802    
803    
804  // Context menu event handler.  // Context menu event handler.
805  void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )  void Channel::contextMenuEvent ( QContextMenuEvent *pEvent )
806  {  {
807          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
808          if (pMainForm)          if (pMainForm)
# Line 803  void qsamplerChannel::contextMenuEvent( Line 810  void qsamplerChannel::contextMenuEvent(
810  }  }
811    
812    
813  // FIXME: Check whether a given file is an instrument file.  // FIXME: Check whether a given file is an instrument file (DLS only).
814  bool qsamplerChannel::isInstrumentFile ( const QString& sInstrumentFile )  bool Channel::isDlsInstrumentFile ( const QString& sInstrumentFile )
815  {  {
816          bool bResult = false;          bool bResult = false;
817    
# Line 822  bool qsamplerChannel::isInstrumentFile ( Line 829  bool qsamplerChannel::isInstrumentFile (
829  }  }
830    
831    
832    // FIXME: Check whether a given file is an instrument file (SF2 only).
833    bool Channel::isSf2InstrumentFile ( const QString& sInstrumentFile )
834    {
835            bool bResult = false;
836    
837            QFile file(sInstrumentFile);
838            if (file.open(QIODevice::ReadOnly)) {
839                    char achHeader[12];
840                    if (file.read(achHeader, 12) > 0) {
841                            bResult = (::memcmp(&achHeader[0], "RIFF", 4) == 0
842                                            && ::memcmp(&achHeader[8], "sfbk", 4) == 0);
843                    }
844                    file.close();
845            }
846    
847            return bResult;
848    }
849    
850    
851  // Retrieve the instrument list of a instrument file (.gig).  // Retrieve the instrument list of a instrument file (.gig).
852  QStringList qsamplerChannel::getInstrumentList( const QString& sInstrumentFile,  QStringList Channel::getInstrumentList (
853          bool bInstrumentNames )          const QString& sInstrumentFile, bool bInstrumentNames )
854  {  {
         QString sInstrumentName = QFileInfo(sInstrumentFile).fileName();  
855          QStringList instlist;          QStringList instlist;
856    
857          if (isInstrumentFile(sInstrumentFile)) {          const QFileInfo fi(sInstrumentFile);
858            if (!fi.exists()) {
859                    instlist.append(noInstrumentName());
860                    return instlist;
861            }
862    
863  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
864                  if (bInstrumentNames) {          if (bInstrumentNames) {
865                    if (isDlsInstrumentFile(sInstrumentFile)) {
866                          RIFF::File *pRiff                          RIFF::File *pRiff
867                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());
868                          gig::File  *pGig  = new gig::File(pRiff);                          gig::File *pGig = new gig::File(pRiff);
869                    #ifdef CONFIG_LIBGIG_SETAUTOLOAD
870                            // prevent sleepy response time on large .gig files
871                            pGig->SetAutoLoad(false);
872                    #endif
873                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
874                          while (pInstrument) {                          while (pInstrument) {
875                                  instlist.append((pInstrument->pInfo)->Name.c_str());                                  instlist.append((pInstrument->pInfo)->Name.c_str());
# Line 843  QStringList qsamplerChannel::getInstrume Line 878  QStringList qsamplerChannel::getInstrume
878                          delete pGig;                          delete pGig;
879                          delete pRiff;                          delete pRiff;
880                  }                  }
881            #ifdef CONFIG_LIBGIG_SF2
882                  else                  else
883                    if (isSf2InstrumentFile(sInstrumentFile)) {
884                            RIFF::File *pRiff
885                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
886                            sf2::File *pSf2 = new sf2::File(pRiff);
887                            const int iPresetCount = pSf2->GetPresetCount();
888                            for (int iIndex = 0; iIndex < iPresetCount; ++iIndex) {
889                                    sf2::Preset *pPreset = pSf2->GetPreset(iIndex);
890                                    if (pPreset) {
891                                            instlist.append(pPreset->Name.c_str());
892                                    } else {
893                                            instlist.append(fi.fileName()
894                                                    + " [" + QString::number(iIndex) + "]");
895                                    }
896                            }
897                            delete pSf2;
898                            delete pRiff;
899                    }
900            #endif
901            }
902  #endif  #endif
903                  for (int iInstrumentNr = 0; iInstrumentNr < QSAMPLER_INSTRUMENT_MAX; iInstrumentNr++)  
904                          instlist.append(sInstrumentName + " [" + QString::number(iInstrumentNr) + "]");          if (instlist.isEmpty()) {
905                    for (int iIndex = 0; iIndex < QSAMPLER_INSTRUMENT_MAX; ++iIndex) {
906                            instlist.append(fi.fileName()
907                                    + " [" + QString::number(iIndex) + "]");
908                    }
909          }          }
         else instlist.append(noInstrumentName());  
910    
911          return instlist;          return instlist;
912  }  }
913    
914    
915  // Retrieve the spacific instrument name of a instrument file (.gig), given its index.  // Retrieve the spacific instrument name of a instrument file (.gig), given its index.
916  QString qsamplerChannel::getInstrumentName( const QString& sInstrumentFile,  QString Channel::getInstrumentName (
917          int iInstrumentNr, bool bInstrumentNames )          const QString& sInstrumentFile, int iInstrumentNr, bool bInstrumentNames )
918  {  {
919            const QFileInfo fi(sInstrumentFile);
920            if (!fi.exists())
921                    return noInstrumentName();
922    
923          QString sInstrumentName;          QString sInstrumentName;
924    
         if (isInstrumentFile(sInstrumentFile)) {  
                 sInstrumentName = QFileInfo(sInstrumentFile).fileName();  
925  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
926                  if (bInstrumentNames) {          if (bInstrumentNames) {
927                    if (isDlsInstrumentFile(sInstrumentFile)) {
928                          RIFF::File *pRiff                          RIFF::File *pRiff
929                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());
930                          gig::File *pGig = new gig::File(pRiff);                          gig::File *pGig = new gig::File(pRiff);
931                    #ifdef CONFIG_LIBGIG_SETAUTOLOAD
932                            // prevent sleepy response time on large .gig files
933                            pGig->SetAutoLoad(false);
934                    #endif
935                          int iIndex = 0;                          int iIndex = 0;
936                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
937                          while (pInstrument) {                          while (pInstrument) {
# Line 880  QString qsamplerChannel::getInstrumentNa Line 945  QString qsamplerChannel::getInstrumentNa
945                          delete pGig;                          delete pGig;
946                          delete pRiff;                          delete pRiff;
947                  }                  }
948            #ifdef CONFIG_LIBGIG_SF2
949                  else                  else
950                    if (isSf2InstrumentFile(sInstrumentFile)) {
951                            RIFF::File *pRiff
952                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
953                            sf2::File *pSf2 = new sf2::File(pRiff);
954                            sf2::Preset *pPreset = pSf2->GetPreset(iInstrumentNr);
955                            if (pPreset)
956                                    sInstrumentName = pPreset->Name.c_str();
957                            delete pSf2;
958                            delete pRiff;
959                    }
960            #endif
961            }
962  #endif  #endif
963    
964            if (sInstrumentName.isEmpty()) {
965                    sInstrumentName  = fi.fileName();
966                  sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";                  sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";
967          }          }
         else sInstrumentName = noInstrumentName();  
968    
969          return sInstrumentName;          return sInstrumentName;
970  }  }
971    
972    
973  // Common invalid name-helpers.  // Common invalid name-helpers.
974  QString qsamplerChannel::noEngineName (void)  QString Channel::noEngineName (void)
975  {  {
976          return QObject::tr("(No engine)");          return QObject::tr("(No engine)");
977  }  }
978    
979  QString qsamplerChannel::noInstrumentName (void)  QString Channel::noInstrumentName (void)
980  {  {
981          return QObject::tr("(No instrument)");          return QObject::tr("(No instrument)");
982  }  }
983    
984  QString qsamplerChannel::loadingInstrument (void) {  QString Channel::loadingInstrument (void) {
985          return QObject::tr("(Loading instrument...)");          return QObject::tr("(Loading instrument...)");
986  }  }
987    
988    
989  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
990  // ChannelRoutingModel - data model for audio routing (used for QTableView)  // QSampler::ChannelRoutingModel - data model for audio routing
991  //  //                                 (used for QTableView)
992    
993  ChannelRoutingModel::ChannelRoutingModel ( QObject *pParent )  ChannelRoutingModel::ChannelRoutingModel ( QObject *pParent )
994          : QAbstractTableModel(pParent), m_pDevice(NULL)          : QAbstractTableModel(pParent), m_pDevice(nullptr)
995  {  {
996  }  }
997    
998    
999  int ChannelRoutingModel::rowCount ( const QModelIndex& /*parent*/) const  int ChannelRoutingModel::rowCount ( const QModelIndex& /*parent*/) const
1000  {  {
1001          return m_routing.size();          return (m_pDevice) ? m_routing.size() : 0;
1002  }  }
1003    
1004    
# Line 959  QVariant ChannelRoutingModel::data ( con Line 1039  QVariant ChannelRoutingModel::data ( con
1039          ChannelRoutingItem item;          ChannelRoutingItem item;
1040    
1041          // The common device port item list.          // The common device port item list.
1042          qsamplerDevicePortList& ports = m_pDevice->ports();          DevicePortList& ports = m_pDevice->ports();
1043          QListIterator<qsamplerDevicePort *> iter(ports);          QListIterator<DevicePort *> iter(ports);
1044          while (iter.hasNext()) {          while (iter.hasNext()) {
1045                  qsamplerDevicePort *pPort = iter.next();                  DevicePort *pPort = iter.next();
1046                  item.options.append(                  item.options.append(
1047                          m_pDevice->deviceTypeName()                          m_pDevice->deviceTypeName()
1048                          + ' ' + m_pDevice->driverName()                          + ' ' + m_pDevice->driverName()
# Line 986  QVariant ChannelRoutingModel::headerData Line 1066  QVariant ChannelRoutingModel::headerData
1066                  case Qt::Horizontal:                  case Qt::Horizontal:
1067                          return UNICODE_RIGHT_ARROW + QObject::tr(" Device Channel");                          return UNICODE_RIGHT_ARROW + QObject::tr(" Device Channel");
1068                  case Qt::Vertical:                  case Qt::Vertical:
1069                          return QObject::tr("Sampler Channel ") +                          return QObject::tr("Audio Channel ") +
1070                                  QString::number(section) + " " + UNICODE_RIGHT_ARROW;                                  QString::number(section) + " " + UNICODE_RIGHT_ARROW;
1071                  default:                  default:
1072                          return QVariant();                          return QVariant();
# Line 994  QVariant ChannelRoutingModel::headerData Line 1074  QVariant ChannelRoutingModel::headerData
1074  }  }
1075    
1076    
1077  void ChannelRoutingModel::refresh ( qsamplerDevice *pDevice,  void ChannelRoutingModel::refresh ( Device *pDevice,
1078          const qsamplerChannelRoutingMap& routing )          const ChannelRoutingMap& routing )
1079  {  {
1080          m_pDevice = pDevice;          m_pDevice = pDevice;
1081          m_routing = routing;          m_routing = routing;
1082          // inform the outer world (QTableView) that our data changed          // inform the outer world (QTableView) that our data changed
1083    #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
1084          QAbstractTableModel::reset();          QAbstractTableModel::reset();
1085    #else
1086            QAbstractTableModel::beginResetModel();
1087            QAbstractTableModel::endResetModel();
1088    #endif
1089  }  }
1090    
1091    
1092  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1093  // ChannelRoutingDelegate - table cell renderer for audio routing  // QSampler::ChannelRoutingDelegate - table cell renderer for audio routing
1094  //  //
1095    
1096  ChannelRoutingDelegate::ChannelRoutingDelegate ( QObject *pParent )  ChannelRoutingDelegate::ChannelRoutingDelegate ( QObject *pParent )
# Line 1018  QWidget* ChannelRoutingDelegate::createE Line 1103  QWidget* ChannelRoutingDelegate::createE
1103          const QStyleOptionViewItem & option, const QModelIndex& index ) const          const QStyleOptionViewItem & option, const QModelIndex& index ) const
1104  {  {
1105          if (!index.isValid())          if (!index.isValid())
1106                  return NULL;                  return nullptr;
1107    
1108          if (index.column() != 0)          if (index.column() != 0)
1109                  return NULL;                  return nullptr;
1110    
1111          ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();          ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();
1112    
# Line 1029  QWidget* ChannelRoutingDelegate::createE Line 1114  QWidget* ChannelRoutingDelegate::createE
1114          pComboBox->addItems(item.options);          pComboBox->addItems(item.options);
1115          pComboBox->setCurrentIndex(item.selection);          pComboBox->setCurrentIndex(item.selection);
1116          pComboBox->setEnabled(true);          pComboBox->setEnabled(true);
1117            pComboBox->setEditable(true);
1118          pComboBox->setGeometry(option.rect);          pComboBox->setGeometry(option.rect);
1119          return pComboBox;          return pComboBox;
1120  }  }
# Line 1058  void ChannelRoutingDelegate::updateEdito Line 1144  void ChannelRoutingDelegate::updateEdito
1144          pEditor->setGeometry(option.rect);          pEditor->setGeometry(option.rect);
1145  }  }
1146    
1147    } // namespace QSampler
1148    
1149    
1150  // end of qsamplerChannel.cpp  // end of qsamplerChannel.cpp

Legend:
Removed from v.1510  
changed lines
  Added in v.3849

  ViewVC Help
Powered by ViewVC