/[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 255 by capela, Tue Sep 28 16:17:43 2004 UTC revision 753 by capela, Wed Aug 24 17:44:59 2005 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, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2005, 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 26  Line 26 
26  #include <qprocess.h>  #include <qprocess.h>
27  #include <qmessagebox.h>  #include <qmessagebox.h>
28  #include <qdragobject.h>  #include <qdragobject.h>
29    #include <qregexp.h>
30  #include <qfiledialog.h>  #include <qfiledialog.h>
31  #include <qfileinfo.h>  #include <qfileinfo.h>
32  #include <qfile.h>  #include <qfile.h>
# Line 36  Line 37 
37    
38  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
39  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
40    #include "qsamplerChannel.h"
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #ifdef HAVE_SIGNAL_H
49    #include <signal.h>
50    #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
# Line 100  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;
117      m_iDirtyCount = 0;      m_iDirtyCount = 0;
118    
119      m_pServer = NULL;      m_pServer = NULL;
# Line 114  void qsamplerMainForm::init (void) Line 124  void qsamplerMainForm::init (void)
124    
125      m_iTimerSlot = 0;      m_iTimerSlot = 0;
126    
127    #ifdef HAVE_SIGNAL_H
128            // Set to ignore any fatal "Broken pipe" signals.
129            ::signal(SIGPIPE, SIG_IGN);
130    #endif
131    
132      // Make it an MDI workspace.      // Make it an MDI workspace.
133      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
134      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 128  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 163  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 195  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 225  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 264  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 284  void qsamplerMainForm::closeEvent ( QClo Line 313  void qsamplerMainForm::closeEvent ( QClo
313  }  }
314    
315    
316  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
317  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
318  {  {
319      bool bAccept = false;      bool bDecode = false;
320    
321      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
322          QString sUrl;          QString sText;
323          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
324              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
325                files = QStringList::split('\n', sText);
326                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
327                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
328            }
329      }      }
330    
331      pDragEnterEvent->accept(bAccept);      return bDecode;
332    }
333    
334    
335    // Window drag-n-drop event handlers.
336    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
337    {
338            QStringList files;
339            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
340  }  }
341    
342    
343  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
344  {  {
345      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
346          QString sUrl;  
347          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
348              loadSessionFile(QUrl(sUrl).path());          return;
349      }  
350            for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
351                    const QString& sPath = *iter;
352                    if (qsamplerChannel::isInstrumentFile(sPath)) {
353                            // Try to create a new channel from instrument file...
354                            qsamplerChannel *pChannel = new qsamplerChannel(this);
355                            if (pChannel == NULL)
356                                    return;
357                            // Start setting the instrument filename...
358                            pChannel->setInstrument(sPath, 0);
359                            // Before we show it up, may be we'll
360                            // better ask for some initial values?
361                            if (!pChannel->channelSetup(this)) {
362                                    delete pChannel;
363                                    return;
364                            }
365                            // Finally, give it to a new channel strip...
366                            if (!createChannelStrip(pChannel)) {
367                                    delete pChannel;
368                                    return;
369                            }
370                            // Make that an overall update.
371                            m_iDirtyCount++;
372                            stabilizeForm();
373                    }   // Otherwise, load an usual session file (LSCP script)...
374                    else if (closeSession(true))
375                            loadSessionFile(sPath);
376                    // Make it look responsive...:)
377                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
378            }
379  }  }
380    
381    
# Line 315  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 326  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 370  bool qsamplerMainForm::newSession (void) Line 447  bool qsamplerMainForm::newSession (void)
447      if (!closeSession(true))      if (!closeSession(true))
448          return false;          return false;
449    
450            // Give us what the server has, right now...
451            updateSession();
452    
453      // Ok increment untitled count.      // Ok increment untitled count.
454      m_iUntitled++;      m_iUntitled++;
455    
# Line 483  bool qsamplerMainForm::closeSession ( bo Line 563  bool qsamplerMainForm::closeSession ( bo
563          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
564          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
565          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
566              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
567              if (bForce && ::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK)              if (pChannelStrip) {
568                  appendMessagesClient("lscp_remove_channel");                  qsamplerChannel *pChannel = pChannelStrip->channel();
569              delete pChannel;                  if (bForce && pChannel)
570                        pChannel->removeChannel();
571                    delete pChannelStrip;
572                }
573          }          }
574          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
575          // We're now clean, for sure.          // We're now clean, for sure.
# Line 534  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    
620      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
621      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));  
622    
623      // Now we'll try to create the whole GUI session.          // Have we any errors?
624      int iChannels = ::lscp_get_channels(m_pClient);          if (iErrors > 0)
625      if (iChannels < 0) {                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
         appendMessagesClient("lscp_get_channels");  
         appendMessagesError(tr("Could not get current number of channels.\n\nSorry."));  
     }  
       
     // Try to (re)create each channel.  
     m_pWorkspace->setUpdatesEnabled(false);  
     for (int iChannelID = 0; iChannelID < iChannels; iChannelID++) {  
         createChannel(iChannelID, false);  
         QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
     }  
     m_pWorkspace->setUpdatesEnabled(true);  
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.
638      stabilizeForm();      stabilizeForm();
639      return true;      return true;
640  }  }
# Line 578  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 589  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 *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
759          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
760          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
761          ts << "ADD CHANNEL" << endl;              if (pChannel) {
762          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
763          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
764          ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                  if (audioDeviceMap.isEmpty()) {
765          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
766          if (pChannel->midiChannel() > 0)                                                  << " " << pChannel->audioDriver() << endl;
767              ts << pChannel->midiChannel();                                  } else {
768           else                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
769              ts << "ALL";                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
770          ts << endl;                                  }
771          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                  if (midiDeviceMap.isEmpty()) {
772          ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
773          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                                                  << " " << pChannel->midiDriver() << endl;
774          ts << endl;                                  } 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)
782                        ts << "ALL";
783                    else
784                        ts << pChannel->midiChannel();
785                    ts << endl;
786                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
787                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
788                    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;
794                }
795            }
796          // Try to keep it snappy :)          // Try to keep it snappy :)
797          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
798      }      }
# Line 637  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 694  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;
892    
893      // Just do the reset, after closing down current session...      // Just do the reset, after closing down current session...
894      if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK)      if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {
895          appendMessagesClient("lscp_reset_sampler");          appendMessagesClient("lscp_reset_sampler");
896            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
897            return;
898        }
899    
900        // Log this.
901        appendMessages(tr("Sampler reset."));
902    
903            // Make it a new session...
904            newSession();
905  }  }
906    
907    
# Line 710  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 720  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 752  void qsamplerMainForm::editAddChannel (v Line 952  void qsamplerMainForm::editAddChannel (v
952      if (m_pClient == NULL)      if (m_pClient == NULL)
953          return;          return;
954    
955      // Create the new sampler channel.      // Just create the channel instance...
956      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel(this);
957      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
958          return;          return;
     }  
