/[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 1000 by capela, Fri Dec 22 01:31:28 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_NormalBorder
234                    | Qt::WStyle_Title
235                    | Qt::WStyle_SysMenu
236                    | Qt::WStyle_MinMax
237                    | Qt::WType_TopLevel;
238      if (m_pOptions->bKeepOnTop)      if (m_pOptions->bKeepOnTop)
239          wflags |= Qt::WStyle_Tool;          wflags |= Qt::WStyle_Tool;
240      // Some child forms are to be created right now.      // Some child forms are to be created right now.
241      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
242      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
243    #ifdef CONFIG_MIDI_INSTRUMENT
244        m_pInstrumentListForm = new qsamplerInstrumentListForm(this, 0, wflags);
245            QObject::connect(m_pInstrumentListForm->InstrumentList,
246                    SIGNAL(instrumentsChanged()),
247                    SLOT(sessionDirty()));
248    #else
249            viewInstrumentsAction->setEnabled(false);
250    #endif
251      // Set message defaults...      // Set message defaults...
252      updateMessagesFont();      updateMessagesFont();
253      updateMessagesLimit();      updateMessagesLimit();
254      updateMessagesCapture();      updateMessagesCapture();
255      // Set the visibility signal.      // Set the visibility signal.
256      QObject::connect(m_pMessages, SIGNAL(visibilityChanged(bool)), this, SLOT(stabilizeForm()));      QObject::connect(m_pMessages,
257                    SIGNAL(visibilityChanged(bool)),
258                    SLOT(stabilizeForm()));
259    
260      // Initial decorations toggle state.      // Initial decorations toggle state.
261      viewMenubarAction->setOn(m_pOptions->bMenubar);      viewMenubarAction->setOn(m_pOptions->bMenubar);
# Line 248  void qsamplerMainForm::setup ( qsamplerO Line 280  void qsamplerMainForm::setup ( qsamplerO
280      }      }
281      // Try to restore old window positioning and initial visibility.      // Try to restore old window positioning and initial visibility.
282      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
283        m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
284      m_pOptions->loadWidgetGeometry(m_pDeviceForm);      m_pOptions->loadWidgetGeometry(m_pDeviceForm);
285    
286      // Final startup stabilization...      // Final startup stabilization...
# Line 287  bool qsamplerMainForm::queryClose (void) Line 320  bool qsamplerMainForm::queryClose (void)
320              ostr << *this;              ostr << *this;
321              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
322              // And the children, and the main windows state,.              // And the children, and the main windows state,.
323                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
324              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
325                  // Close popup widgets.                          m_pOptions->saveWidgetGeometry(this);
326                  if (m_pDeviceForm)                          // Close popup widgets.
327                      m_pDeviceForm->close();                          if (m_pInstrumentListForm)
328                                    m_pInstrumentListForm->close();
329                            if (m_pDeviceForm)
330                                    m_pDeviceForm->close();
331              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
332              stopServer();              stopServer();
333          }          }
# Line 344  void qsamplerMainForm::dropEvent ( QDrop Line 380  void qsamplerMainForm::dropEvent ( QDrop
380      if (!decodeDragFiles(pDropEvent, files))      if (!decodeDragFiles(pDropEvent, files))
381          return;          return;
382    
383      for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
384                  const QString& sPath = *iter;                  const QString& sPath = *iter;
385                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
386                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
387                      qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel();
388                      if (pChannel == NULL)                          if (pChannel == NULL)
389                          return;                                  return;
390                          // Start setting the instrument filename...                          // Start setting the instrument filename...
391                          pChannel->setInstrument(sPath, 0);                          pChannel->setInstrument(sPath, 0);
392                      // Before we show it up, may be we'll                          // Before we show it up, may be we'll
393                      // better ask for some initial values?                          // better ask for some initial values?
394                      if (!pChannel->channelSetup(this)) {                          if (!pChannel->channelSetup(this)) {
395                          delete pChannel;                                  delete pChannel;
396                          return;                                  return;
397                      }                          }
398                      // Finally, give it to a new channel strip...                          // Finally, give it to a new channel strip...
399                          if (!createChannelStrip(pChannel)) {                          if (!createChannelStrip(pChannel)) {
400                          delete pChannel;                                  delete pChannel;
401                          return;                                  return;
402                          }                          }
403                      // Make that an overall update.                          // Make that an overall update.
404                      m_iDirtyCount++;                          m_iDirtyCount++;
405                      stabilizeForm();                          stabilizeForm();
406                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
407                  else if (closeSession(true))                  else if (closeSession(true)) {
408                          loadSessionFile(sPath);                          loadSessionFile(sPath);
409                            break;
410                    }
411                  // Make it look responsive...:)                  // Make it look responsive...:)
412                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
413          }          }
# Line 382  void qsamplerMainForm::customEvent ( QCu Line 420  void qsamplerMainForm::customEvent ( QCu
420      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
421      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
422          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
423          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
424              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
425              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
426                            if (pChannelStrip)
427                                    channelStripChanged(pChannelStrip);
428                    } else {
429                            appendMessagesColor(tr("Notify event: %1 data: %2")
430                                    .arg(::lscp_event_to_text(pEvent->event()))
431                                    .arg(pEvent->data()), "#996699");
432                    }
433      }      }
434  }  }
435    
# Line 393  void qsamplerMainForm::customEvent ( QCu Line 438  void qsamplerMainForm::customEvent ( QCu
438  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
439  {  {
440      stabilizeForm();      stabilizeForm();
441        
442      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
443  }  }
444    
# Line 407  qsamplerOptions *qsamplerMainForm::optio Line 452  qsamplerOptions *qsamplerMainForm::optio
452      return m_pOptions;      return m_pOptions;
453  }  }
454    
455    
456  // The LSCP client descriptor property.  // The LSCP client descriptor property.
457  lscp_client_t *qsamplerMainForm::client (void)  lscp_client_t *qsamplerMainForm::client (void)
458  {  {
# Line 414  lscp_client_t *qsamplerMainForm::client Line 460  lscp_client_t *qsamplerMainForm::client
460  }  }
461    
462    
463    // The pseudo-singleton instance accessor.
464    qsamplerMainForm *qsamplerMainForm::getInstance (void)
465    {
466            return g_pMainForm;
467    }
468    
469    
470  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
471  // qsamplerMainForm -- Session file stuff.  // qsamplerMainForm -- Session file stuff.
472    
# Line 461  bool qsamplerMainForm::openSession (void Line 514  bool qsamplerMainForm::openSession (void
514    
515      // Ask for the filename to open...      // Ask for the filename to open...
516      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
517              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
518              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
519              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
520              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
521      );      );
522    
523      // Have we cancelled?      // Have we cancelled?
# Line 495  bool qsamplerMainForm::saveSession ( boo Line 548  bool qsamplerMainForm::saveSession ( boo
548              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
549          // Prompt the guy...          // Prompt the guy...
550          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
551                  sFilename,                              // Start here.                          sFilename,                              // Start here.
552                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
553                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
554                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
555          );          );
556          // Have we cancelled it?          // Have we cancelled it?
557          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 508  bool qsamplerMainForm::saveSession ( boo Line 561  bool qsamplerMainForm::saveSession ( boo
561              sFilename += ".lscp";              sFilename += ".lscp";
562          // Check if already exists...          // Check if already exists...
563          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
564              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
565                                    QSAMPLER_TITLE ": " + tr("Warning"),
566                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
567                     "\"%1\"\n\n"                     "\"%1\"\n\n"
568                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 530  bool qsamplerMainForm::closeSession ( bo Line 584  bool qsamplerMainForm::closeSession ( bo
584    
585      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
586      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
587          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
588                            QSAMPLER_TITLE ": " + tr("Warning"),
589              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
590              "\"%1\"\n\n"              "\"%1\"\n\n"
591              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 570  bool qsamplerMainForm::closeSession ( bo Line 625  bool qsamplerMainForm::closeSession ( bo
625  }  }
626    
627    
628    // Reset current session.
629    bool qsamplerMainForm::resetSession (void)
630    {
631    #ifdef CONFIG_MIDI_INSTRUMENT
632            // Reset all MIDI instrument mapping, if any.
633            int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
634            for (int iMap = 0; piMaps && piMaps[iMap] >= 0; ++iMap) {
635                    int iMidiMap = piMaps[iMap];
636                    if (::lscp_clear_midi_instruments(m_pClient, iMidiMap) != LSCP_OK)
637                            appendMessagesClient("lscp_clear_midi_instruments");
638                    if (::lscp_remove_midi_instrument_map(m_pClient, iMidiMap) != LSCP_OK)
639                            appendMessagesClient("lscp_remove_midi_instrument_map");
640            }
641            // Check for errors...
642            if (piMaps == NULL && ::lscp_client_get_errno(m_pClient))
643                    appendMessagesClient("lscp_list_midi_instrument_maps");
644    #endif  // CONFIG_MIDI_INSTRUMENT
645    
646            // Do the actual sampler reset...
647            if (::lscp_reset_sampler(m_pClient) != LSCP_OK) {
648                    appendMessagesClient("lscp_reset_sampler");
649                    appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
650                    return false;
651            }
652    
653            // Done.
654            return true;
655    }
656    
657    
658  // Load a session from specific file path.  // Load a session from specific file path.
659  bool qsamplerMainForm::loadSessionFile ( const QString& sFilename )  bool qsamplerMainForm::loadSessionFile ( const QString& sFilename )
660  {  {
# Line 583  bool qsamplerMainForm::loadSessionFile ( Line 668  bool qsamplerMainForm::loadSessionFile (
668          return false;          return false;
669      }      }
670    
671            // Tell the world we'll take some time...
672            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
673    
674      // Read the file.      // Read the file.
675            int iLine = 0;
676      int iErrors = 0;      int iErrors = 0;
677      QTextStream ts(&file);      QTextStream ts(&file);
678      while (!ts.atEnd()) {      while (!ts.atEnd()) {
679          // Read the line.          // Read the line.
680          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
681                    iLine++;
682          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
683          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
684              appendMessagesColor(sCommand, "#996633");                          // HACK: A very special trap for the global RESET command...
685              // Remember that, no matter what,                          if (sCommand == "RESET") {
686              // all LSCP commands are CR/LF terminated.                                  // Do our own reset...
687              sCommand += "\r\n";                                  if (!resetSession())
688              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {                                          iErrors++;
689                  appendMessagesClient("lscp_client_query");                          } else {
690                  iErrors++;                                  // Remember that, no matter what,
691                  break;                                  // all LSCP commands are CR/LF terminated.
692              }                                  sCommand += "\r\n";
693                                    if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
694                                            appendMessagesColor(QString("%1(%2): %3")
695                                                    .arg(QFileInfo(sFilename).fileName()).arg(iLine)
696                                                    .arg(sCommand.simplifyWhiteSpace()), "#996633");
697                                            appendMessagesClient("lscp_client_query");
698                                            iErrors++;
699                                    }
700                            }
701          }          }
702          // Try to make it snappy :)          // Try to make it snappy :)
703          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 608  bool qsamplerMainForm::loadSessionFile ( Line 706  bool qsamplerMainForm::loadSessionFile (
706      // Ok. we've read it.      // Ok. we've read it.
707      file.close();      file.close();
708    
     // Have we any errors?  
     if (iErrors > 0)  
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
   
709          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
710          updateSession();          updateSession();
711    
712            // We're fornerly done.
713            QApplication::restoreOverrideCursor();
714    
715            // Have we any errors?
716            if (iErrors > 0)
717                    appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
718    
719      // Save as default session directory.      // Save as default session directory.
720      if (m_pOptions)      if (m_pOptions)
721          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
722      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
723      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
724      // Stabilize form...      // Stabilize form...
725      m_sFilename = sFilename;      m_sFilename = sFilename;
726      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
727      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
728        
729      // Make that an overall update.      // Make that an overall update.
730      stabilizeForm();      stabilizeForm();
731      return true;      return true;
# Line 634  bool qsamplerMainForm::loadSessionFile ( Line 735  bool qsamplerMainForm::loadSessionFile (
735  // Save current session to specific file path.  // Save current session to specific file path.
736  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )  bool qsamplerMainForm::saveSessionFile ( const QString& sFilename )
737  {  {
738            if (m_pClient == NULL)
739                    return false;
740    
741            // Check whether server is apparently OK...
742            if (::lscp_get_channels(m_pClient) < 0) {
743                    appendMessagesClient("lscp_get_channels");
744                    return false;
745            }
746    
747      // Open and write into real file.      // Open and write into real file.
748      QFile file(sFilename);      QFile file(sFilename);
749      if (!file.open(IO_WriteOnly | IO_Truncate)) {      if (!file.open(IO_WriteOnly | IO_Truncate)) {
# Line 641  bool qsamplerMainForm::saveSessionFile ( Line 751  bool qsamplerMainForm::saveSessionFile (
751          return false;          return false;
752      }      }
753    
754            // Tell the world we'll take some time...
755            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
756    
757      // Write the file.      // Write the file.
758      int  iErrors = 0;      int  iErrors = 0;
759      QTextStream ts(&file);      QTextStream ts(&file);
# Line 657  bool qsamplerMainForm::saveSessionFile ( Line 770  bool qsamplerMainForm::saveSessionFile (
770         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
771      ts << "#"  << endl;      ts << "#"  << endl;
772      ts << endl;      ts << endl;
773    
774          // It is assumed that this new kind of device+session file          // It is assumed that this new kind of device+session file
775          // will be loaded from a complete          // will be loaded from a complete initialized server...
776          int *piDeviceIDs;          int *piDeviceIDs;
777          int  iDevice;          int  iDevice;
778          ts << "RESET" << endl;          ts << "RESET" << endl;
779    
780          // Audio device mapping.          // Audio device mapping.
781          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
782          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
783          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
                 qsamplerDevice device(m_pClient, qsamplerDevice::Audio, piDeviceIDs[iDevice]);  
784                  ts << endl;                  ts << endl;
785          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);
786                     << " " << tr("Device") << " " << iDevice << endl;                  // Audio device specification...
787                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
788                            << " " << tr("Device") << " " << iDevice << endl;
789                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
790                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
791                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
792                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
793                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
794                            const qsamplerDeviceParam& param = deviceParam.data();
795                            if (param.value.isEmpty()) ts << "# ";
796                            ts << " " << deviceParam.key() << "='" << param.value << "'";
797                    }
798                  ts << endl;                  ts << endl;
799                    // Audio channel parameters...
800                    int iPort = 0;
801                    for (qsamplerDevicePort *pPort = device.ports().first();
802                                    pPort;
803                                            pPort = device.ports().next(), ++iPort) {
804                            qsamplerDeviceParamMap::ConstIterator portParam;
805                            for (portParam = pPort->params().begin();
806                                            portParam != pPort->params().end();
807                                                    ++portParam) {
808                                    const qsamplerDeviceParam& param = portParam.data();
809                                    if (param.fix || param.value.isEmpty()) ts << "# ";
810                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
811                                            << " " << iPort << " " << portParam.key()
812                                            << "='" << param.value << "'" << endl;
813                            }
814                    }
815                    // Audio device index/id mapping.
816                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap[device.deviceID()] = iDevice;
817          // Try to keep it snappy :)                  // Try to keep it snappy :)
818          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
819          }          }
820    
821          // MIDI device mapping.          // MIDI device mapping.
822          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
823          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
824          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
825                  qsamplerDevice device(m_pClient, qsamplerDevice::Midi, piDeviceIDs[iDevice]);                  ts << endl;
826          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);
827                     << " " << tr("Device") << " " << iDevice << endl;                  // MIDI device specification...
828                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
829                            << " " << tr("Device") << " " << iDevice << endl;
830                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
831                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
832                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
833                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
834                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
835                            const qsamplerDeviceParam& param = deviceParam.data();
836                            if (param.value.isEmpty()) ts << "# ";
837                            ts << " " << deviceParam.key() << "='" << param.value << "'";
838                    }
839                  ts << endl;                  ts << endl;
840                    // MIDI port parameters...
841                    int iPort = 0;
842                    for (qsamplerDevicePort *pPort = device.ports().first();
843                                    pPort;
844                                            pPort = device.ports().next(), ++iPort) {
845                            qsamplerDeviceParamMap::ConstIterator portParam;
846                            for (portParam = pPort->params().begin();
847                                            portParam != pPort->params().end();
848                                                    ++portParam) {
849                                    const qsamplerDeviceParam& param = portParam.data();
850                                    if (param.fix || param.value.isEmpty()) ts << "# ";
851                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
852                                       << " " << iPort << " " << portParam.key()
853                                       << "='" << param.value << "'" << endl;
854                            }
855                    }
856                    // MIDI device index/id mapping.
857                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap[device.deviceID()] = iDevice;
858          // Try to keep it snappy :)                  // Try to keep it snappy :)
859          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
860          }          }
861          ts << endl;          ts << endl;
862    
863    #ifdef CONFIG_MIDI_INSTRUMENT
864            // MIDI instrument mapping...
865            QMap<int, int> midiInstrumentMap;
866            int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
867            for (int iMap = 0; piMaps && piMaps[iMap] >= 0; iMap++) {
868                    int iMidiMap = piMaps[iMap];
869                    const char *pszMapName
870                            = ::lscp_get_midi_instrument_map_name(m_pClient, iMidiMap);
871                    ts << "# " << tr("MIDI instrument map") << " " << iMap;
872                    if (pszMapName)
873                            ts << " - " << pszMapName;
874                    ts << endl;
875                    ts << "ADD MIDI_INSTRUMENT_MAP";
876                    if (pszMapName)
877                            ts << " '" << pszMapName << "'";
878                    ts << endl;
879                    // MIDI instrument mapping...
880                    lscp_midi_instrument_t *pInstrs
881                            = ::lscp_list_midi_instruments(m_pClient, iMidiMap);
882                    for (int iInstr = 0; pInstrs && pInstrs[iInstr].map >= 0; iInstr++) {
883                            lscp_midi_instrument_info_t *pInstrInfo
884                                    = ::lscp_get_midi_instrument_info(m_pClient, &pInstrs[iInstr]);
885                            if (pInstrInfo) {
886                                    ts << "MAP MIDI_INSTRUMENT "
887                                            << iMap                        << " "
888                                            << pInstrs[iInstr].bank        << " "
889                                            << pInstrs[iInstr].prog        << " "
890                                            << pInstrInfo->engine_name     << " '"
891                                            << pInstrInfo->instrument_file << "' "
892                                            << pInstrInfo->instrument_nr   << " "
893                                            << pInstrInfo->volume          << " ";
894                                    switch (pInstrInfo->load_mode) {
895                                            case LSCP_LOAD_PERSISTENT:
896                                                    ts << "PERSISTENT";
897                                                    break;
898                                            case LSCP_LOAD_ON_DEMAND_HOLD:
899                                                    ts << "ON_DEMAND_HOLD";
900                                                    break;
901                                            case LSCP_LOAD_ON_DEMAND:
902                                            case LSCP_LOAD_DEFAULT:
903                                            default:
904                                                    ts << "ON_DEMAND";
905                                                    break;
906                                    }
907                                    if (pInstrInfo->name)
908                                            ts << " '" << pInstrInfo->name << "'";
909                                    ts << endl;
910                            }       // Check for errors...
911                            else if (::lscp_client_get_errno(m_pClient)) {
912                                    appendMessagesClient("lscp_get_midi_instrument_info");
913                                    iErrors++;
914                            }
915                            // Try to keep it snappy :)
916                            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
917                    }
918                    // Check for errors...
919                    if (pInstrs)
920                            ts << endl;
921                    else if (::lscp_client_get_errno(m_pClient)) {
922                            appendMessagesClient("lscp_list_midi_instruments");
923                            iErrors++;
924                    }
925                    // MIDI strument index/id mapping.
926                    midiInstrumentMap[iMidiMap] = iMap;
927            }
928            // Check for errors...
929            if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) {
930                    appendMessagesClient("lscp_list_midi_instrument_maps");
931                    iErrors++;
932            }
933    #endif  // CONFIG_MIDI_INSTRUMENT
934    
935          // Sampler channel mapping.          // Sampler channel mapping.
936      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
937      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
# Line 707  bool qsamplerMainForm::saveSessionFile ( Line 941  bool qsamplerMainForm::saveSessionFile (
941              if (pChannel) {              if (pChannel) {
942                  ts << "# " << tr("Channel") << " " << iChannel << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
943                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
944                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
945                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
946                                              << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
947                              } else {                                  } else {
948                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
949                                             << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
950                                    }
951                                    if (midiDeviceMap.isEmpty()) {
952                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
953                                                    << " " << pChannel->midiDriver() << endl;
954                                    } else {
955                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
956                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
957                                  }                                  }
958                  if (midiDeviceMap.isEmpty()) {                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
959                          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;  
960                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
961                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
962                      ts << "ALL";                      ts << "ALL";
# Line 730  bool qsamplerMainForm::saveSessionFile ( Line 964  bool qsamplerMainForm::saveSessionFile (
964                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
965                  ts << endl;                  ts << endl;
966                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
967                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;                                  if (pChannel->instrumentStatus() < 100) ts << "# ";
968                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' "
969                                            << pChannel->instrumentNr() << " " << iChannel << endl;
970                                    qsamplerChannelRoutingMap::ConstIterator audioRoute;
971                                    for (audioRoute = pChannel->audioRouting().begin();
972                                                    audioRoute != pChannel->audioRouting().end();
973                                                            ++audioRoute) {
974                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
975                                                    << " " << audioRoute.key()
976                                                    << " " << audioRoute.data() << endl;
977                                    }
978                                    ts << "SET CHANNEL VOLUME " << iChannel
979                                            << " " << pChannel->volume() << endl;
980                                    if (pChannel->channelMute())
981                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
982                                    if (pChannel->channelSolo())
983                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
984    #ifdef CONFIG_MIDI_INSTRUMENT
985                                    if (pChannel->midiMap() >= 0) {
986                                            ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannel
987                                                    << " " << midiInstrumentMap[pChannel->midiMap()] << endl;
988                                    }
989    #endif
990                  ts << endl;                  ts << endl;
991              }              }
992          }          }
# Line 742  bool qsamplerMainForm::saveSessionFile ( Line 997  bool qsamplerMainForm::saveSessionFile (
997      // Ok. we've wrote it.      // Ok. we've wrote it.
998      file.close();      file.close();
999    
1000            // We're fornerly done.
1001            QApplication::restoreOverrideCursor();
1002    
1003      // Have we any errors?      // Have we any errors?
1004      if (iErrors > 0)      if (iErrors > 0)
1005          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 823  void qsamplerMainForm::fileReset (void) Line 1081  void qsamplerMainForm::fileReset (void)
1081          return;          return;
1082    
1083      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
1084      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
1085                    QSAMPLER_TITLE ": " + tr("Warning"),
1086          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
1087             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
1088             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
1089             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
1090             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
1091          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
1092          return;          return;
1093    
1094            // Trye closing the current session, first...
1095            if (!closeSession(true))
1096                    return;
1097    
1098      // Just do the reset, after closing down current session...      // Just do the reset, after closing down current session...
1099      if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {          if (!resetSession())
1100          appendMessagesClient("lscp_reset_sampler");                  return;
         appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));  
         return;  
     }  
