/[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 1022 by capela, Thu Jan 11 16:14:31 2007 UTC revision 1527 by schoenebeck, Mon Nov 26 16:00:21 2007 UTC
# Line 2  Line 2 
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.
5       Copyright (C) 2007, 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 21  Line 22 
22    
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"
# Line 34  Line 36 
36    
37  #define QSAMPLER_INSTRUMENT_MAX 100  #define QSAMPLER_INSTRUMENT_MAX 100
38    
39    #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))
40    
41    
42    using namespace QSampler;
43    
44  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
45  // qsamplerChannel - Sampler channel structure.  // qsamplerChannel - Sampler channel structure.
# Line 56  qsamplerChannel::qsamplerChannel ( int i Line 62  qsamplerChannel::qsamplerChannel ( int i
62          m_iMidiMap          = -1;          m_iMidiMap          = -1;
63          m_sAudioDriver      = "ALSA";          m_sAudioDriver      = "ALSA";
64          m_iAudioDevice      = -1;          m_iAudioDevice      = -1;
65          m_fVolume           = 0.0;          m_fVolume           = 0.0f;
66          m_bMute             = false;          m_bMute             = false;
67          m_bSolo             = false;          m_bSolo             = false;
68  }  }
# Line 70  qsamplerChannel::~qsamplerChannel (void) Line 76  qsamplerChannel::~qsamplerChannel (void)
76  // Create a new sampler channel, if not already.  // Create a new sampler channel, if not already.
77  bool qsamplerChannel::addChannel (void)  bool qsamplerChannel::addChannel (void)
78  {  {
79          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
80          if (pMainForm == NULL)          if (pMainForm == NULL)
81                  return false;                  return false;
82          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
# Line 95  bool qsamplerChannel::addChannel (void) Line 101  bool qsamplerChannel::addChannel (void)
101  // Remove sampler channel.  // Remove sampler channel.
102  bool qsamplerChannel::removeChannel (void)  bool qsamplerChannel::removeChannel (void)
103  {  {
104          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
105          if (pMainForm == NULL)          if (pMainForm == NULL)
106                  return false;                  return false;
107          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
# Line 145  const QString& qsamplerChannel::engineNa Line 151  const QString& qsamplerChannel::engineNa
151    
152  bool qsamplerChannel::loadEngine ( const QString& sEngineName )  bool qsamplerChannel::loadEngine ( const QString& sEngineName )
153  {  {
154          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
155          if (pMainForm == NULL)          if (pMainForm == NULL)
156                  return false;                  return false;
157          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 153  bool qsamplerChannel::loadEngine ( const Line 159  bool qsamplerChannel::loadEngine ( const
159          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)          if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)
160                  return true;                  return true;
161    
162          if (::lscp_load_engine(pMainForm->client(), sEngineName.latin1(), m_iChannelID) != LSCP_OK) {          if (::lscp_load_engine(pMainForm->client(),
163                            sEngineName.toUtf8().constData(), m_iChannelID) != LSCP_OK) {
164                  appendMessagesClient("lscp_load_engine");                  appendMessagesClient("lscp_load_engine");
165                  return false;                  return false;
166          }          }
# Line 192  int qsamplerChannel::instrumentStatus (v Line 199  int qsamplerChannel::instrumentStatus (v
199  // Instrument file loader.  // Instrument file loader.
200  bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )  bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
201  {  {
202          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
203          if (pMainForm == NULL)          if (pMainForm == NULL)
204                  return false;                  return false;
205          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 202  bool qsamplerChannel::loadInstrument ( c Line 209  bool qsamplerChannel::loadInstrument ( c
209          if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)          if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)
210                  return true;                  return true;
211    
212          if (::lscp_load_instrument_non_modal(pMainForm->client(), sInstrumentFile.latin1(), iInstrumentNr, m_iChannelID) != LSCP_OK) {          if (
213                    ::lscp_load_instrument_non_modal(
214                            pMainForm->client(),
215                            qsamplerUtilities::lscpEscapePath(
216                                    sInstrumentFile).toUtf8().constData(),
217                            iInstrumentNr, m_iChannelID
218                    ) != LSCP_OK
219            ) {
220                  appendMessagesClient("lscp_load_instrument");                  appendMessagesClient("lscp_load_instrument");
221                  return false;                  return false;
222          }          }
# Line 238  const QString& qsamplerChannel::midiDriv Line 252  const QString& qsamplerChannel::midiDriv
252    
253  bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )  bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )
254  {  {
255          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
256          if (pMainForm == NULL)          if (pMainForm == NULL)
257                  return false;                  return false;
258          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 246  bool qsamplerChannel::setMidiDriver ( co Line 260  bool qsamplerChannel::setMidiDriver ( co
260          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)          if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)
261                  return true;                  return true;
262    
263          if (::lscp_set_channel_midi_type(pMainForm->client(), m_iChannelID, sMidiDriver.latin1()) != LSCP_OK) {          if (::lscp_set_channel_midi_type(pMainForm->client(),
264                            m_iChannelID, sMidiDriver.toUtf8().constData()) != LSCP_OK) {
265                  appendMessagesClient("lscp_set_channel_midi_type");                  appendMessagesClient("lscp_set_channel_midi_type");
266                  return false;                  return false;
267          }          }
# Line 266  int qsamplerChannel::midiDevice (void) c Line 281  int qsamplerChannel::midiDevice (void) c
281    
282  bool qsamplerChannel::setMidiDevice ( int iMidiDevice )  bool qsamplerChannel::setMidiDevice ( int iMidiDevice )
283  {  {
284          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
285          if (pMainForm == NULL)          if (pMainForm == NULL)
286                  return false;                  return false;
287          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 294  int qsamplerChannel::midiPort (void) con Line 309  int qsamplerChannel::midiPort (void) con
309    
310  bool qsamplerChannel::setMidiPort ( int iMidiPort )  bool qsamplerChannel::setMidiPort ( int iMidiPort )
311  {  {
312          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
313          if (pMainForm == NULL)          if (pMainForm == NULL)
314                  return false;                  return false;
315          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 322  int qsamplerChannel::midiChannel (void) Line 337  int qsamplerChannel::midiChannel (void)
337    
338  bool qsamplerChannel::setMidiChannel ( int iMidiChannel )  bool qsamplerChannel::setMidiChannel ( int iMidiChannel )
339  {  {
340          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
341          if (pMainForm == NULL)          if (pMainForm == NULL)
342                  return false;                  return false;
343          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 350  int qsamplerChannel::midiMap (void) cons Line 365  int qsamplerChannel::midiMap (void) cons
365    
366  bool qsamplerChannel::setMidiMap ( int iMidiMap )  bool qsamplerChannel::setMidiMap ( int iMidiMap )
367  {  {
368          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
369          if (pMainForm == NULL)          if (pMainForm == NULL)
370                  return false;                  return false;
371          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 378  int qsamplerChannel::audioDevice (void) Line 393  int qsamplerChannel::audioDevice (void)
393    
394  bool qsamplerChannel::setAudioDevice ( int iAudioDevice )  bool qsamplerChannel::setAudioDevice ( int iAudioDevice )
395  {  {
396          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
397          if (pMainForm == NULL)          if (pMainForm == NULL)
398                  return false;                  return false;
399          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 406  const QString& qsamplerChannel::audioDri Line 421  const QString& qsamplerChannel::audioDri
421    
422  bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )  bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )
423  {  {
424          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
425          if (pMainForm == NULL)          if (pMainForm == NULL)
426                  return false;                  return false;
427          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 414  bool qsamplerChannel::setAudioDriver ( c Line 429  bool qsamplerChannel::setAudioDriver ( c
429          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)          if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)
430                  return true;                  return true;
431    
432          if (::lscp_set_channel_audio_type(pMainForm->client(), m_iChannelID, sAudioDriver.latin1()) != LSCP_OK) {          if (::lscp_set_channel_audio_type(pMainForm->client(),
433                            m_iChannelID, sAudioDriver.toUtf8().constData()) != LSCP_OK) {
434                  appendMessagesClient("lscp_set_channel_audio_type");                  appendMessagesClient("lscp_set_channel_audio_type");
435                  return false;                  return false;
436          }          }
# Line 434  float qsamplerChannel::volume (void) con Line 450  float qsamplerChannel::volume (void) con
450    
451  bool qsamplerChannel::setVolume ( float fVolume )  bool qsamplerChannel::setVolume ( float fVolume )
452  {  {
453          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
454          if (pMainForm == NULL)          if (pMainForm == NULL)
455                  return false;                  return false;
456          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 462  bool qsamplerChannel::channelMute (void) Line 478  bool qsamplerChannel::channelMute (void)
478    
479  bool qsamplerChannel::setChannelMute ( bool bMute )  bool qsamplerChannel::setChannelMute ( bool bMute )
480  {  {
481          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
482          if (pMainForm == NULL)          if (pMainForm == NULL)
483                  return false;                  return false;
484          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 492  bool qsamplerChannel::channelSolo (void) Line 508  bool qsamplerChannel::channelSolo (void)
508    
509  bool qsamplerChannel::setChannelSolo ( bool bSolo )  bool qsamplerChannel::setChannelSolo ( bool bSolo )
510  {  {
511          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
512          if (pMainForm == NULL)          if (pMainForm == NULL)
513                  return false;                  return false;
514          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 522  int qsamplerChannel::audioChannel ( int Line 538  int qsamplerChannel::audioChannel ( int
538    
539  bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )  bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )
540  {  {
541          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
542          if (pMainForm == NULL)          if (pMainForm == NULL)
543                  return false;                  return false;
544          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 564  void qsamplerChannel::updateInstrumentNa Line 580  void qsamplerChannel::updateInstrumentNa
580  // Update whole channel info state.  // Update whole channel info state.
581  bool qsamplerChannel::updateChannelInfo (void)  bool qsamplerChannel::updateChannelInfo (void)
582  {  {
583          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
584          if (pMainForm == NULL)          if (pMainForm == NULL)
585                  return false;                  return false;
586          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 580  bool qsamplerChannel::updateChannelInfo Line 596  bool qsamplerChannel::updateChannelInfo
596    
597  #ifdef CONFIG_INSTRUMENT_NAME  #ifdef CONFIG_INSTRUMENT_NAME
598          // We got all actual instrument datum...          // We got all actual instrument datum...
599          m_sInstrumentFile = pChannelInfo->instrument_file;          m_sInstrumentFile =
600                    qsamplerUtilities::lscpEscapedPathToPosix(pChannelInfo->instrument_file);
601          m_iInstrumentNr   = pChannelInfo->instrument_nr;          m_iInstrumentNr   = pChannelInfo->instrument_nr;
602          m_sInstrumentName = pChannelInfo->instrument_name;          m_sInstrumentName =
603                    qsamplerUtilities::lscpEscapedTextToRaw(pChannelInfo->instrument_name);
604  #else  #else
605          // First, check if intrument name has changed,          // First, check if intrument name has changed,
606          // taking care that instrument name lookup might be expensive,          // taking care that instrument name lookup might be expensive,
# Line 656  bool qsamplerChannel::updateChannelInfo Line 674  bool qsamplerChannel::updateChannelInfo
674  // Reset channel method.  // Reset channel method.
675  bool qsamplerChannel::channelReset (void)  bool qsamplerChannel::channelReset (void)
676  {  {
677          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
678          if (pMainForm == NULL)          if (pMainForm == NULL)
679                  return false;                  return false;
680          if (pMainForm->client() == NULL || m_iChannelID < 0)          if (pMainForm->client() == NULL || m_iChannelID < 0)
# Line 673  bool qsamplerChannel::channelReset (void Line 691  bool qsamplerChannel::channelReset (void
691  }  }
692    
693    
694    // Spawn instrument editor method.
695    bool qsamplerChannel::editChannel (void)
696    {
697    #ifdef CONFIG_EDIT_INSTRUMENT
698    
699            MainForm *pMainForm = MainForm::getInstance();
700            if (pMainForm == NULL)
701                    return false;
702            if (pMainForm->client() == NULL || m_iChannelID < 0)
703                    return false;
704    
705            if (::lscp_edit_channel_instrument(pMainForm->client(), m_iChannelID)
706                    != LSCP_OK) {
707                    appendMessagesClient("lscp_edit_channel_instrument");
708                    appendMessagesError(QObject::tr(
709                            "Could not launch an appropriate instrument editor "
710                            "for the given instrument!\n"
711                            "Make sure you have an appropriate "
712                            "instrument editor like 'gigedit' installed\n"
713                            "and that it placed its mandatory DLL file "
714                            "into the sampler's plugin directory.")
715                    );
716                    return false;
717            }
718    
719            appendMessages(QObject::tr("edit instrument."));
720    
721            return true;
722    
723    #else
724    
725            appendMessagesError(QObject::tr(
726                    "Sorry, QSampler was compiled for a version of liblscp "
727                    "which lacks this feature.\n"
728                    "You may want to update liblscp and recompile QSampler afterwards.")
729            );
730    
731            return false;
732    
733    #endif
734    }
735    
736    
737  // Channel setup dialog form.  // Channel setup dialog form.
738  bool qsamplerChannel::channelSetup ( QWidget *pParent )  bool qsamplerChannel::channelSetup ( QWidget *pParent )
739  {  {
740          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
741          if (pMainForm == NULL)          if (pMainForm == NULL)
742                  return false;                  return false;
743    
# Line 684  bool qsamplerChannel::channelSetup ( QWi Line 745  bool qsamplerChannel::channelSetup ( QWi
745    
746          appendMessages(QObject::tr("setup..."));          appendMessages(QObject::tr("setup..."));
747    
748          qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(pParent);          ChannelForm *pChannelForm = new ChannelForm(pParent);
749          if (pChannelForm) {          if (pChannelForm) {
750                  pChannelForm->setup(this);                  pChannelForm->setup(this);
751                  bResult = pChannelForm->exec();                  bResult = pChannelForm->exec();
# Line 698  bool qsamplerChannel::channelSetup ( QWi Line 759  bool qsamplerChannel::channelSetup ( QWi
759  // Redirected messages output methods.  // Redirected messages output methods.
760  void qsamplerChannel::appendMessages( const QString& s ) const  void qsamplerChannel::appendMessages( const QString& s ) const
761  {  {
762          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
763          if (pMainForm)          if (pMainForm)
764                  pMainForm->appendMessages(channelName() + ' ' + s);                  pMainForm->appendMessages(channelName() + ' ' + s);
765  }  }
# Line 706  void qsamplerChannel::appendMessages( co Line 767  void qsamplerChannel::appendMessages( co
767  void qsamplerChannel::appendMessagesColor( const QString& s,  void qsamplerChannel::appendMessagesColor( const QString& s,
768          const QString& c ) const          const QString& c ) const
769  {  {
770          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
771          if (pMainForm)          if (pMainForm)
772                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);
773  }  }
774    
775  void qsamplerChannel::appendMessagesText( const QString& s ) const  void qsamplerChannel::appendMessagesText( const QString& s ) const
776  {  {
777          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
778          if (pMainForm)          if (pMainForm)
779                  pMainForm->appendMessagesText(channelName() + ' ' + s);                  pMainForm->appendMessagesText(channelName() + ' ' + s);
780  }  }
781    
782  void qsamplerChannel::appendMessagesError( const QString& s ) const  void qsamplerChannel::appendMessagesError( const QString& s ) const
783  {  {
784          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
785          if (pMainForm)          if (pMainForm)
786                  pMainForm->appendMessagesError(channelName() + "\n\n" + s);                  pMainForm->appendMessagesError(channelName() + "\n\n" + s);
787  }  }
788    
789  void qsamplerChannel::appendMessagesClient( const QString& s ) const  void qsamplerChannel::appendMessagesClient( const QString& s ) const
790  {  {
791          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
792          if (pMainForm)          if (pMainForm)
793                  pMainForm->appendMessagesClient(channelName() + ' ' + s);                  pMainForm->appendMessagesClient(channelName() + ' ' + s);
794  }  }
# Line 736  void qsamplerChannel::appendMessagesClie Line 797  void qsamplerChannel::appendMessagesClie
797  // Context menu event handler.  // Context menu event handler.
798  void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )
799  {  {
800          qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
801          if (pMainForm)          if (pMainForm)
802                  pMainForm->contextMenuEvent(pEvent);                  pMainForm->contextMenuEvent(pEvent);
803  }  }
# Line 748  bool qsamplerChannel::isInstrumentFile ( Line 809  bool qsamplerChannel::isInstrumentFile (
809          bool bResult = false;          bool bResult = false;
810    
811          QFile file(sInstrumentFile);          QFile file(sInstrumentFile);
812          if (file.open(IO_ReadOnly)) {          if (file.open(QIODevice::ReadOnly)) {
813                  char achHeader[16];                  char achHeader[16];
814                  if (file.readBlock(achHeader, 16)) {                  if (file.read(achHeader, 16) > 0) {
815                          bResult = (::memcmp(&achHeader[0], "RIFF", 4)     == 0                          bResult = (::memcmp(&achHeader[0], "RIFF", 4)     == 0
816                                          && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);                                          && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);
817                  }                  }
# Line 771  QStringList qsamplerChannel::getInstrume Line 832  QStringList qsamplerChannel::getInstrume
832          if (isInstrumentFile(sInstrumentFile)) {          if (isInstrumentFile(sInstrumentFile)) {
833  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
834                  if (bInstrumentNames) {                  if (bInstrumentNames) {
835                          RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());                          RIFF::File *pRiff
836                                    = new RIFF::File(sInstrumentFile.toUtf8().constData());
837                          gig::File  *pGig  = new gig::File(pRiff);                          gig::File  *pGig  = new gig::File(pRiff);
838    #if HAVE_LIBGIG_SETAUTOLOAD
839                            // prevent sleepy response time on large .gig files
840                            pGig->SetAutoLoad(false);
841    #endif
842                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
843                          while (pInstrument) {                          while (pInstrument) {
844                                  instlist.append((pInstrument->pInfo)->Name.c_str());                                  instlist.append((pInstrument->pInfo)->Name.c_str());
# Line 802  QString qsamplerChannel::getInstrumentNa Line 868  QString qsamplerChannel::getInstrumentNa
868                  sInstrumentName = QFileInfo(sInstrumentFile).fileName();                  sInstrumentName = QFileInfo(sInstrumentFile).fileName();
869  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
870                  if (bInstrumentNames) {                  if (bInstrumentNames) {
871                          RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());                          RIFF::File *pRiff
872                          gig::File  *pGig  = new gig::File(pRiff);                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());
873                            gig::File *pGig = new gig::File(pRiff);
874    #if HAVE_LIBGIG_SETAUTOLOAD
875                            // prevent sleepy response time on large .gig files
876                            pGig->SetAutoLoad(false);
877    #endif
878                          int iIndex = 0;                          int iIndex = 0;
879                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();                          gig::Instrument *pInstrument = pGig->GetFirstInstrument();
880                          while (pInstrument) {                          while (pInstrument) {
# Line 843  QString qsamplerChannel::loadingInstrume Line 914  QString qsamplerChannel::loadingInstrume
914  }  }
915    
916    
   
917  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
918  // qsamplerChannelRoutingTable - Channel routing table.  // ChannelRoutingModel - data model for audio routing (used for QTableView)
919  //  //
920    
921  // Constructor.  ChannelRoutingModel::ChannelRoutingModel ( QObject *pParent )
922  qsamplerChannelRoutingTable::qsamplerChannelRoutingTable (          : QAbstractTableModel(pParent), m_pDevice(NULL)
923          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);  
924  }  }
925    
926  // Default destructor.  
927  qsamplerChannelRoutingTable::~qsamplerChannelRoutingTable (void)  int ChannelRoutingModel::rowCount ( const QModelIndex& /*parent*/) const
928  {  {
929            return m_routing.size();
930  }  }
931    
932    
933  // Routing map table renderer.  int ChannelRoutingModel::columnCount ( const QModelIndex& /*parent*/) const
934  void qsamplerChannelRoutingTable::refresh ( qsamplerDevice *pDevice,  {
935          const qsamplerChannelRoutingMap& routing )          return 1;
936    }
937    
938    
939    Qt::ItemFlags ChannelRoutingModel::flags ( const QModelIndex& /*index*/) const
940    {
941            return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;
942    }
943    
944    
945    bool ChannelRoutingModel::setData ( const QModelIndex& index,
946            const QVariant& value, int /*role*/)
947    {
948            if (!index.isValid())
949                    return false;
950    
951            m_routing[index.row()] = value.toInt();
952    
953            emit dataChanged(index, index);
954            return true;
955    }
956    
957    
958    QVariant ChannelRoutingModel::data ( const QModelIndex &index, int role ) const
959  {  {
960          if (pDevice == NULL)          if (!index.isValid())
961                  return;                  return QVariant();
962            if (role != Qt::DisplayRole)
963                    return QVariant();
964            if (index.column() != 0)
965                    return QVariant();
966    
967          // Always (re)start it empty.          ChannelRoutingItem item;
         QTable::setUpdatesEnabled(false);  
         QTable::setNumRows(0);  
968    
969          // The common device port item list.          // The common device port item list.
970          QStringList opts;          qsamplerDevicePortList& ports = m_pDevice->ports();
971          qsamplerDevicePortList& ports = pDevice->ports();          QListIterator<qsamplerDevicePort *> iter(ports);
972          qsamplerDevicePort *pPort;          while (iter.hasNext()) {
973          for (pPort = ports.first(); pPort; pPort = ports.next()) {                  qsamplerDevicePort *pPort = iter.next();
974                  opts.append(pDevice->deviceTypeName()                  item.options.append(
975                          + ' ' + pDevice->driverName()                          m_pDevice->deviceTypeName()
976                          + ' ' + pPort->portName());                          + ' ' + m_pDevice->driverName()
977          }                          + ' ' + pPort->portName()
978                    );
979          // Those items shall have a proper pixmap...          }
980          QPixmap pmChannel = QPixmap::fromMimeSource("qsamplerChannel.png");  
981          QPixmap pmDevice;          item.selection = m_routing[index.row()];
982          switch (pDevice->deviceType()) {  
983          case qsamplerDevice::Audio:          return QVariant::fromValue(item);
                 pmDevice = QPixmap::fromMimeSource("audio2.png");  
                 break;  
         case qsamplerDevice::Midi:  
                 pmDevice = QPixmap::fromMimeSource("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();  
984  }  }
985    
986    
987  // Commit any pending editing.  QVariant ChannelRoutingModel::headerData ( int section,
988  void qsamplerChannelRoutingTable::flush (void)          Qt::Orientation orientation, int role) const
989  {  {
990          if (QTable::isEditing())          if (role != Qt::DisplayRole)
991              QTable::endEdit(QTable::currEditRow(), QTable::currEditCol(), true, true);                  return QVariant();
992    
993            switch (orientation) {
994                    case Qt::Horizontal:
995                            return UNICODE_RIGHT_ARROW + QObject::tr(" Device Channel");
996                    case Qt::Vertical:
997                            return QObject::tr("Sampler Channel ") +
998                                    QString::number(section) + " " + UNICODE_RIGHT_ARROW;
999                    default:
1000                            return QVariant();
1001            }
1002    }
1003    
1004    
1005    void ChannelRoutingModel::refresh ( qsamplerDevice *pDevice,
1006            const qsamplerChannelRoutingMap& routing )
1007    {
1008            m_pDevice = pDevice;
1009            m_routing = routing;
1010            // inform the outer world (QTableView) that our data changed
1011            QAbstractTableModel::reset();
1012  }  }
1013    
1014    
1015  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1016  // qsamplerChannelRoutingComboBox - Custom combo box for routing table.  // ChannelRoutingDelegate - table cell renderer for audio routing
1017  //  //
1018    
1019  // Constructor.  ChannelRoutingDelegate::ChannelRoutingDelegate ( QObject *pParent )
1020  qsamplerChannelRoutingComboBox::qsamplerChannelRoutingComboBox (          : QItemDelegate(pParent)
         QTable *pTable, const QStringList& list, const QPixmap& pixmap )  
         : QTableItem(pTable, QTableItem::WhenCurrent, QString::null, pixmap),  
         m_list(list)  
1021  {  {
         m_iCurrentItem = 0;  
1022  }  }
1023    
1024  // Public accessors.  
1025  void qsamplerChannelRoutingComboBox::setCurrentItem ( int iCurrentItem )  QWidget* ChannelRoutingDelegate::createEditor ( QWidget *pParent,
1026            const QStyleOptionViewItem & option, const QModelIndex& index ) const
1027  {  {
1028          m_iCurrentItem = iCurrentItem;          if (!index.isValid())
1029                    return NULL;
1030    
1031            if (index.column() != 0)
1032                    return NULL;
1033    
1034          QTableItem::setText(m_list[iCurrentItem]);          ChannelRoutingItem item = index.model()->data(index, Qt::DisplayRole).value<ChannelRoutingItem>();
1035    
1036            QComboBox* pComboBox = new QComboBox(pParent);
1037            pComboBox->addItems(item.options);
1038            pComboBox->setCurrentIndex(item.selection);
1039            pComboBox->setEnabled(true);
1040            pComboBox->setGeometry(option.rect);
1041            return pComboBox;
1042  }  }
1043    
1044  int qsamplerChannelRoutingComboBox::currentItem (void) const  
1045    void ChannelRoutingDelegate::setEditorData ( QWidget *pEditor,
1046            const QModelIndex &index) const
1047  {  {
1048          return m_iCurrentItem;          ChannelRoutingItem item = index.model()->data(index,
1049                    Qt::DisplayRole).value<ChannelRoutingItem> ();
1050            QComboBox* pComboBox = static_cast<QComboBox*> (pEditor);
1051            pComboBox->setCurrentIndex(item.selection);
1052  }  }
1053    
1054  // Virtual implemetations.  
1055  QWidget *qsamplerChannelRoutingComboBox::createEditor (void) const  void ChannelRoutingDelegate::setModelData ( QWidget* pEditor,
1056            QAbstractItemModel *pModel, const QModelIndex& index ) const
1057  {  {
1058          QComboBox *pComboBox = new QComboBox(QTableItem::table()->viewport());          QComboBox *pComboBox = static_cast<QComboBox*> (pEditor);
1059          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;  
1060  }  }
1061    
1062  void qsamplerChannelRoutingComboBox::setContentFromEditor ( QWidget *pWidget )  
1063    void ChannelRoutingDelegate::updateEditorGeometry ( QWidget *pEditor,
1064            const QStyleOptionViewItem& option, const QModelIndex &/* index */) const
1065  {  {
1066          if (pWidget->inherits("QComboBox")) {          pEditor->setGeometry(option.rect);
                 QComboBox *pComboBox = (QComboBox *) pWidget;  
                 m_iCurrentItem = pComboBox->currentItem();  
                 QTableItem::setText(pComboBox->currentText());  
         }  
         else QTableItem::setContentFromEditor(pWidget);  
1067  }  }
1068    
1069    

Legend:
Removed from v.1022  
changed lines
  Added in v.1527

  ViewVC Help
Powered by ViewVC