959    
960      // Log this happening.      // Before we show it up, may be we'll
961      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
962        if (!pChannel->channelSetup(this)) {
963            delete pChannel;
964            return;
965        }
966    
967      // Just create the channel strip with given id.      // And give it to the strip (will own the channel instance, if successful).
968      createChannel(iChannelID, true);      if (!createChannelStrip(pChannel)) {
969            delete pChannel;
970            return;
971        }
972    
973      // We'll be dirty, for sure...      // Make that an overall update.
974      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
975      stabilizeForm();      stabilizeForm();
976  }  }
977    
# Line 779  void qsamplerMainForm::editRemoveChannel Line 982  void qsamplerMainForm::editRemoveChannel
982      if (m_pClient == NULL)      if (m_pClient == NULL)
983          return;          return;
984    
985      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
986        if (pChannelStrip == NULL)
987            return;
988    
989        qsamplerChannel *pChannel = pChannelStrip->channel();
990      if (pChannel == NULL)      if (pChannel == NULL)
991          return;          return;
992    
# Line 789  void qsamplerMainForm::editRemoveChannel Line 996  void qsamplerMainForm::editRemoveChannel
996              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
997                 "%1\n\n"                 "%1\n\n"
998                 "Are you sure?")                 "Are you sure?")
999                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
1000              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
1001              return;              return;
1002      }      }
1003    
1004      // Remove the existing sampler channel.      // Remove the existing sampler channel.
1005      if (::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      if (!pChannel->removeChannel())
         appendMessagesClient("lscp_remove_channel");  
         appendMessagesError(tr("Could not remove channel.\n\nSorry."));  
1006          return;          return;
     }  
