/[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 176 by capela, Tue Jul 6 10:54:45 2004 UTC revision 751 by capela, Fri Aug 19 17:10:16 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"  #include "config.h"
49    
50    #ifdef HAVE_SIGNAL_H
51    #include <signal.h>
52    #endif
53    
54    #ifdef CONFIG_LIBGIG
55    #include <gig.h>
56    #endif
57    
58  // Timer constant stuff.  // Timer constant stuff.
59  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
# Line 100  void qsamplerMainForm::init (void) Line 111  void qsamplerMainForm::init (void)
111      m_pOptions = NULL;      m_pOptions = NULL;
112    
113      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
114      m_pMessages = NULL;      m_pMessages   = NULL;
115        m_pDeviceForm = NULL;
116    
117      // We'll start clean.      // We'll start clean.
118      m_iUntitled = 0;      m_iUntitled   = 0;
119      m_iDirtyCount = 0;      m_iDirtyCount = 0;
120    
121      m_pServer = NULL;      m_pServer = NULL;
# Line 114  void qsamplerMainForm::init (void) Line 126  void qsamplerMainForm::init (void)
126    
127      m_iTimerSlot = 0;      m_iTimerSlot = 0;
128    
129    #ifdef HAVE_SIGNAL_H
130            // Set to ignore any fatal "Broken pipe" signals.
131            ::signal(SIGPIPE, SIG_IGN);
132    #endif
133    
134      // Make it an MDI workspace.      // Make it an MDI workspace.
135      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
136      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 128  void qsamplerMainForm::init (void) Line 145  void qsamplerMainForm::init (void)
145      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
146      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
147      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
148      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
149      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
150      // Server address.      // Server address.
151      pLabel = new QLabel(this);      pLabel = new QLabel(this);
152      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
153      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
154      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
155      // Channel title.      // Channel title.
156      pLabel = new QLabel(this);      pLabel = new QLabel(this);
157      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
158      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
159      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
160      // Session modification status.      // Session modification status.
161      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
162      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
163      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
164      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
165      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
166    
167      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 163  void qsamplerMainForm::destroy (void) Line 180  void qsamplerMainForm::destroy (void)
180  {  {
181      // Do final processing anyway.      // Do final processing anyway.
182      processServerExit();      processServerExit();
183        
184      // Delete recentfiles menu.  #if defined(WIN32)
185      if (m_pRecentFilesMenu)      WSACleanup();
186          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];  
187    
188      // Finally drop any widgets around...      // Finally drop any widgets around...
189        if (m_pDeviceForm)
190            delete m_pDeviceForm;
191      if (m_pMessages)      if (m_pMessages)
192          delete m_pMessages;          delete m_pMessages;
193      if (m_pWorkspace)      if (m_pWorkspace)
194          delete m_pWorkspace;          delete m_pWorkspace;
195    
196  #if defined(WIN32)      // Delete status item labels one by one.
197      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
198  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
199        if (m_statusItem[QSAMPLER_STATUS_SERVER])
200            delete m_statusItem[QSAMPLER_STATUS_SERVER];
201        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
202            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
203        if (m_statusItem[QSAMPLER_STATUS_SESSION])
204            delete m_statusItem[QSAMPLER_STATUS_SESSION];
205    
206        // Delete recentfiles menu.
207        if (m_pRecentFilesMenu)
208            delete m_pRecentFilesMenu;
209  }  }
210    
211    
# Line 195  void qsamplerMainForm::setup ( qsamplerO Line 215  void qsamplerMainForm::setup ( qsamplerO
215      // We got options?      // We got options?
216      m_pOptions = pOptions;      m_pOptions = pOptions;
217    
218        // What style do we create these forms?
219        WFlags wflags = Qt::WType_TopLevel;
220        if (m_pOptions->bKeepOnTop)
221            wflags |= Qt::WStyle_Tool;
222      // Some child forms are to be created right now.      // Some child forms are to be created right now.
223      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
224        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
225        m_pDeviceForm->setMainForm(this); // An important life immutable!
226      // Set message defaults...      // Set message defaults...
227      updateMessagesFont();      updateMessagesFont();
228      updateMessagesLimit();      updateMessagesLimit();
# Line 225  void qsamplerMainForm::setup ( qsamplerO Line 251  void qsamplerMainForm::setup ( qsamplerO
251          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
252          istr >> *this;          istr >> *this;
253      }      }
254      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
255      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
256        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
257    
258      // Final startup stabilization...      // Final startup stabilization...
259      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 264  bool qsamplerMainForm::queryClose (void) Line 291  bool qsamplerMainForm::queryClose (void)
291              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
292              ostr << *this;              ostr << *this;
293              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
294              // And the main windows state.              // And the children, and the main windows state,.
295              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
296                            m_pOptions->saveWidgetGeometry(this);
297                            // Close popup widgets.
298                            if (m_pDeviceForm)
299                                    m_pDeviceForm->close();
300              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
301              stopServer();              stopServer();
302          }          }
# Line 284  void qsamplerMainForm::closeEvent ( QClo Line 315  void qsamplerMainForm::closeEvent ( QClo
315  }  }
316    
317    
318  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
319  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
320  {  {
321      bool bAccept = false;      bool bDecode = false;
322    
323      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
324          QString sUrl;          QString sText;
325          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
326              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
327                files = QStringList::split('\n', sText);
328                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
329                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
330            }
331      }      }
332    
333      pDragEnterEvent->accept(bAccept);      return bDecode;
334    }
335    
336    
337    // Window drag-n-drop event handlers.
338    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
339    {
340            QStringList files;
341            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
342  }  }
343    
344    
345  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
346  {  {
347      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
348          QString sUrl;  
349          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
350              loadSessionFile(QUrl(sUrl).path());          return;
351      }  
352            for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
353                    const QString& sPath = *iter;
354                    if (qsamplerChannel::isInstrumentFile(sPath)) {
355                            // Try to create a new channel from instrument file...
356                            qsamplerChannel *pChannel = new qsamplerChannel(this);
357                            if (pChannel == NULL)
358                                    return;
359                            // Start setting the instrument filename...
360                            pChannel->setInstrument(sPath, 0);
361                            // Before we show it up, may be we'll
362                            // better ask for some initial values?
363                            if (!pChannel->channelSetup(this)) {
364                                    delete pChannel;
365                                    return;
366                            }
367                            // Finally, give it to a new channel strip...
368                            if (!createChannelStrip(pChannel)) {
369                                    delete pChannel;
370                                    return;
371                            }
372                            // Make that an overall update.
373                            m_iDirtyCount++;
374                            stabilizeForm();
375                    }   // Otherwise, load an usual session file (LSCP script)...
376                    else if (closeSession(true))
377                            loadSessionFile(sPath);
378                    // Make it look responsive...:)
379                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
380            }
381  }  }
382    
383    
# Line 315  void qsamplerMainForm::customEvent ( QCu Line 387  void qsamplerMainForm::customEvent ( QCu
387      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
388      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
389          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
390          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
391              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
392              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
393                            if (pChannelStrip)
394                                    channelStripChanged(pChannelStrip);
395                    } else {
396                            appendMessagesColor(tr("Notify event: %1 data: %2")
397                                    .arg(::lscp_event_to_text(pEvent->event()))
398                                    .arg(pEvent->data()), "#996699");
399                    }
400      }      }
401  }  }
402    
# Line 326  void qsamplerMainForm::customEvent ( QCu Line 405  void qsamplerMainForm::customEvent ( QCu
405  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
406  {  {
407      stabilizeForm();      stabilizeForm();
408        
409      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
410  }  }
411    
# Line 370  bool qsamplerMainForm::newSession (void) Line 449  bool qsamplerMainForm::newSession (void)
449      if (!closeSession(true))      if (!closeSession(true))
450          return false;          return false;
451    
452            // Give us what the server has, right now...
453            updateSession();
454    
455      // Ok increment untitled count.      // Ok increment untitled count.
456      m_iUntitled++;      m_iUntitled++;
457    
# Line 483  bool qsamplerMainForm::closeSession ( bo Line 565  bool qsamplerMainForm::closeSession ( bo
565          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
566          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
567          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
568              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
569              if (bForce && ::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK)              if (pChannelStrip) {
570                  appendMessagesClient("lscp_remove_channel");                  qsamplerChannel *pChannel = pChannelStrip->channel();
571              delete pChannel;                  if (bForce && pChannel)
572                        pChannel->removeChannel();
573                    delete pChannelStrip;
574                }
575          }          }
576          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
577          // We're now clean, for sure.          // We're now clean, for sure.
# Line 534  bool qsamplerMainForm::loadSessionFile ( Line 619  bool qsamplerMainForm::loadSessionFile (
619      // Ok. we've read it.      // Ok. we've read it.
620      file.close();      file.close();
621    
622      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
623      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));  
624    
625      // Now we'll try to create the whole GUI session.          // Have we any errors?
626      int iChannels = ::lscp_get_channels(m_pClient);          if (iErrors > 0)
627      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);  
628    
629      // Save as default session directory.      // Save as default session directory.
630      if (m_pOptions)      if (m_pOptions)
631          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
632      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
633      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
634      // Stabilize form...      // Stabilize form...
635      m_sFilename = sFilename;      m_sFilename = sFilename;
636      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
637      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
638    
639        // Make that an overall update.
640      stabilizeForm();      stabilizeForm();
641      return true;      return true;
642  }  }
# Line 578  bool qsamplerMainForm::saveSessionFile ( Line 653  bool qsamplerMainForm::saveSessionFile (
653      }      }
654    
655      // Write the file.      // Write the file.
656      int iErrors = 0;      int  iErrors = 0;
657      QTextStream ts(&file);      QTextStream ts(&file);
658      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
659      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 589  bool qsamplerMainForm::saveSessionFile ( Line 664  bool qsamplerMainForm::saveSessionFile (
664      ts << "# " << tr("File")      ts << "# " << tr("File")
665         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
666      ts << "# " << tr("Date")      ts << "# " << tr("Date")
667         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
668         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
669      ts << "#"  << endl;      ts << "#"  << endl;
670      ts << endl;      ts << endl;
671            // It is assumed that this new kind of device+session file
672            // will be loaded from a complete
673            int *piDeviceIDs;
674            int  iDevice;
675            ts << "RESET" << endl;
676            // Audio device mapping.
677            QMap<int, int> audioDeviceMap;
678            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
679            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
680                    ts << endl;
681                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
682                    // Audio device specification...
683                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
684                            << " " << tr("Device") << " " << iDevice << endl;
685                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
686                    qsamplerDeviceParamMap::ConstIterator deviceParam;
687                    for (deviceParam = device.params().begin();
688                                    deviceParam != device.params().end();
689                                            ++deviceParam) {
690                            const qsamplerDeviceParam& param = deviceParam.data();
691                            if (param.value.isEmpty()) ts << "# ";
692                            ts << " " << deviceParam.key() << "='" << param.value << "'";
693                    }
694                    ts << endl;
695                    // Audio channel parameters...
696                    int iPort = 0;
697                    for (qsamplerDevicePort *pPort = device.ports().first();
698                                    pPort;
699                                            pPort = device.ports().next(), ++iPort) {
700                            qsamplerDeviceParamMap::ConstIterator portParam;
701                            for (portParam = pPort->params().begin();
702                                            portParam != pPort->params().end();
703                                                    ++portParam) {
704                                    const qsamplerDeviceParam& param = portParam.data();
705                                    if (param.fix || param.value.isEmpty()) ts << "# ";
706                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
707                                            << " " << iPort << " " << portParam.key()
708                                            << "='" << param.value << "'" << endl;
709                            }
710                    }
711                    // Audio device index/id mapping.
712                    audioDeviceMap[device.deviceID()] = iDevice;
713            // Try to keep it snappy :)
714            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
715            }
716            // MIDI device mapping.
717            QMap<int, int> midiDeviceMap;
718            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
719            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
720                    ts << endl;
721                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
722                    // MIDI device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
726                    qsamplerDeviceParamMap::ConstIterator deviceParam;
727                    for (deviceParam = device.params().begin();
728                                    deviceParam != device.params().end();
729                                            ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                    ts << endl;
735                    // MIDI port parameters...
736                    int iPort = 0;
737                    for (qsamplerDevicePort *pPort = device.ports().first();
738                                    pPort;
739                                            pPort = device.ports().next(), ++iPort) {
740                            qsamplerDeviceParamMap::ConstIterator portParam;
741                            for (portParam = pPort->params().begin();
742                                            portParam != pPort->params().end();
743                                                    ++portParam) {
744                                    const qsamplerDeviceParam& param = portParam.data();
745                                    if (param.fix || param.value.isEmpty()) ts << "# ";
746                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
747                                       << " " << iPort << " " << portParam.key()
748                                       << "='" << param.value << "'" << endl;
749                            }
750                    }
751                    // MIDI device index/id mapping.
752                    midiDeviceMap[device.deviceID()] = iDevice;
753            // Try to keep it snappy :)
754            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
755            }
756            ts << endl;
757            // Sampler channel mapping.
758      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
759      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
760          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
761          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
762          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
763          ts << "ADD CHANNEL" << endl;              if (pChannel) {
764          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
765          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
766          ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                  if (audioDeviceMap.isEmpty()) {
767          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " " << pChannel->midiChannel() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
768          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                                  << " " << pChannel->audioDriver() << endl;
769          ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                                  } else {
770          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
771          ts << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
772                                    }
773                                    if (midiDeviceMap.isEmpty()) {
774                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
775                                                    << " " << pChannel->midiDriver() << endl;
776                                    } else {
777                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
778                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
779                                    }
780                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
781                                            << " " << pChannel->midiPort() << endl;
782                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
783                    if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
784                        ts << "ALL";
785                    else
786                        ts << pChannel->midiChannel();
787                    ts << endl;
788                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
789                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
790                    ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
791                    if (pChannel->channelMute())
792                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
793                    if (pChannel->channelSolo())
794                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
795                    ts << endl;
796                }
797            }
798          // Try to keep it snappy :)          // Try to keep it snappy :)
799          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
800      }      }
# Line 632  bool qsamplerMainForm::saveSessionFile ( Line 820  bool qsamplerMainForm::saveSessionFile (
820  }  }
821    
822    
823    // Session change receiver slot.
824    void qsamplerMainForm::sessionDirty (void)
825    {
826        // Just mark the dirty form.
827        m_iDirtyCount++;
828        // and update the form status...
829        stabilizeForm();
830    }
831    
832    
833  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
834  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
835    
# Line 678  void qsamplerMainForm::fileSaveAs (void) Line 876  void qsamplerMainForm::fileSaveAs (void)
876  }  }
877    
878    
879    // Reset the sampler instance.
880    void qsamplerMainForm::fileReset (void)
881    {
882        if (m_pClient == NULL)
883            return;
884    
885        // Ask user whether he/she want's an internal sampler reset...
886        if (QMessageBox::warning(this, tr("Warning"),
887            tr("Resetting the sampler instance will close\n"
888               "all device and channel configurations.\n\n"
889               "Please note that this operation may cause\n"
890               "temporary MIDI and Audio disruption.\n\n"
891               "Do you want to reset the sampler engine now?"),
892            tr("Reset"), tr("Cancel")) > 0)
893            return;
894    
895        // Just do the reset, after closing down current session...
896        if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {
897            appendMessagesClient("lscp_reset_sampler");
898            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
899            return;
900        }
901    
902        // Log this.
903        appendMessages(tr("Sampler reset."));
904    
905            // Make it a new session...
906            newSession();
907    }
908    
909    
910  // Restart the client/server instance.  // Restart the client/server instance.
911  void qsamplerMainForm::fileRestart (void)  void qsamplerMainForm::fileRestart (void)
912  {  {
913      if (m_pOptions == NULL)      if (m_pOptions == NULL)
914          return;          return;
915            
916      bool bRestart = true;      bool bRestart = true;
917        
918      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
919      // (if we're currently up and running)      // (if we're currently up and running)
920      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
# Line 693  void qsamplerMainForm::fileRestart (void Line 922  void qsamplerMainForm::fileRestart (void
922              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
923                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
924                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
925                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
926                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
927              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
928      }      }
# Line 725  void qsamplerMainForm::editAddChannel (v Line 954  void qsamplerMainForm::editAddChannel (v
954      if (m_pClient == NULL)      if (m_pClient == NULL)
955          return;          return;
956    
957      // Create the new sampler channel.      // Just create the channel instance...
958      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel(this);
959      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
960          return;          return;
     }  
