/[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 388 by capela, Thu Feb 17 17:27:59 2005 UTC revision 736 by schoenebeck, Tue Aug 16 10:19:25 2005 UTC
# Line 41  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"  #include "config.h"
# Line 49  Line 51 
51  #include <signal.h>  #include <signal.h>
52  #endif  #endif
53    
54    #ifdef CONFIG_LIBGIG
55    #include <gig.h>
56    #endif
57    
58  // Timer constant stuff.  // Timer constant stuff.
59  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
60    
# Line 105  void qsamplerMainForm::init (void) Line 111  void qsamplerMainForm::init (void)
111      m_pOptions = NULL;      m_pOptions = NULL;
112    
113      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
114      m_pMessages = NULL;      m_pMessages   = NULL;
115        m_pDeviceForm = NULL;
116    
117      // We'll start clean.      // We'll start clean.
118      m_iUntitled    = 0;      m_iUntitled   = 0;
119      m_iDirtyCount  = 0;      m_iDirtyCount = 0;
     m_iChangeCount = 0;  
120    
121      m_pServer = NULL;      m_pServer = NULL;
122      m_pClient = NULL;      m_pClient = NULL;
# Line 139  void qsamplerMainForm::init (void) Line 145  void qsamplerMainForm::init (void)
145      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
146      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
147      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
148      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
149      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
150      // Server address.      // Server address.
151      pLabel = new QLabel(this);      pLabel = new QLabel(this);
152      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
153      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
154      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
155      // Channel title.      // Channel title.
156      pLabel = new QLabel(this);      pLabel = new QLabel(this);
157      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
158      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
159      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
160      // Session modification status.      // Session modification status.
161      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
162      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
163      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
164      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
165      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
166    
167      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 174  void qsamplerMainForm::destroy (void) Line 180  void qsamplerMainForm::destroy (void)
180  {  {
181      // Do final processing anyway.      // Do final processing anyway.
182      processServerExit();      processServerExit();
183        
184      // Delete recentfiles menu.  #if defined(WIN32)
185      if (m_pRecentFilesMenu)      WSACleanup();
186          delete m_pRecentFilesMenu;  #endif
     // Delete status item labels one by one.  
     if (m_status[QSAMPLER_STATUS_CLIENT])  
         delete m_status[QSAMPLER_STATUS_CLIENT];  
     if (m_status[QSAMPLER_STATUS_SERVER])  
         delete m_status[QSAMPLER_STATUS_SERVER];  
     if (m_status[QSAMPLER_STATUS_CHANNEL])  
         delete m_status[QSAMPLER_STATUS_CHANNEL];  
     if (m_status[QSAMPLER_STATUS_SESSION])  
         delete m_status[QSAMPLER_STATUS_SESSION];  
187    
188      // Finally drop any widgets around...      // Finally drop any widgets around...
189        if (m_pDeviceForm)
190            delete m_pDeviceForm;
191      if (m_pMessages)      if (m_pMessages)
192          delete m_pMessages;          delete m_pMessages;
193      if (m_pWorkspace)      if (m_pWorkspace)
194          delete m_pWorkspace;          delete m_pWorkspace;
195    
196  #if defined(WIN32)      // Delete status item labels one by one.
197      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
198  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
199        if (m_statusItem[QSAMPLER_STATUS_SERVER])
200            delete m_statusItem[QSAMPLER_STATUS_SERVER];
201        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
202            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
203        if (m_statusItem[QSAMPLER_STATUS_SESSION])
204            delete m_statusItem[QSAMPLER_STATUS_SESSION];
205    
206        // Delete recentfiles menu.
207        if (m_pRecentFilesMenu)
208            delete m_pRecentFilesMenu;
209  }  }
210    
211    
# Line 206  void qsamplerMainForm::setup ( qsamplerO Line 215  void qsamplerMainForm::setup ( qsamplerO
215      // We got options?      // We got options?
216      m_pOptions = pOptions;      m_pOptions = pOptions;
217    
218        // What style do we create these forms?
219        WFlags wflags = Qt::WType_TopLevel;
220        if (m_pOptions->bKeepOnTop)
221            wflags |= Qt::WStyle_Tool;
222      // Some child forms are to be created right now.      // Some child forms are to be created right now.
223      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
224        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
225        m_pDeviceForm->setMainForm(this); // An important life immutable!
226      // Set message defaults...      // Set message defaults...
227      updateMessagesFont();      updateMessagesFont();
228      updateMessagesLimit();      updateMessagesLimit();
# Line 236  void qsamplerMainForm::setup ( qsamplerO Line 251  void qsamplerMainForm::setup ( qsamplerO
251          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
252          istr >> *this;          istr >> *this;
253      }      }
254      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
255      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
256        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
257    
258      // Final startup stabilization...      // Final startup stabilization...
259      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 275  bool qsamplerMainForm::queryClose (void) Line 291  bool qsamplerMainForm::queryClose (void)
291              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
292              ostr << *this;              ostr << *this;
293              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
294              // And the main windows state.              // And the children, and the main windows state,.
295              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
296                            m_pOptions->saveWidgetGeometry(this);
297                            // Close popup widgets.
298                            if (m_pDeviceForm)
299                                    m_pDeviceForm->close();
300              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
301              stopServer();              stopServer();
302          }          }
# Line 306  bool qsamplerMainForm::decodeDragFiles ( Line 326  bool qsamplerMainForm::decodeDragFiles (
326          if (bDecode) {          if (bDecode) {
327              files = QStringList::split('\n', sText);              files = QStringList::split('\n', sText);
328              for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)              for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
329                  *iter = (*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null);                  *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
330          }          }
331      }      }
332    
# Line 317  bool qsamplerMainForm::decodeDragFiles ( Line 337  bool qsamplerMainForm::decodeDragFiles (
337  // Window drag-n-drop event handlers.  // Window drag-n-drop event handlers.
338  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
339  {  {
340      QStringList files;          QStringList files;
341            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
     pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));  
