/[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 344 by capela, Tue Jan 18 13:53:04 2005 UTC revision 753 by capela, Wed Aug 24 17:44:59 2005 UTC
# 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 40  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
 #include "qsamplerOptionsForm.h"  
44    
45  #include "config.h"  #include "qsamplerDeviceForm.h"
46    #include "qsamplerOptionsForm.h"
47    
48  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
49  #include <signal.h>  #include <signal.h>
50  #endif  #endif
51    
52    #ifdef CONFIG_LIBGIG
53    #include <gig.h>
54    #endif
55    
56  // Timer constant stuff.  // Timer constant stuff.
57  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
58    
# Line 104  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;
     m_iChangeCount = 0;  
118    
119      m_pServer = NULL;      m_pServer = NULL;
120      m_pClient = NULL;      m_pClient = NULL;
# Line 138  void qsamplerMainForm::init (void) Line 143  void qsamplerMainForm::init (void)
143      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
144      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
145      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
146      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
147      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
148      // Server address.      // Server address.
149      pLabel = new QLabel(this);      pLabel = new QLabel(this);
150      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
151      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
152      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
153      // Channel title.      // Channel title.
154      pLabel = new QLabel(this);      pLabel = new QLabel(this);
155      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
156      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
157      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
158      // Session modification status.      // Session modification status.
159      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
160      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
161      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
162      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
163      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
164    
165      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 173  void qsamplerMainForm::destroy (void) Line 178  void qsamplerMainForm::destroy (void)
178  {  {
179      // Do final processing anyway.      // Do final processing anyway.
180      processServerExit();      processServerExit();
181        
182      // Delete recentfiles menu.  #if defined(WIN32)
183      if (m_pRecentFilesMenu)      WSACleanup();
184          delete m_pRecentFilesMenu;  #endif
     // Delete status item labels one by one.  
     if (m_status[QSAMPLER_STATUS_CLIENT])  
         delete m_status[QSAMPLER_STATUS_CLIENT];  
     if (m_status[QSAMPLER_STATUS_SERVER])  
         delete m_status[QSAMPLER_STATUS_SERVER];  
     if (m_status[QSAMPLER_STATUS_CHANNEL])  
         delete m_status[QSAMPLER_STATUS_CHANNEL];  
     if (m_status[QSAMPLER_STATUS_SESSION])  
         delete m_status[QSAMPLER_STATUS_SESSION];  
185    
186      // Finally drop any widgets around...      // Finally drop any widgets around...
187        if (m_pDeviceForm)
188            delete m_pDeviceForm;
189      if (m_pMessages)      if (m_pMessages)
190          delete m_pMessages;          delete m_pMessages;
191      if (m_pWorkspace)      if (m_pWorkspace)
192          delete m_pWorkspace;          delete m_pWorkspace;
193    
194  #if defined(WIN32)      // Delete status item labels one by one.
195      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
196  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
197        if (m_statusItem[QSAMPLER_STATUS_SERVER])
198            delete m_statusItem[QSAMPLER_STATUS_SERVER];
199        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
200            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
201        if (m_statusItem[QSAMPLER_STATUS_SESSION])
202            delete m_statusItem[QSAMPLER_STATUS_SESSION];
203    
204        // Delete recentfiles menu.
205        if (m_pRecentFilesMenu)
206            delete m_pRecentFilesMenu;
207  }  }
208    
209    
# Line 205  void qsamplerMainForm::setup ( qsamplerO Line 213  void qsamplerMainForm::setup ( qsamplerO
213      // We got options?      // We got options?
214      m_pOptions = pOptions;      m_pOptions = pOptions;
215    
216        // What style do we create these forms?
217        WFlags wflags = Qt::WType_TopLevel;
218        if (m_pOptions->bKeepOnTop)
219            wflags |= Qt::WStyle_Tool;
220      // Some child forms are to be created right now.      // Some child forms are to be created right now.
221      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
222        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
223        m_pDeviceForm->setMainForm(this); // An important life immutable!
224      // Set message defaults...      // Set message defaults...
225      updateMessagesFont();      updateMessagesFont();
226      updateMessagesLimit();      updateMessagesLimit();
# Line 235  void qsamplerMainForm::setup ( qsamplerO Line 249  void qsamplerMainForm::setup ( qsamplerO
249          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
250          istr >> *this;          istr >> *this;
251      }      }
252      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
253      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
254        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
255    
256      // Final startup stabilization...      // Final startup stabilization...
257      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 274  bool qsamplerMainForm::queryClose (void) Line 289  bool qsamplerMainForm::queryClose (void)
289              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
290              ostr << *this;              ostr << *this;
291              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
292              // And the main windows state.              // And the children, and the main windows state,.
293              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
294                            m_pOptions->saveWidgetGeometry(this);
295                            // Close popup widgets.
296                            if (m_pDeviceForm)
297                                    m_pDeviceForm->close();
298              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
299              stopServer();              stopServer();
300          }          }
# Line 294  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 325  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 336  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 380  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 547  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 *piChannelIDs = ::lscp_list_channels(m_pClient);          if (iErrors > 0)
625      if (piChannelIDs == NULL) {                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
         appendMessagesClient("lscp_list_channels");  
         appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));  
     }  
       
     // Try to (re)create each channel.  
     m_pWorkspace->setUpdatesEnabled(false);  
     for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {  
         createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));  
         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.      // Make that an overall update.
     m_iChangeCount++;  
