/[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 1033 by capela, Mon Jan 15 11:27:22 2007 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-2007, 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 132  void qsamplerMainForm::init (void) Line 142  void qsamplerMainForm::init (void)
142      // Make it an MDI workspace.      // Make it an MDI workspace.
143      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
144      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
145      // Set the activation connection.          // Set the activation connection.
146      QObject::connect(m_pWorkspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(stabilizeForm()));          QObject::connect(m_pWorkspace,
147                    SIGNAL(windowActivated(QWidget *)),
148                    SLOT(stabilizeForm()));
149      // Make it shine :-)      // Make it shine :-)
150      setCentralWidget(m_pWorkspace);      setCentralWidget(m_pWorkspace);
151    
# Line 186  void qsamplerMainForm::destroy (void) Line 198  void qsamplerMainForm::destroy (void)
198      // Finally drop any widgets around...      // Finally drop any widgets around...
199      if (m_pDeviceForm)      if (m_pDeviceForm)
200          delete m_pDeviceForm;          delete m_pDeviceForm;
201        if (m_pInstrumentListForm)
202            delete m_pInstrumentListForm;
203      if (m_pMessages)      if (m_pMessages)
204          delete m_pMessages;          delete m_pMessages;
205      if (m_pWorkspace)      if (m_pWorkspace)
# Line 204  void qsamplerMainForm::destroy (void) Line 218  void qsamplerMainForm::destroy (void)
218      // Delete recentfiles menu.      // Delete recentfiles menu.
219      if (m_pRecentFilesMenu)      if (m_pRecentFilesMenu)
220          delete m_pRecentFilesMenu;          delete m_pRecentFilesMenu;
221    
222            // Pseudo-singleton reference shut-down.
223            g_pMainForm = NULL;
224  }  }
225    
226    
# Line 214  void qsamplerMainForm::setup ( qsamplerO Line 231  void qsamplerMainForm::setup ( qsamplerO
231      m_pOptions = pOptions;      m_pOptions = pOptions;
232    
233      // What style do we create these forms?      // What style do we create these forms?
234      WFlags wflags = Qt::WType_TopLevel;          Qt::WFlags wflags = Qt::WStyle_Customize
235                    | Qt::WStyle_NormalBorder
236                    | Qt::WStyle_Title
237                    | Qt::WStyle_SysMenu
238                    | Qt::WStyle_MinMax
239                    | Qt::WType_TopLevel;
240      if (m_pOptions->bKeepOnTop)      if (m_pOptions->bKeepOnTop)
241          wflags |= Qt::WStyle_Tool;          wflags |= Qt::WStyle_Tool;
242      // Some child forms are to be created right now.      // Some child forms are to be created right now.
243      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
244      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
245      m_pDeviceForm->setMainForm(this); // An important life immutable!  #ifdef CONFIG_MIDI_INSTRUMENT
246        m_pInstrumentListForm = new qsamplerInstrumentListForm(this, 0, wflags);
247            QObject::connect(m_pInstrumentListForm->InstrumentList,
248                    SIGNAL(instrumentsChanged()),
249                    SLOT(sessionDirty()));
250    #else
251            viewInstrumentsAction->setEnabled(false);
252    #endif
253      // Set message defaults...      // Set message defaults...
254      updateMessagesFont();      updateMessagesFont();
255      updateMessagesLimit();      updateMessagesLimit();
256      updateMessagesCapture();      updateMessagesCapture();
257      // Set the visibility signal.      // Set the visibility signal.
258      QObject::connect(m_pMessages, SIGNAL(visibilityChanged(bool)), this, SLOT(stabilizeForm()));          QObject::connect(m_pMessages,
259                    SIGNAL(visibilityChanged(bool)),
260                    SLOT(stabilizeForm()));
261    
262      // Initial decorations toggle state.      // Initial decorations toggle state.
263      viewMenubarAction->setOn(m_pOptions->bMenubar);      viewMenubarAction->setOn(m_pOptions->bMenubar);
# Line 251  void qsamplerMainForm::setup ( qsamplerO Line 282  void qsamplerMainForm::setup ( qsamplerO
282      }      }
283      // Try to restore old window positioning and initial visibility.      // Try to restore old window positioning and initial visibility.
284      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
285        m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
286      m_pOptions->loadWidgetGeometry(m_pDeviceForm);      m_pOptions->loadWidgetGeometry(m_pDeviceForm);
287    
288      // Final startup stabilization...      // Final startup stabilization...
# Line 291  bool qsamplerMainForm::queryClose (void) Line 323  bool qsamplerMainForm::queryClose (void)
323              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
324              // And the children, and the main windows state,.              // And the children, and the main windows state,.
325                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
326                            m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
327                          m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this);
328                          // Close popup widgets.                          // Close popup widgets.
329                            if (m_pInstrumentListForm)
330                                    m_pInstrumentListForm->close();
331                          if (m_pDeviceForm)                          if (m_pDeviceForm)
332                                  m_pDeviceForm->close();                                  m_pDeviceForm->close();
333              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
# Line 351  void qsamplerMainForm::dropEvent ( QDrop Line 386  void qsamplerMainForm::dropEvent ( QDrop
386                  const QString& sPath = *iter;                  const QString& sPath = *iter;
387                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
388                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
389                          qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel();
390                          if (pChannel == NULL)                          if (pChannel == NULL)
391                                  return;                                  return;
392                          // Start setting the instrument filename...                          // Start setting the instrument filename...
# Line 371  void qsamplerMainForm::dropEvent ( QDrop Line 406  void qsamplerMainForm::dropEvent ( QDrop
406                          m_iDirtyCount++;                          m_iDirtyCount++;
407                          stabilizeForm();                          stabilizeForm();
408                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
409                  else if (closeSession(true))                  else if (closeSession(true)) {
410                          loadSessionFile(sPath);                          loadSessionFile(sPath);
411                            break;
412                    }
413                  // Make it look responsive...:)                  // Make it look responsive...:)
414                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
415          }          }
# Line 417  qsamplerOptions *qsamplerMainForm::optio Line 454  qsamplerOptions *qsamplerMainForm::optio
454      return m_pOptions;      return m_pOptions;
455  }  }
456    
457    
458  // The LSCP client descriptor property.  // The LSCP client descriptor property.
459  lscp_client_t *qsamplerMainForm::client (void)  lscp_client_t *qsamplerMainForm::client (void)
460  {  {
# Line 424  lscp_client_t *qsamplerMainForm::client Line 462  lscp_client_t *qsamplerMainForm::client
462  }  }
463    
464    
465    // The pseudo-singleton instance accessor.
466    qsamplerMainForm *qsamplerMainForm::getInstance (void)
467    {
468            return g_pMainForm;
469    }
470    
471    
472  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
473  // qsamplerMainForm -- Session file stuff.  // qsamplerMainForm -- Session file stuff.
474    
# Line 471  bool qsamplerMainForm::openSession (void Line 516  bool qsamplerMainForm::openSession (void
516    
517      // Ask for the filename to open...      // Ask for the filename to open...
518      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
519              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
520              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
521              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
522              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
523      );      );
524    
525      // Have we cancelled?      // Have we cancelled?
# Line 505  bool qsamplerMainForm::saveSession ( boo Line 550  bool qsamplerMainForm::saveSession ( boo
550              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
551          // Prompt the guy...          // Prompt the guy...
552          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
553                  sFilename,                              // Start here.                          sFilename,                              // Start here.
554                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
555                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
556                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
557          );          );
558          // Have we cancelled it?          // Have we cancelled it?
559          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 518  bool qsamplerMainForm::saveSession ( boo Line 563  bool qsamplerMainForm::saveSession ( boo
563              sFilename += ".lscp";              sFilename += ".lscp";
564          // Check if already exists...          // Check if already exists...
565          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
566              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
567                                    QSAMPLER_TITLE ": " + tr("Warning"),
568                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
569                     "\"%1\"\n\n"                     "\"%1\"\n\n"
570                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 540  bool qsamplerMainForm::closeSession ( bo Line 586  bool qsamplerMainForm::closeSession ( bo
586    
587      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
588      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
589          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
590                            QSAMPLER_TITLE ": " + tr("Warning"),
591              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
592              "\"%1\"\n\n"              "\"%1\"\n\n"
593              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 593  bool qsamplerMainForm::loadSessionFile ( Line 640  bool qsamplerMainForm::loadSessionFile (
640          return false;          return false;
641      }      }
642    
643            // Tell the world we'll take some time...
644            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
645    
646      // Read the file.      // Read the file.
647            int iLine = 0;
648      int iErrors = 0;      int iErrors = 0;
649      QTextStream ts(&file);      QTextStream ts(&file);
650      while (!ts.atEnd()) {      while (!ts.atEnd()) {
651          // Read the line.          // Read the line.
652          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
653                    iLine++;
654          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
655          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
656              appendMessagesColor(sCommand, "#996633");                          // Remember that, no matter what,
657              // Remember that, no matter what,                          // all LSCP commands are CR/LF terminated.
658              // all LSCP commands are CR/LF terminated.                          sCommand += "\r\n";
659              sCommand += "\r\n";                          if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
660              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {                                  appendMessagesColor(QString("%1(%2): %3")
661                  appendMessagesClient("lscp_client_query");                                          .arg(QFileInfo(sFilename).fileName()).arg(iLine)
662                  iErrors++;                                          .arg(sCommand.simplifyWhiteSpace()), "#996633");
663              }                                  appendMessagesClient("lscp_client_query");
664                                    iErrors++;
665                            }
666          }          }
667          // Try to make it snappy :)          // Try to make it snappy :)
668          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 620  bool qsamplerMainForm::loadSessionFile ( Line 674  bool qsamplerMainForm::loadSessionFile (
674          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
675          updateSession();          updateSession();
676    
677            // We're fornerly done.
678            QApplication::restoreOverrideCursor();
679    
680          // Have we any errors?          // Have we any errors?
681          if (iErrors > 0)          if (iErrors > 0)
682                  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 700  bool qsamplerMainForm::loadSessionFile (
700  // Save current session to specific file path.  // Save current session to specific file path.
701  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )
702  {  {
703            if (m_pClient == NULL)
704                    return false;
705    
706            // Check whether server is apparently OK...
707            if (::lscp_get_channels(m_pClient) < 0) {
708                    appendMessagesClient("lscp_get_channels");
709                    return false;
710            }
711    
712      // Open and write into real file.      // Open and write into real file.
713      QFile file(sFilename);      QFile file(sFilename);
714      if (!file.open(IO_WriteOnly | IO_Truncate)) {      if (!file.open(IO_WriteOnly | IO_Truncate)) {
# Line 650  bool qsamplerMainForm::saveSessionFile ( Line 716  bool qsamplerMainForm::saveSessionFile (
716          return false;          return false;
717      }      }
718    
719            // Tell the world we'll take some time...
720            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
721    
722      // Write the file.      // Write the file.
723      int  iErrors = 0;      int  iErrors = 0;
724      QTextStream ts(&file);      QTextStream ts(&file);
# Line 666  bool qsamplerMainForm::saveSessionFile ( Line 735  bool qsamplerMainForm::saveSessionFile (
735         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
736      ts << "#"  << endl;      ts << "#"  << endl;
737      ts << endl;      ts << endl;
738    
739          // It is assumed that this new kind of device+session file          // It is assumed that this new kind of device+session file
740          // will be loaded from a complete          // will be loaded from a complete initialized server...
741          int *piDeviceIDs;          int *piDeviceIDs;
742          int  iDevice;          int  iDevice;
743          ts << "RESET" << endl;          ts << "RESET" << endl;
744    
745          // Audio device mapping.          // Audio device mapping.
746          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
747          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
748          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
749                  ts << endl;                  ts << endl;
750                  qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);                  qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);
751                  // Audio device specification...                  // Audio device specification...
752                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
753                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
# Line 708  bool qsamplerMainForm::saveSessionFile ( Line 779  bool qsamplerMainForm::saveSessionFile (
779                  }                  }
780                  // Audio device index/id mapping.                  // Audio device index/id mapping.
781                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap[device.deviceID()] = iDevice;
782          // Try to keep it snappy :)                  // Try to keep it snappy :)
783          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
784          }          }
785    
786          // MIDI device mapping.          // MIDI device mapping.
787          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
788          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
789          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
790                  ts << endl;                  ts << endl;
791                  qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);                  qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);
792                  // MIDI device specification...                  // MIDI device specification...
793                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
794                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
# Line 748  bool qsamplerMainForm::saveSessionFile ( Line 820  bool qsamplerMainForm::saveSessionFile (
820                  }                  }
821                  // MIDI device index/id mapping.                  // MIDI device index/id mapping.
822                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap[device.deviceID()] = iDevice;
823          // Try to keep it snappy :)                  // Try to keep it snappy :)
824          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
825          }          }
826          ts << endl;          ts << endl;
827    
828    #ifdef CONFIG_MIDI_INSTRUMENT
829            // MIDI instrument mapping...
830            QMap<int, int> midiInstrumentMap;
831            int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
832            for (int iMap = 0; piMaps && piMaps[iMap] >= 0; iMap++) {
833                    int iMidiMap = piMaps[iMap];
834                    const char *pszMapName
835                            = ::lscp_get_midi_instrument_map_name(m_pClient, iMidiMap);
836                    ts << "# " << tr("MIDI instrument map") << " " << iMap;
837                    if (pszMapName)
838                            ts << " - " << pszMapName;
839                    ts << endl;
840                    ts << "ADD MIDI_INSTRUMENT_MAP";
841                    if (pszMapName)
842                            ts << " '" << pszMapName << "'";
843                    ts << endl;
844                    // MIDI instrument mapping...
845                    lscp_midi_instrument_t *pInstrs
846                            = ::lscp_list_midi_instruments(m_pClient, iMidiMap);
847                    for (int iInstr = 0; pInstrs && pInstrs[iInstr].map >= 0; iInstr++) {
848                            lscp_midi_instrument_info_t *pInstrInfo
849                                    = ::lscp_get_midi_instrument_info(m_pClient, &pInstrs[iInstr]);
850                            if (pInstrInfo) {
851                                    ts << "MAP MIDI_INSTRUMENT "
852                                            << iMap                        << " "
853                                            << pInstrs[iInstr].bank        << " "
854                                            << pInstrs[iInstr].prog        << " "
855                                            << pInstrInfo->engine_name     << " '"
856                                            << pInstrInfo->instrument_file << "' "
857                                            << pInstrInfo->instrument_nr   << " "
858                                            << pInstrInfo->volume          << " ";
859                                    switch (pInstrInfo->load_mode) {
860                                            case LSCP_LOAD_PERSISTENT:
861                                                    ts << "PERSISTENT";
862                                                    break;
863                                            case LSCP_LOAD_ON_DEMAND_HOLD:
864                                                    ts << "ON_DEMAND_HOLD";
865                                                    break;
866                                            case LSCP_LOAD_ON_DEMAND:
867                                            case LSCP_LOAD_DEFAULT:
868                                            default:
869                                                    ts << "ON_DEMAND";
870                                                    break;
871                                    }
872                                    if (pInstrInfo->name)
873                                            ts << " '" << pInstrInfo->name << "'";
874                                    ts << endl;
875                            }       // Check for errors...
876                            else if (::lscp_client_get_errno(m_pClient)) {
877                                    appendMessagesClient("lscp_get_midi_instrument_info");
878                                    iErrors++;
879                            }
880                            // Try to keep it snappy :)
881                            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
882                    }
883                    ts << endl;
884                    // Check for errors...
885                    if (pInstrs == NULL && ::lscp_client_get_errno(m_pClient)) {
886                            appendMessagesClient("lscp_list_midi_instruments");
887                            iErrors++;
888                    }
889                    // MIDI strument index/id mapping.
890                    midiInstrumentMap[iMidiMap] = iMap;
891            }
892            // Check for errors...
893            if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) {
894                    appendMessagesClient("lscp_list_midi_instrument_maps");
895                    iErrors++;
896            }
897    #endif  // CONFIG_MIDI_INSTRUMENT
898    
899          // Sampler channel mapping.          // Sampler channel mapping.
900      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
901      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
902          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip
903                            = static_cast<qsamplerChannelStrip *> (wlist.at(iChannel));
904          if (pChannelStrip) {          if (pChannelStrip) {
905              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
906              if (pChannel) {              if (pChannel) {
# Line 784  bool qsamplerMainForm::saveSessionFile ( Line 929  bool qsamplerMainForm::saveSessionFile (
929                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
930                  ts << endl;                  ts << endl;
931                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
932                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;                                  if (pChannel->instrumentStatus() < 100) ts << "# ";
933                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' "
934                  if (pChannel->channelMute())                                          << pChannel->instrumentNr() << " " << iChannel << endl;
935                          ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;                                  qsamplerChannelRoutingMap::ConstIterator audioRoute;
936                  if (pChannel->channelSolo())                                  for (audioRoute = pChannel->audioRouting().begin();
937                          ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;                                                  audioRoute != pChannel->audioRouting().end();
938                                                            ++audioRoute) {
939                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
940                                                    << " " << audioRoute.key()
941                                                    << " " << audioRoute.data() << endl;
942                                    }
943                                    ts << "SET CHANNEL VOLUME " << iChannel
944                                            << " " << pChannel->volume() << endl;
945                                    if (pChannel->channelMute())
946                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
947                                    if (pChannel->channelSolo())
948                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
949    #ifdef CONFIG_MIDI_INSTRUMENT
950                                    if (pChannel->midiMap() >= 0) {
951                                            ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannel
952                                                    << " " << midiInstrumentMap[pChannel->midiMap()] << endl;
953                                    }
954    #endif
955    #ifdef CONFIG_FXSEND
956                                    int iChannelID = pChannel->channelID();
957                                    int *piFxSends = ::lscp_list_fxsends(m_pClient, iChannelID);
958                                    for (int iFxSend = 0;
959                                                    piFxSends && piFxSends[iFxSend] >= 0;
960                                                            iFxSend++) {
961                                            lscp_fxsend_info_t *pFxSendInfo = ::lscp_get_fxsend_info(
962                                                    m_pClient, iChannelID, piFxSends[iFxSend]);
963                                            if (pFxSendInfo) {
964                                                    ts << "CREATE FX_SEND " << iChannel
965                                                            << " " << pFxSendInfo->midi_controller;
966                                                    if (pFxSendInfo->name)
967                                                            ts << " '" << pFxSendInfo->name << "'";
968                                                    ts << endl;
969                                                    int *piRouting = pFxSendInfo->audio_routing;
970                                                    for (int iAudioSrc = 0;
971                                                                    piRouting && piRouting[iAudioSrc] >= 0;
972                                                                            iAudioSrc++) {
973                                                            ts << "SET FX_SEND AUDIO_OUTPUT_CHANNEL "
974                                                                    << iChannel
975                                                                    << " " << iFxSend
976                                                                    << " " << iAudioSrc
977                                                                    << " " << piRouting[iAudioSrc] << endl;
978                                                    }
979    #ifdef CONFIG_FXSEND_LEVEL
980                                                    ts << "SET FX_SEND LEVEL " << iChannel
981                                                            << " " << iFxSend
982                                                            << " " << pFxSendInfo->level << endl;                                                  
983    #endif
984                                            }       // Check for errors...
985                                            else if (::lscp_client_get_errno(m_pClient)) {
986                                                    appendMessagesClient("lscp_get_fxsend_info");
987                                                    iErrors++;
988                                            }
989                                    }
990    #endif
991                  ts << endl;                  ts << endl;
992              }              }
993          }          }
# Line 800  bool qsamplerMainForm::saveSessionFile ( Line 998  bool qsamplerMainForm::saveSessionFile (
998      // Ok. we've wrote it.      // Ok. we've wrote it.
999      file.close();      file.close();
1000    
1001            // We're fornerly done.
1002            QApplication::restoreOverrideCursor();
1003    
1004      // Have we any errors?      // Have we any errors?
1005      if (iErrors > 0)      if (iErrors > 0)
1006          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 1082  void qsamplerMainForm::fileReset (void)
1082          return;          return;
1083    
1084      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
1085      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
1086                    QSAMPLER_TITLE ": " + tr("Warning"),
1087          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
1088             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
1089             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
# Line 890  void qsamplerMainForm::fileReset (void) Line 1092  void qsamplerMainForm::fileReset (void)
1092          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
1093          return;          return;
1094    
1095            // Trye closing the current session, first...
1096            if (!closeSession(true))
1097                    return;
1098    
1099      // Just do the reset, after closing down current session...      // Just do the reset, after closing down current session...
1100      if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {          // Do the actual sampler reset...
1101          appendMessagesClient("lscp_reset_sampler");          if (::lscp_reset_sampler(m_pClient) != LSCP_OK) {
1102          appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));                  appendMessagesClient("lscp_reset_sampler");
1103          return;                  appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
1104      }                  return;
1105            }
1106    
1107      // Log this.      // Log this.
1108      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
# Line 916  void qsamplerMainForm::fileRestart (void Line 1123  void qsamplerMainForm::fileRestart (void
1123      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
1124      // (if we're currently up and running)      // (if we're currently up and running)
1125      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
1126          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
1127                            QSAMPLER_TITLE ": " + tr("Warning"),
1128              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
1129                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
1130                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
# Line 953  void qsamplerMainForm::editAddChannel (v Line 1161  void qsamplerMainForm::editAddChannel (v
1161          return;          return;
1162    
1163      // Just create the channel instance...      // Just create the channel instance...
1164      qsamplerChannel *pChannel = new qsamplerChannel(this);      qsamplerChannel *pChannel = new qsamplerChannel();
1165      if (pChannel == NULL)      if (pChannel == NULL)
1166          return;          return;
1167    
# Line 992  void qsamplerMainForm::editRemoveChannel Line 1200  void qsamplerMainForm::editRemoveChannel
1200    
1201      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1202      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1203          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1204                            QSAMPLER_TITLE ": " + tr("Warning"),
1205              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1206                 "%1\n\n"                 "%1\n\n"
1207                 "Are you sure?")                 "Are you sure?")
# Line 1115  void qsamplerMainForm::viewMessages ( bo Line 1324  void qsamplerMainForm::viewMessages ( bo
1324  }  }
1325    
1326    
1327    // Show/hide the MIDI instrument list-view form.
1328    void qsamplerMainForm::viewInstruments (void)
1329    {
1330            if (m_pOptions == NULL)
1331                    return;
1332    
1333            if (m_pInstrumentListForm) {
1334                    m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
1335                    if (m_pInstrumentListForm->isVisible()) {
1336                            m_pInstrumentListForm->hide();
1337                    } else {
1338                            m_pInstrumentListForm->show();
1339                            m_pInstrumentListForm->raise();
1340                            m_pInstrumentListForm->setActiveWindow();
1341                    }
1342            }
1343    }
1344    
1345    
1346  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1347  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1348  {  {
# Line 1123  void qsamplerMainForm::viewDevices (void Line 1351  void qsamplerMainForm::viewDevices (void
1351    
1352          if (m_pDeviceForm) {          if (m_pDeviceForm) {
1353                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
                 m_pDeviceForm->setClient(m_pClient);  
1354                  if (m_pDeviceForm->isVisible()) {                  if (m_pDeviceForm->isVisible()) {
1355                          m_pDeviceForm->hide();                          m_pDeviceForm->hide();
1356                  } else {                  } else {
# Line 1175  void qsamplerMainForm::viewOptions (void Line 1402  void qsamplerMainForm::viewOptions (void
1402                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1403                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1404                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1405                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this,
1406                                            QSAMPLER_TITLE ": " + tr("Information"),
1407                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1408                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1409                  updateMessagesCapture();                  updateMessagesCapture();
# Line 1308  void qsamplerMainForm::helpAbout (void) Line 1536  void qsamplerMainForm::helpAbout (void)
1536      sText += tr("Sampler channel Mute/Solo support disabled.");      sText += tr("Sampler channel Mute/Solo support disabled.");
1537      sText += "</font></small><br />";      sText += "</font></small><br />";
1538  #endif  #endif
1539    #ifndef CONFIG_AUDIO_ROUTING
1540        sText += "<small><font color=\"red\">";
1541        sText += tr("LSCP (liblscp) audio_routing support disabled.");
1542        sText += "</font></small><br />";
1543    #endif
1544    #ifndef CONFIG_FXSEND
1545        sText += "<small><font color=\"red\">";
1546        sText += tr("Sampler channel Effect Sends support disabled.");
1547        sText += "</font></small><br />";
1548    #endif
1549    #ifndef CONFIG_MIDI_INSTRUMENT
1550        sText += "<small><font color=\"red\">";
1551        sText += tr("MIDI instrument mapping support disabled.");
1552        sText += "</font></small><br />";
1553    #endif
1554      sText += "<br />\n";      sText += "<br />\n";
1555      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1556      sText += ::lscp_client_package();      sText += ::lscp_client_package();
# Line 1343  void qsamplerMainForm::stabilizeForm (vo Line 1586  void qsamplerMainForm::stabilizeForm (vo
1586      // Update the main application caption...      // Update the main application caption...
1587      QString sSessionName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1588      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1589          sSessionName += '*';          sSessionName += " *";
1590      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1591    
1592      // Update the main menu state...      // Update the main menu state...
# Line 1362  void qsamplerMainForm::stabilizeForm (vo Line 1605  void qsamplerMainForm::stabilizeForm (vo
1605      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1606      editResetAllChannelsAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1607      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1608      viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());  #ifdef CONFIG_MIDI_INSTRUMENT
1609            viewInstrumentsAction->setOn(m_pInstrumentListForm
1610                    && m_pInstrumentListForm->isVisible());
1611            viewInstrumentsAction->setEnabled(bHasClient);
1612    #endif
1613            viewDevicesAction->setOn(m_pDeviceForm
1614                    && m_pDeviceForm->isVisible());
1615      viewDevicesAction->setEnabled(bHasClient);      viewDevicesAction->setEnabled(bHasClient);
1616      channelsArrangeAction->setEnabled(bHasChannel);      channelsArrangeAction->setEnabled(bHasChannel);
1617    
# Line 1413  void qsamplerMainForm::channelStripChang Line 1662  void qsamplerMainForm::channelStripChang
1662  // Grab and restore current sampler channels session.  // Grab and restore current sampler channels session.
1663  void qsamplerMainForm::updateSession (void)  void qsamplerMainForm::updateSession (void)
1664  {  {
1665    #ifdef CONFIG_MIDI_INSTRUMENT
1666            // FIXME: Make some room for default instrument maps...
1667            int iMaps = ::lscp_get_midi_instrument_maps(m_pClient);
1668            if (iMaps < 0)
1669                    appendMessagesClient("lscp_get_midi_instrument_maps");
1670            else if (iMaps < 1) {
1671                    ::lscp_add_midi_instrument_map(m_pClient, tr("Chromatic").latin1());
1672                    ::lscp_add_midi_instrument_map(m_pClient, tr("Drum Kits").latin1());
1673            }
1674    #endif
1675    
1676          // Retrieve the current channel list.          // Retrieve the current channel list.
1677          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
1678          if (piChannelIDs == NULL) {          if (piChannelIDs == NULL) {
# Line 1420  void qsamplerMainForm::updateSession (vo Line 1680  void qsamplerMainForm::updateSession (vo
1680                          appendMessagesClient("lscp_list_channels");                          appendMessagesClient("lscp_list_channels");
1681                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1682                  }                  }
1683                  return;          } else {
1684                    // Try to (re)create each channel.
1685                    m_pWorkspace->setUpdatesEnabled(false);
1686                    for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1687                            // Check if theres already a channel strip for this one...
1688                            if (!channelStrip(piChannelIDs[iChannel]))
1689                                    createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));
1690                    }
1691                    m_pWorkspace->setUpdatesEnabled(true);
1692          }          }
1693    
1694          // Try to (re)create each channel.      // Do we auto-arrange?
1695          m_pWorkspace->setUpdatesEnabled(false);      if (m_pOptions && m_pOptions->bAutoArrange)
1696          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {          channelsArrange();
1697                  // Check if theres already a channel strip for this one...  
1698                  if (!channelStrip(piChannelIDs[iChannel]))          // Remember to refresh devices and instruments...
1699                          createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));          if (m_pInstrumentListForm)
1700                  // Make it visibly responsive...              m_pInstrumentListForm->refreshInstruments();
                 QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
         }  
         m_pWorkspace->setUpdatesEnabled(true);  
           
         // Remember to refresh devices  
