/[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 2108 by capela, Thu Jul 15 08:03:32 2010 UTC revision 3404 by capela, Wed Jan 10 18:55:12 2018 UTC
# Line 1  Line 1 
1  // qsamplerChannel.cpp  // qsamplerChannel.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2010, 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     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
# Line 32  Line 32 
32    
33  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
34  #include "gig.h"  #include "gig.h"
35    #ifdef CONFIG_LIBGIG_SF2
36    #include "SF.h"
37    #endif
38  #endif  #endif
39    
40  namespace QSampler {  namespace QSampler {
41    
42  #define QSAMPLER_INSTRUMENT_MAX 100  #define QSAMPLER_INSTRUMENT_MAX 128
43    
44  #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))  #define UNICODE_RIGHT_ARROW     QChar(char(0x92), char(0x21))
45    
# Line 757  bool Channel::channelSetup ( QWidget *pP Line 760  bool Channel::channelSetup ( QWidget *pP
760    
761    
762  // Redirected messages output methods.  // Redirected messages output methods.
763  void Channel::appendMessages( const QString& s ) const  void Channel::appendMessages ( const QString& sText ) const
764  {  {
765          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
766          if (pMainForm)          if (pMainForm)
767                  pMainForm->appendMessages(channelName() + ' ' + s);                  pMainForm->appendMessages(channelName() + ' ' + sText);
768  }  }
769    
770  void Channel::appendMessagesColor( const QString& s,  void Channel::appendMessagesColor (
771          const QString& c ) const          const QString& sText, const QString& sColor ) const
772  {  {
773          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
774          if (pMainForm)          if (pMainForm)
775                  pMainForm->appendMessagesColor(channelName() + ' ' + s, c);                  pMainForm->appendMessagesColor(channelName() + ' ' + sText, sColor);
776  }  }
777    
778  void Channel::appendMessagesText( const QString& s ) const  void Channel::appendMessagesText ( const QString& sText ) const
779  {  {
780          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
781          if (pMainForm)          if (pMainForm)
782                  pMainForm->appendMessagesText(channelName() + ' ' + s);                  pMainForm->appendMessagesText(channelName() + ' ' + sText);
783  }  }
784    
785  void Channel::appendMessagesError( const QString& s ) const  void Channel::appendMessagesError ( const QString& sText ) 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" + sText);
790  }  }
791    
792  void Channel::appendMessagesClient( const QString& s ) const  void Channel::appendMessagesClient ( const QString& sText ) const
793  {  {
794          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
795          if (pMainForm)          if (pMainForm)
796                  pMainForm->appendMessagesClient(channelName() + ' ' + s);                  pMainForm->appendMessagesClient(channelName() + ' ' + sText);
797  }  }
798    
799    
800  // Context menu event handler.  // Context menu event handler.
801  void Channel::contextMenuEvent( QContextMenuEvent *pEvent )  void Channel::contextMenuEvent ( QContextMenuEvent *pEvent )
802  {  {
803          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
804          if (pMainForm)          if (pMainForm)
# Line 822  bool Channel::isDlsInstrumentFile ( cons Line 825  bool Channel::isDlsInstrumentFile ( cons
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 Channel::getInstrumentList( const QString& sInstrumentFile,  QStringList Channel::getInstrumentList (
849          bool bInstrumentNames )          const QString& sInstrumentFile, bool bInstrumentNames )
850  {  {
851          QStringList instlist;          QStringList instlist;
852    
853          if (isDlsInstrumentFile(sInstrumentFile)) {          const QFileInfo fi(sInstrumentFile);
854          #ifdef CONFIG_LIBGIG          if (!fi.exists()) {
855                  if (bInstrumentNames) {                  instlist.append(noInstrumentName());
856                    return instlist;
857            }
858    
859    #ifdef CONFIG_LIBGIG
860            if (bInstrumentNames) {
861                    if (isDlsInstrumentFile(sInstrumentFile)) {
862                          RIFF::File *pRiff                          RIFF::File *pRiff
863                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());
864                          gig::File  *pGig  = new gig::File(pRiff);                          gig::File *pGig = new gig::File(pRiff);
865                  #if HAVE_LIBGIG_SETAUTOLOAD                  #ifdef CONFIG_LIBGIG_SETAUTOLOAD
866                          // prevent sleepy response time on large .gig files                          // prevent sleepy response time on large .gig files
867                          pGig->SetAutoLoad(false);                          pGig->SetAutoLoad(false);
868                  #endif                  #endif
# Line 846  QStringList Channel::getInstrumentList( Line 874  QStringList Channel::getInstrumentList(
874                          delete pGig;                          delete pGig;
875                          delete pRiff;                          delete pRiff;
876                  }                  }
877            #ifdef CONFIG_LIBGIG_SF2
878                    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          #endif
897          }          }
898    #endif
899    
900          if (instlist.isEmpty()) {          if (instlist.isEmpty()) {
901                  QFileInfo fi(sInstrumentFile);                  for (int iIndex = 0; iIndex < QSAMPLER_INSTRUMENT_MAX; ++iIndex) {
902                  if (fi.exists()) {                          instlist.append(fi.fileName()
903                          QString sInstrumentName = fi.fileName();                                  + " [" + QString::number(iIndex) + "]");
                         int iInstrumentNr = 0;  
                         while (iInstrumentNr < QSAMPLER_INSTRUMENT_MAX) {  
                                 instlist.append(sInstrumentName  
                                         + " [" + QString::number(++iInstrumentNr) + "]");  
                         }  
904                  }                  }
                 else instlist.append(noInstrumentName());  
905          }          }
906    
907          return instlist;          return instlist;
# Line 867  QStringList Channel::getInstrumentList( Line 909  QStringList Channel::getInstrumentList(
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 Channel::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    
921          if (isDlsInstrumentFile(sInstrumentFile)) {  #ifdef CONFIG_LIBGIG
922          #ifdef CONFIG_LIBGIG          if (bInstrumentNames) {
923                  if (bInstrumentNames) {                  if (isDlsInstrumentFile(sInstrumentFile)) {
924                          RIFF::File *pRiff                          RIFF::File *pRiff
925                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());                                  = new RIFF::File(sInstrumentFile.toUtf8().constData());
926                          gig::File *pGig = new gig::File(pRiff);                          gig::File *pGig = new gig::File(pRiff);
927                  #if HAVE_LIBGIG_SETAUTOLOAD                  #ifdef CONFIG_LIBGIG_SETAUTOLOAD
928                          // prevent sleepy response time on large .gig files                          // prevent sleepy response time on large .gig files
929                          pGig->SetAutoLoad(false);                          pGig->SetAutoLoad(false);
930                  #endif                  #endif
# Line 895  QString Channel::getInstrumentName( cons Line 941  QString Channel::getInstrumentName( cons
941                          delete pGig;                          delete pGig;
942                          delete pRiff;                          delete pRiff;
943                  }                  }
944            #ifdef CONFIG_LIBGIG_SF2
945                    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          #endif
957          }          }
958    #endif
959    
960          if (sInstrumentName.isEmpty()) {          if (sInstrumentName.isEmpty()) {
961                  QFileInfo fi(sInstrumentFile);                  sInstrumentName  = fi.fileName();
962                  if (fi.exists()) {                  sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";
                         sInstrumentName  = fi.fileName();  
                         sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";  
                 }  
                 else sInstrumentName = noInstrumentName();  
963          }          }
964    
965          return sInstrumentName;          return sInstrumentName;
# Line 1021  void ChannelRoutingModel::refresh ( Devi Line 1076  void ChannelRoutingModel::refresh ( Devi
1076          m_pDevice = pDevice;          m_pDevice = pDevice;
1077          m_routing = routing;          m_routing = routing;
1078          // inform the outer world (QTableView) that our data changed          // inform the outer world (QTableView) that our data changed
1079    #if QT_VERSION < 0x050000
1080          QAbstractTableModel::reset();          QAbstractTableModel::reset();
1081    #else
1082            QAbstractTableModel::beginResetModel();
1083            QAbstractTableModel::endResetModel();
1084    #endif
1085  }  }
1086    
1087    

Legend:
Removed from v.2108  
changed lines
  Added in v.3404

  ViewVC Help
Powered by ViewVC