/[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 400 by capela, Mon Feb 21 15:02:58 2005 UTC revision 753 by capela, Wed Aug 24 17:44:59 2005 UTC
# Line 41  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
 #include "qsamplerOptionsForm.h"  
44    
45  #include "config.h"  #include "qsamplerDeviceForm.h"
46    #include "qsamplerOptionsForm.h"
47    
48  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
49  #include <signal.h>  #include <signal.h>
50  #endif  #endif
51    
52    #ifdef CONFIG_LIBGIG
53    #include <gig.h>
54    #endif
55    
56  // Timer constant stuff.  // Timer constant stuff.
57  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
58    
# Line 105  void qsamplerMainForm::init (void) Line 109  void qsamplerMainForm::init (void)
109      m_pOptions = NULL;      m_pOptions = NULL;
110    
111      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
112      m_pMessages = NULL;      m_pMessages   = NULL;
113        m_pDeviceForm = NULL;
114    
115      // We'll start clean.      // We'll start clean.
116      m_iUntitled   = 0;      m_iUntitled   = 0;
# Line 138  void qsamplerMainForm::init (void) Line 143  void qsamplerMainForm::init (void)
143      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
144      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
145      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
146      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
147      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
148      // Server address.      // Server address.
149      pLabel = new QLabel(this);      pLabel = new QLabel(this);
150      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
151      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
152      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
153      // Channel title.      // Channel title.
154      pLabel = new QLabel(this);      pLabel = new QLabel(this);
155      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
156      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
157      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
158      // Session modification status.      // Session modification status.
159      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
160      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
161      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
162      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
163      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
164    
165      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 173  void qsamplerMainForm::destroy (void) Line 178  void qsamplerMainForm::destroy (void)
178  {  {
179      // Do final processing anyway.      // Do final processing anyway.
180      processServerExit();      processServerExit();
181        
182      // Delete recentfiles menu.  #if defined(WIN32)
183      if (m_pRecentFilesMenu)      WSACleanup();
184          delete m_pRecentFilesMenu;  #endif
     // Delete status item labels one by one.  
     if (m_status[QSAMPLER_STATUS_CLIENT])  
         delete m_status[QSAMPLER_STATUS_CLIENT];  
     if (m_status[QSAMPLER_STATUS_SERVER])  
         delete m_status[QSAMPLER_STATUS_SERVER];  
     if (m_status[QSAMPLER_STATUS_CHANNEL])  
         delete m_status[QSAMPLER_STATUS_CHANNEL];  
     if (m_status[QSAMPLER_STATUS_SESSION])  
         delete m_status[QSAMPLER_STATUS_SESSION];  
185    
186      // Finally drop any widgets around...      // Finally drop any widgets around...
187        if (m_pDeviceForm)
188            delete m_pDeviceForm;
189      if (m_pMessages)      if (m_pMessages)
190          delete m_pMessages;          delete m_pMessages;
191      if (m_pWorkspace)      if (m_pWorkspace)
192          delete m_pWorkspace;          delete m_pWorkspace;
193    
194  #if defined(WIN32)      // Delete status item labels one by one.
195      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
196  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
197        if (m_statusItem[QSAMPLER_STATUS_SERVER])
198            delete m_statusItem[QSAMPLER_STATUS_SERVER];
199        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
200            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
201        if (m_statusItem[QSAMPLER_STATUS_SESSION])
202            delete m_statusItem[QSAMPLER_STATUS_SESSION];
203    
204        // Delete recentfiles menu.
205        if (m_pRecentFilesMenu)
206            delete m_pRecentFilesMenu;
207  }  }
208    
209    
# Line 205  void qsamplerMainForm::setup ( qsamplerO Line 213  void qsamplerMainForm::setup ( qsamplerO
213      // We got options?      // We got options?
214      m_pOptions = pOptions;      m_pOptions = pOptions;
215    
216        // What style do we create these forms?
217        WFlags wflags = Qt::WType_TopLevel;
218        if (m_pOptions->bKeepOnTop)
219            wflags |= Qt::WStyle_Tool;
220      // Some child forms are to be created right now.      // Some child forms are to be created right now.
221      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
222        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
223        m_pDeviceForm->setMainForm(this); // An important life immutable!
224      // Set message defaults...      // Set message defaults...
225      updateMessagesFont();      updateMessagesFont();
226      updateMessagesLimit();      updateMessagesLimit();
# Line 235  void qsamplerMainForm::setup ( qsamplerO Line 249  void qsamplerMainForm::setup ( qsamplerO
249          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
250          istr >> *this;          istr >> *this;
251      }      }
252      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
253      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
254        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
255    
256      // Final startup stabilization...      // Final startup stabilization...
257      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 274  bool qsamplerMainForm::queryClose (void) Line 289  bool qsamplerMainForm::queryClose (void)
289              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
290              ostr << *this;              ostr << *this;
291              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
292              // And the main windows state.              // And the children, and the main windows state,.
293              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
294                            m_pOptions->saveWidgetGeometry(this);
295                            // Close popup widgets.
296                            if (m_pDeviceForm)
297                                    m_pDeviceForm->close();
298              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
299              stopServer();              stopServer();
300          }          }
# Line 305  bool qsamplerMainForm::decodeDragFiles ( Line 324  bool qsamplerMainForm::decodeDragFiles (
324          if (bDecode) {          if (bDecode) {
325              files = QStringList::split('\n', sText);              files = QStringList::split('\n', sText);
326              for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)              for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
327                  *iter = (*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null);                  *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
328          }          }
329      }      }
330    
# Line 328  void qsamplerMainForm::dropEvent ( QDrop Line 347  void qsamplerMainForm::dropEvent ( QDrop
347      if (!decodeDragFiles(pDropEvent, files))      if (!decodeDragFiles(pDropEvent, files))
348          return;          return;
349    
350      for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
351                  const QString& sPath = QUrl(*iter).path();                  const QString& sPath = *iter;
352                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
353                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
354                      qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel(this);
355                      if (pChannel == NULL)                          if (pChannel == NULL)
356                          return;                                  return;
357                          // Start setting the instrument filename...                          // Start setting the instrument filename...
358                          pChannel->setInstrument(sPath, 0);                          pChannel->setInstrument(sPath, 0);
359                      // Before we show it up, may be we'll                          // Before we show it up, may be we'll
360                      // better ask for some initial values?                          // better ask for some initial values?
361                      if (!pChannel->channelSetup(this)) {                          if (!pChannel->channelSetup(this)) {
362                          delete pChannel;                                  delete pChannel;
363                          return;                                  return;
364                      }                          }
365                      // Finally, give it to a new channel strip...                          // Finally, give it to a new channel strip...
366                          if (!createChannelStrip(pChannel)) {                          if (!createChannelStrip(pChannel)) {
367                          delete pChannel;                                  delete pChannel;
368                          return;                                  return;
369                          }                          }
370                      // Make that an overall update.                          // Make that an overall update.
371                      m_iDirtyCount++;                          m_iDirtyCount++;
372                      stabilizeForm();                          stabilizeForm();
373                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
374                  else if (closeSession(true))                  else if (closeSession(true))
375                          loadSessionFile(sPath);                          loadSessionFile(sPath);
# Line 366  void qsamplerMainForm::customEvent ( QCu Line 385  void qsamplerMainForm::customEvent ( QCu
385      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
386      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
387          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
388          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
389              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
390              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
391                            if (pChannelStrip)
392                                    channelStripChanged(pChannelStrip);
393                    } else {
394                            appendMessagesColor(tr("Notify event: %1 data: %2")
395                                    .arg(::lscp_event_to_text(pEvent->event()))
396                                    .arg(pEvent->data()), "#996699");
397                    }
398      }      }
399  }  }
400    
# Line 377  void qsamplerMainForm::customEvent ( QCu Line 403  void qsamplerMainForm::customEvent ( QCu
403  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
404  {  {
405      stabilizeForm();      stabilizeForm();
406        
407      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
408  }  }
409    
# Line 582  bool qsamplerMainForm::loadSessionFile ( Line 608  bool qsamplerMainForm::loadSessionFile (
608              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
609                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
610                  iErrors++;                  iErrors++;
                 break;  
