/[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 1463 by capela, Thu Nov 1 13:01:27 2007 UTC revision 2646 by capela, Wed Jun 18 08:39:54 2014 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-2014, rncbc aka Rui Nuno Capela. All rights reserved.
5       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 19  Line 20 
20    
21  *****************************************************************************/  *****************************************************************************/
22    
 #include "qsamplerUtilities.h"  
23  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
24  #include "qsamplerChannel.h"  #include "qsamplerChannel.h"
25    #include "qsamplerUtilities.h"
26    
27  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
28  #include "qsamplerChannelForm.h"  #include "qsamplerChannelForm.h"
29    
30  #include <qfileinfo.h>  #include <QFileInfo>
31  #include <qcombobox.h>  #include <QComboBox>
32    
33  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
34  #include "gig.h"  #include "gig.h"
35    #ifdef CONFIG_LIBGIG_SF_H
36    #include "SF.h"
37    #endif
38  #endif  #endif
39    
40  #define QSAMPLER_INSTRUMENT_MAX 100  namespace QSampler {
41    
42    #define QSAMPLER_INSTRUMENT_MAX 128
43    
44    #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))
45    
 using namespace QSampler;  
46    
47  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
48  // qsamplerChannel - Sampler channel structure.  // QSampler::Channel - Sampler channel structure.
49  //  //
50    
51  // Constructor.  // Constructor.
52  qsamplerChannel::qsamplerChannel ( int iChannelID )  Channel::Channel ( int iChannelID )
53  {  {
54          m_iChannelID = iChannelID;          m_iChannelID = iChannelID;
55    
# Line 58  qsamplerChannel::qsamplerChannel ( int i Line 65  qsamplerChannel::qsamplerChannel ( int i
65          m_iMidiMap          = -1;          m_iMidiMap          = -1;
66          m_sAudioDriver      = "ALSA";          m_sAudioDriver      = "ALSA";
67          m_iAudioDevice      = -1;          m_iAudioDevice      = -1;
68          m_fVolume           = 0.0;          m_fVolume           = 0.0f;
69          m_bMute             = false;          m_bMute             = false;
70          m_bSolo             = false;          m_bSolo             = false;
71  }  }
72    
73  // Default destructor.  // Default destructor.
74  qsamplerChannel::~qsamplerChannel (void)  Channel::~Channel (void)
75  {  {
76  }  }
77    
78    
79  // Create a new sampler channel, if not already.  // Create a new sampler channel, if not already.
80  bool qsamplerChannel::addChannel (void)  bool Channel::addChannel (void)
81  {  {
82          MainForm* pMainForm = MainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
83          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 95  bool qsamplerChannel::addChannel (void) Line 102  bool qsamplerChannel::addChannel (void)
102    
103    
104  // Remove sampler channel.  // Remove sampler channel.
105  bool qsamplerChannel::removeChannel (void)  bool Channel::removeChannel (void)
106  {  {
107          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
108          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 121  bool qsamplerChannel::removeChannel (voi Line 128  bool qsamplerChannel::removeChannel (voi
128    
129    
130  // Channel-ID (aka Sammpler-Channel) accessors.  // Channel-ID (aka Sammpler-Channel) accessors.
131  int qsamplerChannel::channelID (void) const  int Channel::channelID (void) const
132  {  {
133          return m_iChannelID;          return m_iChannelID;
134  }  }
135    
136  void qsamplerChannel::setChannelID ( int iChannelID )  void Channel::setChannelID ( int iChannelID )
137  {  {
138          m_iChannelID = iChannelID;          m_iChannelID = iChannelID;
139  }  }
140    
141    
142  // Readable channel name.  // Readable channel name.
143  QString qsamplerChannel::channelName (void) const  QString Channel::channelName (void) const
144  {  {
145          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));
146  }  }
147    
148    
149  // Engine name accessors.  // Engine name accessors.
150  const QString& qsamplerChannel::engineName (void) const  const QString& Channel::engineName (void) const
151  {  {
152          return m_sEngineName;          return m_sEngineName;
153  }  }
154    
155  bool qsamplerChannel::loadEngine ( const QString& sEngineName )  bool Channel::loadEngine ( const QString& sEngineName )
156  {  {
157          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
158          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 155  bool qsamplerChannel::loadEngine ( const Line 162  bool qsamplerChannel::loadEngine ( const
162          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)
163                  return true;                  return true;
164    
165          if (::lscp_load_engine(pMainForm->client(), sEngineName.latin1(), m_iChannelID) != LSCP_OK) {          if (::lscp_load_engine(pMainForm->client(),
166                            sEngineName.toUtf8().constData(), m_iChannelID) != LSCP_OK) {
167                  appendMessagesClient("lscp_load_engine");                  appendMessagesClient("lscp_load_engine");
168                  return false;                  return false;
169          }          }
# Line 168  bool qsamplerChannel::loadEngine ( const Line 176  bool qsamplerChannel::loadEngine ( const
176    
177    
178  // Instrument filename accessor.  // Instrument filename accessor.
179  const QString& qsamplerChannel::instrumentFile (void) const  const QString& Channel::instrumentFile (void) const
180  {  {
181          return m_sInstrumentFile;          return m_sInstrumentFile;
182  }  }
183    
184  // Instrument index accessor.  // Instrument index accessor.
185  int qsamplerChannel::instrumentNr (void) const  int Channel::instrumentNr (void) const
186  {  {
187          return m_iInstrumentNr;          return m_iInstrumentNr;
188  }  }
189    
190  // Instrument name accessor.  // Instrument name accessor.
191  const QString& qsamplerChannel::instrumentName (void) const  const QString& Channel::instrumentName (void) const
192  {  {
193          return m_sInstrumentName;          return m_sInstrumentName;
194  }  }
195    
196  // Instrument status accessor.  // Instrument status accessor.
197  int qsamplerChannel::instrumentStatus (void) const  int Channel::instrumentStatus (void) const
198  {  {
199          return m_iInstrumentStatus;          return m_iInstrumentStatus;
200  }  }
201    
202  // Instrument file loader.  // Instrument file loader.
203  bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )  bool Channel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
204  {  {
205          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
206          if (pMainForm == NULL)          if (pMainForm == NULL)
207                  return false;                  return false;
208          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
209                  return false;                  return false;
210          if (!isInstrumentFile(sInstrumentFile))          if (!QFileInfo(sInstrumentFile).exists())
211                  return false;                  return false;
212          if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)          if (m_iInstrumentStatus == 100
213                    && m_sInstrumentFile == sInstrumentFile
214                    && m_iInstrumentNr == iInstrumentNr)
215                  return true;                  return true;
216    
217          if (          if (::lscp_load_instrument_non_modal(
                 ::lscp_load_instrument_non_modal(  
218                          pMainForm->client(),                          pMainForm->client(),
219                          qsamplerUtilities::lscpEscapePath(sInstrumentFile).latin1(),                          qsamplerUtilities::lscpEscapePath(
220                                    sInstrumentFile).toUtf8().constData(),
221                          iInstrumentNr, m_iChannelID                          iInstrumentNr, m_iChannelID
222                  ) != LSCP_OK                  ) != LSCP_OK) {
         ) {  
223                  appendMessagesClient("lscp_load_instrument");                  appendMessagesClient("lscp_load_instrument");
224                  return false;                  return false;
225          }          }
# Line 223  bool qsamplerChannel::loadInstrument ( c Line 232  bool qsamplerChannel::loadInstrument ( c
232    
233    
234  // Special instrument file/name/number settler.  // Special instrument file/name/number settler.
235  bool qsamplerChannel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )  bool Channel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
236  {  {
237          m_sInstrumentFile = sInstrumentFile;          m_sInstrumentFile = sInstrumentFile;
238          m_iInstrumentNr = iInstrumentNr;          m_iInstrumentNr = iInstrumentNr;
# Line 239  bool qsamplerChannel::setInstrument ( co Line 248  bool qsamplerChannel::setInstrument ( co
248    
249    
250  // MIDI driver type accessors (DEPRECATED).  // MIDI driver type accessors (DEPRECATED).
251  const QString& qsamplerChannel::midiDriver (void) const  const QString& Channel::midiDriver (void) const
252  {  {
253          return m_sMidiDriver;          return m_sMidiDriver;
254  }  }
255    
256  bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )  bool Channel::setMidiDriver ( const QString& sMidiDriver )
257  {  {
258          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
259          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 254  bool qsamplerChannel::setMidiDriver ( co Line 263  bool qsamplerChannel::setMidiDriver ( co
263          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)
264                  return true;                  return true;
265    
266          if (::lscp_set_channel_midi_type(pMainForm->client(), m_iChannelID, sMidiDriver.latin1()) != LSCP_OK) {          if (::lscp_set_channel_midi_type(pMainForm->client(),
267                            m_iChannelID, sMidiDriver.toUtf8().constData()) != LSCP_OK) {
268                  appendMessagesClient("lscp_set_channel_midi_type");                  appendMessagesClient("lscp_set_channel_midi_type");
269                  return false;                  return false;
270          }          }
# Line 267  bool qsamplerChannel::setMidiDriver ( co Line 277  bool qsamplerChannel::setMidiDriver ( co
277    
278    
279  // MIDI device accessors.  // MIDI device accessors.
280  int qsamplerChannel::midiDevice (void) const  int Channel::midiDevice (void) const
281  {  {
282          return m_iMidiDevice;          return m_iMidiDevice;
283  }  }
284    
285  bool qsamplerChannel::setMidiDevice ( int iMidiDevice )  bool Channel::setMidiDevice ( int iMidiDevice )
286  {  {
287          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
288          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 295  bool qsamplerChannel::setMidiDevice ( in Line 305  bool qsamplerChannel::setMidiDevice ( in
305    
306    
307  // MIDI port number accessor.  // MIDI port number accessor.
308  int qsamplerChannel::midiPort (void) const  int Channel::midiPort (void) const
309  {  {
310          return m_iMidiPort;          return m_iMidiPort;
311  }  }
312    
313  bool qsamplerChannel::setMidiPort ( int iMidiPort )  bool Channel::setMidiPort ( int iMidiPort )
314  {  {
315          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
316          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 323  bool qsamplerChannel::setMidiPort ( int Line 333  bool qsamplerChannel::setMidiPort ( int
333    
334    
335  // MIDI channel accessor.  // MIDI channel accessor.
336  int qsamplerChannel::midiChannel (void) const  int Channel::midiChannel (void) const
337  {  {
338          return m_iMidiChannel;          return m_iMidiChannel;
339  }  }
340    
341  bool qsamplerChannel::setMidiChannel ( int iMidiChannel )  bool Channel::setMidiChannel ( int iMidiChannel )
342  {  {
343          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
344          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 351  bool qsamplerChannel::setMidiChannel ( i Line 361  bool qsamplerChannel::setMidiChannel ( i
361    
362    
363  // MIDI instrument map accessor.  // MIDI instrument map accessor.
364  int qsamplerChannel::midiMap (void) const  int Channel::midiMap (void) const
365  {  {
366          return m_iMidiMap;          return m_iMidiMap;
367  }  }
368    
369  bool qsamplerChannel::setMidiMap ( int iMidiMap )  bool Channel::setMidiMap ( int iMidiMap )
370  {  {
371          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
372          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 379  bool qsamplerChannel::setMidiMap ( int i Line 389  bool qsamplerChannel::setMidiMap ( int i
389    
390    
391  // Audio device accessor.  // Audio device accessor.
392  int qsamplerChannel::audioDevice (void) const  int Channel::audioDevice (void) const
393  {  {
394          return m_iAudioDevice;          return m_iAudioDevice;
395  }  }
396    
397  bool qsamplerChannel::setAudioDevice ( int iAudioDevice )  bool Channel::setAudioDevice ( int iAudioDevice )
398  {  {
399          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
400          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 407  bool qsamplerChannel::setAudioDevice ( i Line 417  bool qsamplerChannel::setAudioDevice ( i
417    
418    
419  // Audio driver type accessors (DEPRECATED).  // Audio driver type accessors (DEPRECATED).
420  const QString& qsamplerChannel::audioDriver (void) const  const QString& Channel::audioDriver (void) const
421  {  {
422          return m_sAudioDriver;          return m_sAudioDriver;
423  }  }
424    
425  bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )  bool Channel::setAudioDriver ( const QString& sAudioDriver )
426  {  {
427          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
428          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 422  bool qsamplerChannel::setAudioDriver ( c Line 432  bool qsamplerChannel::setAudioDriver ( c
432          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)
433                  return true;                  return true;
434    
435          if (::lscp_set_channel_audio_type(pMainForm->client(), m_iChannelID, sAudioDriver.latin1()) != LSCP_OK) {          if (::lscp_set_channel_audio_type(pMainForm->client(),
436                            m_iChannelID, sAudioDriver.toUtf8().constData()) != LSCP_OK) {
437                  appendMessagesClient("lscp_set_channel_audio_type");                  appendMessagesClient("lscp_set_channel_audio_type");
438                  return false;                  return false;
439          }          }
# Line 435  bool qsamplerChannel::setAudioDriver ( c Line 446  bool qsamplerChannel::setAudioDriver ( c
446    
447    
448  // Channel volume accessors.  // Channel volume accessors.
449  float qsamplerChannel::volume (void) const  float Channel::volume (void) const
450  {  {
451          return m_fVolume;          return m_fVolume;
452  }  }
453    
454  bool qsamplerChannel::setVolume ( float fVolume )  bool Channel::setVolume ( float fVolume )
455  {  {
456          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
457          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 463  bool qsamplerChannel::setVolume ( float Line 474  bool qsamplerChannel::setVolume ( float
474    
475    
476  // Sampler channel mute state.  // Sampler channel mute state.
477  bool qsamplerChannel::channelMute (void) const  bool Channel::channelMute (void) const
478  {  {
479          return m_bMute;          return m_bMute;
480  }  }
481    
482  bool qsamplerChannel::setChannelMute ( bool bMute )  bool Channel::setChannelMute ( bool bMute )
483  {  {
484          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
485          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 493  bool qsamplerChannel::setChannelMute ( b Line 504  bool qsamplerChannel::setChannelMute ( b
504    
505    
506  // Sampler channel solo state.  // Sampler channel solo state.
507  bool qsamplerChannel::channelSolo (void) const  bool Channel::channelSolo (void) const
508  {  {
509          return m_bSolo;          return m_bSolo;
510  }  }
511    
512  bool qsamplerChannel::setChannelSolo ( bool bSolo )  bool Channel::setChannelSolo ( bool bSolo )
513  {  {
514          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
515          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 523  bool qsamplerChannel::setChannelSolo ( b Line 534  bool qsamplerChannel::setChannelSolo ( b
534    
535    
536  // Audio routing accessors.  // Audio routing accessors.
537  int qsamplerChannel::audioChannel ( int iAudioOut ) const  int Channel::audioChannel ( int iAudioOut ) const
538  {  {
539          return m_audioRouting[iAudioOut];          return m_audioRouting[iAudioOut];
540  }  }
541    
542  bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )  bool Channel::setAudioChannel ( int iAudioOut, int iAudioIn )
543  {  {
544          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
545          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 553  bool qsamplerChannel::setAudioChannel ( Line 564  bool qsamplerChannel::setAudioChannel (
564  }  }
565    
566  // The audio routing map itself.  // The audio routing map itself.
567  const qsamplerChannelRoutingMap& qsamplerChannel::audioRouting (void) const  const ChannelRoutingMap& Channel::audioRouting (void) const
568  {  {
569          return m_audioRouting;          return m_audioRouting;
570  }  }
571    
572    
573  // Istrument name remapper.  // Istrument name remapper.
574  void qsamplerChannel::updateInstrumentName (void)  void Channel::updateInstrumentName (void)
575  {  {
576  #ifndef CONFIG_INSTRUMENT_NAME  #ifndef CONFIG_INSTRUMENT_NAME
577          m_sInstrumentName = getInstrumentName(m_sInstrumentFile,          m_sInstrumentName = getInstrumentName(m_sInstrumentFile,
# Line 570  void qsamplerChannel::updateInstrumentNa Line 581  void qsamplerChannel::updateInstrumentNa
581    
582    
583  // Update whole channel info state.  // Update whole channel info state.
584  bool qsamplerChannel::updateChannelInfo (void)  bool Channel::updateChannelInfo (void)
585  {  {
586          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
587          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 664  bool qsamplerChannel::updateChannelInfo Line 675  bool qsamplerChannel::updateChannelInfo
675    
676    
677  // Reset channel method.  // Reset channel method.
678  bool qsamplerChannel::channelReset (void)  bool Channel::channelReset (void)
679  {  {
680          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
681          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 684  bool qsamplerChannel::channelReset (void Line 695  bool qsamplerChannel::channelReset (void
695    
696    
697  // Spawn instrument editor method.  // Spawn instrument editor method.
698  bool qsamplerChannel::editChannel (void)  bool Channel::editChannel (void)
699  {  {
700  #ifdef CONFIG_EDIT_INSTRUMENT  #ifdef CONFIG_EDIT_INSTRUMENT
701    
# Line 699  bool qsamplerChannel::editChannel (void) Line 710  bool qsamplerChannel::editChannel (void)
710                  appendMessagesClient("lscp_edit_channel_instrument");                  appendMessagesClient("lscp_edit_channel_instrument");
711                  appendMessagesError(QObject::tr(                  appendMessagesError(QObject::tr(
712                          "Could not launch an appropriate instrument editor "                          "Could not launch an appropriate instrument editor "
713                          "for the given instrument!\n"                          "for the given instrument!\n\n"
714                          "Make sure you have an appropriate "                          "Make sure you have an appropriate "
715                          "instrument editor like 'gigedit' installed\n"                          "instrument editor like 'gigedit' installed "
716                          "and that it placed its mandatory DLL file "                          "and that it placed its mandatory DLL file "
717                          "into the sampler's plugin directory.")                          "into the sampler's plugin directory.")
718                  );                  );
# Line 716  bool qsamplerChannel::editChannel (void) Line 727  bool qsamplerChannel::editChannel (void)
727    
728          appendMessagesError(QObject::tr(          appendMessagesError(QObject::tr(
729                  "Sorry, QSampler was compiled for a version of liblscp "                  "Sorry, QSampler was compiled for a version of liblscp "
730                  "which lacks this feature.\n"                  "which lacks this feature.\n\n"
731                  "You may want to update liblscp and recompile QSampler afterwards.")                  "You may want to update liblscp and recompile QSampler afterwards.")
732          );          );
733    
# Line 727  bool qsamplerChannel::editChannel (void) Line 738  bool qsamplerChannel::editChannel (void)
738    
739    
740  // Channel setup dialog form.  // Channel setup dialog form.
741  bool qsamplerChannel::channelSetup ( QWidget *pParent )  bool Channel::channelSetup ( QWidget *pParent )
742  {  {
743          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
744          if (pMainForm == NULL)          if (pMainForm == NULL)
# Line 749  bool qsamplerChannel::channelSetup ( QWi Line 760  bool qsamplerChannel::channelSetup ( QWi
760    
761    
762  // Redirected messages output methods.  // Redirected messages output methods.
763  void qsamplerChannel::appendMessages( const QString& s ) const  void Channel::appendMessages( const QString& s ) const
764  {  {
765          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
766          if (pMainForm)          if (pMainForm)
767                  pMainForm->appendMessages(channelName() + ' ' + s);                  pMainForm->appendMessages(channelName() + ' ' + s);
768  }  }
769    
770  void qsamplerChannel::appendMessagesColor( const QString& s,  void Channel::appendMessagesColor( const QString& s,
771          const QString& c ) const          const QString& c ) const
772  {  {
773          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
# Line 764  void qsamplerChannel::appendMessagesColo Line 775  void qsamplerChannel::appendMessagesColo
775                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);
776  }  }
777    
778  void qsamplerChannel::appendMessagesText( const QString& s ) const  void Channel::appendMessagesText( const QString& s ) const
779  {  {
780          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
781          if (pMainForm)          if (pMainForm)
782                  pMainForm->appendMessagesText(channelName() + ' ' + s);                  pMainForm->appendMessagesText(channelName() + ' ' + s);
783  }  }
784    
785  void qsamplerChannel::appendMessagesError( const QString& s ) const  void Channel::appendMessagesError( const QString& s ) const
786  {  {
787          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
788          if (pMainForm)          if (pMainForm)
789                  pMainForm->appendMessagesError(channelName() + "\n\n" + s);                  pMainForm->appendMessagesError(channelName() + "\n\n" + s);
790  }  }
791    
792  void qsamplerChannel::appendMessagesClient( const QString& s ) const  void Channel::appendMessagesClient( const QString& s ) const
793  {  {
794          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
795          if (pMainForm)          if (pMainForm)
# Line 787  void qsamplerChannel::appendMessagesClie Line 798  void qsamplerChannel::appendMessagesClie
798    
799    
800  // Context menu event handler.  // Context menu event handler.
801  void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )  void Channel::contextMenuEvent( QContextMenuEvent *pEvent )
802  {  {
803          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
804          if (pMainForm)          if (pMainForm)
# Line 795  void qsamplerChannel::contextMenuEvent( Line 806  void qsamplerChannel::contextMenuEvent(
806  }  }
807    
808    
809  // FIXME: Check whether a given file is an instrument file.  // FIXME: Check whether a given file is an instrument file (DLS only).
810  bool qsamplerChannel::isInstrumentFile ( const QString& sInstrumentFile )  bool Channel::isDlsInstrumentFile ( const QString& sInstrumentFile )
811  {  {
812          bool bResult = false;          bool bResult = false;
813    
814          QFile file(sInstrumentFile);          QFile file(sInstrumentFile);
815          if (file.open(IO_ReadOnly)) {          if (file.open(QIODevice::ReadOnly)) {
816                  char achHeader[16];                  char achHeader[16];
817                  if (file.readBlock(achHeader, 16)) {                  if (file.read(achHeader, 16) > 0) {
818                          bResult = (::memcmp(&achHeader[0], "RIFF", 4)     == 0                          bResult = (::memcmp(&achHeader[0], "RIFF", 4)     == 0
819                                          && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);                                          && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);
820                  }                  }
# Line 814  bool qsamplerChannel::isInstrumentFile ( Line 825  bool qsamplerChannel::isInstrumentFile (
825  }  }
826    
827    
828    // FIXME: Check whether a given file is an instrument file (SF2 only).
829    bool Channel::isSf2InstrumentFile ( const QString& sInstrumentFile )
830    {
831            bool bResult = false;
832    
833            QFile file(sInstrumentFile);
834            if (file.open(QIODevice::ReadOnly)) {
835                    char achHeader[12];
836                    if (file.read(achHeader, 12) > 0) {
837                            bResult = (::memcmp(&achHeader[0], "RIFF", 4) == 0
838                                            && ::memcmp(&achHeader[8], "sfbk", 4) == 0);
839                    }
840                    file.close();
841            }
842    
843            return bResult;
844    }
845    
846    
847  // Retrieve the instrument list of a instrument file (.gig).  // Retrieve the instrument list of a instrument file (.gig).
848  QStringList qsamplerChannel::getInstrumentList( const QString& sInstrumentFile,  QStringList Channel::getInstrumentList (
849          bool bInstrumentNames )          const QString& sInstrumentFile, bool bInstrumentNames )
850  {  {
         QString sInstrumentName = QFileInfo(sInstrumentFile).fileName();  
851          QStringList instlist;          QStringList instlist;
852    
853          if (isInstrumentFile(sInstrumentFile)) {          const QFileInfo fi(sInstrumentFile);
854            if (!fi.exists()) {
855                    instlist.append(noInstrumentName());
856                    return instlist;
857            }
858    
859  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
860                  if (bInstrumentNames) {          if (bInstrumentNames) {
861                          RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());                  if (isDlsInstrumentFile(sInstrumentFile)) {
862                          gig::File  *pGig  = new gig::File(pRiff);                          RIFF::File *pRiff
863                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
864                            gig::File *pGig = new gig::File(pRiff);
865                    #ifdef CONFIG_LIBGIG_SETAUTOLOAD
866                            // prevent sleepy response time on large .gig files
867                            pGig->SetAutoLoad(false);
868                    #endif
869                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
870                          while (pInstrument) {                          while (pInstrument) {
871                                  instlist.append((pInstrument->pInfo)->Name.c_str());                                  instlist.append((pInstrument->pInfo)->Name.c_str());
# Line 834  QStringList qsamplerChannel::getInstrume Line 874  QStringList qsamplerChannel::getInstrume
874                          delete pGig;                          delete pGig;
875                          delete pRiff;                          delete pRiff;
876                  }                  }
877            #ifdef CONFIG_LIBGIG_SF2
878                  else                  else
879                    if (isSf2InstrumentFile(sInstrumentFile)) {
880                            RIFF::File *pRiff
881                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
882                            sf2::File *pSf2 = new sf2::File(pRiff);
883                            const int iPresetCount = pSf2->GetPresetCount();
884                            for (int iIndex = 0; iIndex < iPresetCount; ++iIndex) {
885                                    sf2::Preset *pPreset = pSf2->GetPreset(iIndex);
886                                    if (pPreset) {
887                                            instlist.append(pPreset->Name.c_str());
888                                    } else {
889                                            instlist.append(fi.fileName()
890                                                    + " [" + QString::number(iIndex) + "]");
891                                    }
892                            }
893                            delete pSf2;
894                            delete pRiff;
895                    }
896            #endif
897            }
898  #endif  #endif
899                  for (int iInstrumentNr = 0; iInstrumentNr < QSAMPLER_INSTRUMENT_MAX; iInstrumentNr++)  
900                          instlist.append(sInstrumentName + " [" + QString::number(iInstrumentNr) + "]");          if (instlist.isEmpty()) {
901                    for (int iIndex = 0; iIndex < QSAMPLER_INSTRUMENT_MAX; ++iIndex) {
902                            instlist.append(fi.fileName()
903                                    + " [" + QString::number(iIndex) + "]");
904                    }
905          }          }
         else instlist.append(noInstrumentName());  
906    
907          return instlist;          return instlist;
908  }  }
909    
910    
911  // 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.
912  QString qsamplerChannel::getInstrumentName( const QString& sInstrumentFile,  QString Channel::getInstrumentName (
913          int iInstrumentNr, bool bInstrumentNames )          const QString& sInstrumentFile, int iInstrumentNr, bool bInstrumentNames )
914  {  {
915            const QFileInfo fi(sInstrumentFile);
916            if (!fi.exists())
917                    return noInstrumentName();
918    
919          QString sInstrumentName;          QString sInstrumentName;
920    
         if (isInstrumentFile(sInstrumentFile)) {  
                 sInstrumentName = QFileInfo(sInstrumentFile).fileName();  
921  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
922                  if (bInstrumentNames) {          if (bInstrumentNames) {
923                          RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());                  if (isDlsInstrumentFile(sInstrumentFile)) {
924                          gig::File  *pGig  = new gig::File(pRiff);                          RIFF::File *pRiff
925                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
926                            gig::File *pGig = new gig::File(pRiff);
927                    #ifdef CONFIG_LIBGIG_SETAUTOLOAD
928                            // prevent sleepy response time on large .gig files
929                            pGig->SetAutoLoad(false);
930                    #endif
931                          int iIndex = 0;                          int iIndex = 0;
932                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
933                          while (pInstrument) {                          while (pInstrument) {
# Line 870  QString qsamplerChannel::getInstrumentNa Line 941  QString qsamplerChannel::getInstrumentNa
941                          delete pGig;                          delete pGig;
942                          delete pRiff;                          delete pRiff;
943                  }                  }
944            #ifdef CONFIG_LIBGIG_SF2
945                  else                  else
946                    if (isSf2InstrumentFile(sInstrumentFile)) {
947                            RIFF::File *pRiff
948                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
949                            sf2::File *pSf2 = new sf2::File(pRiff);
950                            sf2::Preset *pPreset = pSf2->GetPreset(iInstrumentNr);
951                            if (pPreset)
952                                    sInstrumentName = pPreset->Name.c_str();
953                            delete pSf2;
954                            delete pRiff;
955                    }
956            #endif
957            }
958  #endif  #endif
959    
960            if (sInstrumentName.isEmpty()) {
961                    sInstrumentName  = fi.fileName();
962                  sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";                  sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";
963          }          }
         else sInstrumentName = noInstrumentName();  
964    
965          return sInstrumentName;          return sInstrumentName;
966  }  }
967    
968    
969  // Common invalid name-helpers.  // Common invalid name-helpers.
970  QString qsamplerChannel::noEngineName (void)  QString Channel::noEngineName (void)
971  {  {
972          return QObject::tr("(No engine)");          return QObject::tr("(No engine)");
973  }  }
974    
975  QString qsamplerChannel::noInstrumentName (void)  QString Channel::noInstrumentName (void)
976  {  {
977          return QObject::tr("(No instrument)");          return QObject::tr("(No instrument)");
978  }  }
979    
980  QString qsamplerChannel::loadingInstrument (void) {  QString Channel::loadingInstrument (void) {
981          return QObject::tr("(Loading instrument...)");          return QObject::tr("(Loading instrument...)");
982  }  }
983    
984    
   
985  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
986  // qsamplerChannelRoutingTable - Channel routing table.  // QSampler::ChannelRoutingModel - data model for audio routing
987  //  //                                 (used for QTableView)
 #if 0  
 // Constructor.  
 qsamplerChannelRoutingTable::qsamplerChannelRoutingTable (  
         QWidget *pParent, const char *pszName )  
         : QTable(pParent, pszName)  
 {  
         // Set fixed number of columns.  
         QTable::setNumCols(2);  
         QTable::setShowGrid(false);  
         QTable::setSorting(false);  
         QTable::setFocusStyle(QTable::FollowStyle);  
         QTable::setSelectionMode(QTable::NoSelection);  
         // No vertical header.  
         QTable::verticalHeader()->hide();  
         QTable::setLeftMargin(0);  
         // Initialize the fixed table column headings.  
         QHeader *pHeader = QTable::horizontalHeader();  
         pHeader->setLabel(0, tr("Sampler Channel"));  
         pHeader->setLabel(1, tr("Device Channel"));  
         // Set read-onlyness of each column  
         QTable::setColumnReadOnly(0, true);  
 //      QTable::setColumnReadOnly(1, false); -- of course not.  
         QTable::setColumnStretchable(1, true);  
 }  
988    
989  // Default destructor.  ChannelRoutingModel::ChannelRoutingModel ( QObject *pParent )
990  qsamplerChannelRoutingTable::~qsamplerChannelRoutingTable (void)          : QAbstractTableModel(pParent), m_pDevice(NULL)
991  {  {
992  }  }
993    
994    
995  // Routing map table renderer.  int ChannelRoutingModel::rowCount ( const QModelIndex& /*parent*/) const
 void qsamplerChannelRoutingTable::refresh ( qsamplerDevice *pDevice,  
         const qsamplerChannelRoutingMap& routing )  
996  {  {
997          if (pDevice == NULL)          return (m_pDevice) ? m_routing.size() : 0;
                 return;  
   
         // Always (re)start it empty.  
         QTable::setUpdatesEnabled(false);  
         QTable::setNumRows(0);  
   
         // The common device port item list.  
         QStringList opts;  
         qsamplerDevicePortList& ports = pDevice->ports();  
         qsamplerDevicePort *pPort;  
         for (pPort = ports.first(); pPort; pPort = ports.next()) {  
                 opts.append(pDevice->deviceTypeName()  
                         + ' ' + pDevice->driverName()  
                         + ' ' + pPort->portName());  
         }  
   
         // Those items shall have a proper pixmap...  
         QPixmap pmChannel = QPixmap(":/icons/qsamplerChannel.png");  
         QPixmap pmDevice;  
         switch (pDevice->deviceType()) {  
         case qsamplerDevice::Audio:  
                 pmDevice = QPixmap(":/icons/audio2.png");  
                 break;  
         case qsamplerDevice::Midi:  
                 pmDevice = QPixmap(":/icons/midi2.png");  
                 break;  
         case qsamplerDevice::None:  
                 break;  
         }  
   
         // Fill the routing table...  
         QTable::insertRows(0, routing.count());  
         int iRow = 0;  
         qsamplerChannelRoutingMap::ConstIterator iter;  
         for (iter = routing.begin(); iter != routing.end(); ++iter) {  
                 QTable::setPixmap(iRow, 0, pmChannel);  
                 QTable::setText(iRow, 0, pDevice->deviceTypeName()  
                         + ' ' + QString::number(iter.key()));  
                 qsamplerChannelRoutingComboBox *pComboItem =  
                         new qsamplerChannelRoutingComboBox(this, opts, pmDevice);  
                 pComboItem->setCurrentItem(iter.data());  
                 QTable::setItem(iRow, 1, pComboItem);  
                 ++iRow;  
         }  
   
         // Adjust optimal column widths.  
         QTable::adjustColumn(0);  
         QTable::adjustColumn(1);  
   
         QTable::setUpdatesEnabled(true);  
         QTable::updateContents();  
998  }  }
999    
1000    
1001  // Commit any pending editing.  int ChannelRoutingModel::columnCount ( const QModelIndex& /*parent*/) const
 void qsamplerChannelRoutingTable::flush (void)  
1002  {  {
1003          if (QTable::isEditing())          return 1;
             QTable::endEdit(QTable::currEditRow(), QTable::currEditCol(), true, true);  
1004  }  }
 #endif  
1005    
 ChannelRoutingModel::ChannelRoutingModel(QObject* parent) : QAbstractTableModel(parent), pDevice(NULL) {  
 }  
1006    
1007  int ChannelRoutingModel::rowCount(const QModelIndex& /*parent*/) const {  Qt::ItemFlags ChannelRoutingModel::flags ( const QModelIndex& /*index*/) const
1008      return routing.size();  {
1009  }          return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;
   
 int ChannelRoutingModel::columnCount(const QModelIndex& /*parent*/) const {  
     return 1;  
1010  }  }
1011    
 QVariant ChannelRoutingModel::data(const QModelIndex &index, int role) const {  
     if (!index.isValid())  
         return QVariant();  
     if (role != Qt::DisplayRole)  
         return QVariant();  
1012    
1013      ChannelRoutingItem item;  bool ChannelRoutingModel::setData ( const QModelIndex& index,
1014            const QVariant& value, int /*role*/)
1015      // The common device port item list.  {
1016      qsamplerDevicePortList& ports = pDevice->ports();          if (!index.isValid())
1017      qsamplerDevicePort* pPort;                  return false;
     for (pPort = ports.first(); pPort; pPort = ports.next()) {  
         item.options.append(  
             pDevice->deviceTypeName()  
             + ' ' + pDevice->driverName()  
             + ' ' + pPort->portName()  
         );  
     }  
1018    
1019      item.selection = routing[index.column()];          m_routing[index.row()] = value.toInt();
1020    
1021      return QVariant::fromValue(item);          emit dataChanged(index, index);
1022            return true;
1023  }  }
1024    
 QVariant ChannelRoutingModel::headerData(int section, Qt::Orientation orientation, int role) const {  
     if (role != Qt::DisplayRole) return QVariant();  
   
     if (orientation == Qt::Horizontal)  
         return QObject::tr("Device Channel");  
1025    
1026      if (orientation == Qt::Vertical)  QVariant ChannelRoutingModel::data ( const QModelIndex &index, int role ) const
         return QObject::tr("Sampler Channel Output ") +  
                QString(section);  
   
     return QVariant();  
 }  
   
 void ChannelRoutingModel::refresh ( qsamplerDevice *pDevice,  
         const qsamplerChannelRoutingMap& routing )  
1027  {  {
1028      this->pDevice = pDevice;          if (!index.isValid())
1029      this->routing = routing;                  return QVariant();
1030  }          if (role != Qt::DisplayRole)
1031                    return QVariant();
1032            if (index.column() != 0)
1033                    return QVariant();
1034    
1035            ChannelRoutingItem item;
1036    
1037            // The common device port item list.
1038            DevicePortList& ports = m_pDevice->ports();
1039            QListIterator<DevicePort *> iter(ports);
1040            while (iter.hasNext()) {
1041                    DevicePort *pPort = iter.next();
1042                    item.options.append(
1043                            m_pDevice->deviceTypeName()
1044                            + ' ' + m_pDevice->driverName()
1045                            + ' ' + pPort->portName()
1046                    );
1047            }
1048    
1049            item.selection = m_routing[index.row()];
1050    
1051  ChannelRoutingDelegate::ChannelRoutingDelegate(QObject *parent) : QItemDelegate(parent) {          return QVariant::fromValue(item);
1052  }  }
1053    
 QWidget* ChannelRoutingDelegate::createEditor(QWidget *parent,  
         const QStyleOptionViewItem &/* option */,  
         const QModelIndex& index) const  
 {  
     ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();  
1054    
1055      QComboBox* editor = new QComboBox(parent);  QVariant ChannelRoutingModel::headerData ( int section,
1056      editor->addItems(item.options);          Qt::Orientation orientation, int role) const
1057      editor->setCurrentIndex(item.selection);  {
1058      editor->installEventFilter(const_cast<ChannelRoutingDelegate*>(this));          if (role != Qt::DisplayRole)
1059      return editor;                  return QVariant();
 }  
1060    
1061  void ChannelRoutingDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {          switch (orientation) {
1062      ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();                  case Qt::Horizontal:
1063      QComboBox* comboBox = static_cast<QComboBox*>(editor);                          return UNICODE_RIGHT_ARROW + QObject::tr(" Device Channel");
1064      comboBox->setCurrentIndex(item.selection);                  case Qt::Vertical:
1065                            return QObject::tr("Audio Channel ") +
1066                                    QString::number(section) + " " + UNICODE_RIGHT_ARROW;
1067                    default:
1068                            return QVariant();
1069            }
1070  }  }
1071    
 void ChannelRoutingDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {  
     QComboBox* comboBox = static_cast<QComboBox*>(editor);  
     model->setData(index, comboBox->currentIndex());  
 }  
1072    
1073  void ChannelRoutingDelegate::updateEditorGeometry(QWidget *editor,  void ChannelRoutingModel::refresh ( Device *pDevice,
1074          const QStyleOptionViewItem &option, const QModelIndex &/* index */) const          const ChannelRoutingMap& routing )
1075  {  {
1076      editor->setGeometry(option.rect);          m_pDevice = pDevice;
1077            m_routing = routing;
1078            // inform the outer world (QTableView) that our data changed
1079    #if QT_VERSION < 0x050000
1080            QAbstractTableModel::reset();
1081    #else
1082            QAbstractTableModel::beginResetModel();
1083            QAbstractTableModel::endResetModel();
1084    #endif
1085  }  }
1086    
1087    
   
1088  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1089  // qsamplerChannelRoutingComboBox - Custom combo box for routing table.  // QSampler::ChannelRoutingDelegate - table cell renderer for audio routing
1090  //  //
1091    
1092  #if 0  ChannelRoutingDelegate::ChannelRoutingDelegate ( QObject *pParent )
1093  // Constructor.          : QItemDelegate(pParent)
 qsamplerChannelRoutingComboBox::qsamplerChannelRoutingComboBox (  
         QTable *pTable, const QStringList& list, const QPixmap& pixmap )  
         : QTableItem(pTable, QTableItem::WhenCurrent, QString::null, pixmap),  
         m_list(list)  
1094  {  {
         m_iCurrentItem = 0;  
1095  }  }
1096    
1097  // Public accessors.  
1098  void qsamplerChannelRoutingComboBox::setCurrentItem ( int iCurrentItem )  QWidget* ChannelRoutingDelegate::createEditor ( QWidget *pParent,
1099            const QStyleOptionViewItem & option, const QModelIndex& index ) const
1100  {  {
1101          m_iCurrentItem = iCurrentItem;          if (!index.isValid())
1102                    return NULL;
1103    
1104            if (index.column() != 0)
1105                    return NULL;
1106    
1107          QTableItem::setText(m_list[iCurrentItem]);          ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();
1108    
1109            QComboBox* pComboBox = new QComboBox(pParent);
1110            pComboBox->addItems(item.options);
1111            pComboBox->setCurrentIndex(item.selection);
1112            pComboBox->setEnabled(true);
1113            pComboBox->setGeometry(option.rect);
1114            return pComboBox;
1115  }  }
1116    
1117  int qsamplerChannelRoutingComboBox::currentItem (void) const  
1118    void ChannelRoutingDelegate::setEditorData ( QWidget *pEditor,
1119            const QModelIndex &index) const
1120  {  {
1121          return m_iCurrentItem;          ChannelRoutingItem item = index.model()->data(index,
1122                    Qt::DisplayRole).value<ChannelRoutingItem> ();
1123            QComboBox* pComboBox = static_cast<QComboBox*> (pEditor);
1124            pComboBox->setCurrentIndex(item.selection);
1125  }  }
1126    
1127  // Virtual implemetations.  
1128  QWidget *qsamplerChannelRoutingComboBox::createEditor (void) const  void ChannelRoutingDelegate::setModelData ( QWidget* pEditor,
1129            QAbstractItemModel *pModel, const QModelIndex& index ) const
1130  {  {
1131          QComboBox *pComboBox = new QComboBox(QTableItem::table()->viewport());          QComboBox *pComboBox = static_cast<QComboBox*> (pEditor);
1132          QObject::connect(pComboBox, SIGNAL(activated(int)),          pModel->setData(index, pComboBox->currentIndex());
                 QTableItem::table(), SLOT(doValueChanged()));  
         for (QStringList::ConstIterator iter = m_list.begin();  
                         iter != m_list.end(); iter++) {  
                 pComboBox->insertItem(QTableItem::pixmap(), *iter);  
         }  
         pComboBox->setCurrentItem(m_iCurrentItem);  
         return pComboBox;  
1133  }  }
1134    
1135  void qsamplerChannelRoutingComboBox::setContentFromEditor ( QWidget *pWidget )  
1136    void ChannelRoutingDelegate::updateEditorGeometry ( QWidget *pEditor,
1137            const QStyleOptionViewItem& option, const QModelIndex &/* index */) const
1138  {  {
1139          if (pWidget->inherits("QComboBox")) {          pEditor->setGeometry(option.rect);
                 QComboBox *pComboBox = (QComboBox *) pWidget;  
                 m_iCurrentItem = pComboBox->currentItem();  
                 QTableItem::setText(pComboBox->currentText());  
         }  
         else QTableItem::setContentFromEditor(pWidget);  
1140  }  }
1141    
1142  #endif  } // namespace QSampler
1143    
1144    
1145    // end of qsamplerChannel.cpp

Legend:
Removed from v.1463  
changed lines
  Added in v.2646

  ViewVC Help
Powered by ViewVC