342  }  }
343    
344    
345  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
346  {  {
347      QStringList files;      QStringList files;
348      if (decodeDragFiles(pDropEvent, files)) {  
349          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {      if (!decodeDragFiles(pDropEvent, files))
350                          const QString& sPath = QUrl(*iter).path();          return;
351                          if (qsamplerChannel::isInstrumentFile(sPath)) {  
352                                  // Try to create a new channel from instrument file...          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
353                              qsamplerChannel *pChannel = new qsamplerChannel(this);                  const QString& sPath = *iter;
354                              if (pChannel == NULL)                  if (qsamplerChannel::isInstrumentFile(sPath)) {
355                                  return;                          // Try to create a new channel from instrument file...
356                                  // Start setting the instrument filename...                          qsamplerChannel *pChannel = new qsamplerChannel(this);
357                                  pChannel->setInstrument(sPath, 0);                          if (pChannel == NULL)
358                              // Before we show it up, may be we'll                                  return;
359                              // better ask for some initial values?                          // Start setting the instrument filename...
360                              if (!pChannel->channelSetup(this)) {                          pChannel->setInstrument(sPath, 0);
361                                  delete pChannel;                          // Before we show it up, may be we'll
362                                  return;                          // better ask for some initial values?
363                              }                          if (!pChannel->channelSetup(this)) {
364                              // Make that an overall update.                                  delete pChannel;
365                              m_iDirtyCount++;                                  return;
366                              m_iChangeCount++;                          }
367                              stabilizeForm();                          // Finally, give it to a new channel strip...
368                  }   // Otherwise, load an usual session file (LSCP script)...                          if (!createChannelStrip(pChannel)) {
369                          else if (closeSession(true))                                  delete pChannel;
370                                  loadSessionFile(sPath);                                  return;
371                  }                          }
372      }                          // Make that an overall update.
373                            m_iDirtyCount++;
374                            stabilizeForm();
375                    }   // Otherwise, load an usual session file (LSCP script)...
376                    else if (closeSession(true))
377                            loadSessionFile(sPath);
378                    // Make it look responsive...:)
379                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
380            }
381  }  }
382    
383    
# Line 360  void qsamplerMainForm::customEvent ( QCu Line 387  void qsamplerMainForm::customEvent ( QCu
387      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
388      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
389          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
390          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
391              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
392              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
393                            if (pChannelStrip)
394                                    channelStripChanged(pChannelStrip);
395                    } else {
396                            appendMessagesColor(tr("Notify event: %1 data: %2")
397                                    .arg(::lscp_event_to_text(pEvent->event()))
398                                    .arg(pEvent->data()), "#996699");
399                    }
400      }      }
401  }  }
402    
# Line 371  void qsamplerMainForm::customEvent ( QCu Line 405  void qsamplerMainForm::customEvent ( QCu
405  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
406  {  {
407      stabilizeForm();      stabilizeForm();
408        
409      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
410  }  }
411    
# Line 415  bool qsamplerMainForm::newSession (void) Line 449  bool qsamplerMainForm::newSession (void)
449      if (!closeSession(true))      if (!closeSession(true))
450          return false;          return false;
451    
452            // Give us what the server has, right now...
453            updateSession();
454    
455      // Ok increment untitled count.      // Ok increment untitled count.
456      m_iUntitled++;      m_iUntitled++;
457    
# Line 573  bool qsamplerMainForm::loadSessionFile ( Line 610  bool qsamplerMainForm::loadSessionFile (
610              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
611                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
612                  iErrors++;                  iErrors++;
                 break;  