611              }              }
612          }          }
613          // Try to make it snappy :)          // Try to make it snappy :)
# Line 592  bool qsamplerMainForm::loadSessionFile ( Line 617  bool qsamplerMainForm::loadSessionFile (
617      // Ok. we've read it.      // Ok. we've read it.
618      file.close();      file.close();
619    
     // Have we any errors?  
     if (iErrors > 0)  
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
   
620          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
621          updateSession();          updateSession();
622    
623            // Have we any errors?
624            if (iErrors > 0)
625                    appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
626    
627      // Save as default session directory.      // Save as default session directory.
628      if (m_pOptions)      if (m_pOptions)
629          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
630      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
631      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
632      // Stabilize form...      // Stabilize form...
633      m_sFilename = sFilename;      m_sFilename = sFilename;
634      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
635      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
636        
637      // Make that an overall update.      // Make that an overall update.
638      stabilizeForm();      stabilizeForm();
639      return true;      return true;
# Line 626  bool qsamplerMainForm::saveSessionFile ( Line 651  bool qsamplerMainForm::saveSessionFile (
651      }      }
652    
653      // Write the file.      // Write the file.
654      int iErrors = 0;      int  iErrors = 0;
655      QTextStream ts(&file);      QTextStream ts(&file);
656      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
657      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 637  bool qsamplerMainForm::saveSessionFile ( Line 662  bool qsamplerMainForm::saveSessionFile (
662      ts << "# " << tr("File")      ts << "# " << tr("File")
663         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
664      ts << "# " << tr("Date")      ts << "# " << tr("Date")
665         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
666         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
667      ts << "#"  << endl;      ts << "#"  << endl;
668      ts << endl;      ts << endl;
669            // It is assumed that this new kind of device+session file
670            // will be loaded from a complete
671            int *piDeviceIDs;
672            int  iDevice;
673            ts << "RESET" << endl;
674            // Audio device mapping.
675            QMap<int, int> audioDeviceMap;
676            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
677            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
678                    ts << endl;
679                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
680                    // Audio device specification...
681                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
682                            << " " << tr("Device") << " " << iDevice << endl;
683                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
684                    qsamplerDeviceParamMap::ConstIterator deviceParam;
685                    for (deviceParam = device.params().begin();
686                                    deviceParam != device.params().end();
687                                            ++deviceParam) {
688                            const qsamplerDeviceParam& param = deviceParam.data();
689                            if (param.value.isEmpty()) ts << "# ";
690                            ts << " " << deviceParam.key() << "='" << param.value << "'";
691                    }
692                    ts << endl;
693                    // Audio channel parameters...
694                    int iPort = 0;
695                    for (qsamplerDevicePort *pPort = device.ports().first();
696                                    pPort;
697                                            pPort = device.ports().next(), ++iPort) {
698                            qsamplerDeviceParamMap::ConstIterator portParam;
699                            for (portParam = pPort->params().begin();
700                                            portParam != pPort->params().end();
701                                                    ++portParam) {
702                                    const qsamplerDeviceParam& param = portParam.data();
703                                    if (param.fix || param.value.isEmpty()) ts << "# ";
704                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
705                                            << " " << iPort << " " << portParam.key()
706                                            << "='" << param.value << "'" << endl;
707                            }
708                    }
709                    // Audio device index/id mapping.
710                    audioDeviceMap[device.deviceID()] = iDevice;
711            // Try to keep it snappy :)
712            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
713            }
714            // MIDI device mapping.
715            QMap<int, int> midiDeviceMap;
716            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
717            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
718                    ts << endl;
719                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
720                    // MIDI device specification...
721                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
722                            << " " << tr("Device") << " " << iDevice << endl;
723                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
724                    qsamplerDeviceParamMap::ConstIterator deviceParam;
725                    for (deviceParam = device.params().begin();
726                                    deviceParam != device.params().end();
727                                            ++deviceParam) {
728                            const qsamplerDeviceParam& param = deviceParam.data();
729                            if (param.value.isEmpty()) ts << "# ";
730                            ts << " " << deviceParam.key() << "='" << param.value << "'";
731                    }
732                    ts << endl;
733                    // MIDI port parameters...
734                    int iPort = 0;
735                    for (qsamplerDevicePort *pPort = device.ports().first();
736                                    pPort;
737                                            pPort = device.ports().next(), ++iPort) {
738                            qsamplerDeviceParamMap::ConstIterator portParam;
739                            for (portParam = pPort->params().begin();
740                                            portParam != pPort->params().end();
741                                                    ++portParam) {
742                                    const qsamplerDeviceParam& param = portParam.data();
743                                    if (param.fix || param.value.isEmpty()) ts << "# ";
744                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
745                                       << " " << iPort << " " << portParam.key()
746                                       << "='" << param.value << "'" << endl;
747                            }
748                    }
749                    // MIDI device index/id mapping.
750                    midiDeviceMap[device.deviceID()] = iDevice;
751            // Try to keep it snappy :)
752            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
753            }
754            ts << endl;
755            // Sampler channel mapping.
756      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
757      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
758          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
759          if (pChannelStrip) {          if (pChannelStrip) {
760              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
761              if (pChannel) {              if (pChannel) {
762                  int iChannelID = pChannel->channelID();                  ts << "# " << tr("Channel") << " " << iChannel << endl;
                 ts << "# " << pChannelStrip->caption() << endl;  
763                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
764                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                                  if (audioDeviceMap.isEmpty()) {
765                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
766                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                                  << " " << pChannel->audioDriver() << endl;
767                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                                  } else {
768                                            ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
769                                                    << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
770                                    }
771                                    if (midiDeviceMap.isEmpty()) {
772                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
773                                                    << " " << pChannel->midiDriver() << endl;
774                                    } else {
775                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
776                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
777                                    }
778                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
779                                            << " " << pChannel->midiPort() << endl;
780                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
781                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
782                      ts << "ALL";                      ts << "ALL";
783                  else                  else
784                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
785                  ts << endl;                  ts << endl;
786                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
787                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
788                  ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
789                    if (pChannel->channelMute())
790                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
791                    if (pChannel->channelSolo())
792                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
793                  ts << endl;                  ts << endl;
794              }              }
795          }          }
# Line 690  bool qsamplerMainForm::saveSessionFile ( Line 818  bool qsamplerMainForm::saveSessionFile (
818  }  }
819    
820    
821    // Session change receiver slot.
822    void qsamplerMainForm::sessionDirty (void)
823    {
824        // Just mark the dirty form.
825        m_iDirtyCount++;
826        // and update the form status...
827        stabilizeForm();
828    }
829    
830    
831  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
832  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
833    
# Line 747  void qsamplerMainForm::fileReset (void) Line 885  void qsamplerMainForm::fileReset (void)
885          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
886             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
887             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
888             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
889             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
890          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
891          return;          return;
# Line 772  void qsamplerMainForm::fileRestart (void Line 910  void qsamplerMainForm::fileRestart (void
910  {  {
911      if (m_pOptions == NULL)      if (m_pOptions == NULL)
912          return;          return;
913            
914      bool bRestart = true;      bool bRestart = true;
915        
916      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
917      // (if we're currently up and running)      // (if we're currently up and running)
918      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
# Line 782  void qsamplerMainForm::fileRestart (void Line 920  void qsamplerMainForm::fileRestart (void
920              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
921                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
922                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
923                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
924                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
925              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
926      }      }
# Line 825  void qsamplerMainForm::editAddChannel (v Line 963  void qsamplerMainForm::editAddChannel (v
963          delete pChannel;          delete pChannel;
964          return;          return;
965      }      }
966        
967      // 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).
968      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
969          delete pChannel;          delete pChannel;
# Line 847  void qsamplerMainForm::editRemoveChannel Line 985  void qsamplerMainForm::editRemoveChannel
985      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
986      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
987          return;          return;
988            
989      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
990      if (pChannel == NULL)      if (pChannel == NULL)
991          return;          return;
# Line 869  void qsamplerMainForm::editRemoveChannel Line 1007  void qsamplerMainForm::editRemoveChannel
1007    
1008      // Just delete the channel strip.      // Just delete the channel strip.
1009      delete pChannelStrip;      delete pChannelStrip;
1010        
1011      // Do we auto-arrange?      // Do we auto-arrange?
1012      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1013          channelsArrange();          channelsArrange();
# Line 910  void qsamplerMainForm::editResetChannel Line 1048  void qsamplerMainForm::editResetChannel
1048  }  }
1049    
1050    
1051    // Reset all sampler channels.
1052    void qsamplerMainForm::editResetAllChannels (void)
1053    {
1054            if (m_pClient == NULL)
1055                    return;
1056    
1057            // Invoque the channel strip procedure,
1058            // for all channels out there...
1059            m_pWorkspace->setUpdatesEnabled(false);
1060            QWidgetList wlist = m_pWorkspace->windowList();
1061            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1062                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1063                    if (pChannelStrip)
1064                            pChannelStrip->channelReset();
1065            }
1066            m_pWorkspace->setUpdatesEnabled(true);
1067    }
1068    
1069    
1070  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1071  // qsamplerMainForm -- View Action slots.  // qsamplerMainForm -- View Action slots.
1072    
# Line 958  void qsamplerMainForm::viewMessages ( bo Line 1115  void qsamplerMainForm::viewMessages ( bo
1115  }  }
1116    
1117    
1118    // Show/hide the device configurator form.
1119    void qsamplerMainForm::viewDevices (void)
1120    {
1121            if (m_pOptions == NULL)
1122                    return;
1123    
1124            if (m_pDeviceForm) {
1125                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1126                    m_pDeviceForm->setClient(m_pClient);
1127                    if (m_pDeviceForm->isVisible()) {
1128                            m_pDeviceForm->hide();
1129                    } else {
1130                            m_pDeviceForm->show();
1131                            m_pDeviceForm->raise();
1132                            m_pDeviceForm->setActiveWindow();
1133                    }
1134            }
1135    }
1136    
1137    
1138  // Show options dialog.  // Show options dialog.
1139  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1140  {  {
# Line 982  void qsamplerMainForm::viewOptions (void Line 1159  void qsamplerMainForm::viewOptions (void
1159          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1160          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1161          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1162            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1163          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1164          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1165          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
# Line 994  void qsamplerMainForm::viewOptions (void Line 1172  void qsamplerMainForm::viewOptions (void
1172          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1173              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1174              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1175                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1176                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1177                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1178                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1179                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1180                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 1069  void qsamplerMainForm::channelsArrange ( Line 1249  void qsamplerMainForm::channelsArrange (
1249          y += iHeight;          y += iHeight;
1250      }      }
1251      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1252        
1253      stabilizeForm();      stabilizeForm();
1254  }  }
1255    
# Line 1123  void qsamplerMainForm::helpAbout (void) Line 1303  void qsamplerMainForm::helpAbout (void)
1303      sText += tr("LSCP (liblscp) instrument_name support disabled.");      sText += tr("LSCP (liblscp) instrument_name support disabled.");
1304      sText += "</font></small><br />";      sText += "</font></small><br />";
1305  #endif  #endif
1306    #ifndef CONFIG_MUTE_SOLO
1307        sText += "<small><font color=\"red\">";
1308        sText += tr("Sampler channel Mute/Solo support disabled.");
1309        sText += "</font></small><br />";
1310    #endif
1311      sText += "<br />\n";      sText += "<br />\n";
1312      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1313      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1314      sText += " ";      sText += " ";
1315      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1316    #ifdef CONFIG_LIBGIG
1317        sText += ", ";
1318        sText += gig::libraryName().c_str();
1319        sText += " ";
1320        sText += gig::libraryVersion().c_str();
1321    #endif
1322      sText += "<br />\n";      sText += "<br />\n";
1323      sText += "<br />\n";      sText += "<br />\n";
1324      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 1150  void qsamplerMainForm::helpAbout (void) Line 1341  void qsamplerMainForm::helpAbout (void)
1341  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1342  {  {
1343      // Update the main application caption...      // Update the main application caption...
1344      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1345      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1346          sSessioName += '*';          sSessionName += '*';
1347      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1348    
1349      // Update the main menu state...      // Update the main menu state...
1350      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
# Line 1169  void qsamplerMainForm::stabilizeForm (vo Line 1360  void qsamplerMainForm::stabilizeForm (vo
1360      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1361      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1362      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1363      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1364      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1365        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1366        viewDevicesAction->setEnabled(bHasClient);
1367        channelsArrangeAction->setEnabled(bHasChannel);
1368    
1369      // Client/Server status...      // Client/Server status...
1370      if (bHasClient) {      if (bHasClient) {
1371          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1372          m_status[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));          m_statusItem[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));
1373      } else {      } else {
1374          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1375          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1376      }      }
1377      // Channel status...      // Channel status...
1378      if (bHasChannel)      if (bHasChannel)
1379          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1380      else      else
1381          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1382      // Session status...      // Session status...
1383      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1384          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1385      else      else
1386          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1387    
1388      // Recent files menu.      // Recent files menu.
1389      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1204  void qsamplerMainForm::stabilizeForm (vo Line 1398  void qsamplerMainForm::stabilizeForm (vo
1398  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1399  {  {
1400          // Add this strip to the changed list...          // Add this strip to the changed list...
1401          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1402                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1403                    pChannelStrip->resetErrorCount();
1404            }
1405    
1406      // Just mark the dirty form.      // Just mark the dirty form.
1407      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1237  void qsamplerMainForm::updateSession (vo Line 1433  void qsamplerMainForm::updateSession (vo
1433                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1434          }          }
1435          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1436            
1437            // Remember to refresh devices
1438            if (m_pDeviceForm)
1439                m_pDeviceForm->refreshDevices();
1440  }  }
1441    
1442    
# Line 1447  void qsamplerMainForm::updateMessagesLim Line 1647  void qsamplerMainForm::updateMessagesLim
1647          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1648              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1649          else          else
1650              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1651      }      }
1652  }  }
1653    
# Line 1491  qsamplerChannelStrip *qsamplerMainForm:: Line 1691  qsamplerChannelStrip *qsamplerMainForm::
1691      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1692      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1693          return NULL;          return NULL;
1694            
1695      // Actual channel strip setup...      // Actual channel strip setup...
1696      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1697      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1549  qsamplerChannelStrip *qsamplerMainForm:: Line 1749  qsamplerChannelStrip *qsamplerMainForm::
1749          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1750          if (wlist.isEmpty())          if (wlist.isEmpty())
1751                  return NULL;                  return NULL;
1752            
1753          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1754                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1755                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1630  void qsamplerMainForm::timerSlot (void) Line 1830  void qsamplerMainForm::timerSlot (void)
1830              }              }
1831          }          }
1832      }      }
1833        
1834          // Refresh each channel usage, on each period...          if (m_pClient) {
1835      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1836          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1837          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1838              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()) {  
1839                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
1840                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
1841                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
1842                          }                          }
1843              // Update the channel stream usage for each strip...                  }
1844              QWidgetList wlist = m_pWorkspace->windowList();                  // Refresh each channel usage, on each period...
1845              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  if (m_pOptions->bAutoRefresh) {
1846                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1847                  if (pChannelStrip && pChannelStrip->isVisible())                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1848                      pChannelStrip->updateChannelUsage();                                  m_iTimerSlot = 0;
1849              }                                  // Update the channel stream usage for each strip...
1850          }                                  QWidgetList wlist = m_pWorkspace->windowList();
1851      }                                  for (int iChannel = 0;
1852                                                    iChannel < (int) wlist.count(); iChannel++) {
1853                                            qsamplerChannelStrip *pChannelStrip
1854                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1855                                            if (pChannelStrip && pChannelStrip->isVisible())
1856                                                    pChannelStrip->updateChannelUsage();
1857                                    }
1858                            }
1859                    }
1860            }
1861    
1862      // Register the next timer slot.      // Register the next timer slot.
1863      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1833  bool qsamplerMainForm::startClient (void Line 2038  bool qsamplerMainForm::startClient (void
2038      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2039      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)));
2040    
2041            // Subscribe to channel info change notifications...
2042            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2043                    appendMessagesClient("lscp_client_subscribe");
2044    
2045      // We may stop scheduling around.      // We may stop scheduling around.
2046      stopSchedule();      stopSchedule();
2047    
# Line 1842  bool qsamplerMainForm::startClient (void Line 2051  bool qsamplerMainForm::startClient (void
2051      // Log success here.      // Log success here.
2052      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2053    
2054            // Hard-notify device configuration form,
2055            // if visible, that we're ready...
2056            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2057                m_pDeviceForm->setClient(m_pClient);
2058    
2059      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2060      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2061          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1862  void qsamplerMainForm::stopClient (void) Line 2076  void qsamplerMainForm::stopClient (void)
2076      if (m_pClient == NULL)      if (m_pClient == NULL)
2077          return;          return;
2078    
2079            // Hard-notify device configuration form,
2080            // if visible, that we're running out...
2081            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2082                m_pDeviceForm->setClient(NULL);
2083    
2084      // Log prepare here.      // Log prepare here.
2085      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2086    
# Line 1876  void qsamplerMainForm::stopClient (void) Line 2095  void qsamplerMainForm::stopClient (void)
2095      // channels from the back-end server.      // channels from the back-end server.
2096      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2097      closeSession(false);      closeSession(false);
2098        
2099      // Close us as a client...      // Close us as a client...
2100      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2101        ::lscp_client_destroy(m_pClient);
2102      m_pClient = NULL;      m_pClient = NULL;
2103    
2104      // Log final here.      // Log final here.

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

  ViewVC Help
Powered by ViewVC