638      stabilizeForm();      stabilizeForm();
639      return true;      return true;
640  }  }
# Line 594  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 605  bool qsamplerMainForm::saveSessionFile ( Line 662  bool qsamplerMainForm::saveSessionFile (
662      ts << "# " << tr("File")      ts << "# " << tr("File")
663         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
664      ts << "# " << tr("Date")      ts << "# " << tr("Date")
665         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
666         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
667      ts << "#"  << endl;      ts << "#"  << endl;
668      ts << endl;      ts << endl;
669            // It is assumed that this new kind of device+session file
670            // will be loaded from a complete
671            int *piDeviceIDs;
672            int  iDevice;
673            ts << "RESET" << endl;
674            // Audio device mapping.
675            QMap<int, int> audioDeviceMap;
676            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
677            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
678                    ts << endl;
679                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
680                    // Audio device specification...
681                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
682                            << " " << tr("Device") << " " << iDevice << endl;
683                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
684                    qsamplerDeviceParamMap::ConstIterator deviceParam;
685                    for (deviceParam = device.params().begin();
686                                    deviceParam != device.params().end();
687                                            ++deviceParam) {
688                            const qsamplerDeviceParam& param = deviceParam.data();
689                            if (param.value.isEmpty()) ts << "# ";
690                            ts << " " << deviceParam.key() << "='" << param.value << "'";
691                    }
692                    ts << endl;
693                    // Audio channel parameters...
694                    int iPort = 0;
695                    for (qsamplerDevicePort *pPort = device.ports().first();
696                                    pPort;
697                                            pPort = device.ports().next(), ++iPort) {
698                            qsamplerDeviceParamMap::ConstIterator portParam;
699                            for (portParam = pPort->params().begin();
700                                            portParam != pPort->params().end();
701                                                    ++portParam) {
702                                    const qsamplerDeviceParam& param = portParam.data();
703                                    if (param.fix || param.value.isEmpty()) ts << "# ";
704                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
705                                            << " " << iPort << " " << portParam.key()
706                                            << "='" << param.value << "'" << endl;
707                            }
708                    }
709                    // Audio device index/id mapping.
710                    audioDeviceMap[device.deviceID()] = iDevice;
711            // Try to keep it snappy :)
712            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
713            }
714            // MIDI device mapping.
715            QMap<int, int> midiDeviceMap;
716            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
717            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
718                    ts << endl;
719                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
720                    // MIDI device specification...
721                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
722                            << " " << tr("Device") << " " << iDevice << endl;
723                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
724                    qsamplerDeviceParamMap::ConstIterator deviceParam;
725                    for (deviceParam = device.params().begin();
726                                    deviceParam != device.params().end();
727                                            ++deviceParam) {
728                            const qsamplerDeviceParam& param = deviceParam.data();
729                            if (param.value.isEmpty()) ts << "# ";
730                            ts << " " << deviceParam.key() << "='" << param.value << "'";
731                    }
732                    ts << endl;
733                    // MIDI port parameters...
734                    int iPort = 0;
735                    for (qsamplerDevicePort *pPort = device.ports().first();
736                                    pPort;
737                                            pPort = device.ports().next(), ++iPort) {
738                            qsamplerDeviceParamMap::ConstIterator portParam;
739                            for (portParam = pPort->params().begin();
740                                            portParam != pPort->params().end();
741                                                    ++portParam) {
742                                    const qsamplerDeviceParam& param = portParam.data();
743                                    if (param.fix || param.value.isEmpty()) ts << "# ";
744                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
745                                       << " " << iPort << " " << portParam.key()
746                                       << "='" << param.value << "'" << endl;
747                            }
748                    }
749                    // MIDI device index/id mapping.
750                    midiDeviceMap[device.deviceID()] = iDevice;
751            // Try to keep it snappy :)
752            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
753            }
754            ts << endl;
755            // Sampler channel mapping.
756      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
757      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
758          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
759          if (pChannelStrip) {          if (pChannelStrip) {
760              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
761              if (pChannel) {              if (pChannel) {
762                  int iChannelID = pChannel->channelID();                  ts << "# " << tr("Channel") << " " << iChannel << endl;
                 ts << "# " << pChannelStrip->caption() << endl;  
763                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
764                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                                  if (audioDeviceMap.isEmpty()) {
765                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
766                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                                  << " " << pChannel->audioDriver() << endl;
767                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                                  } else {
768                                            ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
769                                                    << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
770                                    }
771                                    if (midiDeviceMap.isEmpty()) {
772                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
773                                                    << " " << pChannel->midiDriver() << endl;
774                                    } else {
775                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
776                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
777                                    }
778                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
779                                            << " " << pChannel->midiPort() << endl;
780                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
781                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
782                      ts << "ALL";                      ts << "ALL";
783                  else                  else
784                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
785                  ts << endl;                  ts << endl;
786                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
787                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
788                  ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
789                    if (pChannel->channelMute())
790                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
791                    if (pChannel->channelSolo())
792                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
793                  ts << endl;                  ts << endl;
794              }              }
795          }          }
# Line 658  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 715  void qsamplerMainForm::fileReset (void) Line 885  void qsamplerMainForm::fileReset (void)
885          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
886             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
887             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
888             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
889             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
890          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
891          return;          return;
# Line 729  void qsamplerMainForm::fileReset (void) Line 899  void qsamplerMainForm::fileReset (void)
899    
900      // Log this.      // Log this.
901      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
902    
903            // Make it a new session...
904            newSession();
905  }  }
906    
907    
# Line 737  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 747  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 790  void qsamplerMainForm::editAddChannel (v Line 963  void qsamplerMainForm::editAddChannel (v
963          delete pChannel;          delete pChannel;
964          return;          return;
965      }      }
966        
967      // And give it to the strip (will own the channel instance, if successful).      // And give it to the strip (will own the channel instance, if successful).
968      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
969          delete pChannel;          delete pChannel;
# Line 799  void qsamplerMainForm::editAddChannel (v Line 972  void qsamplerMainForm::editAddChannel (v
972    
973      // Make that an overall update.      // Make that an overall update.
974      m_iDirtyCount++;      m_iDirtyCount++;
     m_iChangeCount++;  