613              }              }
614          }          }
615          // Try to make it snappy :)          // Try to make it snappy :)
# Line 583  bool qsamplerMainForm::loadSessionFile ( Line 619  bool qsamplerMainForm::loadSessionFile (
619      // Ok. we've read it.      // Ok. we've read it.
620      file.close();      file.close();
621    
622      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
623      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
624    
625      // Now we'll try to create the whole GUI session.          // Have we any errors?
626      int *piChannelIDs = ::lscp_list_channels(m_pClient);          if (iErrors > 0)
627      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."));  
     } else {  
                 // 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);  
         }  
628    
629      // Save as default session directory.      // Save as default session directory.
630      if (m_pOptions)      if (m_pOptions)
631          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
632      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
633      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
634      // Stabilize form...      // Stabilize form...
635      m_sFilename = sFilename;      m_sFilename = sFilename;
636      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
637      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
638        
639      // Make that an overall update.      // Make that an overall update.
     m_iChangeCount++;  
640      stabilizeForm();      stabilizeForm();
641      return true;      return true;
642  }  }
# Line 630  bool qsamplerMainForm::saveSessionFile ( Line 653  bool qsamplerMainForm::saveSessionFile (
653      }      }
654    
655      // Write the file.      // Write the file.
656      int iErrors = 0;      int  iErrors = 0;
657      QTextStream ts(&file);      QTextStream ts(&file);
658      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
659      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 641  bool qsamplerMainForm::saveSessionFile ( Line 664  bool qsamplerMainForm::saveSessionFile (
664      ts << "# " << tr("File")      ts << "# " << tr("File")
665         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
666      ts << "# " << tr("Date")      ts << "# " << tr("Date")
667         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
668         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
669      ts << "#"  << endl;      ts << "#"  << endl;
670      ts << endl;      ts << endl;
671            // It is assumed that this new kind of device+session file
672            // will be loaded from a complete
673            int *piDeviceIDs;
674            int  iDevice;
675            ts << "RESET" << endl;
676            // Audio device mapping.
677            QMap<int, int> audioDeviceMap;
678            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
679            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
680                    ts << endl;
681                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
682                    // Audio device specification...
683                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
684                            << " " << tr("Device") << " " << iDevice << endl;
685                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
686                    qsamplerDeviceParamMap::ConstIterator deviceParam;
687                    for (deviceParam = device.params().begin();
688                                    deviceParam != device.params().end();
689                                            ++deviceParam) {
690                            const qsamplerDeviceParam& param = deviceParam.data();
691                            if (param.value.isEmpty()) ts << "# ";
692                            ts << " " << deviceParam.key() << "='" << param.value << "'";
693                    }
694                    ts << endl;
695                    // Audio channel parameters...
696                    int iPort = 0;
697                    for (qsamplerDevicePort *pPort = device.ports().first();
698                                    pPort;
699                                            pPort = device.ports().next(), ++iPort) {
700                            qsamplerDeviceParamMap::ConstIterator portParam;
701                            for (portParam = pPort->params().begin();
702                                            portParam != pPort->params().end();
703                                                    ++portParam) {
704                                    const qsamplerDeviceParam& param = portParam.data();
705                                    if (param.fix || param.value.isEmpty()) ts << "# ";
706                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
707                                            << " " << iPort << " " << portParam.key()
708                                            << "='" << param.value << "'" << endl;
709                            }
710                    }
711                    // Audio device index/id mapping.
712                    audioDeviceMap[device.deviceID()] = iDevice;
713            // Try to keep it snappy :)
714            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
715            }
716            // MIDI device mapping.
717            QMap<int, int> midiDeviceMap;
718            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
719            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
720                    ts << endl;
721                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
722                    // MIDI device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
726                    qsamplerDeviceParamMap::ConstIterator deviceParam;
727                    for (deviceParam = device.params().begin();
728                                    deviceParam != device.params().end();
729                                            ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                    ts << endl;
735                    // MIDI port parameters...
736                    int iPort = 0;
737                    for (qsamplerDevicePort *pPort = device.ports().first();
738                                    pPort;
739                                            pPort = device.ports().next(), ++iPort) {
740                            qsamplerDeviceParamMap::ConstIterator portParam;
741                            for (portParam = pPort->params().begin();
742                                            portParam != pPort->params().end();
743                                                    ++portParam) {
744                                    const qsamplerDeviceParam& param = portParam.data();
745                                    if (param.fix || param.value.isEmpty()) ts << "# ";
746                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
747                                       << " " << iPort << " " << portParam.key()
748                                       << "='" << param.value << "'" << endl;
749                            }
750                    }
751                    // MIDI device index/id mapping.
752                    midiDeviceMap[device.deviceID()] = iDevice;
753            // Try to keep it snappy :)
754            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
755            }
756            ts << endl;
757            // Sampler channel mapping.
758      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
759      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
760          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
761          if (pChannelStrip) {          if (pChannelStrip) {
762              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
763              if (pChannel) {              if (pChannel) {
764                  int iChannelID = pChannel->channelID();                  ts << "# " << tr("Channel") << " " << iChannel << endl;
                 ts << "# " << pChannelStrip->caption() << endl;  
765                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
766                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                                  if (audioDeviceMap.isEmpty()) {
767                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
768                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                                  << " " << pChannel->audioDriver() << endl;
769                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                                  } else {
770                                            ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
771                                                    << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
772                                    }
773                                    if (midiDeviceMap.isEmpty()) {
774                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
775                                                    << " " << pChannel->midiDriver() << endl;
776                                    } else {
777                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
778                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
779                                    }
780                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
781                                            << " " << pChannel->midiPort() << endl;
782                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
783                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
784                      ts << "ALL";                      ts << "ALL";
785                  else                  else
786                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
787                  ts << endl;                  ts << endl;
788                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
789                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
790                  ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
791                  ts << endl;                  ts << endl;
792              }              }
793          }          }
# Line 694  bool qsamplerMainForm::saveSessionFile ( Line 816  bool qsamplerMainForm::saveSessionFile (
816  }  }
817    
818    
819    // Session change receiver slot.
820    void qsamplerMainForm::sessionDirty (void)
821    {
822        // Just mark the dirty form.
823        m_iDirtyCount++;
824        // and update the form status...
825        stabilizeForm();
826    }
827    
828    
829  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
830  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
831    
# Line 751  void qsamplerMainForm::fileReset (void) Line 883  void qsamplerMainForm::fileReset (void)
883          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
884             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
885             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
886             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
887             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
888          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
889          return;          return;
# Line 765  void qsamplerMainForm::fileReset (void) Line 897  void qsamplerMainForm::fileReset (void)
897    
898      // Log this.      // Log this.
899      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
900    
901            // Make it a new session...
902            newSession();
903  }  }
904    
905    
# Line 773  void qsamplerMainForm::fileRestart (void Line 908  void qsamplerMainForm::fileRestart (void
908  {  {
909      if (m_pOptions == NULL)      if (m_pOptions == NULL)
910          return;          return;
911            
912      bool bRestart = true;      bool bRestart = true;
913        
914      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
915      // (if we're currently up and running)      // (if we're currently up and running)
916      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
# Line 783  void qsamplerMainForm::fileRestart (void Line 918  void qsamplerMainForm::fileRestart (void
918              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
919                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
920                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
921                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
922                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
923              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
924      }      }
# Line 826  void qsamplerMainForm::editAddChannel (v Line 961  void qsamplerMainForm::editAddChannel (v
961          delete pChannel;          delete pChannel;
962          return;          return;
963      }      }
964        
965      // 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).
966      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
967          delete pChannel;          delete pChannel;
# Line 835  void qsamplerMainForm::editAddChannel (v Line 970  void qsamplerMainForm::editAddChannel (v
970    
971      // Make that an overall update.      // Make that an overall update.
972      m_iDirtyCount++;      m_iDirtyCount++;
     m_iChangeCount++;  