1101    
1102      // Log this.      // Log this.
1103      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
# Line 852  void qsamplerMainForm::fileRestart (void Line 1112  void qsamplerMainForm::fileRestart (void
1112  {  {
1113      if (m_pOptions == NULL)      if (m_pOptions == NULL)
1114          return;          return;
1115            
1116      bool bRestart = true;      bool bRestart = true;
1117        
1118      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
1119      // (if we're currently up and running)      // (if we're currently up and running)
1120      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
1121          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
1122                            QSAMPLER_TITLE ": " + tr("Warning"),
1123              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
1124                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
1125                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
1126                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
1127                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
1128              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
1129      }      }
# Line 895  void qsamplerMainForm::editAddChannel (v Line 1156  void qsamplerMainForm::editAddChannel (v
1156          return;          return;
1157    
1158      // Just create the channel instance...      // Just create the channel instance...
1159      qsamplerChannel *pChannel = new qsamplerChannel(this);      qsamplerChannel *pChannel = new qsamplerChannel();
1160      if (pChannel == NULL)      if (pChannel == NULL)
1161          return;          return;
1162    
# Line 905  void qsamplerMainForm::editAddChannel (v Line 1166  void qsamplerMainForm::editAddChannel (v
1166          delete pChannel;          delete pChannel;
1167          return;          return;
1168      }      }
1169        
1170      // 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).
1171      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
1172          delete pChannel;          delete pChannel;
# Line 927  void qsamplerMainForm::editRemoveChannel Line 1188  void qsamplerMainForm::editRemoveChannel
1188      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1189      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1190          return;          return;
1191            
1192      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
1193      if (pChannel == NULL)      if (pChannel == NULL)
1194          return;          return;
1195    
1196      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1197      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1198          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1199                            QSAMPLER_TITLE ": " + tr("Warning"),
1200              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1201                 "%1\n\n"                 "%1\n\n"
1202                 "Are you sure?")                 "Are you sure?")
# Line 949  void qsamplerMainForm::editRemoveChannel Line 1211  void qsamplerMainForm::editRemoveChannel
1211    
1212      // Just delete the channel strip.      // Just delete the channel strip.
1213      delete pChannelStrip;      delete pChannelStrip;
1214        
1215      // Do we auto-arrange?      // Do we auto-arrange?
1216      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1217          channelsArrange();          channelsArrange();
# Line 993  void qsamplerMainForm::editResetChannel Line 1255  void qsamplerMainForm::editResetChannel
1255  // Reset all sampler channels.  // Reset all sampler channels.
1256  void qsamplerMainForm::editResetAllChannels (void)  void qsamplerMainForm::editResetAllChannels (void)
1257  {  {
1258      if (m_pClient == NULL)          if (m_pClient == NULL)
1259          return;                  return;
1260    
1261      // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1262          // for all channels out there...          // for all channels out there...
1263      m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1264      QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1265      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1266          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1267          if (pChannelStrip)                  if (pChannelStrip)
1268                  pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1269      }          }
1270      m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1271  }  }
1272    
1273    
# Line 1057  void qsamplerMainForm::viewMessages ( bo Line 1319  void qsamplerMainForm::viewMessages ( bo
1319  }  }
1320    
1321    
1322    // Show/hide the MIDI instrument list-view form.
1323    void qsamplerMainForm::viewInstruments (void)
1324    {
1325            if (m_pOptions == NULL)
1326                    return;
1327    
1328            if (m_pInstrumentListForm) {
1329                    m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
1330                    if (m_pInstrumentListForm->isVisible()) {
1331                            m_pInstrumentListForm->hide();
1332                    } else {
1333                            m_pInstrumentListForm->show();
1334                            m_pInstrumentListForm->raise();
1335                            m_pInstrumentListForm->setActiveWindow();
1336                    }
1337            }
1338    }
1339    
1340    
1341  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1342  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1343  {  {
1344      if (m_pOptions == NULL)          if (m_pOptions == NULL)
1345          return;                  return;
1346    
1347      if (m_pDeviceForm) {          if (m_pDeviceForm) {
1348          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1349                  m_pDeviceForm->setClient(m_pClient);                  if (m_pDeviceForm->isVisible()) {
1350          if (m_pDeviceForm->isVisible()) {                          m_pDeviceForm->hide();
1351              m_pDeviceForm->hide();                  } else {
1352          } else {                          m_pDeviceForm->show();
1353              m_pDeviceForm->show();                          m_pDeviceForm->raise();
1354              m_pDeviceForm->raise();                          m_pDeviceForm->setActiveWindow();
1355              m_pDeviceForm->setActiveWindow();                  }
1356          }          }
     }  
1357  }  }
1358    
1359    
# Line 1117  void qsamplerMainForm::viewOptions (void Line 1397  void qsamplerMainForm::viewOptions (void
1397                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1398                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1399                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1400                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this,
1401                                            QSAMPLER_TITLE ": " + tr("Information"),
1402                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1403                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1404                  updateMessagesCapture();                  updateMessagesCapture();
# Line 1191  void qsamplerMainForm::channelsArrange ( Line 1472  void qsamplerMainForm::channelsArrange (
1472          y += iHeight;          y += iHeight;
1473      }      }
1474      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1475        
1476      stabilizeForm();      stabilizeForm();
1477  }  }
1478    
# Line 1245  void qsamplerMainForm::helpAbout (void) Line 1526  void qsamplerMainForm::helpAbout (void)
1526      sText += tr("LSCP (liblscp) instrument_name support disabled.");      sText += tr("LSCP (liblscp) instrument_name support disabled.");
1527      sText += "</font></small><br />";      sText += "</font></small><br />";
1528  #endif  #endif
1529    #ifndef CONFIG_MUTE_SOLO
1530        sText += "<small><font color=\"red\">";
1531        sText += tr("Sampler channel Mute/Solo support disabled.");
1532        sText += "</font></small><br />";
1533    #endif
1534    #ifndef CONFIG_MIDI_INSTRUMENT
1535        sText += "<small><font color=\"red\">";
1536        sText += tr("MIDI instrument mapping support disabled.");
1537        sText += "</font></small><br />";
1538    #endif
1539      sText += "<br />\n";      sText += "<br />\n";
1540      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1541      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1542      sText += " ";      sText += " ";
1543      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1544    #ifdef CONFIG_LIBGIG
1545        sText += ", ";
1546        sText += gig::libraryName().c_str();
1547        sText += " ";
1548        sText += gig::libraryVersion().c_str();
1549    #endif
1550      sText += "<br />\n";      sText += "<br />\n";
1551      sText += "<br />\n";      sText += "<br />\n";
1552      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 1571  void qsamplerMainForm::stabilizeForm (vo
1571      // Update the main application caption...      // Update the main application caption...
1572      QString sSessionName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1573      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1574          sSessionName += '*';          sSessionName += " *";
1575      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1576    
1577      // Update the main menu state...      // Update the main menu state...
# Line 1293  void qsamplerMainForm::stabilizeForm (vo Line 1590  void qsamplerMainForm::stabilizeForm (vo
1590      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1591      editResetAllChannelsAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1592      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1593      viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());  #ifdef CONFIG_MIDI_INSTRUMENT
1594            viewInstrumentsAction->setOn(m_pInstrumentListForm
1595                    && m_pInstrumentListForm->isVisible());
1596            viewInstrumentsAction->setEnabled(bHasClient);
1597    #endif
1598            viewDevicesAction->setOn(m_pDeviceForm
1599                    && m_pDeviceForm->isVisible());
1600      viewDevicesAction->setEnabled(bHasClient);      viewDevicesAction->setEnabled(bHasClient);
1601      channelsArrangeAction->setEnabled(bHasChannel);      channelsArrangeAction->setEnabled(bHasChannel);
1602    
# Line 1329  void qsamplerMainForm::stabilizeForm (vo Line 1632  void qsamplerMainForm::stabilizeForm (vo
1632  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1633  {  {
1634          // Add this strip to the changed list...          // Add this strip to the changed list...
1635          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1636                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1637                    pChannelStrip->resetErrorCount();
1638            }
1639    
1640      // Just mark the dirty form.      // Just mark the dirty form.
1641      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1342  void qsamplerMainForm::channelStripChang Line 1647  void qsamplerMainForm::channelStripChang
1647  // Grab and restore current sampler channels session.  // Grab and restore current sampler channels session.
1648  void qsamplerMainForm::updateSession (void)  void qsamplerMainForm::updateSession (void)
1649  {  {
1650    #ifdef CONFIG_MIDI_INSTRUMENT
1651            // FIXME Make some room for default instrument maps...
1652            int iMaps = ::lscp_get_midi_instrument_maps(m_pClient);
1653            if (iMaps < 0)
1654                    appendMessagesClient("lscp_get_midi_instrument_maps");
1655            else if (iMaps < 1) {
1656                    ::lscp_add_midi_instrument_map(m_pClient, tr("Chromatic").latin1());
1657                    ::lscp_add_midi_instrument_map(m_pClient, tr("Drum Kits").latin1());
1658            }
1659    #endif
1660    
1661          // Retrieve the current channel list.          // Retrieve the current channel list.
1662          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
1663          if (piChannelIDs == NULL) {          if (piChannelIDs == NULL) {
# Line 1349  void qsamplerMainForm::updateSession (vo Line 1665  void qsamplerMainForm::updateSession (vo
1665                          appendMessagesClient("lscp_list_channels");                          appendMessagesClient("lscp_list_channels");
1666                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));                          appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1667                  }                  }
1668                  return;          } else {
1669                    // Try to (re)create each channel.
1670                    m_pWorkspace->setUpdatesEnabled(false);
1671                    for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1672                            // Check if theres already a channel strip for this one...
1673                            if (!channelStrip(piChannelIDs[iChannel]))
1674                                    createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));
1675                    }
1676                    m_pWorkspace->setUpdatesEnabled(true);
1677          }          }
1678    
1679          // Try to (re)create each channel.      // Do we auto-arrange?
1680          m_pWorkspace->setUpdatesEnabled(false);      if (m_pOptions && m_pOptions->bAutoArrange)
1681          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {          channelsArrange();
1682                  // Check if theres already a channel strip for this one...  
1683                  if (!channelStrip(piChannelIDs[iChannel]))          // Remember to refresh devices and instruments...
1684                          createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));          if (m_pInstrumentListForm)
1685                  // Make it visibly responsive...              m_pInstrumentListForm->refreshInstruments();
1686                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          if (m_pDeviceForm)
1687          }              m_pDeviceForm->refreshDevices();
         m_pWorkspace->setUpdatesEnabled(true);  
