/[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 176 by capela, Tue Jul 6 10:54:45 2004 UTC revision 455 by capela, Mon Mar 14 12:59:27 2005 UTC
# Line 2  Line 2 
2  //  //
3  // ui.h extension file, included from the uic-generated form implementation.  // ui.h extension file, included from the uic-generated form implementation.
4  /****************************************************************************  /****************************************************************************
5     Copyright (C) 2004, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2005, rncbc aka Rui Nuno Capela. All rights reserved.
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 26  Line 26 
26  #include <qprocess.h>  #include <qprocess.h>
27  #include <qmessagebox.h>  #include <qmessagebox.h>
28  #include <qdragobject.h>  #include <qdragobject.h>
29    #include <qregexp.h>
30  #include <qfiledialog.h>  #include <qfiledialog.h>
31  #include <qfileinfo.h>  #include <qfileinfo.h>
32  #include <qfile.h>  #include <qfile.h>
# Line 36  Line 37 
37    
38  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
39  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
40    #include "qsamplerChannel.h"
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #include "config.h"
49    
50    #ifdef HAVE_SIGNAL_H
51    #include <signal.h>
52    #endif
53    
54  // Timer constant stuff.  // Timer constant stuff.
55  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
# Line 100  void qsamplerMainForm::init (void) Line 107  void qsamplerMainForm::init (void)
107      m_pOptions = NULL;      m_pOptions = NULL;
108    
109      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
110      m_pMessages = NULL;      m_pMessages   = NULL;
111        m_pDeviceForm = NULL;
112    
113      // We'll start clean.      // We'll start clean.
114      m_iUntitled = 0;      m_iUntitled   = 0;
115      m_iDirtyCount = 0;      m_iDirtyCount = 0;
116    
117      m_pServer = NULL;      m_pServer = NULL;
# Line 114  void qsamplerMainForm::init (void) Line 122  void qsamplerMainForm::init (void)
122    
123      m_iTimerSlot = 0;      m_iTimerSlot = 0;
124    
125    #ifdef HAVE_SIGNAL_H
126            // Set to ignore any fatal "Broken pipe" signals.
127            ::signal(SIGPIPE, SIG_IGN);
128    #endif
129    
130      // Make it an MDI workspace.      // Make it an MDI workspace.
131      m_pWorkspace = new QWorkspace(this);      m_pWorkspace = new QWorkspace(this);
132      m_pWorkspace->setScrollBarsEnabled(true);      m_pWorkspace->setScrollBarsEnabled(true);
# Line 128  void qsamplerMainForm::init (void) Line 141  void qsamplerMainForm::init (void)
141      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
142      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
143      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
144      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
145      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
146      // Server address.      // Server address.
147      pLabel = new QLabel(this);      pLabel = new QLabel(this);
148      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
149      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
150      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
151      // Channel title.      // Channel title.
152      pLabel = new QLabel(this);      pLabel = new QLabel(this);
153      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
154      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
155      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
156      // Session modification status.      // Session modification status.
157      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
158      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
159      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
160      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
161      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
162    
163      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 163  void qsamplerMainForm::destroy (void) Line 176  void qsamplerMainForm::destroy (void)
176  {  {
177      // Do final processing anyway.      // Do final processing anyway.
178      processServerExit();      processServerExit();
179        
180      // Delete recentfiles menu.  #if defined(WIN32)
181      if (m_pRecentFilesMenu)      WSACleanup();
182          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];  
183    
184      // Finally drop any widgets around...      // Finally drop any widgets around...
185        if (m_pDeviceForm)
186            delete m_pDeviceForm;
187      if (m_pMessages)      if (m_pMessages)
188          delete m_pMessages;          delete m_pMessages;
189      if (m_pWorkspace)      if (m_pWorkspace)
190          delete m_pWorkspace;          delete m_pWorkspace;
191    
192  #if defined(WIN32)      // Delete status item labels one by one.
193      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
194  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
195        if (m_statusItem[QSAMPLER_STATUS_SERVER])
196            delete m_statusItem[QSAMPLER_STATUS_SERVER];
197        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
198            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
199        if (m_statusItem[QSAMPLER_STATUS_SESSION])
200            delete m_statusItem[QSAMPLER_STATUS_SESSION];
201    
202        // Delete recentfiles menu.
203        if (m_pRecentFilesMenu)
204            delete m_pRecentFilesMenu;
205  }  }
206    
207    
# Line 195  void qsamplerMainForm::setup ( qsamplerO Line 211  void qsamplerMainForm::setup ( qsamplerO
211      // We got options?      // We got options?
212      m_pOptions = pOptions;      m_pOptions = pOptions;
213    
214        // What style do we create these forms?
215        WFlags wflags = Qt::WType_TopLevel;
216        if (m_pOptions->bKeepOnTop)
217            wflags |= Qt::WStyle_Tool;
218      // Some child forms are to be created right now.      // Some child forms are to be created right now.
219      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
220        m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
221      // Set message defaults...      // Set message defaults...
222      updateMessagesFont();      updateMessagesFont();
223      updateMessagesLimit();      updateMessagesLimit();
# Line 225  void qsamplerMainForm::setup ( qsamplerO Line 246  void qsamplerMainForm::setup ( qsamplerO
246          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
247          istr >> *this;          istr >> *this;
248      }      }
249      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
250      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
251        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
252    
253      // Final startup stabilization...      // Final startup stabilization...
254      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 264  bool qsamplerMainForm::queryClose (void) Line 286  bool qsamplerMainForm::queryClose (void)
286              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
287              ostr << *this;              ostr << *this;
288              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
289              // And the main windows state.              // And the children, and the main windows state,.
290                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
291              m_pOptions->saveWidgetGeometry(this);              m_pOptions->saveWidgetGeometry(this);
292                    // Close popup widgets.
293                    if (m_pDeviceForm)
294                        m_pDeviceForm->close();
295              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
296              stopServer();              stopServer();
297          }          }
# Line 284  void qsamplerMainForm::closeEvent ( QClo Line 310  void qsamplerMainForm::closeEvent ( QClo
310  }  }
311    
312    
313  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
314  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
315  {  {
316      bool bAccept = false;      bool bDecode = false;
317    
318      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
319          QString sUrl;          QString sText;
320          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
321              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
322                files = QStringList::split('\n', sText);
323                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
324                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
325            }
326      }      }
327    
328      pDragEnterEvent->accept(bAccept);      return bDecode;
329    }
330    
331    
332    // Window drag-n-drop event handlers.
333    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
334    {
335            QStringList files;
336            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
337  }  }
338    
339    
340  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
341  {  {
342      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
343          QString sUrl;  
344          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
345              loadSessionFile(QUrl(sUrl).path());          return;
346      }  
347        for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
348                    const QString& sPath = *iter;
349                    if (qsamplerChannel::isInstrumentFile(sPath)) {
350                            // Try to create a new channel from instrument file...
351                        qsamplerChannel *pChannel = new qsamplerChannel(this);
352                        if (pChannel == NULL)
353                            return;
354                            // Start setting the instrument filename...
355                            pChannel->setInstrument(sPath, 0);
356                        // Before we show it up, may be we'll
357                        // better ask for some initial values?
358                        if (!pChannel->channelSetup(this)) {
359                            delete pChannel;
360                            return;
361                        }
362                        // Finally, give it to a new channel strip...
363                            if (!createChannelStrip(pChannel)) {
364                            delete pChannel;
365                            return;
366                            }
367                        // Make that an overall update.
368                        m_iDirtyCount++;
369                        stabilizeForm();
370                    }   // Otherwise, load an usual session file (LSCP script)...
371                    else if (closeSession(true))
372                            loadSessionFile(sPath);
373                    // Make it look responsive...:)
374                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
375            }
376  }  }
377    
378    
# Line 370  bool qsamplerMainForm::newSession (void) Line 437  bool qsamplerMainForm::newSession (void)
437      if (!closeSession(true))      if (!closeSession(true))
438          return false;          return false;
439    
440            // Give us what the server has, right now...
441            updateSession();
442    
443      // Ok increment untitled count.      // Ok increment untitled count.
444      m_iUntitled++;      m_iUntitled++;
445    
# Line 483  bool qsamplerMainForm::closeSession ( bo Line 553  bool qsamplerMainForm::closeSession ( bo
553          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
554          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
555          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
556              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
557              if (bForce && ::lscp_remove_channel(m_pClient, pChannel->channelID()) != LSCP_OK)              if (pChannelStrip) {
558                  appendMessagesClient("lscp_remove_channel");                  qsamplerChannel *pChannel = pChannelStrip->channel();
559              delete pChannel;                  if (bForce && pChannel)
560                        pChannel->removeChannel();
561                    delete pChannelStrip;
562                }
563          }          }
564          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
565          // We're now clean, for sure.          // We're now clean, for sure.
# Line 525  bool qsamplerMainForm::loadSessionFile ( Line 598  bool qsamplerMainForm::loadSessionFile (
598              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
599                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
600                  iErrors++;                  iErrors++;
601                    break;
602              }              }
603          }          }
604          // Try to make it snappy :)          // Try to make it snappy :)
# Line 536  bool qsamplerMainForm::loadSessionFile ( Line 610  bool qsamplerMainForm::loadSessionFile (
610    
611      // Have we any errors?      // Have we any errors?
612      if (iErrors > 0)      if (iErrors > 0)
613          appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));          appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));
614    
615      // Now we'll try to create the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
616      int iChannels = ::lscp_get_channels(m_pClient);          updateSession();
     if (iChannels < 0) {  
         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);  
617    
618      // Save as default session directory.      // Save as default session directory.
619      if (m_pOptions)      if (m_pOptions)
# Line 562  bool qsamplerMainForm::loadSessionFile ( Line 624  bool qsamplerMainForm::loadSessionFile (
624      m_sFilename = sFilename;      m_sFilename = sFilename;
625      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
626      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
627        
628        // Make that an overall update.
629      stabilizeForm();      stabilizeForm();
630      return true;      return true;
631  }  }
# Line 578  bool qsamplerMainForm::saveSessionFile ( Line 642  bool qsamplerMainForm::saveSessionFile (
642      }      }
643    
644      // Write the file.      // Write the file.
645      int iErrors = 0;      int  iErrors = 0;
646      QTextStream ts(&file);      QTextStream ts(&file);
647      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
648      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 589  bool qsamplerMainForm::saveSessionFile ( Line 653  bool qsamplerMainForm::saveSessionFile (
653      ts << "# " << tr("File")      ts << "# " << tr("File")
654         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
655      ts << "# " << tr("Date")      ts << "# " << tr("Date")
656         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
657         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
658      ts << "#"  << endl;      ts << "#"  << endl;
659      ts << endl;      ts << endl;
660            // It is assumed that this new kind of device+session file
661            // will be loaded from a complete
662            int *piDeviceIDs;
663            int  iDevice;
664            ts << "RESET" << endl;
665            // Audio device mapping.
666            QMap<int, int> audioDeviceMap;
667            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
668            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
669                    qsamplerDevice device(m_pClient, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
670                    ts << endl;
671            ts << "# " << device.deviceTypeName() << " " << device.driverName()
672                       << " " << tr("Device") << " " << iDevice << endl;
673                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
674                    qsamplerDeviceParamMap& params = device.params();
675                    qsamplerDeviceParamMap::ConstIterator iter;
676                    for (iter = params.begin(); iter != params.end(); ++iter)
677                            ts << " " << iter.key() << "='" << iter.data().value << "'";
678                    ts << endl;
679                    audioDeviceMap[device.deviceID()] = iDevice;
680            // Try to keep it snappy :)
681            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
682            }
683            // MIDI device mapping.
684            QMap<int, int> midiDeviceMap;
685            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
686            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
687                    qsamplerDevice device(m_pClient, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
688            ts << "# " << device.deviceTypeName() << " " << device.driverName()
689                       << " " << tr("Device") << " " << iDevice << endl;
690                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
691                    qsamplerDeviceParamMap& params = device.params();
692                    qsamplerDeviceParamMap::ConstIterator iter;
693                    for (iter = params.begin(); iter != params.end(); ++iter)
694                            ts << " " << iter.key() << "='" << iter.data().value << "'";
695                    ts << endl;
696                    midiDeviceMap[device.deviceID()] = iDevice;
697            // Try to keep it snappy :)
698            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
699            }
700            ts << endl;
701            // Sampler channel mapping.
702      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
703      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
704          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
705          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
706          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
707          ts << "ADD CHANNEL" << endl;              if (pChannel) {
708          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
709          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
710          ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                  if (audioDeviceMap.isEmpty()) {
711          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " " << pChannel->midiChannel() << endl;                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
712          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                              << " " << pChannel->audioDriver() << endl;
713          ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                              } else {
714          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
715          ts << endl;                                             << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
716                                    }
717                    if (midiDeviceMap.isEmpty()) {
718                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
719                                           << " " << pChannel->midiDriver() << endl;
720                                } else {
721                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
722                                               << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
723                                }
724                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
725                                   << " " << pChannel->midiPort() << endl;
726                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
727                    if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
728                        ts << "ALL";
729                    else
730                        ts << pChannel->midiChannel();
731                    ts << endl;
732                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
733                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
734                    ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
735                    ts << endl;
736                }
737            }
738          // Try to keep it snappy :)          // Try to keep it snappy :)
739          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
740      }      }
# Line 632  bool qsamplerMainForm::saveSessionFile ( Line 760  bool qsamplerMainForm::saveSessionFile (
760  }  }
761    
762    
763    // Session change receiver slot.
764    void qsamplerMainForm::sessionDirty (void)
765    {
766        // Just mark the dirty form.
767        m_iDirtyCount++;
768        // and update the form status...
769        stabilizeForm();
770    }
771    
772    
773  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
774  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
775    
# Line 678  void qsamplerMainForm::fileSaveAs (void) Line 816  void qsamplerMainForm::fileSaveAs (void)
816  }  }
817    
818    
819    // Reset the sampler instance.
820    void qsamplerMainForm::fileReset (void)
821    {
822        if (m_pClient == NULL)
823            return;
824    
825        // Ask user whether he/she want's an internal sampler reset...
826        if (QMessageBox::warning(this, tr("Warning"),
827            tr("Resetting the sampler instance will close\n"
828               "all device and channel configurations.\n\n"
829               "Please note that this operation may cause\n"
830               "temporary MIDI and Audio disruption\n\n"
831               "Do you want to reset the sampler engine now?"),
832            tr("Reset"), tr("Cancel")) > 0)
833            return;
834    
835        // Just do the reset, after closing down current session...
836        if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {
837            appendMessagesClient("lscp_reset_sampler");
838            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
839            return;
840        }
841    
842        // Log this.
843        appendMessages(tr("Sampler reset."));
844    
845            // Make it a new session...
846            newSession();
847    }
848    
849    
850  // Restart the client/server instance.  // Restart the client/server instance.
851  void qsamplerMainForm::fileRestart (void)  void qsamplerMainForm::fileRestart (void)
852  {  {
# Line 725  void qsamplerMainForm::editAddChannel (v Line 894  void qsamplerMainForm::editAddChannel (v
894      if (m_pClient == NULL)      if (m_pClient == NULL)
895          return;          return;
896    
897      // Create the new sampler channel.      // Just create the channel instance...
898      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel(this);
899      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
900          return;          return;
     }  
901    
902      // Log this happening.      // Before we show it up, may be we'll
903      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
904        if (!pChannel->channelSetup(this)) {
905      // Just create the channel strip with given id.          delete pChannel;
906      createChannel(iChannelID, true);          return;
907        }
908        
909        // And give it to the strip (will own the channel instance, if successful).
910        if (!createChannelStrip(pChannel)) {
911            delete pChannel;
912            return;
913        }
914    
915      // We'll be dirty, for sure...      // Make that an overall update.
916      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
917      stabilizeForm();      stabilizeForm();
918  }  }
919    
# Line 752  void qsamplerMainForm::editRemoveChannel Line 924  void qsamplerMainForm::editRemoveChannel
924      if (m_pClient == NULL)      if (m_pClient == NULL)
925          return;          return;
926    
927      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
928        if (pChannelStrip == NULL)
929            return;
930            
931        qsamplerChannel *pChannel = pChannelStrip->channel();
932      if (pChannel == NULL)      if (pChannel == NULL)
933          return;          return;
934    
# Line 762  void qsamplerMainForm::editRemoveChannel Line 938  void qsamplerMainForm::editRemoveChannel
938              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
939                 "%1\n\n"                 "%1\n\n"
940                 "Are you sure?")                 "Are you sure?")
941                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
942              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
943              return;              return;
944      }      }
945    
946      // Remove the existing sampler channel.      // Remove the existing sampler channel.
947      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."));  
948          return;          return;
     }  
949    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
950      // Just delete the channel strip.      // Just delete the channel strip.
951      delete pChannel;      delete pChannelStrip;
952        
953      // Do we auto-arrange?      // Do we auto-arrange?
954      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
955          channelsArrange();          channelsArrange();
# Line 795  void qsamplerMainForm::editSetupChannel Line 966  void qsamplerMainForm::editSetupChannel
966      if (m_pClient == NULL)      if (m_pClient == NULL)
967          return;          return;
968    
969      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
970      if (pChannel == NULL)      if (pChannelStrip == NULL)
971          return;          return;
972    
973      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
974      pChannel->channelSetup(false);      pChannelStrip->channelSetup();
975  }  }
976    
977    
# Line 810  void qsamplerMainForm::editResetChannel Line 981  void qsamplerMainForm::editResetChannel
981      if (m_pClient == NULL)      if (m_pClient == NULL)
982          return;          return;
983    
984      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
985      if (pChannel == NULL)      if (pChannelStrip == NULL)
986          return;          return;
987    
988      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
989      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
990          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
991    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
992    
993      // Refresh channel strip info.  // Reset all sampler channels.
994      pChannel->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
995    {
996        if (m_pClient == NULL)
997            return;
998    
999        // Invoque the channel strip procedure,
1000            // for all channels out there...
1001        m_pWorkspace->setUpdatesEnabled(false);
1002        QWidgetList wlist = m_pWorkspace->windowList();
1003        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1004            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1005            if (pChannelStrip)
1006                    pChannelStrip->channelReset();
1007        }
1008        m_pWorkspace->setUpdatesEnabled(true);
1009  }  }
1010    
1011    
# Line 877  void qsamplerMainForm::viewMessages ( bo Line 1057  void qsamplerMainForm::viewMessages ( bo
1057  }  }
1058    
1059    
1060    // Show/hide the device configurator form.
1061    void qsamplerMainForm::viewDevices (void)
1062    {
1063        if (m_pOptions == NULL)
1064            return;
1065    
1066        if (m_pDeviceForm) {
1067            m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1068                    m_pDeviceForm->setClient(m_pClient);
1069            if (m_pDeviceForm->isVisible()) {
1070                m_pDeviceForm->hide();
1071            } else {
1072                m_pDeviceForm->show();
1073                m_pDeviceForm->raise();
1074                m_pDeviceForm->setActiveWindow();
1075            }
1076        }
1077    }
1078    
1079    
1080  // Show options dialog.  // Show options dialog.
1081  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1082  {  {
# Line 886  void qsamplerMainForm::viewOptions (void Line 1086  void qsamplerMainForm::viewOptions (void
1086      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1087      if (pOptionsForm) {      if (pOptionsForm) {
1088          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1089          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1090          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1091              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1092          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1093              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1094          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 898  void qsamplerMainForm::viewOptions (void Line 1098  void qsamplerMainForm::viewOptions (void
1098          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1099          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1100          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1101            bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1102          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1103          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1104            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1105          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1106          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1107          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1108          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1109            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1110          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1111          // Load the current setup settings.          // Load the current setup settings.
1112          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 911  void qsamplerMainForm::viewOptions (void Line 1114  void qsamplerMainForm::viewOptions (void
1114          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1115              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1116              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1117                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1118                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1119                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1120                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1121                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1122                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 922  void qsamplerMainForm::viewOptions (void Line 1127  void qsamplerMainForm::viewOptions (void
1127                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1128                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1129                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1130                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1131                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1132                    updateInstrumentNames();
1133                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1134                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1135                    updateDisplayEffect();
1136              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1137                  updateDisplayFont();                  updateDisplayFont();
1138              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 964  void qsamplerMainForm::channelsArrange ( Line 1175  void qsamplerMainForm::channelsArrange (
1175      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1176      int y = 0;      int y = 0;
1177      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1178          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1179      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1180              // Prevent flicker...              // Prevent flicker...
1181              pChannel->hide();              pChannelStrip->hide();
1182              pChannel->showNormal();              pChannelStrip->showNormal();
1183          }   */          }   */
1184          pChannel->adjustSize();          pChannelStrip->adjustSize();
1185          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1186          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1187              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1188      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1189          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1190          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1191          y += iHeight;          y += iHeight;
1192      }      }
1193      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
# Line 1029  void qsamplerMainForm::helpAbout (void) Line 1240  void qsamplerMainForm::helpAbout (void)
1240      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1241      sText += "</font></small><br />";      sText += "</font></small><br />";
1242  #endif  #endif
1243    #ifndef CONFIG_INSTRUMENT_NAME
1244        sText += "<small><font color=\"red\">";
1245        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1246        sText += "</font></small><br />";
1247    #endif
1248      sText += "<br />\n";      sText += "<br />\n";
1249      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1250      sText += ::lscp_client_package();      sText += ::lscp_client_package();
# Line 1056  void qsamplerMainForm::helpAbout (void) Line 1272  void qsamplerMainForm::helpAbout (void)
1272  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1273  {  {
1274      // Update the main application caption...      // Update the main application caption...
1275      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1276      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1277          sSessioName += '*';          sSessionName += '*';
1278      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1279    
1280      // Update the main menu state...      // Update the main menu state...
1281      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1282      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1283      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1284      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1285      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1286      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
1287      fileSaveAsAction->setEnabled(bHasClient);      fileSaveAsAction->setEnabled(bHasClient);
1288        fileResetAction->setEnabled(bHasClient);
1289      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);
1290      editAddChannelAction->setEnabled(bHasClient);      editAddChannelAction->setEnabled(bHasClient);
1291      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1292      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1293      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1294      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1295      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1296        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1297        viewDevicesAction->setEnabled(bHasClient);
1298        channelsArrangeAction->setEnabled(bHasChannel);
1299    
1300      // Client/Server status...      // Client/Server status...
1301      if (bHasClient) {      if (bHasClient) {
1302          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1303          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));
1304      } else {      } else {
1305          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1306          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1307      }      }
1308      // Channel status...      // Channel status...
1309      if (bHasChannel)      if (bHasChannel)
1310          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannel->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1311      else      else
1312          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1313      // Session status...      // Session status...
1314      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1315          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1316      else      else
1317          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1318    
1319      // Recent files menu.      // Recent files menu.
1320      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1106  void qsamplerMainForm::stabilizeForm (vo Line 1326  void qsamplerMainForm::stabilizeForm (vo
1326    
1327    
1328  // Channel change receiver slot.  // Channel change receiver slot.
1329  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1330  {  {
1331            // Add this strip to the changed list...
1332            if (m_changedStrips.containsRef(pChannelStrip) == 0)
1333                    m_changedStrips.append(pChannelStrip);
1334    
1335      // Just mark the dirty form.      // Just mark the dirty form.
1336      m_iDirtyCount++;      m_iDirtyCount++;
1337      // and update the form status...      // and update the form status...
# Line 1115  void qsamplerMainForm::channelChanged( q Line 1339  void qsamplerMainForm::channelChanged( q
1339  }  }
1340    
1341    
1342    // Grab and restore current sampler channels session.
1343    void qsamplerMainForm::updateSession (void)
1344    {
1345            // Retrieve the current channel list.
1346            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1347            if (piChannelIDs == NULL) {
1348                    if (::lscp_client_get_errno(m_pClient)) {
1349                            appendMessagesClient("lscp_list_channels");
1350                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1351                    }
1352                    return;
1353            }
1354    
1355            // Try to (re)create each channel.
1356            m_pWorkspace->setUpdatesEnabled(false);
1357            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1358                    // Check if theres already a channel strip for this one...
1359                    if (!channelStrip(piChannelIDs[iChannel]))
1360                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1361                    // Make it visibly responsive...
1362                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1363            }
1364            m_pWorkspace->setUpdatesEnabled(true);
1365    }
1366    
1367    
1368  // Update the recent files list and menu.  // Update the recent files list and menu.
1369  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1370  {  {
# Line 1159  void qsamplerMainForm::updateRecentFiles Line 1409  void qsamplerMainForm::updateRecentFiles
1409  }  }
1410    
1411    
1412    // Force update of the channels instrument names mode.
1413    void qsamplerMainForm::updateInstrumentNames (void)
1414    {
1415        // Full channel list update...
1416        QWidgetList wlist = m_pWorkspace->windowList();
1417        if (wlist.isEmpty())
1418            return;
1419    
1420        m_pWorkspace->setUpdatesEnabled(false);
1421        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1422            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1423            if (pChannelStrip)
1424                pChannelStrip->updateInstrumentName(true);
1425        }
1426        m_pWorkspace->setUpdatesEnabled(true);
1427    }
1428    
1429    
1430  // Force update of the channels display font.  // Force update of the channels display font.
1431  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1432  {  {
# Line 1180  void qsamplerMainForm::updateDisplayFont Line 1448  void qsamplerMainForm::updateDisplayFont
1448    
1449      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1450      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1451          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1452          pChannel->setDisplayFont(font);          if (pChannelStrip)
1453                pChannelStrip->setDisplayFont(font);
1454        }
1455        m_pWorkspace->setUpdatesEnabled(true);
1456    }
1457    
1458    
1459    // Update channel strips background effect.
1460    void qsamplerMainForm::updateDisplayEffect (void)
1461    {
1462       QPixmap pm;
1463        if (m_pOptions->bDisplayEffect)
1464            pm = QPixmap::fromMimeSource("displaybg1.png");
1465    
1466        // Full channel list update...
1467        QWidgetList wlist = m_pWorkspace->windowList();
1468        if (wlist.isEmpty())
1469            return;
1470    
1471        m_pWorkspace->setUpdatesEnabled(false);
1472        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1473            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1474            if (pChannelStrip)
1475                pChannelStrip->setDisplayBackground(pm);
1476      }      }
1477      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1478  }  }
# Line 1200  void qsamplerMainForm::updateMaxVolume ( Line 1491  void qsamplerMainForm::updateMaxVolume (
1491    
1492      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1493      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1494          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1495          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1496                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1497      }      }
1498      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1499  }  }
# Line 1300  void qsamplerMainForm::updateMessagesCap Line 1592  void qsamplerMainForm::updateMessagesCap
1592  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1593    
1594  // The channel strip creation executive.  // The channel strip creation executive.
1595  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1596  {  {
1597      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1598          return;          return NULL;
1599    
1600      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1601      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1602      int y = 0;      int y = 0;
1603      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1604          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1605          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1606              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1607          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1608              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1609                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1610                            }
1611          }          }
1612      }      }
1613    
1614      // Add a new channel itema...      // Add a new channel itema...
1615      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;
1616      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1617      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1618      pChannel->setup(this, iChannelID);          return NULL;
1619      // We'll need a display font.          
1620      QFont font;      // Actual channel strip setup...
1621      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1622          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1623      // Track channel setup changes.      // Set some initial aesthetic options...
1624      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1625      // Before we show it up, may be we'll          // Background display effect...
1626      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1627      if (bPrompt)          // We'll need a display font.
1628          pChannel->channelSetup(true);          QFont font;
1629            if (font.fromString(m_pOptions->sDisplayFont))
1630                pChannelStrip->setDisplayFont(font);
1631            // Maximum allowed volume setting.
1632            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1633        }
1634    
1635      // Now we show up us to the world.      // Now we show up us to the world.
1636      pChannel->show();      pChannelStrip->show();
1637      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1638      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1639          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1640      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1641          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1642          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1643      }      }
1644    
1645            // This is pretty new, so we'll watch for it closely.
1646            channelStripChanged(pChannelStrip);
1647    
1648        // Return our successful reference...
1649        return pChannelStrip;
1650  }  }
1651    
1652    
1653  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1654  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1655  {  {
1656      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1657  }  }
1658    
1659    
1660  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1661  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1662  {  {
1663      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1664      if (wlist.isEmpty())      if (wlist.isEmpty())
1665          return 0;          return NULL;
1666    
1667      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1668  }  }
1669    
1670    
1671    // Retrieve a channel strip by sampler channel id.
1672    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1673    {
1674            QWidgetList wlist = m_pWorkspace->windowList();
1675            if (wlist.isEmpty())
1676                    return NULL;
1677            
1678            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1679                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1680                    if (pChannelStrip) {
1681                            qsamplerChannel *pChannel = pChannelStrip->channel();
1682                            if (pChannel && pChannel->channelID() == iChannelID)
1683                                    return pChannelStrip;
1684                    }
1685            }
1686    
1687            // Not found.
1688            return NULL;
1689    }
1690    
1691    
1692  // Construct the windows menu.  // Construct the windows menu.
1693  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1694  {  {
# Line 1373  void qsamplerMainForm::channelsMenuAbout Line 1700  void qsamplerMainForm::channelsMenuAbout
1700      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1701          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1702          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1703              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1704              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1705              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1706              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1707                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1708                }
1709          }          }
1710      }      }
1711  }  }
# Line 1385  void qsamplerMainForm::channelsMenuAbout Line 1714  void qsamplerMainForm::channelsMenuAbout
1714  // Windows menu activation slot  // Windows menu activation slot
1715  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1716  {  {
1717      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1718      if (pChannel)      if (pChannelStrip)
1719          pChannel->showNormal();          pChannelStrip->showNormal();
1720      pChannel->setFocus();      pChannelStrip->setFocus();
1721  }  }
1722    
1723    
# Line 1428  void qsamplerMainForm::timerSlot (void) Line 1757  void qsamplerMainForm::timerSlot (void)
1757      }      }
1758            
1759          // Refresh each channel usage, on each period...          // Refresh each channel usage, on each period...
1760      if (m_pClient && m_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {
1761          m_iTimerSlot += QSAMPLER_TIMER_MSECS;          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1762          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {
1763              m_iTimerSlot = 0;              m_iTimerSlot = 0;
1764                // Update the channel information for each pending strip...
1765                for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1766                        pChannelStrip;
1767                                                    pChannelStrip = m_changedStrips.next()) {
1768                                    // If successfull, remove from pending list...
1769                                    if (pChannelStrip->updateChannelInfo())
1770                        m_changedStrips.remove(pChannelStrip);
1771                            }
1772                // Update the channel stream usage for each strip...
1773              QWidgetList wlist = m_pWorkspace->windowList();              QWidgetList wlist = m_pWorkspace->windowList();
1774              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1775                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1776                  if (pChannel->isVisible())                  if (pChannelStrip && pChannelStrip->isVisible())
1777                      pChannel->updateChannelUsage();                      pChannelStrip->updateChannelUsage();
1778              }              }
1779          }          }
1780      }      }
# Line 1629  bool qsamplerMainForm::startClient (void Line 1967  bool qsamplerMainForm::startClient (void
1967      // Log success here.      // Log success here.
1968      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
1969    
1970            // Hard-notify device configuration form,
1971            // if visible, that we're ready...
1972            if (m_pDeviceForm && m_pDeviceForm->isVisible())
1973                m_pDeviceForm->setClient(m_pClient);
1974                
1975      // Is any session pending to be loaded?      // Is any session pending to be loaded?
1976      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
1977          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1649  void qsamplerMainForm::stopClient (void) Line 1992  void qsamplerMainForm::stopClient (void)
1992      if (m_pClient == NULL)      if (m_pClient == NULL)
1993          return;          return;
1994    
1995            // Hard-notify device configuration form,
1996            // if visible, that we're running out...
1997            if (m_pDeviceForm && m_pDeviceForm->isVisible())
1998                m_pDeviceForm->setClient(NULL);
1999    
2000      // Log prepare here.      // Log prepare here.
2001      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2002    

Legend:
Removed from v.176  
changed lines
  Added in v.455

  ViewVC Help
Powered by ViewVC