973      stabilizeForm();      stabilizeForm();
974  }  }
975    
# Line 849  void qsamplerMainForm::editRemoveChannel Line 983  void qsamplerMainForm::editRemoveChannel
983      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
984      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
985          return;          return;
986            
987      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
988      if (pChannel == NULL)      if (pChannel == NULL)
989          return;          return;
# Line 871  void qsamplerMainForm::editRemoveChannel Line 1005  void qsamplerMainForm::editRemoveChannel
1005    
1006      // Just delete the channel strip.      // Just delete the channel strip.
1007      delete pChannelStrip;      delete pChannelStrip;
1008        
1009      // Do we auto-arrange?      // Do we auto-arrange?
1010      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1011          channelsArrange();          channelsArrange();
# Line 907  void qsamplerMainForm::editResetChannel Line 1041  void qsamplerMainForm::editResetChannel
1041      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1042          return;          return;
1043    
1044      qsamplerChannel *pChannel = pChannelStrip->channel();      // Just invoque the channel strip procedure.
1045      if (pChannel == NULL)      pChannelStrip->channelReset();
1046          return;  }
1047    
     // Reset the existing sampler channel.  
     pChannel->resetChannel();  
1048    
1049      // And force a deferred update.  // Reset all sampler channels.
1050      m_iChangeCount++;  void qsamplerMainForm::editResetAllChannels (void)
1051    {
1052            if (m_pClient == NULL)
1053                    return;
1054    
1055            // Invoque the channel strip procedure,
1056            // for all channels out there...
1057            m_pWorkspace->setUpdatesEnabled(false);
1058            QWidgetList wlist = m_pWorkspace->windowList();
1059            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1060                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1061                    if (pChannelStrip)
1062                            pChannelStrip->channelReset();
1063            }
1064            m_pWorkspace->setUpdatesEnabled(true);
1065  }  }
1066    
1067    
# Line 967  void qsamplerMainForm::viewMessages ( bo Line 1113  void qsamplerMainForm::viewMessages ( bo
1113  }  }
1114    
1115    
1116    // Show/hide the device configurator form.
1117    void qsamplerMainForm::viewDevices (void)
1118    {
1119            if (m_pOptions == NULL)
1120                    return;
1121    
1122            if (m_pDeviceForm) {
1123                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1124                    m_pDeviceForm->setClient(m_pClient);
1125                    if (m_pDeviceForm->isVisible()) {
1126                            m_pDeviceForm->hide();
1127                    } else {
1128                            m_pDeviceForm->show();
1129                            m_pDeviceForm->raise();
1130                            m_pDeviceForm->setActiveWindow();
1131                    }
1132            }
1133    }
1134    
1135    
1136  // Show options dialog.  // Show options dialog.
1137  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1138  {  {
# Line 991  void qsamplerMainForm::viewOptions (void Line 1157  void qsamplerMainForm::viewOptions (void
1157          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1158          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1159          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1160            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1161          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1162          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1163          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
# Line 1003  void qsamplerMainForm::viewOptions (void Line 1170  void qsamplerMainForm::viewOptions (void
1170          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1171              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1172              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1173                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1174                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1175                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1176                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1177                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1178                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 1078  void qsamplerMainForm::channelsArrange ( Line 1247  void qsamplerMainForm::channelsArrange (
1247          y += iHeight;          y += iHeight;
1248      }      }
1249      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1250        
1251      stabilizeForm();      stabilizeForm();
1252  }  }
1253    
# Line 1137  void qsamplerMainForm::helpAbout (void) Line 1306  void qsamplerMainForm::helpAbout (void)
1306      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1307      sText += " ";      sText += " ";
1308      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1309    #ifdef CONFIG_LIBGIG
1310        sText += ", ";
1311        sText += gig::libraryName().c_str();
1312        sText += " ";
1313        sText += gig::libraryVersion().c_str();
1314    #endif
1315      sText += "<br />\n";      sText += "<br />\n";
1316      sText += "<br />\n";      sText += "<br />\n";
1317      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 1159  void qsamplerMainForm::helpAbout (void) Line 1334  void qsamplerMainForm::helpAbout (void)
1334  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1335  {  {
1336      // Update the main application caption...      // Update the main application caption...
1337      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1338      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1339          sSessioName += '*';          sSessionName += '*';
1340      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1341    
1342      // Update the main menu state...      // Update the main menu state...
1343      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
# Line 1178  void qsamplerMainForm::stabilizeForm (vo Line 1353  void qsamplerMainForm::stabilizeForm (vo
1353      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1354      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1355      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1356      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1357      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1358        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1359        viewDevicesAction->setEnabled(bHasClient);
1360        channelsArrangeAction->setEnabled(bHasChannel);
1361    
1362      // Client/Server status...      // Client/Server status...
1363      if (bHasClient) {      if (bHasClient) {
1364          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1365          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));
1366      } else {      } else {
1367          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1368          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1369      }      }
1370      // Channel status...      // Channel status...
1371      if (bHasChannel)      if (bHasChannel)
1372          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1373      else      else
1374          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1375      // Session status...      // Session status...
1376      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1377          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1378      else      else
1379          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1380    
1381      // Recent files menu.      // Recent files menu.
1382      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1210  void qsamplerMainForm::stabilizeForm (vo Line 1388  void qsamplerMainForm::stabilizeForm (vo
1388    
1389    
1390  // Channel change receiver slot.  // Channel change receiver slot.
1391  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1392  {  {
1393      // Flag that we're update those channel strips.          // Add this strip to the changed list...
1394      m_iChangeCount++;          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1395                    m_changedStrips.append(pChannelStrip);
1396                    pChannelStrip->resetErrorCount();
1397            }
1398    
1399      // Just mark the dirty form.      // Just mark the dirty form.
1400      m_iDirtyCount++;      m_iDirtyCount++;
1401      // and update the form status...      // and update the form status...
# Line 1221  void qsamplerMainForm::channelStripChang Line 1403  void qsamplerMainForm::channelStripChang
1403  }  }
1404    
1405    
1406    // Grab and restore current sampler channels session.
1407    void qsamplerMainForm::updateSession (void)
1408    {
1409            // Retrieve the current channel list.
1410            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1411            if (piChannelIDs == NULL) {
1412                    if (::lscp_client_get_errno(m_pClient)) {
1413                            appendMessagesClient("lscp_list_channels");
1414                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1415                    }
1416                    return;
1417            }
1418    
1419            // Try to (re)create each channel.
1420            m_pWorkspace->setUpdatesEnabled(false);
1421            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1422                    // Check if theres already a channel strip for this one...
1423                    if (!channelStrip(piChannelIDs[iChannel]))
1424                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1425                    // Make it visibly responsive...
1426                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1427            }
1428            m_pWorkspace->setUpdatesEnabled(true);
1429            
1430            // Remember to refresh devices
1431            if (m_pDeviceForm)
1432                m_pDeviceForm->refreshDevices();
1433    }
1434    
1435    
1436  // Update the recent files list and menu.  // Update the recent files list and menu.
1437  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1438  {  {
# Line 1428  void qsamplerMainForm::updateMessagesLim Line 1640  void qsamplerMainForm::updateMessagesLim
1640          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1641              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1642          else          else
1643              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1644      }      }
1645  }  }
1646    
# Line 1460  qsamplerChannelStrip *qsamplerMainForm:: Line 1672  qsamplerChannelStrip *qsamplerMainForm::
1672          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1673          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1674              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1675          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1676              y += pChannelStrip->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1677                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1678                            }
1679          }          }
1680      }      }
1681    
# Line 1470  qsamplerChannelStrip *qsamplerMainForm:: Line 1684  qsamplerChannelStrip *qsamplerMainForm::
1684      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1685      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1686          return NULL;          return NULL;
1687            
1688      // Actual channel strip setup...      // Actual channel strip setup...
1689      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1690      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1495  qsamplerChannelStrip *qsamplerMainForm:: Line 1709  qsamplerChannelStrip *qsamplerMainForm::
1709          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1710          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1711      }      }
1712        
1713            // This is pretty new, so we'll watch for it closely.
1714            channelStripChanged(pChannelStrip);
1715    
1716      // Return our successful reference...      // Return our successful reference...
1717      return pChannelStrip;      return pChannelStrip;
1718  }  }
# Line 1513  qsamplerChannelStrip *qsamplerMainForm:: Line 1730  qsamplerChannelStrip *qsamplerMainForm::
1730  {  {
1731      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1732      if (wlist.isEmpty())      if (wlist.isEmpty())
1733          return 0;          return NULL;
1734    
1735      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1736  }  }
1737    
1738    
1739    // Retrieve a channel strip by sampler channel id.
1740    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1741    {
1742            QWidgetList wlist = m_pWorkspace->windowList();
1743            if (wlist.isEmpty())
1744                    return NULL;
1745    
1746            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1747                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1748                    if (pChannelStrip) {
1749                            qsamplerChannel *pChannel = pChannelStrip->channel();
1750                            if (pChannel && pChannel->channelID() == iChannelID)
1751                                    return pChannelStrip;
1752                    }
1753            }
1754    
1755            // Not found.
1756            return NULL;
1757    }
1758    
1759    
1760  // Construct the windows menu.  // Construct the windows menu.
1761  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1762  {  {
# Line 1585  void qsamplerMainForm::timerSlot (void) Line 1823  void qsamplerMainForm::timerSlot (void)
1823              }              }
1824          }          }
1825      }      }
1826        
1827          // Refresh each channel usage, on each period...          if (m_pClient) {
1828      if (m_pClient && (m_iChangeCount > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1829          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1830          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1831              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1832              m_iChangeCount = 0;                                  // If successfull, remove from pending list...
1833              QWidgetList wlist = m_pWorkspace->windowList();                                  if (pChannelStrip->updateChannelInfo())
1834              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                          m_changedStrips.remove(pChannelStrip);
1835                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          }
1836                  if (pChannelStrip && pChannelStrip->isVisible()) {                  }
1837                      // If we can't make it clean, try next time.                  // Refresh each channel usage, on each period...
1838                      if (!pChannelStrip->updateChannelUsage())                  if (m_pOptions->bAutoRefresh) {
1839                          m_iChangeCount++;                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1840                  }                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1841              }                                  m_iTimerSlot = 0;
1842          }                                  // Update the channel stream usage for each strip...
1843      }                                  QWidgetList wlist = m_pWorkspace->windowList();
1844                                    for (int iChannel = 0;
1845                                                    iChannel < (int) wlist.count(); iChannel++) {
1846                                            qsamplerChannelStrip *pChannelStrip
1847                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1848                                            if (pChannelStrip && pChannelStrip->isVisible())
1849                                                    pChannelStrip->updateChannelUsage();
1850                                    }
1851                            }
1852                    }
1853            }
1854    
1855      // Register the next timer slot.      // Register the next timer slot.
1856      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1783  bool qsamplerMainForm::startClient (void Line 2031  bool qsamplerMainForm::startClient (void
2031      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2032      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)));
2033    
2034            // Subscribe to channel info change notifications...
2035            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2036                    appendMessagesClient("lscp_client_subscribe");
2037    
2038      // We may stop scheduling around.      // We may stop scheduling around.
2039      stopSchedule();      stopSchedule();
2040    
# Line 1792  bool qsamplerMainForm::startClient (void Line 2044  bool qsamplerMainForm::startClient (void
2044      // Log success here.      // Log success here.
2045      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2046    
2047            // Hard-notify device configuration form,
2048            // if visible, that we're ready...
2049            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2050                m_pDeviceForm->setClient(m_pClient);
2051    
2052      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2053      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2054          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1812  void qsamplerMainForm::stopClient (void) Line 2069  void qsamplerMainForm::stopClient (void)
2069      if (m_pClient == NULL)      if (m_pClient == NULL)
2070          return;          return;
2071    
2072            // Hard-notify device configuration form,
2073            // if visible, that we're running out...
2074            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2075                m_pDeviceForm->setClient(NULL);
2076    
2077      // Log prepare here.      // Log prepare here.
2078      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2079    
# Line 1826  void qsamplerMainForm::stopClient (void) Line 2088  void qsamplerMainForm::stopClient (void)
2088      // channels from the back-end server.      // channels from the back-end server.
2089      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2090      closeSession(false);      closeSession(false);
2091        
2092      // Close us as a client...      // Close us as a client...
2093      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2094        ::lscp_client_destroy(m_pClient);
2095      m_pClient = NULL;      m_pClient = NULL;
2096    
2097      // Log final here.      // Log final here.

Legend:
Removed from v.388  
changed lines
  Added in v.736

  ViewVC Help
Powered by ViewVC