/[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 469 by capela, Wed Mar 16 17:56:46 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                    ts << endl;
670                    qsamplerDevice device(m_pClient, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
671                    // Audio device specification...
672            ts << "# " << device.deviceTypeName() << " " << device.driverName()
673                       << " " << tr("Device") << " " << iDevice << endl;
674                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
675                    qsamplerDeviceParamMap::ConstIterator deviceParam;
676                    for (deviceParam = device.params().begin();
677                                    deviceParam != device.params().end();
678                                            ++deviceParam) {
679                            ts << " " << deviceParam.key()
680                               << "='" << deviceParam.data().value << "'";
681                    }
682                    ts << endl;
683                    // Audio channel parameters...
684                    int iPort = 0;
685                    for (qsamplerDevicePort *pPort = device.ports().first();
686                                    pPort;
687                                            pPort = device.ports().next(), ++iPort) {
688                            qsamplerDeviceParamMap::ConstIterator portParam;
689                            for (portParam = pPort->params().begin();
690                                            portParam != pPort->params().end();
691                                                    ++portParam) {
692                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
693                                       << " " << iPort << " " << portParam.key()
694                                       << "='" << portParam.data().value << "'" << endl;
695                            }
696                    }
697                    // Audio device index/id mapping.
698                    audioDeviceMap[device.deviceID()] = iDevice;
699            // Try to keep it snappy :)
700            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
701            }
702            // MIDI device mapping.
703            QMap<int, int> midiDeviceMap;
704            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
705            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
706                    ts << endl;
707                    qsamplerDevice device(m_pClient, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
708                    // MIDI device specification...
709            ts << "# " << device.deviceTypeName() << " " << device.driverName()
710                       << " " << tr("Device") << " " << iDevice << endl;
711                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
712                    qsamplerDeviceParamMap::ConstIterator deviceParam;
713                    for (deviceParam = device.params().begin();
714                                    deviceParam != device.params().end();
715                                            ++deviceParam) {
716                            ts << " " << deviceParam.key()
717                               << "='" << deviceParam.data().value << "'";
718                    }
719                    ts << endl;
720                    // MIDI port parameters...
721                    int iPort = 0;
722                    for (qsamplerDevicePort *pPort = device.ports().first();
723                                    pPort;
724                                            pPort = device.ports().next(), ++iPort) {
725                            qsamplerDeviceParamMap::ConstIterator portParam;
726                            for (portParam = pPort->params().begin();
727                                            portParam != pPort->params().end();
728                                                    ++portParam) {
729                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
730                                       << " " << iPort << " " << portParam.key()
731                                       << "='" << portParam.data().value << "'" << endl;
732                            }
733                    }
734                    // MIDI device index/id mapping.
735                    midiDeviceMap[device.deviceID()] = iDevice;
736            // Try to keep it snappy :)
737            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
738            }
739            ts << endl;
740            // Sampler channel mapping.
741      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
742      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
743          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
744          int iChannelID = pChannel->channelID();          if (pChannelStrip) {
745          ts << "# " << pChannel->caption() << endl;              qsamplerChannel *pChannel = pChannelStrip->channel();
746          ts << "ADD CHANNEL" << endl;              if (pChannel) {
747          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
748          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "ADD CHANNEL" << endl;
749          ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;                  if (audioDeviceMap.isEmpty()) {
750          ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " " << pChannel->midiChannel() << endl;                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
751          ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                                              << " " << pChannel->audioDriver() << endl;
752          ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                              } else {
753          ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
754          ts << endl;                                             << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
755                                    }
756                    if (midiDeviceMap.isEmpty()) {
757                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
758                                           << " " << pChannel->midiDriver() << endl;
759                                } else {
760                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
761                                               << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
762                                }
763                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
764                                   << " " << pChannel->midiPort() << endl;
765                    ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
766                    if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
767                        ts << "ALL";
768                    else
769                        ts << pChannel->midiChannel();
770                    ts << endl;
771                    ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
772                    ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
773                    ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
774                    ts << endl;
775                }
776            }
777          // Try to keep it snappy :)          // Try to keep it snappy :)
778          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
779      }      }
# Line 632  bool qsamplerMainForm::saveSessionFile ( Line 799  bool qsamplerMainForm::saveSessionFile (
799  }  }
800    
801    
802    // Session change receiver slot.
803    void qsamplerMainForm::sessionDirty (void)
804    {
805        // Just mark the dirty form.
806        m_iDirtyCount++;
807        // and update the form status...
808        stabilizeForm();
809    }
810    
811    
812  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
813  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
814    
# Line 678  void qsamplerMainForm::fileSaveAs (void) Line 855  void qsamplerMainForm::fileSaveAs (void)
855  }  }
856    
857    
858    // Reset the sampler instance.
859    void qsamplerMainForm::fileReset (void)
860    {
861        if (m_pClient == NULL)
862            return;
863    
864        // Ask user whether he/she want's an internal sampler reset...
865        if (QMessageBox::warning(this, tr("Warning"),
866            tr("Resetting the sampler instance will close\n"
867               "all device and channel configurations.\n\n"
868               "Please note that this operation may cause\n"
869               "temporary MIDI and Audio disruption\n\n"
870               "Do you want to reset the sampler engine now?"),
871            tr("Reset"), tr("Cancel")) > 0)
872            return;
873    
874        // Just do the reset, after closing down current session...
875        if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) {
876            appendMessagesClient("lscp_reset_sampler");
877            appendMessagesError(tr("Could not reset sampler instance.\n\nSorry."));
878            return;
879        }
880    
881        // Log this.
882        appendMessages(tr("Sampler reset."));
883    
884            // Make it a new session...
885            newSession();
886    }
887    
888    
889  // Restart the client/server instance.  // Restart the client/server instance.
890  void qsamplerMainForm::fileRestart (void)  void qsamplerMainForm::fileRestart (void)
891  {  {
# Line 725  void qsamplerMainForm::editAddChannel (v Line 933  void qsamplerMainForm::editAddChannel (v
933      if (m_pClient == NULL)      if (m_pClient == NULL)
934          return;          return;
935    
936      // Create the new sampler channel.      // Just create the channel instance...
937      int iChannelID = ::lscp_add_channel(m_pClient);      qsamplerChannel *pChannel = new qsamplerChannel(this);
938      if (iChannelID < 0) {      if (pChannel == NULL)
         appendMessagesClient("lscp_add_channel");  
         appendMessagesError(tr("Could not create the new channel.\n\nSorry."));  
939          return;          return;
     }  
940    
941      // Log this happening.      // Before we show it up, may be we'll
942      appendMessages(tr("Channel %1 created.").arg(iChannelID));      // better ask for some initial values?
943        if (!pChannel->channelSetup(this)) {
944      // Just create the channel strip with given id.          delete pChannel;
945      createChannel(iChannelID, true);          return;
946        }
947        
948        // And give it to the strip (will own the channel instance, if successful).
949        if (!createChannelStrip(pChannel)) {
950            delete pChannel;
951            return;
952        }
953    
954      // We'll be dirty, for sure...      // Make that an overall update.
955      m_iDirtyCount++;      m_iDirtyCount++;
     // Stabilize form anyway.  
956      stabilizeForm();      stabilizeForm();
957  }  }
958    
# Line 752  void qsamplerMainForm::editRemoveChannel Line 963  void qsamplerMainForm::editRemoveChannel
963      if (m_pClient == NULL)      if (m_pClient == NULL)
964          return;          return;
965    
966      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
967        if (pChannelStrip == NULL)
968            return;
969            
970        qsamplerChannel *pChannel = pChannelStrip->channel();
971      if (pChannel == NULL)      if (pChannel == NULL)
972          return;          return;
973    
# Line 762  void qsamplerMainForm::editRemoveChannel Line 977  void qsamplerMainForm::editRemoveChannel
977              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
978                 "%1\n\n"                 "%1\n\n"
979                 "Are you sure?")                 "Are you sure?")
980                 .arg(pChannel->caption()),                 .arg(pChannelStrip->caption()),
981              tr("OK"), tr("Cancel")) > 0)              tr("OK"), tr("Cancel")) > 0)
982              return;              return;
983      }      }
984    
985      // Remove the existing sampler channel.      // Remove the existing sampler channel.
986      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."));  
987          return;          return;
     }  