961    
962      // Log this happening.      // Before we show it up, may be we'll
963      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
964        if (!pChannel->channelSetup(this)) {
965            delete pChannel;
966            return;
967        }
968    
969      // Just create the channel strip with given id.      // And give it to the strip (will own the channel instance, if successful).
970      createChannel(iChannelID, true);      if (!createChannelStrip(pChannel)) {
971            delete pChannel;
972            return;
973        }
974    
975      // We'll be dirty, for sure...      // Make that an overall update.
976      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
977      stabilizeForm();      stabilizeForm();
978  }  }
979    
# Line 752  void qsamplerMainForm::editRemoveChannel Line 984  void qsamplerMainForm::editRemoveChannel
984      if (m_pClient == NULL)      if (m_pClient == NULL)
985          return;          return;
986    
987      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
988        if (pChannelStrip == NULL)
989            return;
990    
991        qsamplerChannel *pChannel = pChannelStrip->channel();
992      if (pChannel == NULL)      if (pChannel == NULL)
993          return;          return;
994    
# Line 762  void qsamplerMainForm::editRemoveChannel Line 998  void qsamplerMainForm::editRemoveChannel
998              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
999                 "%1\n\n"                 "%1\n\n"
1000                 "Are you sure?")                 "Are you sure?")
1001                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
1002              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
1003              return;              return;
1004      }      }
1005    
1006      // Remove the existing sampler channel.      // Remove the existing sampler channel.
1007      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."));  
1008          return;          return;
     }  
