/[svn]/qsampler/trunk/src/qsamplerMainForm.ui.h
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMainForm.ui.h

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

revision 753 by capela, Wed Aug 24 17:44:59 2005 UTC revision 995 by capela, Thu Dec 21 13:58:52 2006 UTC
# Line 2  Line 2 
2  //  //
3  // ui.h extension file, included from the uic-generated form implementation.  // ui.h extension file, included from the uic-generated form implementation.
4  /****************************************************************************  /****************************************************************************
5     Copyright (C) 2004-2005, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2006, rncbc aka Rui Nuno Capela. All rights reserved.
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 14  Line 14 
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License along
18     along with this program; if not, write to the Free Software     with this program; if not, write to the Free Software Foundation, Inc.,
19     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20    
21  *****************************************************************************/  *****************************************************************************/
22    
# Line 41  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    #include "qsamplerInstrumentList.h"
45    
46    #include "qsamplerInstrumentListForm.h"
47  #include "qsamplerDeviceForm.h"  #include "qsamplerDeviceForm.h"
48  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
49    
# Line 102  private: Line 104  private:
104  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
105  // qsamplerMainForm -- Main window form implementation.  // qsamplerMainForm -- Main window form implementation.
106    
107    // Kind of singleton reference.
108    qsamplerMainForm *qsamplerMainForm::g_pMainForm = NULL;
109    
110    
111  // Kind of constructor.  // Kind of constructor.
112  void qsamplerMainForm::init (void)  void qsamplerMainForm::init (void)
113  {  {
114            // Pseudo-singleton reference setup.
115            g_pMainForm = this;
116    
117      // Initialize some pointer references.      // Initialize some pointer references.
118      m_pOptions = NULL;      m_pOptions = NULL;
119    
120      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
121      m_pMessages   = NULL;      m_pMessages = NULL;
122        m_pInstrumentListForm = NULL;
123      m_pDeviceForm = NULL;      m_pDeviceForm = NULL;
124    
125      // We'll start clean.      // We'll start clean.
# Line 186  void qsamplerMainForm::destroy (void) Line 196  void qsamplerMainForm::destroy (void)
196      // Finally drop any widgets around...      // Finally drop any widgets around...
197      if (m_pDeviceForm)      if (m_pDeviceForm)
198          delete m_pDeviceForm;          delete m_pDeviceForm;
199        if (m_pInstrumentListForm)
200            delete m_pInstrumentListForm;
201      if (m_pMessages)      if (m_pMessages)
202          delete m_pMessages;          delete m_pMessages;
203      if (m_pWorkspace)      if (m_pWorkspace)
# Line 204  void qsamplerMainForm::destroy (void) Line 216  void qsamplerMainForm::destroy (void)
216      // Delete recentfiles menu.      // Delete recentfiles menu.
217      if (m_pRecentFilesMenu)      if (m_pRecentFilesMenu)
218          delete m_pRecentFilesMenu;          delete m_pRecentFilesMenu;
219    
220            // Pseudo-singleton reference shut-down.
221            g_pMainForm = NULL;
222  }  }
223    
224    
# Line 214  void qsamplerMainForm::setup ( qsamplerO Line 229  void qsamplerMainForm::setup ( qsamplerO
229      m_pOptions = pOptions;      m_pOptions = pOptions;
230    
231      // What style do we create these forms?      // What style do we create these forms?
232      WFlags wflags = Qt::WType_TopLevel;          Qt::WFlags wflags = Qt::WStyle_Customize
233                    | Qt::WStyle_NormalBorder
234                    | Qt::WStyle_Title
235                    | Qt::WStyle_SysMenu
236                    | Qt::WStyle_MinMax
237                    | Qt::WType_TopLevel;
238      if (m_pOptions->bKeepOnTop)      if (m_pOptions->bKeepOnTop)
239          wflags |= Qt::WStyle_Tool;          wflags |= Qt::WStyle_Tool;
240      // Some child forms are to be created right now.      // Some child forms are to be created right now.
241      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
242      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
243      m_pDeviceForm->setMainForm(this); // An important life immutable!  #ifdef CONFIG_MIDI_INSTRUMENT
244        m_pInstrumentListForm = new qsamplerInstrumentListForm(this, 0, wflags);
245            QObject::connect(m_pInstrumentListForm->InstrumentList,
246                    SIGNAL(instrumentsChanged()),
247                    SLOT(sessionDirty()));
248    #else
249            viewInstrumentsAction->setEnabled(false);
250    #endif
251      // Set message defaults...      // Set message defaults...
252      updateMessagesFont();      updateMessagesFont();
253      updateMessagesLimit();      updateMessagesLimit();
254      updateMessagesCapture();      updateMessagesCapture();
255      // Set the visibility signal.      // Set the visibility signal.
256      QObject::connect(m_pMessages, SIGNAL(visibilityChanged(bool)), this, SLOT(stabilizeForm()));      QObject::connect(m_pMessages,
257                    SIGNAL(visibilityChanged(bool)),
258                    SLOT(stabilizeForm()));
259    
260      // Initial decorations toggle state.      // Initial decorations toggle state.
261      viewMenubarAction->setOn(m_pOptions->bMenubar);      viewMenubarAction->setOn(m_pOptions->bMenubar);
# Line 251  void qsamplerMainForm::setup ( qsamplerO Line 280  void qsamplerMainForm::setup ( qsamplerO
280      }      }
281      // Try to restore old window positioning and initial visibility.      // Try to restore old window positioning and initial visibility.
282      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
283        m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
284      m_pOptions->loadWidgetGeometry(m_pDeviceForm);      m_pOptions->loadWidgetGeometry(m_pDeviceForm);
285    
286      // Final startup stabilization...      // Final startup stabilization...
# Line 291  bool qsamplerMainForm::queryClose (void) Line 321  bool qsamplerMainForm::queryClose (void)
321              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
322              // And the children, and the main windows state,.              // And the children, and the main windows state,.
323                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
324                            m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
325                          m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this);
326                          // Close popup widgets.                          // Close popup widgets.
327                            if (m_pInstrumentListForm)
328                                    m_pInstrumentListForm->close();
329                          if (m_pDeviceForm)                          if (m_pDeviceForm)
330                                  m_pDeviceForm->close();                                  m_pDeviceForm->close();
331              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
# Line 351  void qsamplerMainForm::dropEvent ( QDrop Line 384  void qsamplerMainForm::dropEvent ( QDrop
384                  const QString& sPath = *iter;                  const QString& sPath = *iter;
385                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
386                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
387                          qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel();
388                          if (pChannel == NULL)                          if (pChannel == NULL)
389                                  return;                                  return;
390                          // Start setting the instrument filename...                          // Start setting the instrument filename...
# Line 371  void qsamplerMainForm::dropEvent ( QDrop Line 404  void qsamplerMainForm::dropEvent ( QDrop
404                          m_iDirtyCount++;                          m_iDirtyCount++;
405                          stabilizeForm();                          stabilizeForm();
406                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
407                  else if (closeSession(true))                  else if (closeSession(true)) {
408                          loadSessionFile(sPath);                          loadSessionFile(sPath);
409                            break;
410                    }
411                  // Make it look responsive...:)                  // Make it look responsive...:)
412                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
413          }          }
# Line 417  qsamplerOptions *qsamplerMainForm::optio Line 452  qsamplerOptions *qsamplerMainForm::optio
452      return m_pOptions;      return m_pOptions;
453  }  }
454    
455    
456  // The LSCP client descriptor property.  // The LSCP client descriptor property.
457  lscp_client_t *qsamplerMainForm::client (void)  lscp_client_t *qsamplerMainForm::client (void)
458  {  {
# Line 424  lscp_client_t *qsamplerMainForm::client Line 460  lscp_client_t *qsamplerMainForm::client
460  }  }
461    
462    
463    // The pseudo-singleton instance accessor.
464    qsamplerMainForm *qsamplerMainForm::getInstance (void)
465    {
466            return g_pMainForm;
467    }
468    
469    
470  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
471  // qsamplerMainForm -- Session file stuff.  // qsamplerMainForm -- Session file stuff.
472    
# Line 471  bool qsamplerMainForm::openSession (void Line 514  bool qsamplerMainForm::openSession (void
514    
515      // Ask for the filename to open...      // Ask for the filename to open...
516      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
517              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
518              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
519              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
520              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
521      );      );
522    
523      // Have we cancelled?      // Have we cancelled?
# Line 505  bool qsamplerMainForm::saveSession ( boo Line 548  bool qsamplerMainForm::saveSession ( boo
548              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
549          // Prompt the guy...          // Prompt the guy...
550          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
551                  sFilename,                              // Start here.                          sFilename,                              // Start here.
552                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
553                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
554                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
555          );          );
556          // Have we cancelled it?          // Have we cancelled it?
557          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 518  bool qsamplerMainForm::saveSession ( boo Line 561  bool qsamplerMainForm::saveSession ( boo
561              sFilename += ".lscp";              sFilename += ".lscp";
562          // Check if already exists...          // Check if already exists...
563          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
564              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
565                                    QSAMPLER_TITLE ": " + tr("Warning"),
566                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
567                     "\"%1\"\n\n"                     "\"%1\"\n\n"
568                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 540  bool qsamplerMainForm::closeSession ( bo Line 584  bool qsamplerMainForm::closeSession ( bo
584    
585      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
586      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
587          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
588                            QSAMPLER_TITLE ": " + tr("Warning"),
589              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
590              "\"%1\"\n\n"              "\"%1\"\n\n"
591              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 593  bool qsamplerMainForm::loadSessionFile ( Line 638  bool qsamplerMainForm::loadSessionFile (
638          return false;          return false;
639      }      }
640    
641            // Tell the world we'll take some time...
642            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
643    
644      // Read the file.      // Read the file.
645            int iLine = 0;
646      int iErrors = 0;      int iErrors = 0;
647      QTextStream ts(&file);      QTextStream ts(&file);
648      while (!ts.atEnd()) {      while (!ts.atEnd()) {
649          // Read the line.          // Read the line.
650          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
651                    iLine++;
652          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
653          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
             appendMessagesColor(sCommand, "#996633");  
654              // Remember that, no matter what,              // Remember that, no matter what,
655              // all LSCP commands are CR/LF terminated.              // all LSCP commands are CR/LF terminated.
656              sCommand += "\r\n";              sCommand += "\r\n";
657              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
658                                    appendMessagesColor(QString("%1(%2): %3")
659                                            .arg(QFileInfo(sFilename).fileName()).arg(iLine)
660                                            .arg(sCommand.simplifyWhiteSpace()), "#996633");
661                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
662                  iErrors++;                  iErrors++;
663              }              }
# Line 620  bool qsamplerMainForm::loadSessionFile ( Line 672  bool qsamplerMainForm::loadSessionFile (
672          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
673          updateSession();          updateSession();
674    
675            // We're fornerly done.
676            QApplication::restoreOverrideCursor();
677    
678          // Have we any errors?          // Have we any errors?
679          if (iErrors > 0)          if (iErrors > 0)
680                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
# Line 643  bool qsamplerMainForm::loadSessionFile ( Line 698  bool qsamplerMainForm::loadSessionFile (
698  // Save current session to specific file path.  // Save current session to specific file path.
699  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )
700  {  {
701            if (m_pClient == NULL)
702                    return false;
703    
704            // Check whether server is apparently OK...
705            if (::lscp_get_channels(m_pClient) < 0) {
706                    appendMessagesClient("lscp_get_channels");
707                    return false;
708            }
709    
710      // Open and write into real file.      // Open and write into real file.
711      QFile file(sFilename);      QFile file(sFilename);
712      if (!file.open(IO_WriteOnly | IO_Truncate)) {      if (!file.open(IO_WriteOnly | IO_Truncate)) {
# Line 650  bool qsamplerMainForm::saveSessionFile ( Line 714  bool qsamplerMainForm::saveSessionFile (
714          return false;          return false;
715      }      }
716    
717            // Tell the world we'll take some time...
718            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
719    
720      // Write the file.      // Write the file.
721      int  iErrors = 0;      int  iErrors = 0;
722      QTextStream ts(&file);      QTextStream ts(&file);
# Line 666  bool qsamplerMainForm::saveSessionFile ( Line 733  bool qsamplerMainForm::saveSessionFile (
733         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
734      ts << "#"  << endl;      ts << "#"  << endl;
735      ts << endl;      ts << endl;
736    
737          // It is assumed that this new kind of device+session file          // It is assumed that this new kind of device+session file
738          // will be loaded from a complete          // will be loaded from a complete initialized server...
739          int *piDeviceIDs;          int *piDeviceIDs;
740          int  iDevice;          int  iDevice;
741          ts << "RESET" << endl;          ts << "RESET" << endl;
742    
743          // Audio device mapping.          // Audio device mapping.
744          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
745          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
746          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
747                  ts << endl;                  ts << endl;
748                  qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);                  qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);
749                  // Audio device specification...                  // Audio device specification...
750                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
751                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
# Line 708  bool qsamplerMainForm::saveSessionFile ( Line 777  bool qsamplerMainForm::saveSessionFile (
777                  }                  }
778                  // Audio device index/id mapping.                  // Audio device index/id mapping.
779                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap[device.deviceID()] = iDevice;
780          // Try to keep it snappy :)                  // Try to keep it snappy :)
781          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
782          }          }
783    
784          // MIDI device mapping.          // MIDI device mapping.
785          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
786          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
787          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
788                  ts << endl;                  ts << endl;
789                  qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);                  qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);
790                  // MIDI device specification...                  // MIDI device specification...
791                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
792                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
# Line 748  bool qsamplerMainForm::saveSessionFile ( Line 818  bool qsamplerMainForm::saveSessionFile (
818                  }                  }
819                  // MIDI device index/id mapping.                  // MIDI device index/id mapping.
820                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap[device.deviceID()] = iDevice;
821          // Try to keep it snappy :)                  // Try to keep it snappy :)
822          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
823          }          }
824          ts << endl;          ts << endl;
825    
826    #ifdef CONFIG_MIDI_INSTRUMENT
827            // MIDI instrument mapping...
828            QMap<int, int> midiInstrumentMap;
829            int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
830            for (int iMap = 0; piMaps && piMaps[iMap] >= 0; iMap++) {
831                    int iMidiMap = piMaps[iMap];
832                    const char *pszMapName
833                            = ::lscp_get_midi_instrument_map_name(m_pClient, iMidiMap);
834                    ts << "# " << tr("MIDI instrument map") << " " << iMap;
835                    if (pszMapName)
836                            ts << " - " << pszMapName;
837                    ts << endl;
838                    ts << "ADD MIDI_INSTRUMENT_MAP";
839                    if (pszMapName)
840                            ts << " '" << pszMapName << "'";
841                    ts << endl;
842                    // MIDI instrument mapping...
843                    lscp_midi_instrument_t *pInstrs
844                            = ::lscp_list_midi_instruments(m_pClient, iMidiMap);
845                    for (int iInstr = 0; pInstrs && pInstrs[iInstr].map >= 0; iInstr++) {
846                            lscp_midi_instrument_info_t *pInstrInfo
847                                    = ::lscp_get_midi_instrument_info(m_pClient, &pInstrs[iInstr]);
848                            if (pInstrInfo) {
849                                    ts << "MAP MIDI_INSTRUMENT "
850                                            << iMap                        << " "
851                                            << pInstrs[iInstr].bank        << " "
852                                            << pInstrs[iInstr].prog        << " "
853                                            << pInstrInfo->engine_name     << " '"
854                                            << pInstrInfo->instrument_file << "' "
855                                            << pInstrInfo->instrument_nr   << " "
856                                            << pInstrInfo->volume          << " ";
857                                    switch (pInstrInfo->load_mode) {
858                                            case LSCP_LOAD_PERSISTENT:
859                                                    ts << "PERSISTENT";
860                                                    break;
861                                            case LSCP_LOAD_ON_DEMAND_HOLD:
862                                                    ts << "ON_DEMAND_HOLD";
863                                                    break;
864                                            case LSCP_LOAD_ON_DEMAND:
865                                            case LSCP_LOAD_DEFAULT:
866                                            default:
867                                                    ts << "ON_DEMAND";
868                                                    break;
869                                    }
870                                    if (pInstrInfo->name)
871                                            ts << " '" << pInstrInfo->name << "'";
872                                    ts << endl;
873                            }       // Check for errors...
874                            else if (::lscp_client_get_errno(m_pClient)) {
875                                    appendMessagesClient("lscp_get_midi_instrument_info");
876                                    iErrors++;
877                            }
878                            // MIDI device index/id mapping.
879                            midiInstrumentMap[iMidiMap] = iMap;
880                            // Try to keep it snappy :)
881                            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
882                    }
883                    // Check for errors...
884                    if (pInstrs)
885                            ts << endl;
886                    else if (::lscp_client_get_errno(m_pClient)) {
887                            appendMessagesClient("lscp_list_midi_instruments");
888                            iErrors++;
889                    }
890            }
891            // Check for errors...
892            if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) {
893                    appendMessagesClient("lscp_list_midi_instrument_maps");
894                    iErrors++;
895            }
896    #endif  // CONFIG_MIDI_INSTRUMENT
897    
898          // Sampler channel mapping.          // Sampler channel mapping.
899      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
900      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
# Line 784  bool qsamplerMainForm::saveSessionFile ( Line 927  bool qsamplerMainForm::saveSessionFile (
927                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
928                  ts << endl;                  ts << endl;
929                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
930                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;                                  if (pChannel->instrumentStatus() < 100) ts << "# ";
931                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' "
932                  if (pChannel->channelMute())                                          << pChannel->instrumentNr() << " " << iChannel << endl;
933                          ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;                                  qsamplerChannelRoutingMap::ConstIterator audioRoute;
934                  if (pChannel->channelSolo())                                  for (audioRoute = pChannel->audioRouting().begin();
935                          ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;                                                  audioRoute != pChannel->audioRouting().end();
936                                                            ++audioRoute) {
937                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
938                                                    << " " << audioRoute.key()
939                                                    << " " << audioRoute.data() << endl;
940                                    }
941                                    ts << "SET CHANNEL VOLUME " << iChannel
942                                            << " " << pChannel->volume() << endl;
943                                    if (pChannel->channelMute())
944                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
945                                    if (pChannel->channelSolo())
946                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
947    #ifdef CONFIG_MIDI_INSTRUMENT
948                                    if (pChannel->midiMap() >= 0) {
949                                            ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannel
950                                                    << " " << midiInstrumentMap[pChannel->midiMap()] << endl;
951                                    }
952    #endif
953                  ts << endl;                  ts << endl;
954              }              }
955          }          }
# Line 800  bool qsamplerMainForm::saveSessionFile ( Line 960  bool qsamplerMainForm::saveSessionFile (
960      // Ok. we've wrote it.      // Ok. we've wrote it.
961      file.close();      file.close();
962    
963            // We're fornerly done.
964            QApplication::restoreOverrideCursor();
965    
966      // Have we any errors?      // Have we any errors?
967      if (iErrors > 0)      if (iErrors > 0)
968          appendMessagesError(tr("Some settings could not be saved\nto \"%1\" session file.\n\nSorry.").arg(sFilename));          appendMessagesError(tr("Some settings could not be saved\nto \"%1\" session file.\n\nSorry.").arg(sFilename));
# Line 881  void qsamplerMainForm::fileReset (void) Line 1044  void qsamplerMainForm::fileReset (void)
1044          return;          return;
1045    
1046      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
1047      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
1048                    QSAMPLER_TITLE ": " + tr("Warning"),
1049          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
1050             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
1051             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
# Line 891  void qsamplerMainForm::fileReset (void) Line 1055  void qsamplerMainForm::fileReset (void)
1055          return;          return;
1056    
1057      // Just do the reset, after closing down current session...      // Just do the reset, after closing down current session...
1058      if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {      if (closeSession(true)) {
1059          appendMessagesClient("lscp_reset_sampler");  #ifdef CONFIG_MIDI_INSTRUMENT
1060          appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));                  // Reset all MIDI instrument mapping, if any.
1061          return;                  int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
1062                    for (int iMap = 0; piMaps && piMaps[iMap] >= 0; ++iMap) {
1063                            int iMidiMap = piMaps[iMap];
1064                            if (::lscp_clear_midi_instruments(m_pClient, iMidiMap) != LSCP_OK)
1065                                    appendMessagesClient("lscp_clear_midi_instruments");
1066                            if (::lscp_remove_midi_instrument_map(m_pClient, iMidiMap) != LSCP_OK)
1067                                    appendMessagesClient("lscp_remove_midi_instrument_map");
1068                    }
1069                    // Check for errors...
1070                    if (piMaps == NULL && ::lscp_client_get_errno(m_pClient))
1071                            appendMessagesClient("lscp_list_midi_instrument_maps");
1072    #endif  // CONFIG_MIDI_INSTRUMENT
1073                    // actually do the sampler reset...
1074                    if (::lscp_reset_sampler(m_pClient) != LSCP_OK) {
1075                            appendMessagesClient("lscp_reset_sampler");
1076                            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
1077                            return;
1078                    }
1079      }      }
1080    
1081      // Log this.      // Log this.
# Line 916  void qsamplerMainForm::fileRestart (void Line 1097  void qsamplerMainForm::fileRestart (void
1097      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
1098      // (if we're currently up and running)      // (if we're currently up and running)
1099      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
1100          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
1101                            QSAMPLER_TITLE ": " + tr("Warning"),
1102              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
1103                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
1104                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
# Line 953  void qsamplerMainForm::editAddChannel (v Line 1135  void qsamplerMainForm::editAddChannel (v
1135          return;          return;
1136    
1137      // Just create the channel instance...      // Just create the channel instance...
1138      qsamplerChannel *pChannel = new qsamplerChannel(this);      qsamplerChannel *pChannel = new qsamplerChannel();
1139      if (pChannel == NULL)      if (pChannel == NULL)
1140          return;          return;
1141    
# Line 992  void qsamplerMainForm::editRemoveChannel Line 1174  void qsamplerMainForm::editRemoveChannel
1174    
1175      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1176      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1177          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1178                            QSAMPLER_TITLE ": " + tr("Warning"),
1179              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1180                 "%1\n\n"                 "%1\n\n"
1181                 "Are you sure?")                 "Are you sure?")
# Line 1115  void qsamplerMainForm::viewMessages ( bo Line 1298  void qsamplerMainForm::viewMessages ( bo
1298  }  }
1299    
1300    
1301    // Show/hide the MIDI instrument list-view form.
1302    void qsamplerMainForm::viewInstruments (void)
1303    {
1304            if (m_pOptions == NULL)
1305                    return;
1306    
1307            if (m_pInstrumentListForm) {
1308                    m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
1309                    if (m_pInstrumentListForm->isVisible()) {
1310                            m_pInstrumentListForm->hide();
1311                    } else {
1312                            m_pInstrumentListForm->show();
1313                            m_pInstrumentListForm->raise();
1314                            m_pInstrumentListForm->setActiveWindow();
1315                    }
1316            }
1317    }
1318    
1319    
1320  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1321  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1322  {  {
# Line 1123  void qsamplerMainForm::viewDevices (void Line 1325  void qsamplerMainForm::viewDevices (void
1325    
1326          if (m_pDeviceForm) {          if (m_pDeviceForm) {
1327                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
                 m_pDeviceForm->setClient(m_pClient);  
1328                  if (m_pDeviceForm->isVisible()) {                  if (m_pDeviceForm->isVisible()) {
1329                          m_pDeviceForm->hide();                          m_pDeviceForm->hide();
1330                  } else {                  } else {
# Line 1175  void qsamplerMainForm::viewOptions (void Line 1376  void qsamplerMainForm::viewOptions (void
1376                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1377                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1378                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1379                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this,
1380                                            QSAMPLER_TITLE ": " + tr("Information"),
1381                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1382                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1383                  updateMessagesCapture();                  updateMessagesCapture();
# Line 1308  void qsamplerMainForm::helpAbout (void) Line 1510  void qsamplerMainForm::helpAbout (void)
1510      sText += tr("Sampler channel Mute/Solo support disabled.");      sText += tr("Sampler channel Mute/Solo support disabled.");
1511      sText += "</font></small><br />";      sText += "</font></small><br />";
1512  #endif  #endif
1513    #ifndef CONFIG_MIDI_INSTRUMENT
1514        sText += "<small><font color=\"red\">";
1515        sText += tr("MIDI instrument mapping support disabled.");
1516        sText += "</font></small><br />";
1517    #endif
1518      sText += "<br />\n";      sText += "<br />\n";
1519      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1520      sText += ::lscp_client_package();      sText += ::lscp_client_package();
# Line 1343  void qsamplerMainForm::stabilizeForm (vo Line 1550  void qsamplerMainForm::stabilizeForm (vo
1550      // Update the main application caption...      // Update the main application caption...
1551      QString sSessionName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1552      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1553          sSessionName += '*';          sSessionName += " *";
1554      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1555    
1556      // Update the main menu state...      // Update the main menu state...
# Line 1362  void qsamplerMainForm::stabilizeForm (vo Line 1569  void qsamplerMainForm::stabilizeForm (vo
1569      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1570      editResetAllChannelsAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1571      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1572      viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());  #ifdef CONFIG_MIDI_INSTRUMENT
1573            viewInstrumentsAction->setOn(m_pInstrumentListForm
1574                    && m_pInstrumentListForm->isVisible());
1575            viewInstrumentsAction->setEnabled(bHasClient);
1576    #endif
1577            viewDevicesAction->setOn(m_pDeviceForm
1578                    && m_pDeviceForm->isVisible());
1579      viewDevicesAction->setEnabled(bHasClient);      viewDevicesAction->setEnabled(bHasClient);
1580      channelsArrangeAction->setEnabled(bHasChannel);      channelsArrangeAction->setEnabled(bHasChannel);
1581    
# Line 1413  void qsamplerMainForm::channelStripChang Line 1626  void qsamplerMainForm::channelStripChang
1626  // Grab and restore current sampler channels session.  // Grab and restore current sampler channels session.
1627  void qsamplerMainForm::updateSession (void)  void qsamplerMainForm::updateSession (void)
1628  {  {
1629    #ifdef CONFIG_MIDI_INSTRUMENT
1630            // FIXME Make some room for default instrument maps...
1631            int iMaps = ::lscp_get_midi_instrument_maps(m_pClient);
1632            if (iMaps < 0)
1633                    appendMessagesClient("lscp_get_midi_instrument_maps");
1634            else if (iMaps < 1) {
1635                    ::lscp_add_midi_instrument_map(m_pClient, tr("Chromatic").latin1());
1636                    ::lscp_add_midi_instrument_map(m_pClient, tr("Drum Kits").latin1());
1637            }
1638    #endif
1639    
1640          // Retrieve the current channel list.          // Retrieve the current channel list.
1641          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
1642          if (piChannelIDs == NULL) {          if (piChannelIDs == NULL) {
# Line 1420  void qsamplerMainForm::updateSession (vo Line 1644  void qsamplerMainForm::updateSession (vo
1644                          appendMessagesClient("lscp_list_channels");                          appendMessagesClient("lscp_list_channels");
1645                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1646                  }                  }
1647                  return;          } else {
1648                    // Try to (re)create each channel.
1649                    m_pWorkspace->setUpdatesEnabled(false);
1650                    for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1651                            // Check if theres already a channel strip for this one...
1652                            if (!channelStrip(piChannelIDs[iChannel]))
1653                                    createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));
1654                    }
1655                    m_pWorkspace->setUpdatesEnabled(true);
1656          }          }
1657    
1658          // Try to (re)create each channel.      // Do we auto-arrange?
1659          m_pWorkspace->setUpdatesEnabled(false);      if (m_pOptions && m_pOptions->bAutoArrange)
1660          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {          channelsArrange();
1661                  // Check if theres already a channel strip for this one...  
1662                  if (!channelStrip(piChannelIDs[iChannel]))          // Remember to refresh devices and instruments...
1663                          createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));          if (m_pInstrumentListForm)
1664                  // Make it visibly responsive...              m_pInstrumentListForm->refreshInstruments();
                 QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
         }  
         m_pWorkspace->setUpdatesEnabled(true);  
           
         // Remember to refresh devices  