1007    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
1008      // Just delete the channel strip.      // Just delete the channel strip.
1009      delete pChannel;      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 822  void qsamplerMainForm::editSetupChannel Line 1024  void qsamplerMainForm::editSetupChannel
1024      if (m_pClient == NULL)      if (m_pClient == NULL)
1025          return;          return;
1026    
1027      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1028      if (pChannel == NULL)      if (pChannelStrip == NULL)
1029          return;          return;
1030    
1031      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
1032      pChannel->channelSetup(false);      pChannelStrip->channelSetup();
1033  }  }
1034    
1035    
# Line 837  void qsamplerMainForm::editResetChannel Line 1039  void qsamplerMainForm::editResetChannel
1039      if (m_pClient == NULL)      if (m_pClient == NULL)
1040          return;          return;
1041    
1042      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1043      if (pChannel == NULL)      if (pChannelStrip == NULL)
1044          return;          return;
1045    
1046      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
1047      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
1048          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
1049    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
1050    
1051      // Refresh channel strip info.  // Reset all sampler channels.
1052      pChannel->updateChannelInfo();  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    
# Line 904  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 913  void qsamplerMainForm::viewOptions (void Line 1144  void qsamplerMainForm::viewOptions (void
1144      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1145      if (pOptionsForm) {      if (pOptionsForm) {
1146          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1147          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1148          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1149              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1150          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1151              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1152          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 925  void qsamplerMainForm::viewOptions (void Line 1156  void qsamplerMainForm::viewOptions (void
1156          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1157          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1158          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1159            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;
1166          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1167            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1168          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1169          // Load the current setup settings.          // Load the current setup settings.
1170          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 938  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 949  void qsamplerMainForm::viewOptions (void Line 1185  void qsamplerMainForm::viewOptions (void
1185                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1186                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1187                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1188                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1189                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1190                    updateInstrumentNames();
1191                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1192                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1193                    updateDisplayEffect();
1194              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1195                  updateDisplayFont();                  updateDisplayFont();
1196              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 991  void qsamplerMainForm::channelsArrange ( Line 1233  void qsamplerMainForm::channelsArrange (
1233      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1234      int y = 0;      int y = 0;
1235      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1236          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1237      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1238              // Prevent flicker...              // Prevent flicker...
1239              pChannel->hide();              pChannelStrip->hide();
1240              pChannel->showNormal();              pChannelStrip->showNormal();
1241          }   */          }   */
1242          pChannel->adjustSize();          pChannelStrip->adjustSize();
1243          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1244          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1245              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1246      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1247          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1248          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1249          y += iHeight;          y += iHeight;
1250      }      }
1251      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1252        
1253      stabilizeForm();      stabilizeForm();
1254  }  }
1255    
# Line 1056  void qsamplerMainForm::helpAbout (void) Line 1298  void qsamplerMainForm::helpAbout (void)
1298      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1299      sText += "</font></small><br />";      sText += "</font></small><br />";
1300  #endif  #endif
1301    #ifndef CONFIG_INSTRUMENT_NAME
1302        sText += "<small><font color=\"red\">";
1303        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1304        sText += "</font></small><br />";
1305    #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 1083  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 *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1351      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1352      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1353      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1354      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1355      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
# Line 1102  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(pChannel->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 1134  void qsamplerMainForm::stabilizeForm (vo Line 1395  void qsamplerMainForm::stabilizeForm (vo
1395    
1396    
1397  // Channel change receiver slot.  // Channel change receiver slot.
1398  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1399  {  {
1400            // Add this strip to the changed list...
1401            if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1402                    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++;
1408      // and update the form status...      // and update the form status...
# Line 1143  void qsamplerMainForm::channelChanged( q Line 1410  void qsamplerMainForm::channelChanged( q
1410  }  }
1411    
1412    
1413    // Grab and restore current sampler channels session.
1414    void qsamplerMainForm::updateSession (void)
1415    {
1416            // Retrieve the current channel list.
1417            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1418            if (piChannelIDs == NULL) {
1419                    if (::lscp_client_get_errno(m_pClient)) {
1420                            appendMessagesClient("lscp_list_channels");
1421                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1422                    }
1423                    return;
1424            }
1425    
1426            // Try to (re)create each channel.
1427            m_pWorkspace->setUpdatesEnabled(false);
1428            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1429                    // Check if theres already a channel strip for this one...
1430                    if (!channelStrip(piChannelIDs[iChannel]))
1431                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1432                    // Make it visibly responsive...
1433                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1434            }
1435            m_pWorkspace->setUpdatesEnabled(true);
1436            
1437            // Remember to refresh devices
1438            if (m_pDeviceForm)
1439                m_pDeviceForm->refreshDevices();
1440    }
1441    
1442    
1443  // Update the recent files list and menu.  // Update the recent files list and menu.
1444  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1445  {  {
# Line 1187  void qsamplerMainForm::updateRecentFiles Line 1484  void qsamplerMainForm::updateRecentFiles
1484  }  }
1485    
1486    
1487    // Force update of the channels instrument names mode.
1488    void qsamplerMainForm::updateInstrumentNames (void)
1489    {
1490        // Full channel list update...
1491        QWidgetList wlist = m_pWorkspace->windowList();
1492        if (wlist.isEmpty())
1493            return;
1494    
1495        m_pWorkspace->setUpdatesEnabled(false);
1496        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1497            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1498            if (pChannelStrip)
1499                pChannelStrip->updateInstrumentName(true);
1500        }
1501        m_pWorkspace->setUpdatesEnabled(true);
1502    }
1503    
1504    
1505  // Force update of the channels display font.  // Force update of the channels display font.
1506  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1507  {  {
# Line 1208  void qsamplerMainForm::updateDisplayFont Line 1523  void qsamplerMainForm::updateDisplayFont
1523    
1524      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1525      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1526          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1527          pChannel->setDisplayFont(font);          if (pChannelStrip)
1528                pChannelStrip->setDisplayFont(font);
1529        }
1530        m_pWorkspace->setUpdatesEnabled(true);
1531    }
1532    
1533    
1534    // Update channel strips background effect.
1535    void qsamplerMainForm::updateDisplayEffect (void)
1536    {
1537       QPixmap pm;
1538        if (m_pOptions->bDisplayEffect)
1539            pm = QPixmap::fromMimeSource("displaybg1.png");
1540    
1541        // Full channel list update...
1542        QWidgetList wlist = m_pWorkspace->windowList();
1543        if (wlist.isEmpty())
1544            return;
1545    
1546        m_pWorkspace->setUpdatesEnabled(false);
1547        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1548            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1549            if (pChannelStrip)
1550                pChannelStrip->setDisplayBackground(pm);
1551      }      }
1552      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1553  }  }
# Line 1228  void qsamplerMainForm::updateMaxVolume ( Line 1566  void qsamplerMainForm::updateMaxVolume (
1566    
1567      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1568      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1569          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1570          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1571                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1572      }      }
1573      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1574  }  }
# Line 1308  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 1328  void qsamplerMainForm::updateMessagesCap Line 1667  void qsamplerMainForm::updateMessagesCap
1667  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1668    
1669  // The channel strip creation executive.  // The channel strip creation executive.
1670  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1671  {  {
1672      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1673          return;          return NULL;
1674    
1675      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1676      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1677      int y = 0;      int y = 0;
1678      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1679          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1680          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1681              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1682          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1683              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1684                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1685                            }
1686          }          }
1687      }      }
1688    
1689      // Add a new channel itema...      // Add a new channel itema...
1690      WFlags wflags = Qt::WStyle_Customize | Qt::WStyle_Tool | Qt::WStyle_Title | Qt::WStyle_NoBorder;      WFlags wflags = Qt::WStyle_Customize | Qt::WStyle_Tool | Qt::WStyle_Title | Qt::WStyle_NoBorder;
1691      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1692      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1693      pChannel->setup(this, iChannelID);          return NULL;
1694      // We'll need a display font.  
1695      QFont font;      // Actual channel strip setup...
1696      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1697          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1698      // Track channel setup changes.      // Set some initial aesthetic options...
1699      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1700      // Before we show it up, may be we'll          // Background display effect...
1701      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1702      if (bPrompt)          // We'll need a display font.
1703          pChannel->channelSetup(true);          QFont font;
1704            if (font.fromString(m_pOptions->sDisplayFont))
1705                pChannelStrip->setDisplayFont(font);
1706            // Maximum allowed volume setting.
1707            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1708        }
1709    
1710      // Now we show up us to the world.      // Now we show up us to the world.
1711      pChannel->show();      pChannelStrip->show();
1712      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1713      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1714          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1715      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1716          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1717          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1718      }      }
1719    
1720            // This is pretty new, so we'll watch for it closely.
1721            channelStripChanged(pChannelStrip);
1722    
1723        // Return our successful reference...
1724        return pChannelStrip;
1725  }  }
1726    
1727    
1728  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1729  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1730  {  {
1731      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1732  }  }
1733    
1734    
1735  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1736  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1737  {  {
1738      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1739      if (wlist.isEmpty())      if (wlist.isEmpty())
1740          return 0;          return NULL;
1741    
1742      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1743  }  }
1744    
1745    
1746    // Retrieve a channel strip by sampler channel id.
1747    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1748    {
1749            QWidgetList wlist = m_pWorkspace->windowList();
1750            if (wlist.isEmpty())
1751                    return NULL;
1752    
1753            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1754                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1755                    if (pChannelStrip) {
1756                            qsamplerChannel *pChannel = pChannelStrip->channel();
1757                            if (pChannel && pChannel->channelID() == iChannelID)
1758                                    return pChannelStrip;
1759                    }
1760            }
1761    
1762            // Not found.
1763            return NULL;
1764    }
1765    
1766    
1767  // Construct the windows menu.  // Construct the windows menu.
1768  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1769  {  {
# Line 1401  void qsamplerMainForm::channelsMenuAbout Line 1775  void qsamplerMainForm::channelsMenuAbout
1775      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1776          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1777          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1778              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1779              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1780              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1781              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1782                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1783                }
1784          }          }
1785      }      }
1786  }  }
# Line 1413  void qsamplerMainForm::channelsMenuAbout Line 1789  void qsamplerMainForm::channelsMenuAbout
1789  // Windows menu activation slot  // Windows menu activation slot
1790  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1791  {  {
1792      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1793      if (pChannel)      if (pChannelStrip)
1794          pChannel->showNormal();          pChannelStrip->showNormal();
1795      pChannel->setFocus();      pChannelStrip->setFocus();
1796  }  }
1797    
1798    
# Line 1454  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_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {                  // 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)  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1838              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1839              QWidgetList wlist = m_pWorkspace->windowList();                                  // If successfull, remove from pending list...
1840              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                  if (pChannelStrip->updateChannelInfo())
1841                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                                          m_changedStrips.remove(pChannelStrip);
1842                  if (pChannel->isVisible())                          }
1843                      pChannel->updateChannelUsage();                  }
1844              }                  // Refresh each channel usage, on each period...
1845          }                  if (m_pOptions->bAutoRefresh) {
1846      }                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1847                            if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1848                                    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 1648  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 1657  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 1677  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 1691  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.255  
changed lines
  Added in v.753

  ViewVC Help
Powered by ViewVC