/[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 263 by capela, Wed Sep 29 09:01:35 2004 UTC revision 772 by capela, Tue Sep 13 14:00:22 2005 UTC
# Line 2  Line 2 
2  //  //
3  // ui.h extension file, included from the uic-generated form implementation.  // ui.h extension file, included from the uic-generated form implementation.
4  /****************************************************************************  /****************************************************************************
5     Copyright (C) 2004, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2005, rncbc aka Rui Nuno Capela. All rights reserved.
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 26  Line 26 
26  #include <qprocess.h>  #include <qprocess.h>
27  #include <qmessagebox.h>  #include <qmessagebox.h>
28  #include <qdragobject.h>  #include <qdragobject.h>
29    #include <qregexp.h>
30  #include <qfiledialog.h>  #include <qfiledialog.h>
31  #include <qfileinfo.h>  #include <qfileinfo.h>
32  #include <qfile.h>  #include <qfile.h>
# Line 36  Line 37 
37    
38  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
39  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
40    #include "qsamplerChannel.h"
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #ifdef HAVE_SIGNAL_H
49    #include <signal.h>
50    #endif
51    
52    #ifdef CONFIG_LIBGIG
53    #include <gig.h>
54    #endif
55    
56  // Timer constant stuff.  // Timer constant stuff.
57  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
# Line 100  void qsamplerMainForm::init (void) Line 109  void qsamplerMainForm::init (void)
109      m_pOptions = NULL;      m_pOptions = NULL;
110    
111      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
112      m_pMessages = NULL;      m_pMessages   = NULL;
113        m_pDeviceForm = NULL;
114    
115      // We'll start clean.      // We'll start clean.
116      m_iUntitled = 0;      m_iUntitled   = 0;
117      m_iDirtyCount = 0;      m_iDirtyCount = 0;
118    
119      m_pServer = NULL;      m_pServer = NULL;
# Line 114  void qsamplerMainForm::init (void) Line 124  void qsamplerMainForm::init (void)
124    
125      m_iTimerSlot = 0;      m_iTimerSlot = 0;
126    
127    #ifdef HAVE_SIGNAL_H
128            // Set to ignore any fatal "Broken pipe" signals.
129            ::signal(SIGPIPE, SIG_IGN);
130    #endif
131    
132      // Make it an MDI workspace.      // Make it an MDI workspace.
133      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
134      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 128  void qsamplerMainForm::init (void) Line 143  void qsamplerMainForm::init (void)
143      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
144      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
145      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
146      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
147      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
148      // Server address.      // Server address.
149      pLabel = new QLabel(this);      pLabel = new QLabel(this);
150      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
151      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
152      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
153      // Channel title.      // Channel title.
154      pLabel = new QLabel(this);      pLabel = new QLabel(this);
155      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
156      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
157      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
158      // Session modification status.      // Session modification status.
159      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
160      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
161      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
162      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
163      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
164    
165      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 163  void qsamplerMainForm::destroy (void) Line 178  void qsamplerMainForm::destroy (void)
178  {  {
179      // Do final processing anyway.      // Do final processing anyway.
180      processServerExit();      processServerExit();
181        
182      // Delete recentfiles menu.  #if defined(WIN32)
183      if (m_pRecentFilesMenu)      WSACleanup();
184          delete m_pRecentFilesMenu;  #endif
     // Delete status item labels one by one.  
     if (m_status[QSAMPLER_STATUS_CLIENT])  
         delete m_status[QSAMPLER_STATUS_CLIENT];  
     if (m_status[QSAMPLER_STATUS_SERVER])  
         delete m_status[QSAMPLER_STATUS_SERVER];  
     if (m_status[QSAMPLER_STATUS_CHANNEL])  
         delete m_status[QSAMPLER_STATUS_CHANNEL];  
     if (m_status[QSAMPLER_STATUS_SESSION])  
         delete m_status[QSAMPLER_STATUS_SESSION];  
185    
186      // Finally drop any widgets around...      // Finally drop any widgets around...
187        if (m_pDeviceForm)
188            delete m_pDeviceForm;
189      if (m_pMessages)      if (m_pMessages)
190          delete m_pMessages;          delete m_pMessages;
191      if (m_pWorkspace)      if (m_pWorkspace)
192          delete m_pWorkspace;          delete m_pWorkspace;
193    
194  #if defined(WIN32)      // Delete status item labels one by one.
195      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
196  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
197        if (m_statusItem[QSAMPLER_STATUS_SERVER])
198            delete m_statusItem[QSAMPLER_STATUS_SERVER];
199        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
200            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
201        if (m_statusItem[QSAMPLER_STATUS_SESSION])
202            delete m_statusItem[QSAMPLER_STATUS_SESSION];
203    
204        // Delete recentfiles menu.
205        if (m_pRecentFilesMenu)
206            delete m_pRecentFilesMenu;
207  }  }
208    
209    
# Line 195  void qsamplerMainForm::setup ( qsamplerO Line 213  void qsamplerMainForm::setup ( qsamplerO
213      // We got options?      // We got options?
214      m_pOptions = pOptions;      m_pOptions = pOptions;
215    
216        // What style do we create these forms?
217        WFlags wflags = Qt::WType_TopLevel;
218        if (m_pOptions->bKeepOnTop)
219            wflags |= Qt::WStyle_Tool;
220      // Some child forms are to be created right now.      // Some child forms are to be created right now.
221      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
222        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
223        m_pDeviceForm->setMainForm(this); // An important life immutable!
224      // Set message defaults...      // Set message defaults...
225      updateMessagesFont();      updateMessagesFont();
226      updateMessagesLimit();      updateMessagesLimit();
# Line 225  void qsamplerMainForm::setup ( qsamplerO Line 249  void qsamplerMainForm::setup ( qsamplerO
249          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
250          istr >> *this;          istr >> *this;
251      }      }
252      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
253      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
254        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
255    
256      // Final startup stabilization...      // Final startup stabilization...
257      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 264  bool qsamplerMainForm::queryClose (void) Line 289  bool qsamplerMainForm::queryClose (void)
289              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
290              ostr << *this;              ostr << *this;
291              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
292              // And the main windows state.              // And the children, and the main windows state,.
293              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
294                            m_pOptions->saveWidgetGeometry(this);
295                            // Close popup widgets.
296                            if (m_pDeviceForm)
297                                    m_pDeviceForm->close();
298              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
299              stopServer();              stopServer();
300          }          }
# Line 284  void qsamplerMainForm::closeEvent ( QClo Line 313  void qsamplerMainForm::closeEvent ( QClo
313  }  }
314    
315    
316  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
317  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
318  {  {
319      bool bAccept = false;      bool bDecode = false;
320    
321      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
322          QString sUrl;          QString sText;
323          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
324              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
325                files = QStringList::split('\n', sText);
326                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
327                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
328            }
329      }      }
330    
331      pDragEnterEvent->accept(bAccept);      return bDecode;
332    }
333    
334    
335    // Window drag-n-drop event handlers.
336    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
337    {
338            QStringList files;
339            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
340  }  }
341    
342    
343  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
344  {  {
345      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
346          QString sUrl;  
347          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
348              loadSessionFile(QUrl(sUrl).path());          return;
349      }  
350            for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
351                    const QString& sPath = *iter;
352                    if (qsamplerChannel::isInstrumentFile(sPath)) {
353                            // Try to create a new channel from instrument file...
354                            qsamplerChannel *pChannel = new qsamplerChannel(this);
355                            if (pChannel == NULL)
356                                    return;
357                            // Start setting the instrument filename...
358                            pChannel->setInstrument(sPath, 0);
359                            // Before we show it up, may be we'll
360                            // better ask for some initial values?
361                            if (!pChannel->channelSetup(this)) {
362                                    delete pChannel;
363                                    return;
364                            }
365                            // Finally, give it to a new channel strip...
366                            if (!createChannelStrip(pChannel)) {
367                                    delete pChannel;
368                                    return;
369                            }
370                            // Make that an overall update.
371                            m_iDirtyCount++;
372                            stabilizeForm();
373                    }   // Otherwise, load an usual session file (LSCP script)...
374                    else if (closeSession(true))
375                            loadSessionFile(sPath);
376                    // Make it look responsive...:)
377                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
378            }
379  }  }
380    
381    
# Line 315  void qsamplerMainForm::customEvent ( QCu Line 385  void qsamplerMainForm::customEvent ( QCu
385      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
386      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
387          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
388          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
389              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
390              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
391                            if (pChannelStrip)
392                                    channelStripChanged(pChannelStrip);
393                    } else {
394                            appendMessagesColor(tr("Notify event: %1 data: %2")
395                                    .arg(::lscp_event_to_text(pEvent->event()))
396                                    .arg(pEvent->data()), "#996699");
397                    }
398      }      }
399  }  }
400    
# Line 326  void qsamplerMainForm::customEvent ( QCu Line 403  void qsamplerMainForm::customEvent ( QCu
403  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
404  {  {
405      stabilizeForm();      stabilizeForm();
406        
407      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
408  }  }
409    
# Line 370  bool qsamplerMainForm::newSession (void) Line 447  bool qsamplerMainForm::newSession (void)
447      if (!closeSession(true))      if (!closeSession(true))
448          return false;          return false;
449    
450            // Give us what the server has, right now...
451            updateSession();
452    
453      // Ok increment untitled count.      // Ok increment untitled count.
454      m_iUntitled++;      m_iUntitled++;
455    
# Line 391  bool qsamplerMainForm::openSession (void Line 471  bool qsamplerMainForm::openSession (void
471    
472      // Ask for the filename to open...      // Ask for the filename to open...
473      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
474              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
475              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
476              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
477              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
478      );      );
479    
480      // Have we cancelled?      // Have we cancelled?
# Line 425  bool qsamplerMainForm::saveSession ( boo Line 505  bool qsamplerMainForm::saveSession ( boo
505              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
506          // Prompt the guy...          // Prompt the guy...
507          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
508                  sFilename,                              // Start here.                          sFilename,                              // Start here.
509                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
510                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
511                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
512          );          );
513          // Have we cancelled it?          // Have we cancelled it?
514          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 438  bool qsamplerMainForm::saveSession ( boo Line 518  bool qsamplerMainForm::saveSession ( boo
518              sFilename += ".lscp";              sFilename += ".lscp";
519          // Check if already exists...          // Check if already exists...
520          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
521              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
522                                    QSAMPLER_TITLE ": " + tr("Warning"),
523                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
524                     "\"%1\"\n\n"                     "\"%1\"\n\n"
525                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 460  bool qsamplerMainForm::closeSession ( bo Line 541  bool qsamplerMainForm::closeSession ( bo
541    
542      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
543      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
544          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
545                            QSAMPLER_TITLE ": " + tr("Warning"),
546              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
547              "\"%1\"\n\n"              "\"%1\"\n\n"
548              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 483  bool qsamplerMainForm::closeSession ( bo Line 565  bool qsamplerMainForm::closeSession ( bo
565          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
566          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
567          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
568              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
569              if (bForce && ::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK)              if (pChannelStrip) {
570                  appendMessagesClient("lscp_remove_channel");                  qsamplerChannel *pChannel = pChannelStrip->channel();
571              delete pChannel;                  if (bForce && pChannel)
572                        pChannel->removeChannel();
573                    delete pChannelStrip;
574                }
575          }          }
576          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
577          // We're now clean, for sure.          // We're now clean, for sure.
# Line 534  bool qsamplerMainForm::loadSessionFile ( Line 619  bool qsamplerMainForm::loadSessionFile (
619      // Ok. we've read it.      // Ok. we've read it.
620      file.close();      file.close();
621    
622      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
623      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));  
624    
625      // Now we'll try to create the whole GUI session.          // Have we any errors?
626      int iChannels = ::lscp_get_channels(m_pClient);          if (iErrors > 0)
627      if (iChannels < 0) {                  appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
         appendMessagesClient("lscp_get_channels");  
         appendMessagesError(tr("Could not get current number of channels.\n\nSorry."));  
     }  
       
     // Try to (re)create each channel.  
     m_pWorkspace->setUpdatesEnabled(false);  
     for (int iChannelID = 0; iChannelID < iChannels; iChannelID++) {  
         createChannel(iChannelID, false);  
         QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
     }  
     m_pWorkspace->setUpdatesEnabled(true);  
628    
629      // Save as default session directory.      // Save as default session directory.
630      if (m_pOptions)      if (m_pOptions)
631          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
632      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
633      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
634      // Stabilize form...      // Stabilize form...
635      m_sFilename = sFilename;      m_sFilename = sFilename;
636      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
637      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
638    
639        // Make that an overall update.
640      stabilizeForm();      stabilizeForm();
641      return true;      return true;
642  }  }
# Line 578  bool qsamplerMainForm::saveSessionFile ( Line 653  bool qsamplerMainForm::saveSessionFile (
653      }      }
654    
655      // Write the file.      // Write the file.
656      int iErrors = 0;      int  iErrors = 0;
657      QTextStream ts(&file);      QTextStream ts(&file);
658      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
659      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 589  bool qsamplerMainForm::saveSessionFile ( Line 664  bool qsamplerMainForm::saveSessionFile (
664      ts << "# " << tr("File")      ts << "# " << tr("File")
665         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
666      ts << "# " << tr("Date")      ts << "# " << tr("Date")
667         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
668         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
669      ts << "#"  << endl;      ts << "#"  << endl;
670      ts << endl;      ts << endl;
671            // It is assumed that this new kind of device+session file
672            // will be loaded from a complete
673            int *piDeviceIDs;
674            int  iDevice;
675            ts << "RESET" << endl;
676            // Audio device mapping.
677            QMap<int, int> audioDeviceMap;
678            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
679            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
680                    ts << endl;
681                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
682                    // Audio device specification...
683                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
684                            << " " << tr("Device") << " " << iDevice << endl;
685                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
686                    qsamplerDeviceParamMap::ConstIterator deviceParam;
687                    for (deviceParam = device.params().begin();
688                                    deviceParam != device.params().end();
689                                            ++deviceParam) {
690                            const qsamplerDeviceParam& param = deviceParam.data();
691                            if (param.value.isEmpty()) ts << "# ";
692                            ts << " " << deviceParam.key() << "='" << param.value << "'";
693                    }
694                    ts << endl;
695                    // Audio channel parameters...
696                    int iPort = 0;
697                    for (qsamplerDevicePort *pPort = device.ports().first();
698                                    pPort;
699                                            pPort = device.ports().next(), ++iPort) {
700                            qsamplerDeviceParamMap::ConstIterator portParam;
701                            for (portParam = pPort->params().begin();
702                                            portParam != pPort->params().end();
703                                                    ++portParam) {
704                                    const qsamplerDeviceParam& param = portParam.data();
705                                    if (param.fix || param.value.isEmpty()) ts << "# ";
706                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
707                                            << " " << iPort << " " << portParam.key()
708                                            << "='" << param.value << "'" << endl;
709                            }
710                    }
711                    // Audio device index/id mapping.
712                    audioDeviceMap[device.deviceID()] = iDevice;
713            // Try to keep it snappy :)
714            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
715            }
716            // MIDI device mapping.
717            QMap<int, int> midiDeviceMap;
718            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
719            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
720                    ts << endl;
721                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
722                    // MIDI device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
726                    qsamplerDeviceParamMap::ConstIterator deviceParam;
727                    for (deviceParam = device.params().begin();
728                                    deviceParam != device.params().end();
729                                            ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                    ts << endl;
735                    // MIDI port parameters...
736                    int iPort = 0;
737                    for (qsamplerDevicePort *pPort = device.ports().first();
738                                    pPort;
739                                            pPort = device.ports().next(), ++iPort) {
740                            qsamplerDeviceParamMap::ConstIterator portParam;
741                            for (portParam = pPort->params().begin();
742                                            portParam != pPort->params().end();
743                                                    ++portParam) {
744                                    const qsamplerDeviceParam& param = portParam.data();
745                                    if (param.fix || param.value.isEmpty()) ts << "# ";
746                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
747                                       << " " << iPort << " " << portParam.key()
748                                       << "='" << param.value << "'" << endl;
749                            }
750                    }
751                    // MIDI device index/id mapping.
752                    midiDeviceMap[device.deviceID()] = iDevice;
753            // Try to keep it snappy :)
754            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
755            }
756            ts << endl;
757            // Sampler channel mapping.
758      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
759      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
760          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
761          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
762          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
763          ts << "ADD CHANNEL" << endl;              if (pChannel) {
764          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
765          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
766          ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                  if (audioDeviceMap.isEmpty()) {
767          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
768          if (pChannel->midiChannel() > 0)                                                  << " " << pChannel->audioDriver() << endl;
769              ts << pChannel->midiChannel();                                  } else {
770           else                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
771              ts << "ALL";                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
772          ts << endl;                                  }
773          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                  if (midiDeviceMap.isEmpty()) {
774          ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
775          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                                                  << " " << pChannel->midiDriver() << endl;
776          ts << endl;                                  } else {
777                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
778                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
779                                    }
780                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
781                                            << " " << pChannel->midiPort() << endl;
782                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
783                    if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
784                        ts << "ALL";
785                    else
786                        ts << pChannel->midiChannel();
787                    ts << endl;
788                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
789                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
790                                    qsamplerChannelRoutingMap::ConstIterator audioRoute;
791                                    for (audioRoute = pChannel->audioRouting().begin();
792                                                    audioRoute != pChannel->audioRouting().end();
793                                                            ++audioRoute) {
794                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
795                                                    << " " << audioRoute.key()
796                                                    << " " << audioRoute.data() << endl;
797                                    }
798                    ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
799                                    if (pChannel->channelMute())
800                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
801                                    if (pChannel->channelSolo())
802                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
803                    ts << endl;
804                }
805            }
806          // Try to keep it snappy :)          // Try to keep it snappy :)
807          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
808      }      }
# Line 637  bool qsamplerMainForm::saveSessionFile ( Line 828  bool qsamplerMainForm::saveSessionFile (
828  }  }
829    
830    
831    // Session change receiver slot.
832    void qsamplerMainForm::sessionDirty (void)
833    {
834        // Just mark the dirty form.
835        m_iDirtyCount++;
836        // and update the form status...
837        stabilizeForm();
838    }
839    
840    
841  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
842  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
843    
# Line 690  void qsamplerMainForm::fileReset (void) Line 891  void qsamplerMainForm::fileReset (void)
891          return;          return;
892    
893      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
894      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
895                    QSAMPLER_TITLE ": " + tr("Warning"),
896          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
897             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
898             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
899             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
900             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
901          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
902          return;          return;
# Line 708  void qsamplerMainForm::fileReset (void) Line 910  void qsamplerMainForm::fileReset (void)
910    
911      // Log this.      // Log this.
912      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
913    
914            // Make it a new session...
915            newSession();
916  }  }
917    
918    
# Line 716  void qsamplerMainForm::fileRestart (void Line 921  void qsamplerMainForm::fileRestart (void
921  {  {
922      if (m_pOptions == NULL)      if (m_pOptions == NULL)
923          return;          return;
924            
925      bool bRestart = true;      bool bRestart = true;
926        
927      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
928      // (if we're currently up and running)      // (if we're currently up and running)
929      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
930          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
931                            QSAMPLER_TITLE ": " + tr("Warning"),
932              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
933                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
934                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
935                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
936                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
937              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
938      }      }
# Line 758  void qsamplerMainForm::editAddChannel (v Line 964  void qsamplerMainForm::editAddChannel (v
964      if (m_pClient == NULL)      if (m_pClient == NULL)
965          return;          return;
966    
967      // Create the new sampler channel.      // Just create the channel instance...
968      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel(this);
969      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
970          return;          return;
     }  
971    
972      // Log this happening.      // Before we show it up, may be we'll
973      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
974        if (!pChannel->channelSetup(this)) {
975            delete pChannel;
976            return;
977        }
978    
979      // Just create the channel strip with given id.      // And give it to the strip (will own the channel instance, if successful).
980      createChannel(iChannelID, true);      if (!createChannelStrip(pChannel)) {
981            delete pChannel;
982            return;
983        }
984    
985      // We'll be dirty, for sure...      // Make that an overall update.
986      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
987      stabilizeForm();      stabilizeForm();
988  }  }
989    
# Line 785  void qsamplerMainForm::editRemoveChannel Line 994  void qsamplerMainForm::editRemoveChannel
994      if (m_pClient == NULL)      if (m_pClient == NULL)
995          return;          return;
996    
997      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
998        if (pChannelStrip == NULL)
999            return;
1000    
1001        qsamplerChannel *pChannel = pChannelStrip->channel();
1002      if (pChannel == NULL)      if (pChannel == NULL)
1003          return;          return;
1004    
1005      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1006      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1007          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1008                            QSAMPLER_TITLE ": " + tr("Warning"),
1009              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1010                 "%1\n\n"                 "%1\n\n"
1011                 "Are you sure?")                 "Are you sure?")
1012                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
1013              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
1014              return;              return;
1015      }      }
1016    
1017      // Remove the existing sampler channel.      // Remove the existing sampler channel.
1018      if (::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      if (!pChannel->removeChannel())
         appendMessagesClient("lscp_remove_channel");  
         appendMessagesError(tr("Could not remove channel.\n\nSorry."));  
1019          return;          return;
     }  
1020    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
1021      // Just delete the channel strip.      // Just delete the channel strip.
1022      delete pChannel;      delete pChannelStrip;
1023    
1024      // Do we auto-arrange?      // Do we auto-arrange?
1025      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1026          channelsArrange();          channelsArrange();
# Line 828  void qsamplerMainForm::editSetupChannel Line 1037  void qsamplerMainForm::editSetupChannel
1037      if (m_pClient == NULL)      if (m_pClient == NULL)
1038          return;          return;
1039    
1040      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1041      if (pChannel == NULL)      if (pChannelStrip == NULL)
1042          return;          return;
1043    
1044      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
1045      pChannel->showChannelSetup(false);      pChannelStrip->channelSetup();
1046  }  }
1047    
1048    
# Line 843  void qsamplerMainForm::editResetChannel Line 1052  void qsamplerMainForm::editResetChannel
1052      if (m_pClient == NULL)      if (m_pClient == NULL)
1053          return;          return;
1054    
1055      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1056      if (pChannel == NULL)      if (pChannelStrip == NULL)
1057          return;          return;
1058    
1059      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
1060      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
1061          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
1062    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
1063    
1064      // Refresh channel strip info.  // Reset all sampler channels.
1065      pChannel->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
1066    {
1067            if (m_pClient == NULL)
1068                    return;
1069    
1070            // Invoque the channel strip procedure,
1071            // for all channels out there...
1072            m_pWorkspace->setUpdatesEnabled(false);
1073            QWidgetList wlist = m_pWorkspace->windowList();
1074            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1075                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1076                    if (pChannelStrip)
1077                            pChannelStrip->channelReset();
1078            }
1079            m_pWorkspace->setUpdatesEnabled(true);
1080  }  }
1081    
1082    
# Line 910  void qsamplerMainForm::viewMessages ( bo Line 1128  void qsamplerMainForm::viewMessages ( bo
1128  }  }
1129    
1130    
1131    // Show/hide the device configurator form.
1132    void qsamplerMainForm::viewDevices (void)
1133    {
1134            if (m_pOptions == NULL)
1135                    return;
1136    
1137            if (m_pDeviceForm) {
1138                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1139                    m_pDeviceForm->setClient(m_pClient);
1140                    if (m_pDeviceForm->isVisible()) {
1141                            m_pDeviceForm->hide();
1142                    } else {
1143                            m_pDeviceForm->show();
1144                            m_pDeviceForm->raise();
1145                            m_pDeviceForm->setActiveWindow();
1146                    }
1147            }
1148    }
1149    
1150    
1151  // Show options dialog.  // Show options dialog.
1152  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1153  {  {
# Line 919  void qsamplerMainForm::viewOptions (void Line 1157  void qsamplerMainForm::viewOptions (void
1157      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1158      if (pOptionsForm) {      if (pOptionsForm) {
1159          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1160          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1161          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1162              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1163          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1164              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1165          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 931  void qsamplerMainForm::viewOptions (void Line 1169  void qsamplerMainForm::viewOptions (void
1169          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1170          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1171          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1172            bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1173          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1174          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1175            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1176          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1177          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1178          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1179          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1180            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1181          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1182          // Load the current setup settings.          // Load the current setup settings.
1183          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 944  void qsamplerMainForm::viewOptions (void Line 1185  void qsamplerMainForm::viewOptions (void
1185          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1186              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1187              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1188                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1189                  QMessageBox::information(this, tr("Information"),                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1190                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1191                    QMessageBox::information(this,
1192                                            QSAMPLER_TITLE ": " + tr("Information"),
1193                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1194                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1195                  updateMessagesCapture();                  updateMessagesCapture();
# Line 955  void qsamplerMainForm::viewOptions (void Line 1199  void qsamplerMainForm::viewOptions (void
1199                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1200                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1201                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1202                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1203                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1204                    updateInstrumentNames();
1205                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1206                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1207                    updateDisplayEffect();
1208              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1209                  updateDisplayFont();                  updateDisplayFont();
1210              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 997  void qsamplerMainForm::channelsArrange ( Line 1247  void qsamplerMainForm::channelsArrange (
1247      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1248      int y = 0;      int y = 0;
1249      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1250          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1251      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1252              // Prevent flicker...              // Prevent flicker...
1253              pChannel->hide();              pChannelStrip->hide();
1254              pChannel->showNormal();              pChannelStrip->showNormal();
1255          }   */          }   */
1256          pChannel->adjustSize();          pChannelStrip->adjustSize();
1257          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1258          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1259              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1260      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1261          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1262          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1263          y += iHeight;          y += iHeight;
1264      }      }
1265      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1266        
1267      stabilizeForm();      stabilizeForm();
1268  }  }
1269    
# Line 1062  void qsamplerMainForm::helpAbout (void) Line 1312  void qsamplerMainForm::helpAbout (void)
1312      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1313      sText += "</font></small><br />";      sText += "</font></small><br />";
1314  #endif  #endif
1315    #ifndef CONFIG_INSTRUMENT_NAME
1316        sText += "<small><font color=\"red\">";
1317        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1318        sText += "</font></small><br />";
1319    #endif
1320    #ifndef CONFIG_MUTE_SOLO
1321        sText += "<small><font color=\"red\">";
1322        sText += tr("Sampler channel Mute/Solo support disabled.");
1323        sText += "</font></small><br />";
1324    #endif
1325      sText += "<br />\n";      sText += "<br />\n";
1326      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1327      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1328      sText += " ";      sText += " ";
1329      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1330    #ifdef CONFIG_LIBGIG
1331        sText += ", ";
1332        sText += gig::libraryName().c_str();
1333        sText += " ";
1334        sText += gig::libraryVersion().c_str();
1335    #endif
1336      sText += "<br />\n";      sText += "<br />\n";
1337      sText += "<br />\n";      sText += "<br />\n";
1338      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 1089  void qsamplerMainForm::helpAbout (void) Line 1355  void qsamplerMainForm::helpAbout (void)
1355  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1356  {  {
1357      // Update the main application caption...      // Update the main application caption...
1358      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1359      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1360          sSessioName += '*';          sSessionName += " *";
1361      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1362    
1363      // Update the main menu state...      // Update the main menu state...
1364      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1365      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1366      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1367      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1368      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1369      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
# Line 1108  void qsamplerMainForm::stabilizeForm (vo Line 1374  void qsamplerMainForm::stabilizeForm (vo
1374      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1375      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1376      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1377      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1378      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1379        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1380        viewDevicesAction->setEnabled(bHasClient);
1381        channelsArrangeAction->setEnabled(bHasChannel);
1382    
1383      // Client/Server status...      // Client/Server status...
1384      if (bHasClient) {      if (bHasClient) {
1385          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1386          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));
1387      } else {      } else {
1388          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1389          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1390      }      }
1391      // Channel status...      // Channel status...
1392      if (bHasChannel)      if (bHasChannel)
1393          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannel->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1394      else      else
1395          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1396      // Session status...      // Session status...
1397      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1398          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1399      else      else
1400          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1401    
1402      // Recent files menu.      // Recent files menu.
1403      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1140  void qsamplerMainForm::stabilizeForm (vo Line 1409  void qsamplerMainForm::stabilizeForm (vo
1409    
1410    
1411  // Channel change receiver slot.  // Channel change receiver slot.
1412  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1413  {  {
1414            // Add this strip to the changed list...
1415            if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1416                    m_changedStrips.append(pChannelStrip);
1417                    pChannelStrip->resetErrorCount();
1418            }
1419    
1420      // Just mark the dirty form.      // Just mark the dirty form.
1421      m_iDirtyCount++;      m_iDirtyCount++;
1422      // and update the form status...      // and update the form status...
# Line 1149  void qsamplerMainForm::channelChanged( q Line 1424  void qsamplerMainForm::channelChanged( q
1424  }  }
1425    
1426    
1427    // Grab and restore current sampler channels session.
1428    void qsamplerMainForm::updateSession (void)
1429    {
1430            // Retrieve the current channel list.
1431            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1432            if (piChannelIDs == NULL) {
1433                    if (::lscp_client_get_errno(m_pClient)) {
1434                            appendMessagesClient("lscp_list_channels");
1435                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1436                    }
1437                    return;
1438            }
1439    
1440            // Try to (re)create each channel.
1441            m_pWorkspace->setUpdatesEnabled(false);
1442            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1443                    // Check if theres already a channel strip for this one...
1444                    if (!channelStrip(piChannelIDs[iChannel]))
1445                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1446                    // Make it visibly responsive...
1447                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1448            }
1449            m_pWorkspace->setUpdatesEnabled(true);
1450            
1451            // Remember to refresh devices
1452            if (m_pDeviceForm)
1453                m_pDeviceForm->refreshDevices();
1454    }
1455    
1456    
1457  // Update the recent files list and menu.  // Update the recent files list and menu.
1458  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1459  {  {
# Line 1193  void qsamplerMainForm::updateRecentFiles Line 1498  void qsamplerMainForm::updateRecentFiles
1498  }  }
1499    
1500    
1501    // Force update of the channels instrument names mode.
1502    void qsamplerMainForm::updateInstrumentNames (void)
1503    {
1504        // Full channel list update...
1505        QWidgetList wlist = m_pWorkspace->windowList();
1506        if (wlist.isEmpty())
1507            return;
1508    
1509        m_pWorkspace->setUpdatesEnabled(false);
1510        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1511            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1512            if (pChannelStrip)
1513                pChannelStrip->updateInstrumentName(true);
1514        }
1515        m_pWorkspace->setUpdatesEnabled(true);
1516    }
1517    
1518    
1519  // Force update of the channels display font.  // Force update of the channels display font.
1520  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1521  {  {
# Line 1214  void qsamplerMainForm::updateDisplayFont Line 1537  void qsamplerMainForm::updateDisplayFont
1537    
1538      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1539      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1540          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1541          pChannel->setDisplayFont(font);          if (pChannelStrip)
1542                pChannelStrip->setDisplayFont(font);
1543        }
1544        m_pWorkspace->setUpdatesEnabled(true);
1545    }
1546    
1547    
1548    // Update channel strips background effect.
1549    void qsamplerMainForm::updateDisplayEffect (void)
1550    {
1551       QPixmap pm;
1552        if (m_pOptions->bDisplayEffect)
1553            pm = QPixmap::fromMimeSource("displaybg1.png");
1554    
1555        // Full channel list update...
1556        QWidgetList wlist = m_pWorkspace->windowList();
1557        if (wlist.isEmpty())
1558            return;
1559    
1560        m_pWorkspace->setUpdatesEnabled(false);
1561        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1562            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1563            if (pChannelStrip)
1564                pChannelStrip->setDisplayBackground(pm);
1565      }      }
1566      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1567  }  }
# Line 1234  void qsamplerMainForm::updateMaxVolume ( Line 1580  void qsamplerMainForm::updateMaxVolume (
1580    
1581      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1582      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1583          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1584          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1585                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1586      }      }
1587      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1588  }  }
# Line 1274  void qsamplerMainForm::appendMessagesErr Line 1621  void qsamplerMainForm::appendMessagesErr
1621    
1622      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1623    
1624      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));      QMessageBox::critical(this,
1625                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1626  }  }
1627    
1628    
# Line 1314  void qsamplerMainForm::updateMessagesLim Line 1662  void qsamplerMainForm::updateMessagesLim
1662          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1663              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1664          else          else
1665              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1666      }      }
1667  }  }
1668    
# Line 1334  void qsamplerMainForm::updateMessagesCap Line 1682  void qsamplerMainForm::updateMessagesCap
1682  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1683    
1684  // The channel strip creation executive.  // The channel strip creation executive.
1685  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1686  {  {
1687      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1688          return;          return NULL;
1689    
1690      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1691      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1692      int y = 0;      int y = 0;
1693      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1694          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1695          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1696              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1697          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1698              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1699                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1700                            }
1701          }          }
1702      }      }
1703    
1704      // Add a new channel itema...      // Add a new channel itema...
1705      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;
1706      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1707      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1708      pChannel->setup(this, iChannelID);          return NULL;
1709      // We'll need a display font.  
1710      QFont font;      // Actual channel strip setup...
1711      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1712          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1713      // Track channel setup changes.      // Set some initial aesthetic options...
1714      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1715      // Before we show it up, may be we'll          // Background display effect...
1716      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1717      if (bPrompt)          // We'll need a display font.
1718          pChannel->showChannelSetup(true);          QFont font;
1719            if (font.fromString(m_pOptions->sDisplayFont))
1720                pChannelStrip->setDisplayFont(font);
1721            // Maximum allowed volume setting.
1722            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1723        }
1724    
1725      // Now we show up us to the world.      // Now we show up us to the world.
1726      pChannel->show();      pChannelStrip->show();
1727      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1728      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1729          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1730      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1731          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1732          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1733      }      }
1734    
1735            // This is pretty new, so we'll watch for it closely.
1736            channelStripChanged(pChannelStrip);
1737    
1738        // Return our successful reference...
1739        return pChannelStrip;
1740  }  }
1741    
1742    
1743  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1744  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1745  {  {
1746      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1747  }  }
1748    
1749    
1750  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1751  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1752  {  {
1753      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1754      if (wlist.isEmpty())      if (wlist.isEmpty())
1755          return 0;          return NULL;
1756    
1757      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1758  }  }
1759    
1760    
1761    // Retrieve a channel strip by sampler channel id.
1762    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1763    {
1764            QWidgetList wlist = m_pWorkspace->windowList();
1765            if (wlist.isEmpty())
1766                    return NULL;
1767    
1768            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1769                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1770                    if (pChannelStrip) {
1771                            qsamplerChannel *pChannel = pChannelStrip->channel();
1772                            if (pChannel && pChannel->channelID() == iChannelID)
1773                                    return pChannelStrip;
1774                    }
1775            }
1776    
1777            // Not found.
1778            return NULL;
1779    }
1780    
1781    
1782  // Construct the windows menu.  // Construct the windows menu.
1783  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1784  {  {
# Line 1407  void qsamplerMainForm::channelsMenuAbout Line 1790  void qsamplerMainForm::channelsMenuAbout
1790      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1791          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1792          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1793              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1794              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1795              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1796              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1797                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1798                }
1799          }          }
1800      }      }
1801  }  }
# Line 1419  void qsamplerMainForm::channelsMenuAbout Line 1804  void qsamplerMainForm::channelsMenuAbout
1804  // Windows menu activation slot  // Windows menu activation slot
1805  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1806  {  {
1807      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1808      if (pChannel)      if (pChannelStrip)
1809          pChannel->showNormal();          pChannelStrip->showNormal();
1810      pChannel->setFocus();      pChannelStrip->setFocus();
1811  }  }
1812    
1813    
# Line 1460  void qsamplerMainForm::timerSlot (void) Line 1845  void qsamplerMainForm::timerSlot (void)
1845              }              }
1846          }          }
1847      }      }
1848        
1849          // Refresh each channel usage, on each period...          if (m_pClient) {
1850      if (m_pClient && m_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {                  // Update the channel information for each pending strip...
1851          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1852          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1853              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1854              QWidgetList wlist = m_pWorkspace->windowList();                                  // If successfull, remove from pending list...
1855              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                  if (pChannelStrip->updateChannelInfo())
1856                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                                          m_changedStrips.remove(pChannelStrip);
1857                  if (pChannel->isVisible())                          }
1858                      pChannel->updateChannelUsage();                  }
1859              }                  // Refresh each channel usage, on each period...
1860          }                  if (m_pOptions->bAutoRefresh) {
1861      }                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1862                            if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1863                                    m_iTimerSlot = 0;
1864                                    // Update the channel stream usage for each strip...
1865                                    QWidgetList wlist = m_pWorkspace->windowList();
1866                                    for (int iChannel = 0;
1867                                                    iChannel < (int) wlist.count(); iChannel++) {
1868                                            qsamplerChannelStrip *pChannelStrip
1869                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1870                                            if (pChannelStrip && pChannelStrip->isVisible())
1871                                                    pChannelStrip->updateChannelUsage();
1872                                    }
1873                            }
1874                    }
1875            }
1876    
1877      // Register the next timer slot.      // Register the next timer slot.
1878      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1495  void qsamplerMainForm::startServer (void Line 1894  void qsamplerMainForm::startServer (void
1894    
1895      // Is the server process instance still here?      // Is the server process instance still here?
1896      if (m_pServer) {      if (m_pServer) {
1897          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
1898                            QSAMPLER_TITLE ": " + tr("Warning"),
1899              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
1900                 "Maybe it ss already started."),                 "Maybe it ss already started."),
1901              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1654  bool qsamplerMainForm::startClient (void Line 2054  bool qsamplerMainForm::startClient (void
2054      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2055      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)));
2056    
2057            // Subscribe to channel info change notifications...
2058            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2059                    appendMessagesClient("lscp_client_subscribe");
2060    
2061      // We may stop scheduling around.      // We may stop scheduling around.
2062      stopSchedule();      stopSchedule();
2063    
# Line 1663  bool qsamplerMainForm::startClient (void Line 2067  bool qsamplerMainForm::startClient (void
2067      // Log success here.      // Log success here.
2068      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2069    
2070            // Hard-notify device configuration form,
2071            // if visible, that we're ready...
2072            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2073                m_pDeviceForm->setClient(m_pClient);
2074    
2075      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2076      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2077          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1683  void qsamplerMainForm::stopClient (void) Line 2092  void qsamplerMainForm::stopClient (void)
2092      if (m_pClient == NULL)      if (m_pClient == NULL)
2093          return;          return;
2094    
2095            // Hard-notify device configuration form,
2096            // if visible, that we're running out...
2097            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2098                m_pDeviceForm->setClient(NULL);
2099    
2100      // Log prepare here.      // Log prepare here.
2101      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2102    
# Line 1697  void qsamplerMainForm::stopClient (void) Line 2111  void qsamplerMainForm::stopClient (void)
2111      // channels from the back-end server.      // channels from the back-end server.
2112      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2113      closeSession(false);      closeSession(false);
2114        
2115      // Close us as a client...      // Close us as a client...
2116      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2117        ::lscp_client_destroy(m_pClient);
2118      m_pClient = NULL;      m_pClient = NULL;
2119    
2120      // Log final here.      // Log final here.

Legend:
Removed from v.263  
changed lines
  Added in v.772

  ViewVC Help
Powered by ViewVC