1665          if (m_pDeviceForm)          if (m_pDeviceForm)
1666              m_pDeviceForm->refreshDevices();              m_pDeviceForm->refreshDevices();
1667  }  }
# Line 1607  void qsamplerMainForm::appendMessagesErr Line 1834  void qsamplerMainForm::appendMessagesErr
1834    
1835      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1836    
1837      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));          // Make it look responsive...:)
1838            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1839    
1840        QMessageBox::critical(this,
1841                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1842  }  }
1843    
1844    
# Line 1620  void qsamplerMainForm::appendMessagesCli Line 1851  void qsamplerMainForm::appendMessagesCli
1851      appendMessagesColor(s + QString(": %1 (errno=%2)")      appendMessagesColor(s + QString(": %1 (errno=%2)")
1852          .arg(::lscp_client_get_result(m_pClient))          .arg(::lscp_client_get_result(m_pClient))
1853          .arg(::lscp_client_get_errno(m_pClient)), "#996666");          .arg(::lscp_client_get_errno(m_pClient)), "#996666");
1854    
1855            // Make it look responsive...:)
1856            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1857  }  }
1858    
1859    
# Line 1879  void qsamplerMainForm::startServer (void Line 2113  void qsamplerMainForm::startServer (void
2113    
2114      // Is the server process instance still here?      // Is the server process instance still here?
2115      if (m_pServer) {      if (m_pServer) {
2116          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
2117                            QSAMPLER_TITLE ": " + tr("Warning"),
2118              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
2119                 "Maybe it ss already started."),                 "Maybe it ss already started."),
2120              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 2051  bool qsamplerMainForm::startClient (void Line 2286  bool qsamplerMainForm::startClient (void
2286      // Log success here.      // Log success here.
2287      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2288    
2289          // Hard-notify device configuration form,          // Hard-notify instrumnet and device configuration forms,
2290          // if visible, that we're ready...          // if visible, that we're ready...
2291          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pInstrumentListForm)
2292              m_pDeviceForm->setClient(m_pClient);              m_pInstrumentListForm->refreshInstruments();
2293            if (m_pDeviceForm)
2294                m_pDeviceForm->refreshDevices();
2295    
2296      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2297      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
# Line 2076  void qsamplerMainForm::stopClient (void) Line 2313  void qsamplerMainForm::stopClient (void)
2313      if (m_pClient == NULL)      if (m_pClient == NULL)
2314          return;          return;
2315    
         // Hard-notify device configuration form,  
         // if visible, that we're running out...  
         if (m_pDeviceForm && m_pDeviceForm->isVisible())  
             m_pDeviceForm->setClient(NULL);  
   
2316      // Log prepare here.      // Log prepare here.
2317      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2318    
# Line 2101  void qsamplerMainForm::stopClient (void) Line 2333  void qsamplerMainForm::stopClient (void)
2333      ::lscp_client_destroy(m_pClient);      ::lscp_client_destroy(m_pClient);
2334      m_pClient = NULL;      m_pClient = NULL;
2335    
2336            // Hard-notify instrumnet and device configuration forms,
2337            // if visible, that we're running out...
2338            if (m_pInstrumentListForm)
2339                m_pInstrumentListForm->refreshInstruments();
2340            if (m_pDeviceForm)
2341                m_pDeviceForm->refreshDevices();
2342    
2343      // Log final here.      // Log final here.
2344      appendMessages(tr("Client disconnected."));      appendMessages(tr("Client disconnected."));
2345    

Legend:
Removed from v.753  
changed lines
  Added in v.995

  ViewVC Help
Powered by ViewVC