/[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 296 by capela, Wed Nov 17 11:51:49 2004 UTC revision 753 by capela, Wed Aug 24 17:44:59 2005 UTC
# Line 2  Line 2 
2  //  //
3  // ui.h extension file, included from the uic-generated form implementation.  // ui.h extension file, included from the uic-generated form implementation.
4  /****************************************************************************  /****************************************************************************
5     Copyright (C) 2004, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2005, rncbc aka Rui Nuno Capela. All rights reserved.
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 26  Line 26 
26  #include <qprocess.h>  #include <qprocess.h>
27  #include <qmessagebox.h>  #include <qmessagebox.h>
28  #include <qdragobject.h>  #include <qdragobject.h>
29    #include <qregexp.h>
30  #include <qfiledialog.h>  #include <qfiledialog.h>
31  #include <qfileinfo.h>  #include <qfileinfo.h>
32  #include <qfile.h>  #include <qfile.h>
# Line 40  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #ifdef HAVE_SIGNAL_H
49    #include <signal.h>
50    #endif
51    
52    #ifdef CONFIG_LIBGIG
53    #include <gig.h>
54    #endif
55    
56  // Timer constant stuff.  // Timer constant stuff.
57  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
# Line 101  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 116  void qsamplerMainForm::init (void) Line 124  void qsamplerMainForm::init (void)
124    
125      m_iTimerSlot = 0;      m_iTimerSlot = 0;
126    
127    #ifdef HAVE_SIGNAL_H
128            // Set to ignore any fatal "Broken pipe" signals.
129            ::signal(SIGPIPE, SIG_IGN);
130    #endif
131    
132      // Make it an MDI workspace.      // Make it an MDI workspace.
133      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
134      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 130  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 165  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 197  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 227  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 266  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 286  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 317  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 328  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 372  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 539  bool qsamplerMainForm::loadSessionFile ( Line 617  bool qsamplerMainForm::loadSessionFile (
617      // Ok. we've read it.      // Ok. we've read it.
618      file.close();      file.close();
619    
620      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
621      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));  
622    
623      // Now we'll try to create the whole GUI session.          // Have we any errors?
624      int iChannels = ::lscp_get_channels(m_pClient);          if (iErrors > 0)
625      if (iChannels < 0) {                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
         appendMessagesClient("lscp_get_channels");  
         appendMessagesError(tr("Could not get current number of channels.\n\nSorry."));  
     }  
       
     // Try to (re)create each channel.  
     m_pWorkspace->setUpdatesEnabled(false);  
     for (int iChannelID = 0; iChannelID < iChannels; iChannelID++) {  
         createChannelStrip(iChannelID);  
         QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
     }  
     m_pWorkspace->setUpdatesEnabled(true);  
626    
627      // Save as default session directory.      // Save as default session directory.
628      if (m_pOptions)      if (m_pOptions)
629          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
630      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
631      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
632      // Stabilize form...      // Stabilize form...
633      m_sFilename = sFilename;      m_sFilename = sFilename;
634      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
635      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
636    
637        // Make that an overall update.
638      stabilizeForm();      stabilizeForm();
639      return true;      return true;
640  }  }
# Line 583  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 594  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                  if (pChannel->midiChannel() > 0)                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
769                      ts << pChannel->midiChannel();                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
770                   else                                  }
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)
782                      ts << "ALL";                      ts << "ALL";
783                    else
784                        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 647  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 704  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 718  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 726  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 736  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 768  void qsamplerMainForm::editAddChannel (v Line 952  void qsamplerMainForm::editAddChannel (v
952      if (m_pClient == NULL)      if (m_pClient == NULL)
953          return;          return;
954    
955      // Just create the channel strip,      // Just create the channel instance...
956      // by giving an invalid channel id.      qsamplerChannel *pChannel = new qsamplerChannel(this);
957      createChannelStrip(-1);      if (pChannel == NULL)
958            return;
959    
960        // Before we show it up, may be we'll
961        // better ask for some initial values?
962        if (!pChannel->channelSetup(this)) {
963            delete pChannel;
964            return;
965        }
966    
967        // And give it to the strip (will own the channel instance, if successful).
968        if (!createChannelStrip(pChannel)) {
969            delete pChannel;
970            return;
971        }
972    
973        // Make that an overall update.
974        m_iDirtyCount++;
975        stabilizeForm();
976  }  }
977    
978    
# Line 783  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 805  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 841  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      // Refresh channel strip info.  // Reset all sampler channels.
1052      pChannelStrip->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
1053    {
1054            if (m_pClient == NULL)
1055                    return;
1056    
1057            // Invoque the channel strip procedure,
1058            // for all channels out there...
1059            m_pWorkspace->setUpdatesEnabled(false);
1060            QWidgetList wlist = m_pWorkspace->windowList();
1061            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1062                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1063                    if (pChannelStrip)
1064                            pChannelStrip->channelReset();
1065            }
1066            m_pWorkspace->setUpdatesEnabled(true);
1067  }  }
1068    
1069    
# Line 901  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 925  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 936  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 947  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 1008  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 1057  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 1084  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 1103  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 1135  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 1146  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 1190  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 1335  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 1355  void qsamplerMainForm::updateMessagesCap Line 1667  void qsamplerMainForm::updateMessagesCap
1667  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1668    
1669  // The channel strip creation executive.  // The channel strip creation executive.
1670  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( int iChannelID )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1671  {  {
1672      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1673          return NULL;          return NULL;
1674    
1675      // Prepare for auto-arrange?      // Prepare for auto-arrange?
# Line 1367  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    
1689      // Add a new channel itema...      // Add a new channel itema...
1690      WFlags wflags = Qt::WStyle_Customize | Qt::WStyle_Tool | Qt::WStyle_Title | Qt::WStyle_NoBorder;      WFlags wflags = Qt::WStyle_Customize | Qt::WStyle_Tool | Qt::WStyle_Title | Qt::WStyle_NoBorder;
1691      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1692      // Actual channel setup.      if (pChannelStrip == NULL)
     pChannelStrip->setup(this, iChannelID);  
     QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));  
     // Before we show it up, may be we'll  
     // better ask for some initial values?  
     if (iChannelID < 0 && !pChannelStrip->channelSetup()) {  
         // No luck, bail out...  
         delete pChannelStrip;  
1693          return NULL;          return NULL;
     }  
1694    
1695        // Actual channel strip setup...
1696        pChannelStrip->setup(pChannel);
1697        QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1698      // Set some initial aesthetic options...      // Set some initial aesthetic options...
1699      if (m_pOptions) {      if (m_pOptions) {
1700          // Background display effect...          // Background display effect...
# Line 1407  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 1425  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 1497  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                      pChannelStrip->updateChannelUsage();                  // Refresh each channel usage, on each period...
1845              }                  if (m_pOptions->bAutoRefresh) {
1846          }                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1847      }                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1848                                    m_iTimerSlot = 0;
1849                                    // Update the channel stream usage for each strip...
1850                                    QWidgetList wlist = m_pWorkspace->windowList();
1851                                    for (int iChannel = 0;
1852                                                    iChannel < (int) wlist.count(); iChannel++) {
1853                                            qsamplerChannelStrip *pChannelStrip
1854                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1855                                            if (pChannelStrip && pChannelStrip->isVisible())
1856                                                    pChannelStrip->updateChannelUsage();
1857                                    }
1858                            }
1859                    }
1860            }
1861    
1862      // Register the next timer slot.      // Register the next timer slot.
1863      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1692  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 1701  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 1721  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 1735  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.296  
changed lines
  Added in v.753

  ViewVC Help
Powered by ViewVC