1688  }  }
1689    
1690    
# Line 1532  void qsamplerMainForm::appendMessagesErr Line 1855  void qsamplerMainForm::appendMessagesErr
1855    
1856      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1857    
1858      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));          // Make it look responsive...:)
1859            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1860    
1861        QMessageBox::critical(this,
1862                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1863  }  }
1864    
1865    
# Line 1545  void qsamplerMainForm::appendMessagesCli Line 1872  void qsamplerMainForm::appendMessagesCli
1872      appendMessagesColor(s + QString(": %1 (errno=%2)")      appendMessagesColor(s + QString(": %1 (errno=%2)")
1873          .arg(::lscp_client_get_result(m_pClient))          .arg(::lscp_client_get_result(m_pClient))
1874          .arg(::lscp_client_get_errno(m_pClient)), "#996666");          .arg(::lscp_client_get_errno(m_pClient)), "#996666");
1875    
1876            // Make it look responsive...:)
1877            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1878  }  }
1879    
1880    
# Line 1572  void qsamplerMainForm::updateMessagesLim Line 1902  void qsamplerMainForm::updateMessagesLim
1902          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1903              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1904          else          else
1905              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1906      }      }
1907  }  }
1908    
# Line 1616  qsamplerChannelStrip *qsamplerMainForm:: Line 1946  qsamplerChannelStrip *qsamplerMainForm::
1946      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1947      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1948          return NULL;          return NULL;
1949            
1950      // Actual channel strip setup...      // Actual channel strip setup...
1951      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1952      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 2004  qsamplerChannelStrip *qsamplerMainForm::
2004          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
2005          if (wlist.isEmpty())          if (wlist.isEmpty())
2006                  return NULL;                  return NULL;
2007            
2008          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
2009                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
2010                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1755  void qsamplerMainForm::timerSlot (void) Line 2085  void qsamplerMainForm::timerSlot (void)
2085              }              }
2086          }          }
2087      }      }
2088        
2089          // Refresh each channel usage, on each period...          if (m_pClient) {
2090      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
2091          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
2092          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
2093              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()) {  
2094                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
2095                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
2096                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
2097                          }                          }
2098              // Update the channel stream usage for each strip...                  }
2099              QWidgetList wlist = m_pWorkspace->windowList();                  // Refresh each channel usage, on each period...
2100              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  if (m_pOptions->bAutoRefresh) {
2101                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
2102                  if (pChannelStrip && pChannelStrip->isVisible())                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
2103                      pChannelStrip->updateChannelUsage();                                  m_iTimerSlot = 0;
2104              }                                  // Update the channel stream usage for each strip...
2105          }                                  QWidgetList wlist = m_pWorkspace->windowList();
2106      }                                  for (int iChannel = 0;
2107                                                    iChannel < (int) wlist.count(); iChannel++) {
2108                                            qsamplerChannelStrip *pChannelStrip
2109                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
2110                                            if (pChannelStrip && pChannelStrip->isVisible())
2111                                                    pChannelStrip->updateChannelUsage();
2112                                    }
2113                            }
2114                    }
2115            }
2116    
2117      // Register the next timer slot.      // Register the next timer slot.
2118      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1799  void qsamplerMainForm::startServer (void Line 2134  void qsamplerMainForm::startServer (void
2134    
2135      // Is the server process instance still here?      // Is the server process instance still here?
2136      if (m_pServer) {      if (m_pServer) {
2137          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
2138                            QSAMPLER_TITLE ": " + tr("Warning"),
2139              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
2140                 "Maybe it ss already started."),                 "Maybe it ss already started."),
2141              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1958  bool qsamplerMainForm::startClient (void Line 2294  bool qsamplerMainForm::startClient (void
2294      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2295      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)));
2296    
2297            // Subscribe to channel info change notifications...
2298            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2299                    appendMessagesClient("lscp_client_subscribe");
2300    
2301      // We may stop scheduling around.      // We may stop scheduling around.
2302      stopSchedule();      stopSchedule();
2303    
# Line 1967  bool qsamplerMainForm::startClient (void Line 2307  bool qsamplerMainForm::startClient (void
2307      // Log success here.      // Log success here.
2308      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2309    
2310          // Hard-notify device configuration form,          // Hard-notify instrumnet and device configuration forms,
2311          // if visible, that we're ready...          // if visible, that we're ready...
2312          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pInstrumentListForm)
2313              m_pDeviceForm->setClient(m_pClient);              m_pInstrumentListForm->refreshInstruments();
2314                        if (m_pDeviceForm)
2315                m_pDeviceForm->refreshDevices();
2316    
2317      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2318      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2319          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1992  void qsamplerMainForm::stopClient (void) Line 2334  void qsamplerMainForm::stopClient (void)
2334      if (m_pClient == NULL)      if (m_pClient == NULL)
2335          return;          return;
2336    
         // Hard-notify device configuration form,  
         // if visible, that we're running out...  
         if (m_pDeviceForm && m_pDeviceForm->isVisible())  
             m_pDeviceForm->setClient(NULL);  
   
2337      // Log prepare here.      // Log prepare here.
2338      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2339    
# Line 2011  void qsamplerMainForm::stopClient (void) Line 2348  void qsamplerMainForm::stopClient (void)
2348      // channels from the back-end server.      // channels from the back-end server.
2349      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2350      closeSession(false);      closeSession(false);
2351        
2352      // Close us as a client...      // Close us as a client...
2353      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2354        ::lscp_client_destroy(m_pClient);
2355      m_pClient = NULL;      m_pClient = NULL;
2356    
2357            // Hard-notify instrumnet and device configuration forms,
2358            // if visible, that we're running out...
2359            if (m_pInstrumentListForm)
2360                m_pInstrumentListForm->refreshInstruments();
2361            if (m_pDeviceForm)
2362                m_pDeviceForm->refreshDevices();
2363    
2364      // Log final here.      // Log final here.
2365      appendMessages(tr("Client disconnected."));      appendMessages(tr("Client disconnected."));
2366    

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

  ViewVC Help
Powered by ViewVC