1009    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
1010      // Just delete the channel strip.      // Just delete the channel strip.
1011      delete pChannel;      delete pChannelStrip;
1012    
1013      // Do we auto-arrange?      // Do we auto-arrange?
1014      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1015          channelsArrange();          channelsArrange();
# Line 795  void qsamplerMainForm::editSetupChannel Line 1026  void qsamplerMainForm::editSetupChannel
1026      if (m_pClient == NULL)      if (m_pClient == NULL)
1027          return;          return;
1028    
1029      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1030      if (pChannel == NULL)      if (pChannelStrip == NULL)
1031          return;          return;
1032    
1033      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
1034      pChannel->channelSetup(false);      pChannelStrip->channelSetup();
1035  }  }
1036    
1037    
# Line 810  void qsamplerMainForm::editResetChannel Line 1041  void qsamplerMainForm::editResetChannel
1041      if (m_pClient == NULL)      if (m_pClient == NULL)
1042          return;          return;
1043    
1044      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1045      if (pChannel == NULL)      if (pChannelStrip == NULL)
1046          return;          return;
1047    
1048      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
1049      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
1050          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
1051    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
1052    
1053      // Refresh channel strip info.  // Reset all sampler channels.
1054      pChannel->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
1055    {
1056            if (m_pClient == NULL)
1057                    return;
1058    
1059            // Invoque the channel strip procedure,
1060            // for all channels out there...
1061            m_pWorkspace->setUpdatesEnabled(false);
1062            QWidgetList wlist = m_pWorkspace->windowList();
1063            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1064                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1065                    if (pChannelStrip)
1066                            pChannelStrip->channelReset();
1067            }
1068            m_pWorkspace->setUpdatesEnabled(true);
1069  }  }
1070    
1071    
# Line 877  void qsamplerMainForm::viewMessages ( bo Line 1117  void qsamplerMainForm::viewMessages ( bo
1117  }  }
1118    
1119    
1120    // Show/hide the device configurator form.
1121    void qsamplerMainForm::viewDevices (void)
1122    {
1123            if (m_pOptions == NULL)
1124                    return;
1125    
1126            if (m_pDeviceForm) {
1127                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1128                    m_pDeviceForm->setClient(m_pClient);
1129                    if (m_pDeviceForm->isVisible()) {
1130                            m_pDeviceForm->hide();
1131                    } else {
1132                            m_pDeviceForm->show();
1133                            m_pDeviceForm->raise();
1134                            m_pDeviceForm->setActiveWindow();
1135                    }
1136            }
1137    }
1138    
1139    
1140  // Show options dialog.  // Show options dialog.
1141  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1142  {  {
# Line 886  void qsamplerMainForm::viewOptions (void Line 1146  void qsamplerMainForm::viewOptions (void
1146      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1147      if (pOptionsForm) {      if (pOptionsForm) {
1148          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1149          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1150          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1151              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1152          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1153              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1154          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 898  void qsamplerMainForm::viewOptions (void Line 1158  void qsamplerMainForm::viewOptions (void
1158          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1159          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1160          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1161            bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1162          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1163          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1164            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1165          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1166          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1167          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1168          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1169            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1170          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1171          // Load the current setup settings.          // Load the current setup settings.
1172          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 911  void qsamplerMainForm::viewOptions (void Line 1174  void qsamplerMainForm::viewOptions (void
1174          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1175              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1176              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1177                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1178                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1179                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1180                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1181                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1182                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 922  void qsamplerMainForm::viewOptions (void Line 1187  void qsamplerMainForm::viewOptions (void
1187                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1188                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1189                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1190                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1191                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1192                    updateInstrumentNames();
1193                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1194                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1195                    updateDisplayEffect();
1196              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1197                  updateDisplayFont();                  updateDisplayFont();
1198              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 964  void qsamplerMainForm::channelsArrange ( Line 1235  void qsamplerMainForm::channelsArrange (
1235      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1236      int y = 0;      int y = 0;
1237      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1238          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1239      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1240              // Prevent flicker...              // Prevent flicker...
1241              pChannel->hide();              pChannelStrip->hide();
1242              pChannel->showNormal();              pChannelStrip->showNormal();
1243          }   */          }   */
1244          pChannel->adjustSize();          pChannelStrip->adjustSize();
1245          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1246          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1247              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1248      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1249          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1250          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1251          y += iHeight;          y += iHeight;
1252      }      }
1253      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1254        
1255      stabilizeForm();      stabilizeForm();
1256  }  }
1257    
# Line 1029  void qsamplerMainForm::helpAbout (void) Line 1300  void qsamplerMainForm::helpAbout (void)
1300      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1301      sText += "</font></small><br />";      sText += "</font></small><br />";
1302  #endif  #endif
1303    #ifndef CONFIG_INSTRUMENT_NAME
1304        sText += "<small><font color=\"red\">";
1305        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1306        sText += "</font></small><br />";
1307    #endif
1308    #ifndef CONFIG_MUTE_SOLO
1309        sText += "<small><font color=\"red\">";
1310        sText += tr("Sampler channel Mute/Solo support disabled.");
1311        sText += "</font></small><br />";
1312    #endif
1313      sText += "<br />\n";      sText += "<br />\n";
1314      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1315      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1316      sText += " ";      sText += " ";
1317      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1318    #ifdef CONFIG_LIBGIG
1319        sText += ", ";
1320        sText += gig::libraryName().c_str();
1321        sText += " ";
1322        sText += gig::libraryVersion().c_str();
1323    #endif
1324      sText += "<br />\n";      sText += "<br />\n";
1325      sText += "<br />\n";      sText += "<br />\n";
1326      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 1056  void qsamplerMainForm::helpAbout (void) Line 1343  void qsamplerMainForm::helpAbout (void)
1343  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1344  {  {
1345      // Update the main application caption...      // Update the main application caption...
1346      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1347      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1348          sSessioName += '*';          sSessionName += '*';
1349      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1350    
1351      // Update the main menu state...      // Update the main menu state...
1352      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1353      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1354      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1355      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1356      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1357      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
1358      fileSaveAsAction->setEnabled(bHasClient);      fileSaveAsAction->setEnabled(bHasClient);
1359        fileResetAction->setEnabled(bHasClient);
1360      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);
1361      editAddChannelAction->setEnabled(bHasClient);      editAddChannelAction->setEnabled(bHasClient);
1362      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1363      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1364      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1365      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1366      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1367        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1368        viewDevicesAction->setEnabled(bHasClient);
1369        channelsArrangeAction->setEnabled(bHasChannel);
1370    
1371      // Client/Server status...      // Client/Server status...
1372      if (bHasClient) {      if (bHasClient) {
1373          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1374          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));
1375      } else {      } else {
1376          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1377          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1378      }      }
1379      // Channel status...      // Channel status...
1380      if (bHasChannel)      if (bHasChannel)
1381          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannel->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1382      else      else
1383          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1384      // Session status...      // Session status...
1385      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1386          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1387      else      else
1388          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1389    
1390      // Recent files menu.      // Recent files menu.
1391      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1106  void qsamplerMainForm::stabilizeForm (vo Line 1397  void qsamplerMainForm::stabilizeForm (vo
1397    
1398    
1399  // Channel change receiver slot.  // Channel change receiver slot.
1400  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1401  {  {
1402            // Add this strip to the changed list...
1403            if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1404                    m_changedStrips.append(pChannelStrip);
1405                    pChannelStrip->resetErrorCount();
1406            }
1407    
1408      // Just mark the dirty form.      // Just mark the dirty form.
1409      m_iDirtyCount++;      m_iDirtyCount++;
1410      // and update the form status...      // and update the form status...
# Line 1115  void qsamplerMainForm::channelChanged( q Line 1412  void qsamplerMainForm::channelChanged( q
1412  }  }
1413    
1414    
1415    // Grab and restore current sampler channels session.
1416    void qsamplerMainForm::updateSession (void)
1417    {
1418            // Retrieve the current channel list.
1419            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1420            if (piChannelIDs == NULL) {
1421                    if (::lscp_client_get_errno(m_pClient)) {
1422                            appendMessagesClient("lscp_list_channels");
1423                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1424                    }
1425                    return;
1426            }
1427    
1428            // Try to (re)create each channel.
1429            m_pWorkspace->setUpdatesEnabled(false);
1430            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1431                    // Check if theres already a channel strip for this one...
1432                    if (!channelStrip(piChannelIDs[iChannel]))
1433                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1434                    // Make it visibly responsive...
1435                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1436            }
1437            m_pWorkspace->setUpdatesEnabled(true);
1438            
1439            // Remember to refresh devices
1440            if (m_pDeviceForm)
1441                m_pDeviceForm->refreshDevices();
1442    }
1443    
1444    
1445  // Update the recent files list and menu.  // Update the recent files list and menu.
1446  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1447  {  {
# Line 1159  void qsamplerMainForm::updateRecentFiles Line 1486  void qsamplerMainForm::updateRecentFiles
1486  }  }
1487    
1488    
1489    // Force update of the channels instrument names mode.
1490    void qsamplerMainForm::updateInstrumentNames (void)
1491    {
1492        // Full channel list update...
1493        QWidgetList wlist = m_pWorkspace->windowList();
1494        if (wlist.isEmpty())
1495            return;
1496    
1497        m_pWorkspace->setUpdatesEnabled(false);
1498        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1499            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1500            if (pChannelStrip)
1501                pChannelStrip->updateInstrumentName(true);
1502        }
1503        m_pWorkspace->setUpdatesEnabled(true);
1504    }
1505    
1506    
1507  // Force update of the channels display font.  // Force update of the channels display font.
1508  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1509  {  {
# Line 1180  void qsamplerMainForm::updateDisplayFont Line 1525  void qsamplerMainForm::updateDisplayFont
1525    
1526      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1527      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1528          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1529          pChannel->setDisplayFont(font);          if (pChannelStrip)
1530                pChannelStrip->setDisplayFont(font);
1531        }
1532        m_pWorkspace->setUpdatesEnabled(true);
1533    }
1534    
1535    
1536    // Update channel strips background effect.
1537    void qsamplerMainForm::updateDisplayEffect (void)
1538    {
1539       QPixmap pm;
1540        if (m_pOptions->bDisplayEffect)
1541            pm = QPixmap::fromMimeSource("displaybg1.png");
1542    
1543        // Full channel list update...
1544        QWidgetList wlist = m_pWorkspace->windowList();
1545        if (wlist.isEmpty())
1546            return;
1547    
1548        m_pWorkspace->setUpdatesEnabled(false);
1549        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1550            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1551            if (pChannelStrip)
1552                pChannelStrip->setDisplayBackground(pm);
1553      }      }
1554      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1555  }  }
# Line 1200  void qsamplerMainForm::updateMaxVolume ( Line 1568  void qsamplerMainForm::updateMaxVolume (
1568    
1569      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1570      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1571          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1572          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1573                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1574      }      }
1575      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1576  }  }
# Line 1280  void qsamplerMainForm::updateMessagesLim Line 1649  void qsamplerMainForm::updateMessagesLim
1649          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1650              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1651          else          else
1652              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1653      }      }
1654  }  }
1655    
# Line 1300  void qsamplerMainForm::updateMessagesCap Line 1669  void qsamplerMainForm::updateMessagesCap
1669  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1670    
1671  // The channel strip creation executive.  // The channel strip creation executive.
1672  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1673  {  {
1674      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1675          return;          return NULL;
1676    
1677      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1678      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1679      int y = 0;      int y = 0;
1680      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1681          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1682          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1683              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1684          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1685              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1686                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1687                            }
1688          }          }
1689      }      }
1690    
1691      // Add a new channel itema...      // Add a new channel itema...
1692      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;
1693      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1694      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1695      pChannel->setup(this, iChannelID);          return NULL;
1696      // We'll need a display font.  
1697      QFont font;      // Actual channel strip setup...
1698      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1699          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1700      // Track channel setup changes.      // Set some initial aesthetic options...
1701      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1702      // Before we show it up, may be we'll          // Background display effect...
1703      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1704      if (bPrompt)          // We'll need a display font.
1705          pChannel->channelSetup(true);          QFont font;
1706            if (font.fromString(m_pOptions->sDisplayFont))
1707                pChannelStrip->setDisplayFont(font);
1708            // Maximum allowed volume setting.
1709            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1710        }
1711    
1712      // Now we show up us to the world.      // Now we show up us to the world.
1713      pChannel->show();      pChannelStrip->show();
1714      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1715      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1716          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1717      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1718          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1719          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1720      }      }
1721    
1722            // This is pretty new, so we'll watch for it closely.
1723            channelStripChanged(pChannelStrip);
1724    
1725        // Return our successful reference...
1726        return pChannelStrip;
1727  }  }
1728    
1729    
1730  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1731  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1732  {  {
1733      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1734  }  }
1735    
1736    
1737  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1738  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1739  {  {
1740      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1741      if (wlist.isEmpty())      if (wlist.isEmpty())
1742          return 0;          return NULL;
1743    
1744      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1745  }  }
1746    
1747    
1748    // Retrieve a channel strip by sampler channel id.
1749    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1750    {
1751            QWidgetList wlist = m_pWorkspace->windowList();
1752            if (wlist.isEmpty())
1753                    return NULL;
1754    
1755            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1756                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1757                    if (pChannelStrip) {
1758                            qsamplerChannel *pChannel = pChannelStrip->channel();
1759                            if (pChannel && pChannel->channelID() == iChannelID)
1760                                    return pChannelStrip;
1761                    }
1762            }
1763    
1764            // Not found.
1765            return NULL;
1766    }
1767    
1768    
1769  // Construct the windows menu.  // Construct the windows menu.
1770  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1771  {  {
# Line 1373  void qsamplerMainForm::channelsMenuAbout Line 1777  void qsamplerMainForm::channelsMenuAbout
1777      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1778          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1779          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1780              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1781              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1782              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1783              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1784                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1785                }
1786          }          }
1787      }      }
1788  }  }
# Line 1385  void qsamplerMainForm::channelsMenuAbout Line 1791  void qsamplerMainForm::channelsMenuAbout
1791  // Windows menu activation slot  // Windows menu activation slot
1792  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1793  {  {
1794      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1795      if (pChannel)      if (pChannelStrip)
1796          pChannel->showNormal();          pChannelStrip->showNormal();
1797      pChannel->setFocus();      pChannelStrip->setFocus();
1798  }  }
1799    
1800    
# Line 1426  void qsamplerMainForm::timerSlot (void) Line 1832  void qsamplerMainForm::timerSlot (void)
1832              }              }
1833          }          }
1834      }      }
1835        
1836          // Refresh each channel usage, on each period...          if (m_pClient) {
1837      if (m_pClient && m_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {                  // Update the channel information for each pending strip...
1838          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1839          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1840              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1841              QWidgetList wlist = m_pWorkspace->windowList();                                  // If successfull, remove from pending list...
1842              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                  if (pChannelStrip->updateChannelInfo())
1843                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                                          m_changedStrips.remove(pChannelStrip);
1844                  if (pChannel->isVisible())                          }
1845                      pChannel->updateChannelUsage();                  }
1846              }                  // Refresh each channel usage, on each period...
1847          }                  if (m_pOptions->bAutoRefresh) {
1848      }                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1849                            if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1850                                    m_iTimerSlot = 0;
1851                                    // Update the channel stream usage for each strip...
1852                                    QWidgetList wlist = m_pWorkspace->windowList();
1853                                    for (int iChannel = 0;
1854                                                    iChannel < (int) wlist.count(); iChannel++) {
1855                                            qsamplerChannelStrip *pChannelStrip
1856                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1857                                            if (pChannelStrip && pChannelStrip->isVisible())
1858                                                    pChannelStrip->updateChannelUsage();
1859                                    }
1860                            }
1861                    }
1862            }
1863    
1864      // Register the next timer slot.      // Register the next timer slot.
1865      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1620  bool qsamplerMainForm::startClient (void Line 2040  bool qsamplerMainForm::startClient (void
2040      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2041      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)));
2042    
2043            // Subscribe to channel info change notifications...
2044            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2045                    appendMessagesClient("lscp_client_subscribe");
2046    
2047      // We may stop scheduling around.      // We may stop scheduling around.
2048      stopSchedule();      stopSchedule();
2049    
# Line 1629  bool qsamplerMainForm::startClient (void Line 2053  bool qsamplerMainForm::startClient (void
2053      // Log success here.      // Log success here.
2054      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2055    
2056            // Hard-notify device configuration form,
2057            // if visible, that we're ready...
2058            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2059                m_pDeviceForm->setClient(m_pClient);
2060    
2061      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2062      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2063          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1649  void qsamplerMainForm::stopClient (void) Line 2078  void qsamplerMainForm::stopClient (void)
2078      if (m_pClient == NULL)      if (m_pClient == NULL)
2079          return;          return;
2080    
2081            // Hard-notify device configuration form,
2082            // if visible, that we're running out...
2083            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2084                m_pDeviceForm->setClient(NULL);
2085    
2086      // Log prepare here.      // Log prepare here.
2087      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2088    
# Line 1663  void qsamplerMainForm::stopClient (void) Line 2097  void qsamplerMainForm::stopClient (void)
2097      // channels from the back-end server.      // channels from the back-end server.
2098      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2099      closeSession(false);      closeSession(false);
2100        
2101      // Close us as a client...      // Close us as a client...
2102      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2103        ::lscp_client_destroy(m_pClient);
2104      m_pClient = NULL;      m_pClient = NULL;
2105    
2106      // Log final here.      // Log final here.

Legend:
Removed from v.176  
changed lines
  Added in v.751

  ViewVC Help
Powered by ViewVC