/[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 455 by capela, Mon Mar 14 12:59:27 2005 UTC revision 961 by capela, Sun Dec 3 18:26:13 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    
 #include "config.h"  
   
50  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
51  #include <signal.h>  #include <signal.h>
52  #endif  #endif
53    
54    #ifdef CONFIG_LIBGIG
55    #include <gig.h>
56    #endif
57    
58  // Timer constant stuff.  // Timer constant stuff.
59  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
60    
# Line 100  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 184  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 202  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 212  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_Title
234                    | Qt::WStyle_SysMenu
235                    | Qt::WStyle_MinMax
236                    | Qt::WType_TopLevel;
237      if (m_pOptions->bKeepOnTop)      if (m_pOptions->bKeepOnTop)
238          wflags |= Qt::WStyle_Tool;          wflags |= Qt::WStyle_Tool;
239      // Some child forms are to be created right now.      // Some child forms are to be created right now.
240      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
241      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
242    #ifdef CONFIG_MIDI_INSTRUMENT
243        m_pInstrumentListForm = new qsamplerInstrumentListForm(this, 0, wflags);
244            QObject::connect(m_pInstrumentListForm->InstrumentList,
245                    SIGNAL(instrumentsChanged()),
246                    SLOT(sessionDirty()));
247    #else
248            viewInstrumentsAction->setEnabled(false);
249    #endif
250      // Set message defaults...      // Set message defaults...
251      updateMessagesFont();      updateMessagesFont();
252      updateMessagesLimit();      updateMessagesLimit();
253      updateMessagesCapture();      updateMessagesCapture();
254      // Set the visibility signal.      // Set the visibility signal.
255      QObject::connect(m_pMessages, SIGNAL(visibilityChanged(bool)), this, SLOT(stabilizeForm()));      QObject::connect(m_pMessages,
256                    SIGNAL(visibilityChanged(bool)),
257                    SLOT(stabilizeForm()));
258    
259      // Initial decorations toggle state.      // Initial decorations toggle state.
260      viewMenubarAction->setOn(m_pOptions->bMenubar);      viewMenubarAction->setOn(m_pOptions->bMenubar);
# Line 248  void qsamplerMainForm::setup ( qsamplerO Line 279  void qsamplerMainForm::setup ( qsamplerO
279      }      }
280      // Try to restore old window positioning and initial visibility.      // Try to restore old window positioning and initial visibility.
281      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
282        m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
283      m_pOptions->loadWidgetGeometry(m_pDeviceForm);      m_pOptions->loadWidgetGeometry(m_pDeviceForm);
284    
285      // Final startup stabilization...      // Final startup stabilization...
# Line 287  bool qsamplerMainForm::queryClose (void) Line 319  bool qsamplerMainForm::queryClose (void)
319              ostr << *this;              ostr << *this;
320              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
321              // And the children, and the main windows state,.              // And the children, and the main windows state,.
322                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
323              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
324                  // Close popup widgets.                          m_pOptions->saveWidgetGeometry(this);
325                  if (m_pDeviceForm)                          // Close popup widgets.
326                      m_pDeviceForm->close();                          if (m_pInstrumentListForm)
327                                    m_pInstrumentListForm->close();
328                            if (m_pDeviceForm)
329                                    m_pDeviceForm->close();
330              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
331              stopServer();              stopServer();
332          }          }
# Line 344  void qsamplerMainForm::dropEvent ( QDrop Line 379  void qsamplerMainForm::dropEvent ( QDrop
379      if (!decodeDragFiles(pDropEvent, files))      if (!decodeDragFiles(pDropEvent, files))
380          return;          return;
381    
382      for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
383                  const QString& sPath = *iter;                  const QString& sPath = *iter;
384                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
385                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
386                      qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel();
387                      if (pChannel == NULL)                          if (pChannel == NULL)
388                          return;                                  return;
389                          // Start setting the instrument filename...                          // Start setting the instrument filename...
390                          pChannel->setInstrument(sPath, 0);                          pChannel->setInstrument(sPath, 0);
391                      // Before we show it up, may be we'll                          // Before we show it up, may be we'll
392                      // better ask for some initial values?                          // better ask for some initial values?
393                      if (!pChannel->channelSetup(this)) {                          if (!pChannel->channelSetup(this)) {
394                          delete pChannel;                                  delete pChannel;
395                          return;                                  return;
396                      }                          }
397                      // Finally, give it to a new channel strip...                          // Finally, give it to a new channel strip...
398                          if (!createChannelStrip(pChannel)) {                          if (!createChannelStrip(pChannel)) {
399                          delete pChannel;                                  delete pChannel;
400                          return;                                  return;
401                          }                          }
402                      // Make that an overall update.                          // Make that an overall update.
403                      m_iDirtyCount++;                          m_iDirtyCount++;
404                      stabilizeForm();                          stabilizeForm();
405                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
406                  else if (closeSession(true))                  else if (closeSession(true))
407                          loadSessionFile(sPath);                          loadSessionFile(sPath);
# Line 382  void qsamplerMainForm::customEvent ( QCu Line 417  void qsamplerMainForm::customEvent ( QCu
417      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
418      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
419          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
420          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
421              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
422              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
423                            if (pChannelStrip)
424                                    channelStripChanged(pChannelStrip);
425                    } else {
426                            appendMessagesColor(tr("Notify event: %1 data: %2")
427                                    .arg(::lscp_event_to_text(pEvent->event()))
428                                    .arg(pEvent->data()), "#996699");
429                    }
430      }      }
431  }  }
432    
# Line 393  void qsamplerMainForm::customEvent ( QCu Line 435  void qsamplerMainForm::customEvent ( QCu
435  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
436  {  {
437      stabilizeForm();      stabilizeForm();
438        
439      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
440  }  }
441    
# Line 407  qsamplerOptions *qsamplerMainForm::optio Line 449  qsamplerOptions *qsamplerMainForm::optio
449      return m_pOptions;      return m_pOptions;
450  }  }
451    
452    
453  // The LSCP client descriptor property.  // The LSCP client descriptor property.
454  lscp_client_t *qsamplerMainForm::client (void)  lscp_client_t *qsamplerMainForm::client (void)
455  {  {
# Line 414  lscp_client_t *qsamplerMainForm::client Line 457  lscp_client_t *qsamplerMainForm::client
457  }  }
458    
459    
460    // The pseudo-singleton instance accessor.
461    qsamplerMainForm *qsamplerMainForm::getInstance (void)
462    {
463            return g_pMainForm;
464    }
465    
466    
467  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
468  // qsamplerMainForm -- Session file stuff.  // qsamplerMainForm -- Session file stuff.
469    
# Line 461  bool qsamplerMainForm::openSession (void Line 511  bool qsamplerMainForm::openSession (void
511    
512      // Ask for the filename to open...      // Ask for the filename to open...
513      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
514              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
515              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
516              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
517              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
518      );      );
519    
520      // Have we cancelled?      // Have we cancelled?
# Line 495  bool qsamplerMainForm::saveSession ( boo Line 545  bool qsamplerMainForm::saveSession ( boo
545              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
546          // Prompt the guy...          // Prompt the guy...
547          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
548                  sFilename,                              // Start here.                          sFilename,                              // Start here.
549                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
550                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
551                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
552          );          );
553          // Have we cancelled it?          // Have we cancelled it?
554          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 508  bool qsamplerMainForm::saveSession ( boo Line 558  bool qsamplerMainForm::saveSession ( boo
558              sFilename += ".lscp";              sFilename += ".lscp";
559          // Check if already exists...          // Check if already exists...
560          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
561              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
562                                    QSAMPLER_TITLE ": " + tr("Warning"),
563                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
564                     "\"%1\"\n\n"                     "\"%1\"\n\n"
565                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 530  bool qsamplerMainForm::closeSession ( bo Line 581  bool qsamplerMainForm::closeSession ( bo
581    
582      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
583      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
584          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
585                            QSAMPLER_TITLE ": " + tr("Warning"),
586              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
587              "\"%1\"\n\n"              "\"%1\"\n\n"
588              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 588  bool qsamplerMainForm::loadSessionFile ( Line 640  bool qsamplerMainForm::loadSessionFile (
640      QTextStream ts(&file);      QTextStream ts(&file);
641      while (!ts.atEnd()) {      while (!ts.atEnd()) {
642          // Read the line.          // Read the line.
643          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
644          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
645          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
646              appendMessagesColor(sCommand, "#996633");              appendMessagesColor(sCommand, "#996633");
# Line 598  bool qsamplerMainForm::loadSessionFile ( Line 650  bool qsamplerMainForm::loadSessionFile (
650              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
651                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
652                  iErrors++;                  iErrors++;
                 break;  
653              }              }
654          }          }
655          // Try to make it snappy :)          // Try to make it snappy :)
# Line 608  bool qsamplerMainForm::loadSessionFile ( Line 659  bool qsamplerMainForm::loadSessionFile (
659      // Ok. we've read it.      // Ok. we've read it.
660      file.close();      file.close();
661    
     // Have we any errors?  
     if (iErrors > 0)  
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
   
662          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
663          updateSession();          updateSession();
664    
665            // Have we any errors?
666            if (iErrors > 0)
667                    appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
668    
669      // Save as default session directory.      // Save as default session directory.
670      if (m_pOptions)      if (m_pOptions)
671          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
672      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
673      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
674      // Stabilize form...      // Stabilize form...
675      m_sFilename = sFilename;      m_sFilename = sFilename;
676      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
677      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
678        
679      // Make that an overall update.      // Make that an overall update.
680      stabilizeForm();      stabilizeForm();
681      return true;      return true;
# Line 666  bool qsamplerMainForm::saveSessionFile ( Line 717  bool qsamplerMainForm::saveSessionFile (
717          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
718          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
719          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
                 qsamplerDevice device(m_pClient, qsamplerDevice::Audio, piDeviceIDs[iDevice]);  
720                  ts << endl;                  ts << endl;
721          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);
722                     << " " << tr("Device") << " " << iDevice << endl;                  // Audio device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
726                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
727                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
728                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
729                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                  ts << endl;                  ts << endl;
735                    // Audio channel parameters...
736                    int iPort = 0;
737                    for (qsamplerDevicePort *pPort = device.ports().first();
738                                    pPort;
739                                            pPort = device.ports().next(), ++iPort) {
740                            qsamplerDeviceParamMap::ConstIterator portParam;
741                            for (portParam = pPort->params().begin();
742                                            portParam != pPort->params().end();
743                                                    ++portParam) {
744                                    const qsamplerDeviceParam& param = portParam.data();
745                                    if (param.fix || param.value.isEmpty()) ts << "# ";
746                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
747                                            << " " << iPort << " " << portParam.key()
748                                            << "='" << param.value << "'" << endl;
749                            }
750                    }
751                    // Audio device index/id mapping.
752                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap[device.deviceID()] = iDevice;
753          // Try to keep it snappy :)          // Try to keep it snappy :)
754          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 684  bool qsamplerMainForm::saveSessionFile ( Line 757  bool qsamplerMainForm::saveSessionFile (
757          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
758          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
759          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
760                  qsamplerDevice device(m_pClient, qsamplerDevice::Midi, piDeviceIDs[iDevice]);                  ts << endl;
761          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);
762                     << " " << tr("Device") << " " << iDevice << endl;                  // MIDI device specification...
763                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
764                            << " " << tr("Device") << " " << iDevice << endl;
765                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
766                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
767                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
768                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
769                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
770                            const qsamplerDeviceParam& param = deviceParam.data();
771                            if (param.value.isEmpty()) ts << "# ";
772                            ts << " " << deviceParam.key() << "='" << param.value << "'";
773                    }
774                  ts << endl;                  ts << endl;
775                    // MIDI port parameters...
776                    int iPort = 0;
777                    for (qsamplerDevicePort *pPort = device.ports().first();
778                                    pPort;
779                                            pPort = device.ports().next(), ++iPort) {
780                            qsamplerDeviceParamMap::ConstIterator portParam;
781                            for (portParam = pPort->params().begin();
782                                            portParam != pPort->params().end();
783                                                    ++portParam) {
784                                    const qsamplerDeviceParam& param = portParam.data();
785                                    if (param.fix || param.value.isEmpty()) ts << "# ";
786                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
787                                       << " " << iPort << " " << portParam.key()
788                                       << "='" << param.value << "'" << endl;
789                            }
790                    }
791                    // MIDI device index/id mapping.
792                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap[device.deviceID()] = iDevice;
793          // Try to keep it snappy :)          // Try to keep it snappy :)
794          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 707  bool qsamplerMainForm::saveSessionFile ( Line 803  bool qsamplerMainForm::saveSessionFile (
803              if (pChannel) {              if (pChannel) {
804                  ts << "# " << tr("Channel") << " " << iChannel << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
805                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
806                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
807                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
808                                              << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
809                              } else {                                  } else {
810                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
811                                             << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
812                                    }
813                                    if (midiDeviceMap.isEmpty()) {
814                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
815                                                    << " " << pChannel->midiDriver() << endl;
816                                    } else {
817                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
818                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
819                                  }                                  }
820                  if (midiDeviceMap.isEmpty()) {                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
821                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel                                          << " " << pChannel->midiPort() << endl;
                                        << " " << pChannel->midiDriver() << endl;  
                             } else {  
                         ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel  
                                            << " " << midiDeviceMap[pChannel->midiDevice()] << endl;  
                             }  
                 ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel  
                                << " " << pChannel->midiPort() << endl;  
822                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
823                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
824                      ts << "ALL";                      ts << "ALL";
# Line 731  bool qsamplerMainForm::saveSessionFile ( Line 827  bool qsamplerMainForm::saveSessionFile (
827                  ts << endl;                  ts << endl;
828                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
829                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
830                                    qsamplerChannelRoutingMap::ConstIterator audioRoute;
831                                    for (audioRoute = pChannel->audioRouting().begin();
832                                                    audioRoute != pChannel->audioRouting().end();
833                                                            ++audioRoute) {
834                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
835                                                    << " " << audioRoute.key()
836                                                    << " " << audioRoute.data() << endl;
837                                    }
838                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
839                                    if (pChannel->channelMute())
840                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
841                                    if (pChannel->channelSolo())
842                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
843                  ts << endl;                  ts << endl;
844              }              }
845          }          }
# Line 739  bool qsamplerMainForm::saveSessionFile ( Line 847  bool qsamplerMainForm::saveSessionFile (
847          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
848      }      }
849    
850    #ifdef CONFIG_MIDI_INSTRUMENT
851            // MIDI instrument mapping...
852            lscp_midi_instrument_t *pInstrs = ::lscp_list_midi_instruments(m_pClient);
853            if (pInstrs)
854            ts << "# " << tr("MIDI instrument mapping") << endl;
855            for (int iInstr = 0; pInstrs && pInstrs[iInstr].program >= 0; iInstr++) {
856                    lscp_midi_instrument_info_t *pInstrInfo
857                            = ::lscp_get_midi_instrument_info(m_pClient, &pInstrs[iInstr]);
858                    if (pInstrInfo) {
859                            ts << "MAP MIDI_INSTRUMENT "
860                                    << pInstrs[iInstr].bank_msb    << " "
861                                    << pInstrs[iInstr].bank_lsb    << " "
862                                    << pInstrs[iInstr].program     << " "
863                                    << pInstrInfo->engine_name     << " '"
864                                    << pInstrInfo->instrument_file << "' "
865                                    << pInstrInfo->instrument_nr   << " "
866                                    << pInstrInfo->volume          << " ";
867                            switch (pInstrInfo->load_mode) {
868                                    case LSCP_LOAD_PERSISTENT:
869                                            ts << "PERSISTENT";
870                                            break;
871                                    case LSCP_LOAD_ON_DEMAND_HOLD:
872                                            ts << "ON_DEMAND_HOLD";
873                                            break;
874                                    case LSCP_LOAD_ON_DEMAND:
875                                    case LSCP_LOAD_DEFAULT:
876                                    default:
877                                            ts << "ON_DEMAND";
878                                            break;
879                            }
880                            if (pInstrInfo->name)
881                                    ts << " '" << pInstrInfo->name << "'";
882                            ts << endl;
883                    }
884                    ts << endl;
885            // Try to keep it snappy :)
886            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
887            }
888    #endif //  CONFIG_MIDI_INSTRUMENT
889    
890      // Ok. we've wrote it.      // Ok. we've wrote it.
891      file.close();      file.close();
892    
# Line 823  void qsamplerMainForm::fileReset (void) Line 971  void qsamplerMainForm::fileReset (void)
971          return;          return;
972    
973      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
974      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
975                    QSAMPLER_TITLE ": " + tr("Warning"),
976          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
977             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
978             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
979             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
980             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
981          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
982          return;          return;
# Line 852  void qsamplerMainForm::fileRestart (void Line 1001  void qsamplerMainForm::fileRestart (void
1001  {  {
1002      if (m_pOptions == NULL)      if (m_pOptions == NULL)
1003          return;          return;
1004            
1005      bool bRestart = true;      bool bRestart = true;
1006        
1007      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
1008      // (if we're currently up and running)      // (if we're currently up and running)
1009      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
1010          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
1011                            QSAMPLER_TITLE ": " + tr("Warning"),
1012              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
1013                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
1014                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
1015                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
1016                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
1017              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
1018      }      }
# Line 895  void qsamplerMainForm::editAddChannel (v Line 1045  void qsamplerMainForm::editAddChannel (v
1045          return;          return;
1046    
1047      // Just create the channel instance...      // Just create the channel instance...
1048      qsamplerChannel *pChannel = new qsamplerChannel(this);      qsamplerChannel *pChannel = new qsamplerChannel();
1049      if (pChannel == NULL)      if (pChannel == NULL)
1050          return;          return;
1051    
# Line 905  void qsamplerMainForm::editAddChannel (v Line 1055  void qsamplerMainForm::editAddChannel (v
1055          delete pChannel;          delete pChannel;
1056          return;          return;
1057      }      }
1058        
1059      // And give it to the strip (will own the channel instance, if successful).      // And give it to the strip (will own the channel instance, if successful).
1060      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
1061          delete pChannel;          delete pChannel;
# Line 927  void qsamplerMainForm::editRemoveChannel Line 1077  void qsamplerMainForm::editRemoveChannel
1077      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1078      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1079          return;          return;
1080            
1081      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
1082      if (pChannel == NULL)      if (pChannel == NULL)
1083          return;          return;
1084    
1085      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1086      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1087          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1088                            QSAMPLER_TITLE ": " + tr("Warning"),
1089              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1090                 "%1\n\n"                 "%1\n\n"
1091                 "Are you sure?")                 "Are you sure?")
# Line 949  void qsamplerMainForm::editRemoveChannel Line 1100  void qsamplerMainForm::editRemoveChannel
1100    
1101      // Just delete the channel strip.      // Just delete the channel strip.
1102      delete pChannelStrip;      delete pChannelStrip;
1103        
1104      // Do we auto-arrange?      // Do we auto-arrange?
1105      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1106          channelsArrange();          channelsArrange();
# Line 993  void qsamplerMainForm::editResetChannel Line 1144  void qsamplerMainForm::editResetChannel
1144  // Reset all sampler channels.  // Reset all sampler channels.
1145  void qsamplerMainForm::editResetAllChannels (void)  void qsamplerMainForm::editResetAllChannels (void)
1146  {  {
1147      if (m_pClient == NULL)          if (m_pClient == NULL)
1148          return;                  return;
1149    
1150      // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1151          // for all channels out there...          // for all channels out there...
1152      m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1153      QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1154      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1155          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1156          if (pChannelStrip)                  if (pChannelStrip)
1157                  pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1158      }          }
1159      m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1160  }  }
1161    
1162    
# Line 1057  void qsamplerMainForm::viewMessages ( bo Line 1208  void qsamplerMainForm::viewMessages ( bo
1208  }  }
1209    
1210    
1211    // Show/hide the MIDI instrument list-view form.
1212    void qsamplerMainForm::viewInstruments (void)
1213    {
1214            if (m_pOptions == NULL)
1215                    return;
1216    
1217            if (m_pInstrumentListForm) {
1218                    m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
1219                    if (m_pInstrumentListForm->isVisible()) {
1220                            m_pInstrumentListForm->hide();
1221                    } else {
1222                            m_pInstrumentListForm->show();
1223                            m_pInstrumentListForm->raise();
1224                            m_pInstrumentListForm->setActiveWindow();
1225                    }
1226            }
1227    }
1228    
1229    
1230  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1231  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1232  {  {
1233      if (m_pOptions == NULL)          if (m_pOptions == NULL)
1234          return;                  return;
1235    
1236      if (m_pDeviceForm) {          if (m_pDeviceForm) {
1237          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1238                  m_pDeviceForm->setClient(m_pClient);                  if (m_pDeviceForm->isVisible()) {
1239          if (m_pDeviceForm->isVisible()) {                          m_pDeviceForm->hide();
1240              m_pDeviceForm->hide();                  } else {
1241          } else {                          m_pDeviceForm->show();
1242              m_pDeviceForm->show();                          m_pDeviceForm->raise();
1243              m_pDeviceForm->raise();                          m_pDeviceForm->setActiveWindow();
1244              m_pDeviceForm->setActiveWindow();                  }
1245          }          }
     }  
1246  }  }
1247    
1248    
# Line 1117  void qsamplerMainForm::viewOptions (void Line 1286  void qsamplerMainForm::viewOptions (void
1286                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1287                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1288                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1289                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this,
1290                                            QSAMPLER_TITLE ": " + tr("Information"),
1291                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1292                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1293                  updateMessagesCapture();                  updateMessagesCapture();
# Line 1191  void qsamplerMainForm::channelsArrange ( Line 1361  void qsamplerMainForm::channelsArrange (
1361          y += iHeight;          y += iHeight;
1362      }      }
1363      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1364        
1365      stabilizeForm();      stabilizeForm();
1366  }  }
1367    
# Line 1245  void qsamplerMainForm::helpAbout (void) Line 1415  void qsamplerMainForm::helpAbout (void)
1415      sText += tr("LSCP (liblscp) instrument_name support disabled.");      sText += tr("LSCP (liblscp) instrument_name support disabled.");
1416      sText += "</font></small><br />";      sText += "</font></small><br />";
1417  #endif  #endif
1418    #ifndef CONFIG_MUTE_SOLO
1419        sText += "<small><font color=\"red\">";
1420        sText += tr("Sampler channel Mute/Solo support disabled.");
1421        sText += "</font></small><br />";
1422    #endif
1423    #ifndef CONFIG_MIDI_INSTRUMENT
1424        sText += "<small><font color=\"red\">";
1425        sText += tr("MIDI instrument mapping support disabled.");
1426        sText += "</font></small><br />";
1427    #endif
1428      sText += "<br />\n";      sText += "<br />\n";
1429      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1430      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1431      sText += " ";      sText += " ";
1432      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1433    #ifdef CONFIG_LIBGIG
1434        sText += ", ";
1435        sText += gig::libraryName().c_str();
1436        sText += " ";
1437        sText += gig::libraryVersion().c_str();
1438    #endif
1439      sText += "<br />\n";      sText += "<br />\n";
1440      sText += "<br />\n";      sText += "<br />\n";
1441      sText += tr("Website") + ": <a href=\"" QSAMPLER_WEBSITE "\">" QSAMPLER_WEBSITE "</a><br />\n";      sText += tr("Website") + ": <a href=\"" QSAMPLER_WEBSITE "\">" QSAMPLER_WEBSITE "</a><br />\n";
# Line 1274  void qsamplerMainForm::stabilizeForm (vo Line 1460  void qsamplerMainForm::stabilizeForm (vo
1460      // Update the main application caption...      // Update the main application caption...
1461      QString sSessionName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1462      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1463          sSessionName += '*';          sSessionName += " *";
1464      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1465    
1466      // Update the main menu state...      // Update the main menu state...
# Line 1293  void qsamplerMainForm::stabilizeForm (vo Line 1479  void qsamplerMainForm::stabilizeForm (vo
1479      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1480      editResetAllChannelsAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1481      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1482      viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());  #ifdef CONFIG_MIDI_INSTRUMENT
1483            viewInstrumentsAction->setOn(m_pInstrumentListForm
1484                    && m_pInstrumentListForm->isVisible());
1485            viewInstrumentsAction->setEnabled(bHasClient);
1486    #endif
1487            viewDevicesAction->setOn(m_pDeviceForm
1488                    && m_pDeviceForm->isVisible());
1489      viewDevicesAction->setEnabled(bHasClient);      viewDevicesAction->setEnabled(bHasClient);
1490      channelsArrangeAction->setEnabled(bHasChannel);      channelsArrangeAction->setEnabled(bHasChannel);
1491    
# Line 1329  void qsamplerMainForm::stabilizeForm (vo Line 1521  void qsamplerMainForm::stabilizeForm (vo
1521  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1522  {  {
1523          // Add this strip to the changed list...          // Add this strip to the changed list...
1524          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1525                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1526                    pChannelStrip->resetErrorCount();
1527            }
1528    
1529      // Just mark the dirty form.      // Just mark the dirty form.
1530      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1357  void qsamplerMainForm::updateSession (vo Line 1551  void qsamplerMainForm::updateSession (vo
1551          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1552                  // Check if theres already a channel strip for this one...                  // Check if theres already a channel strip for this one...
1553                  if (!channelStrip(piChannelIDs[iChannel]))                  if (!channelStrip(piChannelIDs[iChannel]))
1554                          createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));                          createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));
1555                  // Make it visibly responsive...                  // Make it visibly responsive...
1556                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1557          }          }
1558          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1559            
1560            // Remember to refresh devices and instruments...
1561            if (m_pInstrumentListForm)
1562                m_pInstrumentListForm->refreshInstruments();
1563            if (m_pDeviceForm)
1564                m_pDeviceForm->refreshDevices();
1565  }  }
1566    
1567    
# Line 1532  void qsamplerMainForm::appendMessagesErr Line 1732  void qsamplerMainForm::appendMessagesErr
1732    
1733      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1734    
1735      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));      QMessageBox::critical(this,
1736                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1737  }  }
1738    
1739    
# Line 1572  void qsamplerMainForm::updateMessagesLim Line 1773  void qsamplerMainForm::updateMessagesLim
1773          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1774              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1775          else          else
1776              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1777      }      }
1778  }  }
1779    
# Line 1616  qsamplerChannelStrip *qsamplerMainForm:: Line 1817  qsamplerChannelStrip *qsamplerMainForm::
1817      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1818      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1819          return NULL;          return NULL;
1820            
1821      // Actual channel strip setup...      // Actual channel strip setup...
1822      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1823      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1674  qsamplerChannelStrip *qsamplerMainForm:: Line 1875  qsamplerChannelStrip *qsamplerMainForm::
1875          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1876          if (wlist.isEmpty())          if (wlist.isEmpty())
1877                  return NULL;                  return NULL;
1878            
1879          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1880                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1881                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1755  void qsamplerMainForm::timerSlot (void) Line 1956  void qsamplerMainForm::timerSlot (void)
1956              }              }
1957          }          }
1958      }      }
1959        
1960          // Refresh each channel usage, on each period...          if (m_pClient) {
1961      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1962          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1963          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1964              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
             // Update the channel information for each pending strip...  
             for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();  
                     pChannelStrip;  
                                                 pChannelStrip = m_changedStrips.next()) {  
1965                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
1966                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
1967                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
1968                          }                          }
1969              // Update the channel stream usage for each strip...                  }
1970              QWidgetList wlist = m_pWorkspace->windowList();                  // Refresh each channel usage, on each period...
1971              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  if (m_pOptions->bAutoRefresh) {
1972                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1973                  if (pChannelStrip && pChannelStrip->isVisible())                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1974                      pChannelStrip->updateChannelUsage();                                  m_iTimerSlot = 0;
1975              }                                  // Update the channel stream usage for each strip...
1976          }                                  QWidgetList wlist = m_pWorkspace->windowList();
1977      }                                  for (int iChannel = 0;
1978                                                    iChannel < (int) wlist.count(); iChannel++) {
1979                                            qsamplerChannelStrip *pChannelStrip
1980                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1981                                            if (pChannelStrip && pChannelStrip->isVisible())
1982                                                    pChannelStrip->updateChannelUsage();
1983                                    }
1984                            }
1985                    }
1986            }
1987    
1988      // Register the next timer slot.      // Register the next timer slot.
1989      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1799  void qsamplerMainForm::startServer (void Line 2005  void qsamplerMainForm::startServer (void
2005    
2006      // Is the server process instance still here?      // Is the server process instance still here?
2007      if (m_pServer) {      if (m_pServer) {
2008          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
2009                            QSAMPLER_TITLE ": " + tr("Warning"),
2010              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
2011                 "Maybe it ss already started."),                 "Maybe it ss already started."),
2012              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1958  bool qsamplerMainForm::startClient (void Line 2165  bool qsamplerMainForm::startClient (void
2165      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2166      appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient)));      appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient)));
2167    
2168            // Subscribe to channel info change notifications...
2169            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2170                    appendMessagesClient("lscp_client_subscribe");
2171    
2172      // We may stop scheduling around.      // We may stop scheduling around.
2173      stopSchedule();      stopSchedule();
2174    
# Line 1967  bool qsamplerMainForm::startClient (void Line 2178  bool qsamplerMainForm::startClient (void
2178      // Log success here.      // Log success here.
2179      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2180    
2181          // Hard-notify device configuration form,          // Hard-notify instrumnet and device configuration forms,
2182          // if visible, that we're ready...          // if visible, that we're ready...
2183          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pInstrumentListForm)
2184              m_pDeviceForm->setClient(m_pClient);              m_pInstrumentListForm->refreshInstruments();
2185                        if (m_pDeviceForm)
2186                m_pDeviceForm->refreshDevices();
2187    
2188      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2189      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2190          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1992  void qsamplerMainForm::stopClient (void) Line 2205  void qsamplerMainForm::stopClient (void)
2205      if (m_pClient == NULL)      if (m_pClient == NULL)
2206          return;          return;
2207    
         // Hard-notify device configuration form,  
         // if visible, that we're running out...  
         if (m_pDeviceForm && m_pDeviceForm->isVisible())  
             m_pDeviceForm->setClient(NULL);  
   
2208      // Log prepare here.      // Log prepare here.
2209      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2210    
# Line 2011  void qsamplerMainForm::stopClient (void) Line 2219  void qsamplerMainForm::stopClient (void)
2219      // channels from the back-end server.      // channels from the back-end server.
2220      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2221      closeSession(false);      closeSession(false);
2222        
2223      // Close us as a client...      // Close us as a client...
2224      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2225        ::lscp_client_destroy(m_pClient);
2226      m_pClient = NULL;      m_pClient = NULL;
2227    
2228            // Hard-notify instrumnet and device configuration forms,
2229            // if visible, that we're running out...
2230            if (m_pInstrumentListForm)
2231                m_pInstrumentListForm->refreshInstruments();
2232            if (m_pDeviceForm)
2233                m_pDeviceForm->refreshDevices();
2234    
2235      // Log final here.      // Log final here.
2236      appendMessages(tr("Client disconnected."));      appendMessages(tr("Client disconnected."));
2237    

Legend:
Removed from v.455  
changed lines
  Added in v.961

  ViewVC Help
Powered by ViewVC