/[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 149 by capela, Sat Jun 26 14:27:25 2004 UTC revision 969 by capela, Wed Dec 6 19:38:02 2006 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-2006, 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 14  Line 14 
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License along
18     along with this program; if not, write to the Free Software     with this program; if not, write to the Free Software Foundation, Inc.,
19     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20    
21  *****************************************************************************/  *****************************************************************************/
22    
# 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    #include "qsamplerInstrumentList.h"
45    
46    #include "qsamplerInstrumentListForm.h"
47    #include "qsamplerDeviceForm.h"
48  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
49    
50  #include "config.h"  #ifdef HAVE_SIGNAL_H
51    #include <signal.h>
52    #endif
53    
54    #ifdef CONFIG_LIBGIG
55    #include <gig.h>
56    #endif
57    
58  // Timer constant stuff.  // Timer constant stuff.
59  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
# Line 93  private: Line 104  private:
104  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
105  // qsamplerMainForm -- Main window form implementation.  // qsamplerMainForm -- Main window form implementation.
106    
107    // Kind of singleton reference.
108    qsamplerMainForm *qsamplerMainForm::g_pMainForm = NULL;
109    
110    
111  // Kind of constructor.  // Kind of constructor.
112  void qsamplerMainForm::init (void)  void qsamplerMainForm::init (void)
113  {  {
114            // Pseudo-singleton reference setup.
115            g_pMainForm = this;
116    
117      // Initialize some pointer references.      // Initialize some pointer references.
118      m_pOptions = NULL;      m_pOptions = NULL;
119    
120      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
121      m_pMessages = NULL;      m_pMessages = NULL;
122        m_pInstrumentListForm = NULL;
123        m_pDeviceForm = NULL;
124    
125      // We'll start clean.      // We'll start clean.
126      m_iUntitled = 0;      m_iUntitled   = 0;
127      m_iDirtyCount = 0;      m_iDirtyCount = 0;
128    
129      m_pServer = NULL;      m_pServer = NULL;
# Line 114  void qsamplerMainForm::init (void) Line 134  void qsamplerMainForm::init (void)
134    
135      m_iTimerSlot = 0;      m_iTimerSlot = 0;
136    
137    #ifdef HAVE_SIGNAL_H
138            // Set to ignore any fatal "Broken pipe" signals.
139            ::signal(SIGPIPE, SIG_IGN);
140    #endif
141    
142      // Make it an MDI workspace.      // Make it an MDI workspace.
143      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
144      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 128  void qsamplerMainForm::init (void) Line 153  void qsamplerMainForm::init (void)
153      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
154      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
155      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
156      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
157      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
158      // Server address.      // Server address.
159      pLabel = new QLabel(this);      pLabel = new QLabel(this);
160      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
161      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
162      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
163      // Channel title.      // Channel title.
164      pLabel = new QLabel(this);      pLabel = new QLabel(this);
165      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
166      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
167      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
168      // Session modification status.      // Session modification status.
169      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
170      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
171      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
172      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
173      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
174    
175      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 163  void qsamplerMainForm::destroy (void) Line 188  void qsamplerMainForm::destroy (void)
188  {  {
189      // Do final processing anyway.      // Do final processing anyway.
190      processServerExit();      processServerExit();
191        
192      // Delete recentfiles menu.  #if defined(WIN32)
193      if (m_pRecentFilesMenu)      WSACleanup();
194          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];  
195    
196      // Finally drop any widgets around...      // Finally drop any widgets around...
197        if (m_pDeviceForm)
198            delete m_pDeviceForm;
199        if (m_pInstrumentListForm)
200            delete m_pInstrumentListForm;
201      if (m_pMessages)      if (m_pMessages)
202          delete m_pMessages;          delete m_pMessages;
203      if (m_pWorkspace)      if (m_pWorkspace)
204          delete m_pWorkspace;          delete m_pWorkspace;
205    
206  #if defined(WIN32)      // Delete status item labels one by one.
207      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
208  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
209        if (m_statusItem[QSAMPLER_STATUS_SERVER])
210            delete m_statusItem[QSAMPLER_STATUS_SERVER];
211        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
212            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
213        if (m_statusItem[QSAMPLER_STATUS_SESSION])
214            delete m_statusItem[QSAMPLER_STATUS_SESSION];
215    
216        // Delete recentfiles menu.
217        if (m_pRecentFilesMenu)
218            delete m_pRecentFilesMenu;
219    
220            // Pseudo-singleton reference shut-down.
221            g_pMainForm = NULL;
222  }  }
223    
224    
# Line 195  void qsamplerMainForm::setup ( qsamplerO Line 228  void qsamplerMainForm::setup ( qsamplerO
228      // We got options?      // We got options?
229      m_pOptions = pOptions;      m_pOptions = pOptions;
230    
231        // What style do we create these forms?
232            Qt::WFlags wflags = Qt::WStyle_Customize
233                    | Qt::WStyle_NormalBorder
234                    | Qt::WStyle_Title
235                    | Qt::WStyle_SysMenu
236                    | Qt::WStyle_MinMax
237                    | Qt::WType_TopLevel;
238        if (m_pOptions->bKeepOnTop)
239            wflags |= Qt::WStyle_Tool;
240      // Some child forms are to be created right now.      // Some child forms are to be created right now.
241      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
242        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
243    #ifdef CONFIG_MIDI_INSTRUMENT
244        m_pInstrumentListForm = new qsamplerInstrumentListForm(this, 0, wflags);
245            QObject::connect(m_pInstrumentListForm->InstrumentList,
246                    SIGNAL(instrumentsChanged()),
247                    SLOT(sessionDirty()));
248    #else
249            viewInstrumentsAction->setEnabled(false);
250    #endif
251      // Set message defaults...      // Set message defaults...
252      updateMessagesFont();      updateMessagesFont();
253      updateMessagesLimit();      updateMessagesLimit();
254      updateMessagesCapture();      updateMessagesCapture();
255      // Set the visibility signal.      // Set the visibility signal.
256      QObject::connect(m_pMessages, SIGNAL(visibilityChanged(bool)), this, SLOT(stabilizeForm()));      QObject::connect(m_pMessages,
257                    SIGNAL(visibilityChanged(bool)),
258                    SLOT(stabilizeForm()));
259    
260      // Initial decorations toggle state.      // Initial decorations toggle state.
261      viewMenubarAction->setOn(m_pOptions->bMenubar);      viewMenubarAction->setOn(m_pOptions->bMenubar);
# Line 225  void qsamplerMainForm::setup ( qsamplerO Line 278  void qsamplerMainForm::setup ( qsamplerO
278          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
279          istr >> *this;          istr >> *this;
280      }      }
281      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
282      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
283        m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
284        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
285    
286      // Final startup stabilization...      // Final startup stabilization...
287      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 264  bool qsamplerMainForm::queryClose (void) Line 319  bool qsamplerMainForm::queryClose (void)
319              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
320              ostr << *this;              ostr << *this;
321              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
322              // And the main windows state.              // And the children, and the main windows state,.
323              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
324                            m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
325                            m_pOptions->saveWidgetGeometry(this);
326                            // Close popup widgets.
327                            if (m_pInstrumentListForm)
328                                    m_pInstrumentListForm->close();
329                            if (m_pDeviceForm)
330                                    m_pDeviceForm->close();
331              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
332              stopServer();              stopServer();
333          }          }
# Line 284  void qsamplerMainForm::closeEvent ( QClo Line 346  void qsamplerMainForm::closeEvent ( QClo
346  }  }
347    
348    
349  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
350  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
351  {  {
352      bool bAccept = false;      bool bDecode = false;
353    
354      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
355          QString sUrl;          QString sText;
356          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
357              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
358                files = QStringList::split('\n', sText);
359                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
360                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
361            }
362      }      }
363    
364      pDragEnterEvent->accept(bAccept);      return bDecode;
365    }
366    
367    
368    // Window drag-n-drop event handlers.
369    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
370    {
371            QStringList files;
372            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
373  }  }
374    
375    
376  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
377  {  {
378      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
379          QString sUrl;  
380          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
381              loadSessionFile(QUrl(sUrl).path());          return;
382      }  
383            for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
384                    const QString& sPath = *iter;
385                    if (qsamplerChannel::isInstrumentFile(sPath)) {
386                            // Try to create a new channel from instrument file...
387                            qsamplerChannel *pChannel = new qsamplerChannel();
388                            if (pChannel == NULL)
389                                    return;
390                            // Start setting the instrument filename...
391                            pChannel->setInstrument(sPath, 0);
392                            // Before we show it up, may be we'll
393                            // better ask for some initial values?
394                            if (!pChannel->channelSetup(this)) {
395                                    delete pChannel;
396                                    return;
397                            }
398                            // Finally, give it to a new channel strip...
399                            if (!createChannelStrip(pChannel)) {
400                                    delete pChannel;
401                                    return;
402                            }
403                            // Make that an overall update.
404                            m_iDirtyCount++;
405                            stabilizeForm();
406                    }   // Otherwise, load an usual session file (LSCP script)...
407                    else if (closeSession(true))
408                            loadSessionFile(sPath);
409                    // Make it look responsive...:)
410                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
411            }
412  }  }
413    
414    
# Line 315  void qsamplerMainForm::customEvent ( QCu Line 418  void qsamplerMainForm::customEvent ( QCu
418      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
419      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
420          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
421          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
422              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
423              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
424                            if (pChannelStrip)
425                                    channelStripChanged(pChannelStrip);
426                    } else {
427                            appendMessagesColor(tr("Notify event: %1 data: %2")
428                                    .arg(::lscp_event_to_text(pEvent->event()))
429                                    .arg(pEvent->data()), "#996699");
430                    }
431      }      }
432  }  }
433    
# Line 326  void qsamplerMainForm::customEvent ( QCu Line 436  void qsamplerMainForm::customEvent ( QCu
436  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
437  {  {
438      stabilizeForm();      stabilizeForm();
439        
440      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
441  }  }
442    
# Line 340  qsamplerOptions *qsamplerMainForm::optio Line 450  qsamplerOptions *qsamplerMainForm::optio
450      return m_pOptions;      return m_pOptions;
451  }  }
452    
453    
454  // The LSCP client descriptor property.  // The LSCP client descriptor property.
455  lscp_client_t *qsamplerMainForm::client (void)  lscp_client_t *qsamplerMainForm::client (void)
456  {  {
# Line 347  lscp_client_t *qsamplerMainForm::client Line 458  lscp_client_t *qsamplerMainForm::client
458  }  }
459    
460    
461    // The pseudo-singleton instance accessor.
462    qsamplerMainForm *qsamplerMainForm::getInstance (void)
463    {
464            return g_pMainForm;
465    }
466    
467    
468  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
469  // qsamplerMainForm -- Session file stuff.  // qsamplerMainForm -- Session file stuff.
470    
# Line 370  bool qsamplerMainForm::newSession (void) Line 488  bool qsamplerMainForm::newSession (void)
488      if (!closeSession(true))      if (!closeSession(true))
489          return false;          return false;
490    
491            // Give us what the server has, right now...
492            updateSession();
493    
494      // Ok increment untitled count.      // Ok increment untitled count.
495      m_iUntitled++;      m_iUntitled++;
496    
# Line 391  bool qsamplerMainForm::openSession (void Line 512  bool qsamplerMainForm::openSession (void
512    
513      // Ask for the filename to open...      // Ask for the filename to open...
514      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
515              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
516              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
517              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
518              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
519      );      );
520    
521      // Have we cancelled?      // Have we cancelled?
# Line 425  bool qsamplerMainForm::saveSession ( boo Line 546  bool qsamplerMainForm::saveSession ( boo
546              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
547          // Prompt the guy...          // Prompt the guy...
548          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
549                  sFilename,                              // Start here.                          sFilename,                              // Start here.
550                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
551                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
552                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
553          );          );
554          // Have we cancelled it?          // Have we cancelled it?
555          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 438  bool qsamplerMainForm::saveSession ( boo Line 559  bool qsamplerMainForm::saveSession ( boo
559              sFilename += ".lscp";              sFilename += ".lscp";
560          // Check if already exists...          // Check if already exists...
561          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
562              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
563                                    QSAMPLER_TITLE ": " + tr("Warning"),
564                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
565                     "\"%1\"\n\n"                     "\"%1\"\n\n"
566                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 460  bool qsamplerMainForm::closeSession ( bo Line 582  bool qsamplerMainForm::closeSession ( bo
582    
583      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
584      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
585          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
586                            QSAMPLER_TITLE ": " + tr("Warning"),
587              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
588              "\"%1\"\n\n"              "\"%1\"\n\n"
589              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 483  bool qsamplerMainForm::closeSession ( bo Line 606  bool qsamplerMainForm::closeSession ( bo
606          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
607          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
608          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
609              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
610              if (bForce && ::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK)              if (pChannelStrip) {
611                  appendMessagesClient("lscp_remove_channel");                  qsamplerChannel *pChannel = pChannelStrip->channel();
612              delete pChannel;                  if (bForce && pChannel)
613                        pChannel->removeChannel();
614                    delete pChannelStrip;
615                }
616          }          }
617          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
618          // We're now clean, for sure.          // We're now clean, for sure.
# Line 515  bool qsamplerMainForm::loadSessionFile ( Line 641  bool qsamplerMainForm::loadSessionFile (
641      QTextStream ts(&file);      QTextStream ts(&file);
642      while (!ts.atEnd()) {      while (!ts.atEnd()) {
643          // Read the line.          // Read the line.
644          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
645          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
646          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
647              appendMessagesColor(sCommand, "#996633");              appendMessagesColor(sCommand, "#996633");
# Line 534  bool qsamplerMainForm::loadSessionFile ( Line 660  bool qsamplerMainForm::loadSessionFile (
660      // Ok. we've read it.      // Ok. we've read it.
661      file.close();      file.close();
662    
663      // Have we any errors?          // Now we'll try to create (update) the whole GUI session.
664      if (iErrors > 0)          updateSession();
         appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));  
665    
666      // Now we'll try to create the whole GUI session.          // Have we any errors?
667      int iChannels = ::lscp_get_channels(m_pClient);          if (iErrors > 0)
668      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);  
669    
670      // Save as default session directory.      // Save as default session directory.
671      if (m_pOptions)      if (m_pOptions)
672          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
673      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
674      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
675      // Stabilize form...      // Stabilize form...
676      m_sFilename = sFilename;      m_sFilename = sFilename;
677      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
678      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
679    
680        // Make that an overall update.
681      stabilizeForm();      stabilizeForm();
682      return true;      return true;
683  }  }
# Line 578  bool qsamplerMainForm::saveSessionFile ( Line 694  bool qsamplerMainForm::saveSessionFile (
694      }      }
695    
696      // Write the file.      // Write the file.
697      int iErrors = 0;      int  iErrors = 0;
698      QTextStream ts(&file);      QTextStream ts(&file);
699      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
700      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 589  bool qsamplerMainForm::saveSessionFile ( Line 705  bool qsamplerMainForm::saveSessionFile (
705      ts << "# " << tr("File")      ts << "# " << tr("File")
706         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
707      ts << "# " << tr("Date")      ts << "# " << tr("Date")
708         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
709         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
710      ts << "#"  << endl;      ts << "#"  << endl;
711      ts << endl;      ts << endl;
712            // It is assumed that this new kind of device+session file
713            // will be loaded from a complete
714            int *piDeviceIDs;
715            int  iDevice;
716            ts << "RESET" << endl;
717            // Audio device mapping.
718            QMap<int, int> audioDeviceMap;
719            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
720            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
721                    ts << endl;
722                    qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);
723                    // Audio device specification...
724                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
725                            << " " << tr("Device") << " " << iDevice << endl;
726                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
727                    qsamplerDeviceParamMap::ConstIterator deviceParam;
728                    for (deviceParam = device.params().begin();
729                                    deviceParam != device.params().end();
730                                            ++deviceParam) {
731                            const qsamplerDeviceParam& param = deviceParam.data();
732                            if (param.value.isEmpty()) ts << "# ";
733                            ts << " " << deviceParam.key() << "='" << param.value << "'";
734                    }
735                    ts << endl;
736                    // Audio channel parameters...
737                    int iPort = 0;
738                    for (qsamplerDevicePort *pPort = device.ports().first();
739                                    pPort;
740                                            pPort = device.ports().next(), ++iPort) {
741                            qsamplerDeviceParamMap::ConstIterator portParam;
742                            for (portParam = pPort->params().begin();
743                                            portParam != pPort->params().end();
744                                                    ++portParam) {
745                                    const qsamplerDeviceParam& param = portParam.data();
746                                    if (param.fix || param.value.isEmpty()) ts << "# ";
747                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
748                                            << " " << iPort << " " << portParam.key()
749                                            << "='" << param.value << "'" << endl;
750                            }
751                    }
752                    // Audio device index/id mapping.
753                    audioDeviceMap[device.deviceID()] = iDevice;
754            // Try to keep it snappy :)
755            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
756            }
757            // MIDI device mapping.
758            QMap<int, int> midiDeviceMap;
759            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
760            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
761                    ts << endl;
762                    qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);
763                    // MIDI device specification...
764                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
765                            << " " << tr("Device") << " " << iDevice << endl;
766                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
767                    qsamplerDeviceParamMap::ConstIterator deviceParam;
768                    for (deviceParam = device.params().begin();
769                                    deviceParam != device.params().end();
770                                            ++deviceParam) {
771                            const qsamplerDeviceParam& param = deviceParam.data();
772                            if (param.value.isEmpty()) ts << "# ";
773                            ts << " " << deviceParam.key() << "='" << param.value << "'";
774                    }
775                    ts << endl;
776                    // MIDI port parameters...
777                    int iPort = 0;
778                    for (qsamplerDevicePort *pPort = device.ports().first();
779                                    pPort;
780                                            pPort = device.ports().next(), ++iPort) {
781                            qsamplerDeviceParamMap::ConstIterator portParam;
782                            for (portParam = pPort->params().begin();
783                                            portParam != pPort->params().end();
784                                                    ++portParam) {
785                                    const qsamplerDeviceParam& param = portParam.data();
786                                    if (param.fix || param.value.isEmpty()) ts << "# ";
787                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
788                                       << " " << iPort << " " << portParam.key()
789                                       << "='" << param.value << "'" << endl;
790                            }
791                    }
792                    // MIDI device index/id mapping.
793                    midiDeviceMap[device.deviceID()] = iDevice;
794            // Try to keep it snappy :)
795            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
796            }
797            ts << endl;
798            // Sampler channel mapping.
799      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
800      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
801          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
802          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
803          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
804          ts << "ADD CHANNEL" << endl;              if (pChannel) {
805          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
806          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
807      //  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                                  if (audioDeviceMap.isEmpty()) {
808          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " " << pChannel->midiChannel() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
809          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                                  << " " << pChannel->audioDriver() << endl;
810          ts << "LOAD INSTRUMENT NON_MODAL " << pChannel->instrumentFile() << " " << pChannel->instrumentNr() << " " << iChannelID << endl;                                  } else {
811          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
812          ts << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
813                                    }
814                                    if (midiDeviceMap.isEmpty()) {
815                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
816                                                    << " " << pChannel->midiDriver() << endl;
817                                    } else {
818                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
819                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
820                                    }
821                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
822                                            << " " << pChannel->midiPort() << endl;
823                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
824                    if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
825                        ts << "ALL";
826                    else
827                        ts << pChannel->midiChannel();
828                    ts << endl;
829                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
830                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
831                                    qsamplerChannelRoutingMap::ConstIterator audioRoute;
832                                    for (audioRoute = pChannel->audioRouting().begin();
833                                                    audioRoute != pChannel->audioRouting().end();
834                                                            ++audioRoute) {
835                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
836                                                    << " " << audioRoute.key()
837                                                    << " " << audioRoute.data() << endl;
838                                    }
839                    ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
840                                    if (pChannel->channelMute())
841                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
842                                    if (pChannel->channelSolo())
843                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
844                    ts << endl;
845                }
846            }
847          // Try to keep it snappy :)          // Try to keep it snappy :)
848          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
849      }      }
850    
851    #ifdef CONFIG_MIDI_INSTRUMENT
852            // MIDI instrument mapping...
853            lscp_midi_instrument_t *pInstrs = ::lscp_list_midi_instruments(m_pClient);
854            if (pInstrs)
855                    ts << "# " << tr("MIDI instrument mapping") << endl;
856            for (int iInstr = 0; pInstrs && pInstrs[iInstr].program >= 0; iInstr++) {
857                    lscp_midi_instrument_info_t *pInstrInfo
858                            = ::lscp_get_midi_instrument_info(m_pClient, &pInstrs[iInstr]);
859                    if (pInstrInfo) {
860                            ts << "MAP MIDI_INSTRUMENT "
861                                    << pInstrs[iInstr].bank_msb    << " "
862                                    << pInstrs[iInstr].bank_lsb    << " "
863                                    << pInstrs[iInstr].program     << " "
864                                    << pInstrInfo->engine_name     << " '"
865                                    << pInstrInfo->instrument_file << "' "
866                                    << pInstrInfo->instrument_nr   << " "
867                                    << pInstrInfo->volume          << " ";
868                            switch (pInstrInfo->load_mode) {
869                                    case LSCP_LOAD_PERSISTENT:
870                                            ts << "PERSISTENT";
871                                            break;
872                                    case LSCP_LOAD_ON_DEMAND_HOLD:
873                                            ts << "ON_DEMAND_HOLD";
874                                            break;
875                                    case LSCP_LOAD_ON_DEMAND:
876                                    case LSCP_LOAD_DEFAULT:
877                                    default:
878                                            ts << "ON_DEMAND";
879                                            break;
880                            }
881                            if (pInstrInfo->name)
882                                    ts << " '" << pInstrInfo->name << "'";
883                            ts << endl;
884                    }
885                    // Try to keep it snappy :)
886                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
887            }
888            if (pInstrs)
889                    ts << endl;
890    #endif //  CONFIG_MIDI_INSTRUMENT
891    
892      // Ok. we've wrote it.      // Ok. we've wrote it.
893      file.close();      file.close();
894    
# Line 632  bool qsamplerMainForm::saveSessionFile ( Line 910  bool qsamplerMainForm::saveSessionFile (
910  }  }
911    
912    
913    // Session change receiver slot.
914    void qsamplerMainForm::sessionDirty (void)
915    {
916        // Just mark the dirty form.
917        m_iDirtyCount++;
918        // and update the form status...
919        stabilizeForm();
920    }
921    
922    
923  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
924  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
925    
# Line 678  void qsamplerMainForm::fileSaveAs (void) Line 966  void qsamplerMainForm::fileSaveAs (void)
966  }  }
967    
968    
969    // Reset the sampler instance.
970    void qsamplerMainForm::fileReset (void)
971    {
972        if (m_pClient == NULL)
973            return;
974    
975        // Ask user whether he/she want's an internal sampler reset...
976        if (QMessageBox::warning(this,
977                    QSAMPLER_TITLE ": " + tr("Warning"),
978            tr("Resetting the sampler instance will close\n"
979               "all device and channel configurations.\n\n"
980               "Please note that this operation may cause\n"
981               "temporary MIDI and Audio disruption.\n\n"
982               "Do you want to reset the sampler engine now?"),
983            tr("Reset"), tr("Cancel")) > 0)
984            return;
985    
986        // Just do the reset, after closing down current session...
987        if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {
988            appendMessagesClient("lscp_reset_sampler");
989            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
990            return;
991        }
992    
993        // Log this.
994        appendMessages(tr("Sampler reset."));
995    
996            // Make it a new session...
997            newSession();
998    }
999    
1000    
1001  // Restart the client/server instance.  // Restart the client/server instance.
1002  void qsamplerMainForm::fileRestart (void)  void qsamplerMainForm::fileRestart (void)
1003  {  {
1004      if (m_pOptions == NULL)      if (m_pOptions == NULL)
1005          return;          return;
1006            
1007      bool bRestart = true;      bool bRestart = true;
1008        
1009      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
1010      // (if we're currently up and running)      // (if we're currently up and running)
1011      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
1012          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
1013                            QSAMPLER_TITLE ": " + tr("Warning"),
1014              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
1015                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
1016                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
1017                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
1018                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
1019              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
1020      }      }
# Line 725  void qsamplerMainForm::editAddChannel (v Line 1046  void qsamplerMainForm::editAddChannel (v
1046      if (m_pClient == NULL)      if (m_pClient == NULL)
1047          return;          return;
1048    
1049      // Create the new sampler channel.      // Just create the channel instance...
1050      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel();
1051      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
1052          return;          return;
     }  