988    
     // Log this happening.  
     appendMessages(tr("Channel %1 removed.").arg(pChannel->channelID()));  
       
989      // Just delete the channel strip.      // Just delete the channel strip.
990      delete pChannel;      delete pChannelStrip;
991        
992      // Do we auto-arrange?      // Do we auto-arrange?
993      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
994          channelsArrange();          channelsArrange();
# Line 795  void qsamplerMainForm::editSetupChannel Line 1005  void qsamplerMainForm::editSetupChannel
1005      if (m_pClient == NULL)      if (m_pClient == NULL)
1006          return;          return;
1007    
1008      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1009      if (pChannel == NULL)      if (pChannelStrip == NULL)
1010          return;          return;
1011    
1012      // Just invoque the channel strip procedure.      // Just invoque the channel strip procedure.
1013      pChannel->channelSetup(false);      pChannelStrip->channelSetup();
1014  }  }
1015    
1016    
# Line 810  void qsamplerMainForm::editResetChannel Line 1020  void qsamplerMainForm::editResetChannel
1020      if (m_pClient == NULL)      if (m_pClient == NULL)
1021          return;          return;
1022    
1023      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1024      if (pChannel == NULL)      if (pChannelStrip == NULL)
1025          return;          return;
1026    
1027      // Remove the existing sampler channel.      // Just invoque the channel strip procedure.
1028      if (::lscp_reset_channel(m_pClient, pChannel->channelID()) != LSCP_OK) {      pChannelStrip->channelReset();
1029          appendMessagesClient("lscp_reset_channel");  }
         appendMessagesError(tr("Could not reset channel.\n\nSorry."));  
         return;  
     }  