1701          if (m_pDeviceForm)          if (m_pDeviceForm)
1702              m_pDeviceForm->refreshDevices();              m_pDeviceForm->refreshDevices();
1703  }  }
# Line 1607  void qsamplerMainForm::appendMessagesErr Line 1870  void qsamplerMainForm::appendMessagesErr
1870    
1871      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1872    
1873      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));          // Make it look responsive...:)
1874            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1875    
1876        QMessageBox::critical(this,
1877                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1878  }  }
1879    
1880    
# Line 1620  void qsamplerMainForm::appendMessagesCli Line 1887  void qsamplerMainForm::appendMessagesCli
1887      appendMessagesColor(s + QString(": %1 (errno=%2)")      appendMessagesColor(s + QString(": %1 (errno=%2)")
1888          .arg(::lscp_client_get_result(m_pClient))          .arg(::lscp_client_get_result(m_pClient))
1889          .arg(::lscp_client_get_errno(m_pClient)), "#996666");          .arg(::lscp_client_get_errno(m_pClient)), "#996666");
1890    
1891            // Make it look responsive...:)
1892            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1893  }  }
1894    
1895    
# Line 1694  qsamplerChannelStrip *qsamplerMainForm:: Line 1964  qsamplerChannelStrip *qsamplerMainForm::
1964    
1965      // Actual channel strip setup...      // Actual channel strip setup...
1966      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1967      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));          QObject::connect(pChannelStrip,
1968                    SIGNAL(channelChanged(qsamplerChannelStrip *)),
1969                    SLOT(channelStripChanged(qsamplerChannelStrip *)));
1970      // Set some initial aesthetic options...      // Set some initial aesthetic options...
1971      if (m_pOptions) {      if (m_pOptions) {
1972          // Background display effect...          // Background display effect...
# Line 1879  void qsamplerMainForm::startServer (void Line 2151  void qsamplerMainForm::startServer (void
2151    
2152      // Is the server process instance still here?      // Is the server process instance still here?
2153      if (m_pServer) {      if (m_pServer) {
2154          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
2155                            QSAMPLER_TITLE ": " + tr("Warning"),
2156              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
2157                 "Maybe it ss already started."),                 "Maybe it ss already started."),
2158              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1900  void qsamplerMainForm::startServer (void Line 2173  void qsamplerMainForm::startServer (void
2173      m_pServer = new QProcess(this);      m_pServer = new QProcess(this);
2174    
2175      // Setup stdout/stderr capture...      // Setup stdout/stderr capture...
2176      //if (m_pOptions->bStdoutCapture) {          //      if (m_pOptions->bStdoutCapture) {
2177          m_pServer->setCommunication(QProcess::Stdout | QProcess::Stderr | QProcess::DupStderr);                  m_pServer->setCommunication(
2178          QObject::connect(m_pServer, SIGNAL(readyReadStdout()), this, SLOT(readServerStdout()));                          QProcess::Stdout | QProcess::Stderr | QProcess::DupStderr);
2179          QObject::connect(m_pServer, SIGNAL(readyReadStderr()), this, SLOT(readServerStdout()));                  QObject::connect(m_pServer,
2180      //}                          SIGNAL(readyReadStdout()),
2181      // The unforgiveable signal communication...                          SLOT(readServerStdout()));
2182      QObject::connect(m_pServer, SIGNAL(processExited()), this, SLOT(processServerExit()));                  QObject::connect(m_pServer,
2183                            SIGNAL(readyReadStderr()),
2184                            SLOT(readServerStdout()));
2185            //      }
2186            // The unforgiveable signal communication...
2187            QObject::connect(m_pServer,
2188                    SIGNAL(processExited()),
2189                    SLOT(processServerExit()));
2190    
2191      // Build process arguments...      // Build process arguments...
2192      m_pServer->setArguments(QStringList::split(' ', m_pOptions->sServerCmdLine));      m_pServer->setArguments(QStringList::split(' ', m_pOptions->sServerCmdLine));
# Line 2051  bool qsamplerMainForm::startClient (void Line 2331  bool qsamplerMainForm::startClient (void
2331      // Log success here.      // Log success here.
2332      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2333    
2334          // Hard-notify device configuration form,          // Hard-notify instrumnet and device configuration forms,
2335          // if visible, that we're ready...          // if visible, that we're ready...
2336          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pInstrumentListForm)
2337              m_pDeviceForm->setClient(m_pClient);              m_pInstrumentListForm->refreshInstruments();
2338            if (m_pDeviceForm)
2339                m_pDeviceForm->refreshDevices();
2340    
2341      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2342      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
# Line 2076  void qsamplerMainForm::stopClient (void) Line 2358  void qsamplerMainForm::stopClient (void)
2358      if (m_pClient == NULL)      if (m_pClient == NULL)
2359          return;          return;
2360    
         // Hard-notify device configuration form,  
         // if visible, that we're running out...  
         if (m_pDeviceForm && m_pDeviceForm->isVisible())  
             m_pDeviceForm->setClient(NULL);  
   
2361      // Log prepare here.      // Log prepare here.
2362      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2363    
# Line 2101  void qsamplerMainForm::stopClient (void) Line 2378  void qsamplerMainForm::stopClient (void)
2378      ::lscp_client_destroy(m_pClient);      ::lscp_client_destroy(m_pClient);
2379      m_pClient = NULL;      m_pClient = NULL;
2380    
2381            // Hard-notify instrumnet and device configuration forms,
2382            // if visible, that we're running out...
2383            if (m_pInstrumentListForm)
2384                m_pInstrumentListForm->refreshInstruments();
2385            if (m_pDeviceForm)
2386                m_pDeviceForm->refreshDevices();
2387    
2388      // Log final here.      // Log final here.
2389      appendMessages(tr("Client disconnected."));      appendMessages(tr("Client disconnected."));
2390    

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

  ViewVC Help
Powered by ViewVC