1053    
1054      // Log this happening.      // Before we show it up, may be we'll
1055      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
1056        if (!pChannel->channelSetup(this)) {
1057            delete pChannel;
1058            return;
1059        }
1060    
1061      // Just create the channel strip with given id.      // And give it to the strip (will own the channel instance, if successful).
1062      createChannel(iChannelID, true);      if (!createChannelStrip(pChannel)) {
1063            delete pChannel;
1064            return;
1065        }
1066    
1067      // We'll be dirty, for sure...      // Make that an overall update.
1068      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
1069      stabilizeForm();      stabilizeForm();
1070  }  }
1071    
# Line 752  void qsamplerMainForm::editRemoveChannel Line 1076  void qsamplerMainForm::editRemoveChannel
1076      if (m_pClient == NULL)      if (m_pClient == NULL)
1077          return;          return;
1078    
1079      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1080        if (pChannelStrip == NULL)
1081            return;
1082    
1083        qsamplerChannel *pChannel = pChannelStrip->channel();
1084      if (pChannel == NULL)      if (pChannel == NULL)
1085          return;          return;
1086    
1087      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1088      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1089          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1090                            QSAMPLER_TITLE ": " + tr("Warning"),
1091              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1092                 "%1\n\n"                 "%1\n\n"
1093                 "Are you sure?")                 "Are you sure?")
1094                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
1095              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
1096              return;              return;
1097      }      }
1098    
1099      // Remove the existing sampler channel.      // Remove the existing sampler channel.
1100      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."));  
1101          return;          return;
     }  