975      stabilizeForm();      stabilizeForm();
976  }  }
977    
# Line 813  void qsamplerMainForm::editRemoveChannel Line 985  void qsamplerMainForm::editRemoveChannel
985      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
986      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
987          return;          return;
988            
989      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
990      if (pChannel == NULL)      if (pChannel == NULL)
991          return;          return;
# Line 835  void qsamplerMainForm::editRemoveChannel Line 1007  void qsamplerMainForm::editRemoveChannel
1007    
1008      // Just delete the channel strip.      // Just delete the channel strip.
1009      delete pChannelStrip;      delete pChannelStrip;
1010        
1011      // Do we auto-arrange?      // Do we auto-arrange?
1012      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1013          channelsArrange();          channelsArrange();
# Line 871  void qsamplerMainForm::editResetChannel Line 1043  void qsamplerMainForm::editResetChannel
1043      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1044          return;          return;
1045    
1046      qsamplerChannel *pChannel = pChannelStrip->channel();      // Just invoque the channel strip procedure.
1047      if (pChannel == NULL)      pChannelStrip->channelReset();
1048          return;  }
1049    
     // Reset the existing sampler channel.  
     pChannel->resetChannel();  
1050    
1051      // And force a deferred update.  // Reset all sampler channels.
1052      m_iChangeCount++;  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 931  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 955  void qsamplerMainForm::viewOptions (void Line 1159  void qsamplerMainForm::viewOptions (void
1159          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1160          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1161          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1162            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1163          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1164          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1165          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
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 966  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 977  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) ||              if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1192                  (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))                  (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1193                  updateDisplayEffect();                  updateDisplayEffect();
# Line 1038  void qsamplerMainForm::channelsArrange ( Line 1249  void qsamplerMainForm::channelsArrange (
1249          y += iHeight;          y += iHeight;
1250      }      }
1251      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1252        
1253      stabilizeForm();      stabilizeForm();
1254  }  }
1255    
# Line 1087  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 1114  void qsamplerMainForm::helpAbout (void) Line 1341  void qsamplerMainForm::helpAbout (void)
1341  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1342  {  {
1343      // Update the main application caption...      // Update the main application caption...
1344      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1345      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1346          sSessioName += '*';          sSessionName += '*';
1347      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1348    
1349      // Update the main menu state...      // Update the main menu state...
1350      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
# Line 1133  void qsamplerMainForm::stabilizeForm (vo Line 1360  void qsamplerMainForm::stabilizeForm (vo
1360      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1361      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1362      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1363      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1364      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1365        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1366        viewDevicesAction->setEnabled(bHasClient);
1367        channelsArrangeAction->setEnabled(bHasChannel);
1368    
1369      // Client/Server status...      // Client/Server status...
1370      if (bHasClient) {      if (bHasClient) {
1371          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1372          m_status[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));          m_statusItem[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));
1373      } else {      } else {
1374          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1375          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1376      }      }
1377      // Channel status...      // Channel status...
1378      if (bHasChannel)      if (bHasChannel)
1379          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1380      else      else
1381          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1382      // Session status...      // Session status...
1383      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1384          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1385      else      else
1386          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1387    
1388      // Recent files menu.      // Recent files menu.
1389      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1165  void qsamplerMainForm::stabilizeForm (vo Line 1395  void qsamplerMainForm::stabilizeForm (vo
1395    
1396    
1397  // Channel change receiver slot.  // Channel change receiver slot.
1398  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1399  {  {
1400      // Flag that we're update those channel strips.          // Add this strip to the changed list...
1401      m_iChangeCount++;          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 1176  void qsamplerMainForm::channelStripChang Line 1410  void qsamplerMainForm::channelStripChang
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 1220  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 1365  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 1397  qsamplerChannelStrip *qsamplerMainForm:: Line 1679  qsamplerChannelStrip *qsamplerMainForm::
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              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1682          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1683              y += pChannelStrip->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1684                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1685                            }
1686          }          }
1687      }      }
1688    
# Line 1407  qsamplerChannelStrip *qsamplerMainForm:: Line 1691  qsamplerChannelStrip *qsamplerMainForm::
1691      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1692      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1693          return NULL;          return NULL;
1694            
1695      // Actual channel strip setup...      // Actual channel strip setup...
1696      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1697      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1432  qsamplerChannelStrip *qsamplerMainForm:: Line 1716  qsamplerChannelStrip *qsamplerMainForm::
1716          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1717          pChannelStrip->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...      // Return our successful reference...
1724      return pChannelStrip;      return pChannelStrip;
1725  }  }
# Line 1450  qsamplerChannelStrip *qsamplerMainForm:: Line 1737  qsamplerChannelStrip *qsamplerMainForm::
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 1522  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_iChangeCount > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1836          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1837          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1838              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1839              m_iChangeCount = 0;                                  // If successfull, remove from pending list...
1840              QWidgetList wlist = m_pWorkspace->windowList();                                  if (pChannelStrip->updateChannelInfo())
1841              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                          m_changedStrips.remove(pChannelStrip);
1842                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          }
1843                  if (pChannelStrip && pChannelStrip->isVisible()) {                  }
1844                      // If we can't make it clean, try next time.                  // Refresh each channel usage, on each period...
1845                      if (!pChannelStrip->updateChannelUsage())                  if (m_pOptions->bAutoRefresh) {
1846                          m_iChangeCount++;                          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 1720  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 1729  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 1749  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 1763  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.344  
changed lines
  Added in v.753

  ViewVC Help
Powered by ViewVC