1030    
     // Log this.  
     appendMessages(tr("Channel %1 reset.").arg(pChannel->channelID()));  
1031    
1032      // Refresh channel strip info.  // Reset all sampler channels.
1033      pChannel->updateChannelInfo();  void qsamplerMainForm::editResetAllChannels (void)
1034    {
1035        if (m_pClient == NULL)
1036            return;
1037    
1038        // Invoque the channel strip procedure,
1039            // for all channels out there...
1040        m_pWorkspace->setUpdatesEnabled(false);
1041        QWidgetList wlist = m_pWorkspace->windowList();
1042        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1043            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1044            if (pChannelStrip)
1045                    pChannelStrip->channelReset();
1046        }
1047        m_pWorkspace->setUpdatesEnabled(true);
1048  }  }
1049    
1050    
# Line 877  void qsamplerMainForm::viewMessages ( bo Line 1096  void qsamplerMainForm::viewMessages ( bo
1096  }  }
1097    
1098    
1099    // Show/hide the device configurator form.
1100    void qsamplerMainForm::viewDevices (void)
1101    {
1102        if (m_pOptions == NULL)
1103            return;
1104    
1105        if (m_pDeviceForm) {
1106            m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1107                    m_pDeviceForm->setClient(m_pClient);
1108            if (m_pDeviceForm->isVisible()) {
1109                m_pDeviceForm->hide();
1110            } else {
1111                m_pDeviceForm->show();
1112                m_pDeviceForm->raise();
1113                m_pDeviceForm->setActiveWindow();
1114            }
1115        }
1116    }
1117    
1118    
1119  // Show options dialog.  // Show options dialog.
1120  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1121  {  {
# Line 886  void qsamplerMainForm::viewOptions (void Line 1125  void qsamplerMainForm::viewOptions (void
1125      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);      qsamplerOptionsForm *pOptionsForm = new qsamplerOptionsForm(this);
1126      if (pOptionsForm) {      if (pOptionsForm) {
1127          // Check out some initial nullities(tm)...          // Check out some initial nullities(tm)...
1128          qsamplerChannelStrip *pChannel = activeChannel();          qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1129          if (m_pOptions->sDisplayFont.isEmpty() && pChannel)          if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1130              m_pOptions->sDisplayFont = pChannel->displayFont().toString();              m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1131          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)          if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1132              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1133          // To track down deferred or immediate changes.          // To track down deferred or immediate changes.
# Line 898  void qsamplerMainForm::viewOptions (void Line 1137  void qsamplerMainForm::viewOptions (void
1137          bool    bOldServerStart     = m_pOptions->bServerStart;          bool    bOldServerStart     = m_pOptions->bServerStart;
1138          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;          QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1139          QString sOldDisplayFont     = m_pOptions->sDisplayFont;          QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1140            bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1141          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1142          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1143            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1144          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1145          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1146          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1147          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1148            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1149          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1150          // Load the current setup settings.          // Load the current setup settings.
1151          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 911  void qsamplerMainForm::viewOptions (void Line 1153  void qsamplerMainForm::viewOptions (void
1153          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1154              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1155              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1156                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1157                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1158                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1159                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1160                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1161                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 922  void qsamplerMainForm::viewOptions (void Line 1166  void qsamplerMainForm::viewOptions (void
1166                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1167                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1168                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1169                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1170                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1171                    updateInstrumentNames();
1172                if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1173                    (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1174                    updateDisplayEffect();
1175              if (sOldDisplayFont != m_pOptions->sDisplayFont)              if (sOldDisplayFont != m_pOptions->sDisplayFont)
1176                  updateDisplayFont();                  updateDisplayFont();
1177              if (iOldMaxVolume != m_pOptions->iMaxVolume)              if (iOldMaxVolume != m_pOptions->iMaxVolume)
# Line 964  void qsamplerMainForm::channelsArrange ( Line 1214  void qsamplerMainForm::channelsArrange (
1214      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1215      int y = 0;      int y = 0;
1216      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1217          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1218      /*  if (pChannel->testWState(WState_Maximized | WState_Minimized)) {      /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {
1219              // Prevent flicker...              // Prevent flicker...
1220              pChannel->hide();              pChannelStrip->hide();
1221              pChannel->showNormal();              pChannelStrip->showNormal();
1222          }   */          }   */
1223          pChannel->adjustSize();          pChannelStrip->adjustSize();
1224          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1225          if (iWidth < pChannel->width())          if (iWidth < pChannelStrip->width())
1226              iWidth = pChannel->width();              iWidth = pChannelStrip->width();
1227      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1228          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1229          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1230          y += iHeight;          y += iHeight;
1231      }      }
1232      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
# Line 1029  void qsamplerMainForm::helpAbout (void) Line 1279  void qsamplerMainForm::helpAbout (void)
1279      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1280      sText += "</font></small><br />";      sText += "</font></small><br />";
1281  #endif  #endif
1282    #ifndef CONFIG_INSTRUMENT_NAME
1283        sText += "<small><font color=\"red\">";
1284        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1285        sText += "</font></small><br />";
1286    #endif
1287      sText += "<br />\n";      sText += "<br />\n";
1288      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1289      sText += ::lscp_client_package();      sText += ::lscp_client_package();
# Line 1056  void qsamplerMainForm::helpAbout (void) Line 1311  void qsamplerMainForm::helpAbout (void)
1311  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1312  {  {
1313      // Update the main application caption...      // Update the main application caption...
1314      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1315      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1316          sSessioName += '*';          sSessionName += '*';
1317      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1318    
1319      // Update the main menu state...      // Update the main menu state...
1320      qsamplerChannelStrip *pChannel = activeChannel();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
1321      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);      bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);
1322      bool bHasChannel = (bHasClient && pChannel != NULL);      bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1323      fileNewAction->setEnabled(bHasClient);      fileNewAction->setEnabled(bHasClient);
1324      fileOpenAction->setEnabled(bHasClient);      fileOpenAction->setEnabled(bHasClient);
1325      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);      fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
1326      fileSaveAsAction->setEnabled(bHasClient);      fileSaveAsAction->setEnabled(bHasClient);
1327        fileResetAction->setEnabled(bHasClient);
1328      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);      fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);
1329      editAddChannelAction->setEnabled(bHasClient);      editAddChannelAction->setEnabled(bHasClient);
1330      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1331      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1332      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1333      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1334      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1335        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1336        viewDevicesAction->setEnabled(bHasClient);
1337        channelsArrangeAction->setEnabled(bHasChannel);
1338    
1339      // Client/Server status...      // Client/Server status...
1340      if (bHasClient) {      if (bHasClient) {
1341          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1342          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));
1343      } else {      } else {
1344          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1345          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1346      }      }
1347      // Channel status...      // Channel status...
1348      if (bHasChannel)      if (bHasChannel)
1349          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannel->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1350      else      else
1351          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1352      // Session status...      // Session status...
1353      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1354          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1355      else      else
1356          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1357    
1358      // Recent files menu.      // Recent files menu.
1359      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 1365  void qsamplerMainForm::stabilizeForm (vo
1365    
1366    
1367  // Channel change receiver slot.  // Channel change receiver slot.
1368  void qsamplerMainForm::channelChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1369  {  {
1370            // Add this strip to the changed list...
1371            if (m_changedStrips.containsRef(pChannelStrip) == 0)
1372                    m_changedStrips.append(pChannelStrip);
1373    
1374      // Just mark the dirty form.      // Just mark the dirty form.
1375      m_iDirtyCount++;      m_iDirtyCount++;
1376      // and update the form status...      // and update the form status...
# Line 1115  void qsamplerMainForm::channelChanged( q Line 1378  void qsamplerMainForm::channelChanged( q
1378  }  }
1379    
1380    
1381    // Grab and restore current sampler channels session.
1382    void qsamplerMainForm::updateSession (void)
1383    {
1384            // Retrieve the current channel list.
1385            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1386            if (piChannelIDs == NULL) {
1387                    if (::lscp_client_get_errno(m_pClient)) {
1388                            appendMessagesClient("lscp_list_channels");
1389                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1390                    }
1391                    return;
1392            }
1393    
1394            // Try to (re)create each channel.
1395            m_pWorkspace->setUpdatesEnabled(false);
1396            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1397                    // Check if theres already a channel strip for this one...
1398                    if (!channelStrip(piChannelIDs[iChannel]))
1399                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1400                    // Make it visibly responsive...
1401                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1402            }
1403            m_pWorkspace->setUpdatesEnabled(true);
1404            
1405            // Remember to refresh devices
1406            if (m_pDeviceForm)
1407                m_pDeviceForm->refreshDevices();
1408    }
1409    
1410    
1411  // Update the recent files list and menu.  // Update the recent files list and menu.
1412  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1413  {  {
# Line 1159  void qsamplerMainForm::updateRecentFiles Line 1452  void qsamplerMainForm::updateRecentFiles
1452  }  }
1453    
1454    
1455    // Force update of the channels instrument names mode.
1456    void qsamplerMainForm::updateInstrumentNames (void)
1457    {
1458        // Full channel list update...
1459        QWidgetList wlist = m_pWorkspace->windowList();
1460        if (wlist.isEmpty())
1461            return;
1462    
1463        m_pWorkspace->setUpdatesEnabled(false);
1464        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1465            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1466            if (pChannelStrip)
1467                pChannelStrip->updateInstrumentName(true);
1468        }
1469        m_pWorkspace->setUpdatesEnabled(true);
1470    }
1471    
1472    
1473  // Force update of the channels display font.  // Force update of the channels display font.
1474  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1475  {  {
# Line 1180  void qsamplerMainForm::updateDisplayFont Line 1491  void qsamplerMainForm::updateDisplayFont
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->setDisplayFont(font);          if (pChannelStrip)
1496                pChannelStrip->setDisplayFont(font);
1497        }
1498        m_pWorkspace->setUpdatesEnabled(true);
1499    }
1500    
1501    
1502    // Update channel strips background effect.
1503    void qsamplerMainForm::updateDisplayEffect (void)
1504    {
1505       QPixmap pm;
1506        if (m_pOptions->bDisplayEffect)
1507            pm = QPixmap::fromMimeSource("displaybg1.png");
1508    
1509        // Full channel list update...
1510        QWidgetList wlist = m_pWorkspace->windowList();
1511        if (wlist.isEmpty())
1512            return;
1513    
1514        m_pWorkspace->setUpdatesEnabled(false);
1515        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1516            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1517            if (pChannelStrip)
1518                pChannelStrip->setDisplayBackground(pm);
1519      }      }
1520      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1521  }  }
# Line 1200  void qsamplerMainForm::updateMaxVolume ( Line 1534  void qsamplerMainForm::updateMaxVolume (
1534    
1535      m_pWorkspace->setUpdatesEnabled(false);      m_pWorkspace->setUpdatesEnabled(false);
1536      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1537          qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1538          pChannel->setMaxVolume(m_pOptions->iMaxVolume);          if (pChannelStrip)
1539                pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1540      }      }
1541      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1542  }  }
# Line 1300  void qsamplerMainForm::updateMessagesCap Line 1635  void qsamplerMainForm::updateMessagesCap
1635  // qsamplerMainForm -- MDI channel strip management.  // qsamplerMainForm -- MDI channel strip management.
1636    
1637  // The channel strip creation executive.  // The channel strip creation executive.
1638  void qsamplerMainForm::createChannel ( int iChannelID, bool bPrompt )  qsamplerChannelStrip *qsamplerMainForm::createChannelStrip ( qsamplerChannel *pChannel )
1639  {  {
1640      if (m_pClient == NULL)      if (m_pClient == NULL || pChannel == NULL)
1641          return;          return NULL;
1642    
1643      // Prepare for auto-arrange?      // Prepare for auto-arrange?
1644      qsamplerChannelStrip *pChannel = NULL;      qsamplerChannelStrip *pChannelStrip = NULL;
1645      int y = 0;      int y = 0;
1646      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1647          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1648          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1649              pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1650          //  y += pChannel->height() + pChannel->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1651              y += pChannel->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1652                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1653                            }
1654          }          }
1655      }      }
1656    
1657      // Add a new channel itema...      // Add a new channel itema...
1658      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;
1659      pChannel = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1660      pChannel->setMaxVolume(m_pOptions->iMaxVolume);      if (pChannelStrip == NULL)
1661      pChannel->setup(this, iChannelID);          return NULL;
1662      // We'll need a display font.          
1663      QFont font;      // Actual channel strip setup...
1664      if (m_pOptions && font.fromString(m_pOptions->sDisplayFont))      pChannelStrip->setup(pChannel);
1665          pChannel->setDisplayFont(font);      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
1666      // Track channel setup changes.      // Set some initial aesthetic options...
1667      QObject::connect(pChannel, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelChanged(qsamplerChannelStrip *)));      if (m_pOptions) {
1668      // Before we show it up, may be we'll          // Background display effect...
1669      // better ask for some initial values?          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
1670      if (bPrompt)          // We'll need a display font.
1671          pChannel->channelSetup(true);          QFont font;
1672            if (font.fromString(m_pOptions->sDisplayFont))
1673                pChannelStrip->setDisplayFont(font);
1674            // Maximum allowed volume setting.
1675            pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
1676        }
1677    
1678      // Now we show up us to the world.      // Now we show up us to the world.
1679      pChannel->show();      pChannelStrip->show();
1680      // Only then, we'll auto-arrange...      // Only then, we'll auto-arrange...
1681      if (m_pOptions && m_pOptions->bAutoArrange) {      if (m_pOptions && m_pOptions->bAutoArrange) {
1682          int iWidth  = m_pWorkspace->width();          int iWidth  = m_pWorkspace->width();
1683      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();      //  int iHeight = pChannel->height() + pChannel->parentWidget()->baseSize().height();
1684          int iHeight = pChannel->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1685          pChannel->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1686      }      }
1687    
1688            // This is pretty new, so we'll watch for it closely.
1689            channelStripChanged(pChannelStrip);
1690    
1691        // Return our successful reference...
1692        return pChannelStrip;
1693  }  }
1694    
1695    
1696  // Retrieve the active channel strip.  // Retrieve the active channel strip.
1697  qsamplerChannelStrip *qsamplerMainForm::activeChannel (void)  qsamplerChannelStrip *qsamplerMainForm::activeChannelStrip (void)
1698  {  {
1699      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();      return (qsamplerChannelStrip *) m_pWorkspace->activeWindow();
1700  }  }
1701    
1702    
1703  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
1704  qsamplerChannelStrip *qsamplerMainForm::channelAt ( int iChannel )  qsamplerChannelStrip *qsamplerMainForm::channelStripAt ( int iChannel )
1705  {  {
1706      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1707      if (wlist.isEmpty())      if (wlist.isEmpty())
1708          return 0;          return NULL;
1709    
1710      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1711  }  }
1712    
1713    
1714    // Retrieve a channel strip by sampler channel id.
1715    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1716    {
1717            QWidgetList wlist = m_pWorkspace->windowList();
1718            if (wlist.isEmpty())
1719                    return NULL;
1720            
1721            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1722                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1723                    if (pChannelStrip) {
1724                            qsamplerChannel *pChannel = pChannelStrip->channel();
1725                            if (pChannel && pChannel->channelID() == iChannelID)
1726                                    return pChannelStrip;
1727                    }
1728            }
1729    
1730            // Not found.
1731            return NULL;
1732    }
1733    
1734    
1735  // Construct the windows menu.  // Construct the windows menu.
1736  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1737  {  {
# Line 1373  void qsamplerMainForm::channelsMenuAbout Line 1743  void qsamplerMainForm::channelsMenuAbout
1743      if (!wlist.isEmpty()) {      if (!wlist.isEmpty()) {
1744          channelsMenu->insertSeparator();          channelsMenu->insertSeparator();
1745          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1746              qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);              qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1747              int iItemID = channelsMenu->insertItem(pChannel->caption(), this, SLOT(channelsMenuActivated(int)));              if (pChannelStrip) {
1748              channelsMenu->setItemParameter(iItemID, iChannel);                  int iItemID = channelsMenu->insertItem(pChannelStrip->caption(), this, SLOT(channelsMenuActivated(int)));
1749              channelsMenu->setItemChecked(iItemID, activeChannel() == pChannel);                  channelsMenu->setItemParameter(iItemID, iChannel);
1750                    channelsMenu->setItemChecked(iItemID, activeChannelStrip() == pChannelStrip);
1751                }
1752          }          }
1753      }      }
1754  }  }
# Line 1385  void qsamplerMainForm::channelsMenuAbout Line 1757  void qsamplerMainForm::channelsMenuAbout
1757  // Windows menu activation slot  // Windows menu activation slot
1758  void qsamplerMainForm::channelsMenuActivated ( int iChannel )  void qsamplerMainForm::channelsMenuActivated ( int iChannel )
1759  {  {
1760      qsamplerChannelStrip *pChannel = channelAt(iChannel);      qsamplerChannelStrip *pChannelStrip = channelStripAt(iChannel);
1761      if (pChannel)      if (pChannelStrip)
1762          pChannel->showNormal();          pChannelStrip->showNormal();
1763      pChannel->setFocus();      pChannelStrip->setFocus();
1764  }  }
1765    
1766    
# Line 1428  void qsamplerMainForm::timerSlot (void) Line 1800  void qsamplerMainForm::timerSlot (void)
1800      }      }
1801            
1802          // Refresh each channel usage, on each period...          // Refresh each channel usage, on each period...
1803      if (m_pClient && m_pOptions->bAutoRefresh && m_pWorkspace->isUpdatesEnabled()) {      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {
1804          m_iTimerSlot += QSAMPLER_TIMER_MSECS;          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1805          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {
1806              m_iTimerSlot = 0;              m_iTimerSlot = 0;
1807                // Update the channel information for each pending strip...
1808                for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1809                        pChannelStrip;
1810                                                    pChannelStrip = m_changedStrips.next()) {
1811                                    // If successfull, remove from pending list...
1812                                    if (pChannelStrip->updateChannelInfo())
1813                        m_changedStrips.remove(pChannelStrip);
1814                            }
1815                // Update the channel stream usage for each strip...
1816              QWidgetList wlist = m_pWorkspace->windowList();              QWidgetList wlist = m_pWorkspace->windowList();
1817              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1818                  qsamplerChannelStrip *pChannel = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1819                  if (pChannel->isVisible())                  if (pChannelStrip && pChannelStrip->isVisible())
1820                      pChannel->updateChannelUsage();                      pChannelStrip->updateChannelUsage();
1821              }              }
1822          }          }
1823      }      }
# Line 1629  bool qsamplerMainForm::startClient (void Line 2010  bool qsamplerMainForm::startClient (void
2010      // Log success here.      // Log success here.
2011      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2012    
2013            // Hard-notify device configuration form,
2014            // if visible, that we're ready...
2015            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2016                m_pDeviceForm->setClient(m_pClient);
2017                
2018      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2019      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2020          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1649  void qsamplerMainForm::stopClient (void) Line 2035  void qsamplerMainForm::stopClient (void)
2035      if (m_pClient == NULL)      if (m_pClient == NULL)
2036          return;          return;
2037    
2038            // Hard-notify device configuration form,
2039            // if visible, that we're running out...
2040            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2041                m_pDeviceForm->setClient(NULL);
2042    
2043      // Log prepare here.      // Log prepare here.
2044      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2045    

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

  ViewVC Help
Powered by ViewVC