1102    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
1103      // Just delete the channel strip.      // Just delete the channel strip.
1104      delete pChannel;      delete pChannelStrip;
1105    
1106      // Do we auto-arrange?      // Do we auto-arrange?
1107      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1108          channelsArrange();          channelsArrange();
# Line 795  void qsamplerMainForm::editSetupChannel Line 1119  void qsamplerMainForm::editSetupChannel
1119      if (m_pClient == NULL)      if (m_pClient == NULL)
1120          return;          return;
1121    
1122      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1123      if (pChannel == NULL)      if (pChannelStrip == NULL)
1124          return;          return;
1125    
1126      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
1127      pChannel->channelSetup();      pChannelStrip->channelSetup();
1128  }  }
1129    
1130    
# Line 810  void qsamplerMainForm::editResetChannel Line 1134  void qsamplerMainForm::editResetChannel
1134      if (m_pClient == NULL)      if (m_pClient == NULL)
1135          return;          return;
1136    
1137      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1138      if (pChannel == NULL)      if (pChannelStrip == NULL)
1139          return;          return;
1140    
1141      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
1142      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
1143          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
1144    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
1145    
1146      // Refresh channel strip info.  // Reset all sampler channels.
1147      pChannel->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
1148    {
1149            if (m_pClient == NULL)
1150                    return;
1151    
1152            // Invoque the channel strip procedure,
1153            // for all channels out there...
1154            m_pWorkspace->setUpdatesEnabled(false);
1155            QWidgetList wlist = m_pWorkspace->windowList();
1156            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1157                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1158                    if (pChannelStrip)
1159                            pChannelStrip->channelReset();
1160            }
1161            m_pWorkspace->setUpdatesEnabled(true);
1162  }  }
1163    
1164    
# Line 877  void qsamplerMainForm::viewMessages ( bo Line 1210  void qsamplerMainForm::viewMessages ( bo
1210  }  }
1211    
1212    
1213    // Show/hide the MIDI instrument list-view form.
1214    void qsamplerMainForm::viewInstruments (void)
1215    {
1216            if (m_pOptions == NULL)
1217                    return;
1218    
1219            if (m_pInstrumentListForm) {
1220                    m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
1221                    if (m_pInstrumentListForm->isVisible()) {
1222                            m_pInstrumentListForm->hide();
1223                    } else {
1224                            m_pInstrumentListForm->show();
1225                            m_pInstrumentListForm->raise();
1226                            m_pInstrumentListForm->setActiveWindow();
1227                    }
1228            }
1229    }
1230    
1231    
1232    // Show/hide the device configurator form.
1233    void qsamplerMainForm::viewDevices (void)
1234    {
1235            if (m_pOptions == NULL)
1236                    return;
1237    
1238            if (m_pDeviceForm) {
1239                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1240                    if (m_pDeviceForm->isVisible()) {
1241                            m_pDeviceForm->hide();
1242                    } else {
1243                            m_pDeviceForm->show();
1244                            m_pDeviceForm->raise();
1245                            m_pDeviceForm->setActiveWindow();
1246                    }
1247            }
1248    }
1249    
1250    
1251  // Show options dialog.  // Show options dialog.
1252  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1253  {  {
# Line 886  void qsamplerMainForm::viewOptions (void Line 1257  void qsamplerMainForm::viewOptions (void
1257      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1258      if (pOptionsForm) {      if (pOptionsForm) {
1259          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1260          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1261          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1262              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1263          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1264              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1265          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 898  void qsamplerMainForm::viewOptions (void Line 1269  void qsamplerMainForm::viewOptions (void
1269          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1270          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1271          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1272            bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1273          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1274          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1275            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1276          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1277          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1278          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1279          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1280            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1281          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1282          // Load the current setup settings.          // Load the current setup settings.
1283          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 911  void qsamplerMainForm::viewOptions (void Line 1285  void qsamplerMainForm::viewOptions (void
1285          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1286              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1287              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1288                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1289                  QMessageBox::information(this, tr("Information"),                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1290                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1291                    QMessageBox::information(this,
1292                                            QSAMPLER_TITLE ": " + tr("Information"),
1293                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1294                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1295                  updateMessagesCapture();                  updateMessagesCapture();
# Line 922  void qsamplerMainForm::viewOptions (void Line 1299  void qsamplerMainForm::viewOptions (void
1299                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1300                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1301                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1302                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1303                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1304                    updateInstrumentNames();
1305                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1306                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1307                    updateDisplayEffect();
1308              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1309                  updateDisplayFont();                  updateDisplayFont();
1310              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 964  void qsamplerMainForm::channelsArrange ( Line 1347  void qsamplerMainForm::channelsArrange (
1347      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1348      int y = 0;      int y = 0;
1349      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1350          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1351      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1352              // Prevent flicker...              // Prevent flicker...
1353              pChannel->hide();              pChannelStrip->hide();
1354              pChannel->showNormal();              pChannelStrip->showNormal();
1355          }   */          }   */
1356          pChannel->adjustSize();          pChannelStrip->adjustSize();
1357          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1358          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1359              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1360      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1361          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1362          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1363          y += iHeight;          y += iHeight;
1364      }      }
1365      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1366        
1367      stabilizeForm();      stabilizeForm();
1368  }  }
1369    
# Line 1024  void qsamplerMainForm::helpAbout (void) Line 1407  void qsamplerMainForm::helpAbout (void)
1407      sText += tr("Debugging option enabled.");      sText += tr("Debugging option enabled.");
1408      sText += "</font></small><br />";      sText += "</font></small><br />";
1409  #endif  #endif
1410    #ifndef CONFIG_LIBGIG
1411        sText += "<small><font color=\"red\">";
1412        sText += tr("GIG (libgig) file support disabled.");
1413        sText += "</font></small><br />";
1414    #endif
1415    #ifndef CONFIG_INSTRUMENT_NAME
1416        sText += "<small><font color=\"red\">";
1417        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1418        sText += "</font></small><br />";
1419    #endif
1420    #ifndef CONFIG_MUTE_SOLO
1421        sText += "<small><font color=\"red\">";
1422        sText += tr("Sampler channel Mute/Solo support disabled.");
1423        sText += "</font></small><br />";
1424    #endif
1425    #ifndef CONFIG_MIDI_INSTRUMENT
1426        sText += "<small><font color=\"red\">";
1427        sText += tr("MIDI instrument mapping support disabled.");
1428        sText += "</font></small><br />";
1429    #endif
1430      sText += "<br />\n";      sText += "<br />\n";
1431      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1432      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1433      sText += " ";      sText += " ";
1434      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1435    #ifdef CONFIG_LIBGIG
1436        sText += ", ";
1437        sText += gig::libraryName().c_str();
1438        sText += " ";
1439        sText += gig::libraryVersion().c_str();
1440    #endif
1441      sText += "<br />\n";      sText += "<br />\n";
1442      sText += "<br />\n";      sText += "<br />\n";
1443      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 1051  void qsamplerMainForm::helpAbout (void) Line 1460  void qsamplerMainForm::helpAbout (void)
1460  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1461  {  {
1462      // Update the main application caption...      // Update the main application caption...
1463      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1464      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1465          sSessioName += '*';          sSessionName += " *";
1466      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1467    
1468      // Update the main menu state...      // Update the main menu state...
1469      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1470      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1471      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1472      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1473      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1474      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
1475      fileSaveAsAction->setEnabled(bHasClient);      fileSaveAsAction->setEnabled(bHasClient);
1476        fileResetAction->setEnabled(bHasClient);
1477      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);
1478      editAddChannelAction->setEnabled(bHasClient);      editAddChannelAction->setEnabled(bHasClient);
1479      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1480      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1481      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1482      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1483      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1484    #ifdef CONFIG_MIDI_INSTRUMENT
1485            viewInstrumentsAction->setOn(m_pInstrumentListForm
1486                    && m_pInstrumentListForm->isVisible());
1487            viewInstrumentsAction->setEnabled(bHasClient);
1488    #endif
1489            viewDevicesAction->setOn(m_pDeviceForm
1490                    && m_pDeviceForm->isVisible());
1491        viewDevicesAction->setEnabled(bHasClient);
1492        channelsArrangeAction->setEnabled(bHasChannel);
1493    
1494      // Client/Server status...      // Client/Server status...
1495      if (bHasClient) {      if (bHasClient) {
1496          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1497          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));
1498      } else {      } else {
1499          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1500          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1501      }      }
1502      // Channel status...      // Channel status...
1503      if (bHasChannel)      if (bHasChannel)
1504          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannel->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1505      else      else
1506          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1507      // Session status...      // Session status...
1508      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1509          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1510      else      else
1511          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1512    
1513      // Recent files menu.      // Recent files menu.
1514      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1101  void qsamplerMainForm::stabilizeForm (vo Line 1520  void qsamplerMainForm::stabilizeForm (vo
1520    
1521    
1522  // Channel change receiver slot.  // Channel change receiver slot.
1523  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1524  {  {
1525            // Add this strip to the changed list...
1526            if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1527                    m_changedStrips.append(pChannelStrip);
1528                    pChannelStrip->resetErrorCount();
1529            }
1530    
1531      // Just mark the dirty form.      // Just mark the dirty form.
1532      m_iDirtyCount++;      m_iDirtyCount++;
1533      // and update the form status...      // and update the form status...
# Line 1110  void qsamplerMainForm::channelChanged( q Line 1535  void qsamplerMainForm::channelChanged( q
1535  }  }
1536    
1537    
1538    // Grab and restore current sampler channels session.
1539    void qsamplerMainForm::updateSession (void)
1540    {
1541            // Retrieve the current channel list.
1542            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1543            if (piChannelIDs == NULL) {
1544                    if (::lscp_client_get_errno(m_pClient)) {
1545                            appendMessagesClient("lscp_list_channels");
1546                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1547                    }
1548                    return;
1549            }
1550    
1551            // Try to (re)create each channel.
1552            m_pWorkspace->setUpdatesEnabled(false);
1553            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1554                    // Check if theres already a channel strip for this one...
1555                    if (!channelStrip(piChannelIDs[iChannel]))
1556                            createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));
1557                    // Make it visibly responsive...
1558                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1559            }
1560            m_pWorkspace->setUpdatesEnabled(true);
1561            
1562            // Remember to refresh devices and instruments...
1563            if (m_pInstrumentListForm)
1564                m_pInstrumentListForm->refreshInstruments();
1565            if (m_pDeviceForm)
1566                m_pDeviceForm->refreshDevices();
1567    }
1568    
1569    
1570  // Update the recent files list and menu.  // Update the recent files list and menu.
1571  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1572  {  {
# Line 1154  void qsamplerMainForm::updateRecentFiles Line 1611  void qsamplerMainForm::updateRecentFiles
1611  }  }
1612    
1613    
1614    // Force update of the channels instrument names mode.
1615    void qsamplerMainForm::updateInstrumentNames (void)
1616    {
1617        // Full channel list update...
1618        QWidgetList wlist = m_pWorkspace->windowList();
1619        if (wlist.isEmpty())
1620            return;
1621    
1622        m_pWorkspace->setUpdatesEnabled(false);
1623        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1624            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1625            if (pChannelStrip)
1626                pChannelStrip->updateInstrumentName(true);
1627        }
1628        m_pWorkspace->setUpdatesEnabled(true);
1629    }
1630    
1631    
1632  // Force update of the channels display font.  // Force update of the channels display font.
1633  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1634  {  {
# Line 1175  void qsamplerMainForm::updateDisplayFont Line 1650  void qsamplerMainForm::updateDisplayFont
1650    
1651      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1652      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1653          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1654          pChannel->setDisplayFont(font);          if (pChannelStrip)
1655                pChannelStrip->setDisplayFont(font);
1656        }
1657        m_pWorkspace->setUpdatesEnabled(true);
1658    }
1659    
1660    
1661    // Update channel strips background effect.
1662    void qsamplerMainForm::updateDisplayEffect (void)
1663    {
1664       QPixmap pm;
1665        if (m_pOptions->bDisplayEffect)
1666            pm = QPixmap::fromMimeSource("displaybg1.png");
1667    
1668        // Full channel list update...
1669        QWidgetList wlist = m_pWorkspace->windowList();
1670        if (wlist.isEmpty())
1671            return;
1672    
1673        m_pWorkspace->setUpdatesEnabled(false);
1674        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1675            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1676            if (pChannelStrip)
1677                pChannelStrip->setDisplayBackground(pm);
1678      }      }
1679      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1680  }  }
# Line 1195  void qsamplerMainForm::updateMaxVolume ( Line 1693  void qsamplerMainForm::updateMaxVolume (
1693    
1694      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1695      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1696          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1697          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1698                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1699      }      }
1700      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1701  }  }
# Line 1235  void qsamplerMainForm::appendMessagesErr Line 1734  void qsamplerMainForm::appendMessagesErr
1734    
1735      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1736    
1737      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));      QMessageBox::critical(this,
1738                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1739  }  }
1740    
1741    
# Line 1275  void qsamplerMainForm::updateMessagesLim Line 1775  void qsamplerMainForm::updateMessagesLim
1775          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1776              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1777          else          else
1778              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1779      }      }
1780  }  }
1781    
# Line 1295  void qsamplerMainForm::updateMessagesCap Line 1795  void qsamplerMainForm::updateMessagesCap
1795  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1796    
1797  // The channel strip creation executive.  // The channel strip creation executive.
1798  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1799  {  {
1800      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1801          return;          return NULL;
1802    
1803      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1804      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1805      int y = 0;      int y = 0;
1806      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1807          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1808          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1809              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1810          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1811              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1812                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1813                            }
1814          }          }
1815      }      }
1816    
1817      // Add a new channel itema...      // Add a new channel itema...
1818      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;
1819      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1820      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1821      pChannel->setup(this, iChannelID);          return NULL;
1822      // We'll need a display font.  
1823      QFont font;      // Actual channel strip setup...
1824      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1825          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1826      // Track channel setup changes.      // Set some initial aesthetic options...
1827      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1828      // Before we show it up, may be we'll          // Background display effect...
1829      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1830      if (bPrompt)          // We'll need a display font.
1831          pChannel->channelSetup();                QFont font;
1832            if (font.fromString(m_pOptions->sDisplayFont))
1833                pChannelStrip->setDisplayFont(font);
1834            // Maximum allowed volume setting.
1835            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1836        }
1837    
1838      // Now we show up us to the world.      // Now we show up us to the world.
1839      pChannel->show();      pChannelStrip->show();
1840      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1841      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1842          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1843      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1844          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1845          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1846      }      }
1847    
1848            // This is pretty new, so we'll watch for it closely.
1849            channelStripChanged(pChannelStrip);
1850    
1851        // Return our successful reference...
1852        return pChannelStrip;
1853  }  }
1854    
1855    
1856  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1857  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1858  {  {
1859      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1860  }  }
1861    
1862    
1863  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1864  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1865  {  {
1866      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1867      if (wlist.isEmpty())      if (wlist.isEmpty())
1868          return 0;          return NULL;
1869    
1870      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1871  }  }
1872    
1873    
1874    // Retrieve a channel strip by sampler channel id.
1875    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1876    {
1877            QWidgetList wlist = m_pWorkspace->windowList();
1878            if (wlist.isEmpty())
1879                    return NULL;
1880    
1881            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1882                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1883                    if (pChannelStrip) {
1884                            qsamplerChannel *pChannel = pChannelStrip->channel();
1885                            if (pChannel && pChannel->channelID() == iChannelID)
1886                                    return pChannelStrip;
1887                    }
1888            }
1889    
1890            // Not found.
1891            return NULL;
1892    }
1893    
1894    
1895  // Construct the windows menu.  // Construct the windows menu.
1896  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1897  {  {
# Line 1368  void qsamplerMainForm::channelsMenuAbout Line 1903  void qsamplerMainForm::channelsMenuAbout
1903      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1904          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1905          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1906              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1907              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1908              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1909              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1910                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1911                }
1912          }          }
1913      }      }
1914  }  }
# Line 1380  void qsamplerMainForm::channelsMenuAbout Line 1917  void qsamplerMainForm::channelsMenuAbout
1917  // Windows menu activation slot  // Windows menu activation slot
1918  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1919  {  {
1920      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1921      if (pChannel)      if (pChannelStrip)
1922          pChannel->showNormal();          pChannelStrip->showNormal();
1923      pChannel->setFocus();      pChannelStrip->setFocus();
1924  }  }
1925    
1926    
# Line 1421  void qsamplerMainForm::timerSlot (void) Line 1958  void qsamplerMainForm::timerSlot (void)
1958              }              }
1959          }          }
1960      }      }
1961        
1962          // Refresh each channel usage, on each period...          if (m_pClient) {
1963      if (m_pClient && m_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {                  // Update the channel information for each pending strip...
1964          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1965          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1966              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
1967              QWidgetList wlist = m_pWorkspace->windowList();                                  // If successfull, remove from pending list...
1968              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                                  if (pChannelStrip->updateChannelInfo())
1969                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                                          m_changedStrips.remove(pChannelStrip);
1970                  if (pChannel->isVisible())                          }
1971                      pChannel->updateChannelUsage();                  }
1972              }                  // Refresh each channel usage, on each period...
1973          }                  if (m_pOptions->bAutoRefresh) {
1974      }                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1975                            if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1976                                    m_iTimerSlot = 0;
1977                                    // Update the channel stream usage for each strip...
1978                                    QWidgetList wlist = m_pWorkspace->windowList();
1979                                    for (int iChannel = 0;
1980                                                    iChannel < (int) wlist.count(); iChannel++) {
1981                                            qsamplerChannelStrip *pChannelStrip
1982                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1983                                            if (pChannelStrip && pChannelStrip->isVisible())
1984                                                    pChannelStrip->updateChannelUsage();
1985                                    }
1986                            }
1987                    }
1988            }
1989    
1990      // Register the next timer slot.      // Register the next timer slot.
1991      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1456  void qsamplerMainForm::startServer (void Line 2007  void qsamplerMainForm::startServer (void
2007    
2008      // Is the server process instance still here?      // Is the server process instance still here?
2009      if (m_pServer) {      if (m_pServer) {
2010          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
2011                            QSAMPLER_TITLE ": " + tr("Warning"),
2012              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
2013                 "Maybe it ss already started."),                 "Maybe it ss already started."),
2014              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1615  bool qsamplerMainForm::startClient (void Line 2167  bool qsamplerMainForm::startClient (void
2167      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2168      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)));
2169    
2170            // Subscribe to channel info change notifications...
2171            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2172                    appendMessagesClient("lscp_client_subscribe");
2173    
2174      // We may stop scheduling around.      // We may stop scheduling around.
2175      stopSchedule();      stopSchedule();
2176    
# Line 1624  bool qsamplerMainForm::startClient (void Line 2180  bool qsamplerMainForm::startClient (void
2180      // Log success here.      // Log success here.
2181      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2182    
2183            // Hard-notify instrumnet and device configuration forms,
2184            // if visible, that we're ready...
2185            if (m_pInstrumentListForm)
2186                m_pInstrumentListForm->refreshInstruments();
2187            if (m_pDeviceForm)
2188                m_pDeviceForm->refreshDevices();
2189    
2190      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2191      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2192          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1658  void qsamplerMainForm::stopClient (void) Line 2221  void qsamplerMainForm::stopClient (void)
2221      // channels from the back-end server.      // channels from the back-end server.
2222      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2223      closeSession(false);      closeSession(false);
2224        
2225      // Close us as a client...      // Close us as a client...
2226      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2227        ::lscp_client_destroy(m_pClient);
2228      m_pClient = NULL;      m_pClient = NULL;
2229    
2230            // Hard-notify instrumnet and device configuration forms,
2231            // if visible, that we're running out...
2232            if (m_pInstrumentListForm)
2233                m_pInstrumentListForm->refreshInstruments();
2234            if (m_pDeviceForm)
2235                m_pDeviceForm->refreshDevices();
2236    
2237      // Log final here.      // Log final here.
2238      appendMessages(tr("Client disconnected."));      appendMessages(tr("Client disconnected."));
2239    

Legend:
Removed from v.149  
changed lines
  Added in v.969

  ViewVC Help
Powered by ViewVC