/[svn]/qsampler/trunk/src/qsamplerMainForm.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMainForm.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1509 by capela, Thu Nov 22 11:10:44 2007 UTC revision 2979 by capela, Tue Aug 16 15:34:45 2016 UTC
# Line 1  Line 1 
1  // qsamplerMainForm.cpp  // qsamplerMainForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2016, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, Christian Schoenebeck     Copyright (C) 2007,2008,2015 Christian Schoenebeck
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 20  Line 20 
20    
21  *****************************************************************************/  *****************************************************************************/
22    
23    #include "qsamplerAbout.h"
24  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
25    
 #include "qsamplerAbout.h"  
26  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
27  #include "qsamplerChannel.h"  #include "qsamplerChannel.h"
28  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
# Line 33  Line 33 
33  #include "qsamplerInstrumentListForm.h"  #include "qsamplerInstrumentListForm.h"
34  #include "qsamplerDeviceForm.h"  #include "qsamplerDeviceForm.h"
35  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
36    #include "qsamplerDeviceStatusForm.h"
37    
38    #include <QMdiArea>
39    #include <QMdiSubWindow>
40    
41  #include <QApplication>  #include <QApplication>
 #include <QWorkspace>  
42  #include <QProcess>  #include <QProcess>
43  #include <QMessageBox>  #include <QMessageBox>
44    
# Line 55  Line 58 
58  #include <QTimer>  #include <QTimer>
59  #include <QDateTime>  #include <QDateTime>
60    
61    #if QT_VERSION >= 0x050000
62    #include <QMimeData>
63    #endif
64    
65    #if QT_VERSION < 0x040500
66    namespace Qt {
67    const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);
68    }
69    #endif
70    
71  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
72  #include <signal.h>  #include <signal.h>
# Line 77  static inline long lroundf ( float x ) Line 89  static inline long lroundf ( float x )
89  }  }
90  #endif  #endif
91    
92    
93    // All winsock apps needs this.
94    #if defined(WIN32)
95    static WSADATA _wsaData;
96    #endif
97    
98    
99    //-------------------------------------------------------------------------
100    // LADISH Level 1 support stuff.
101    
102    #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
103    
104    #include <QSocketNotifier>
105    
106    #include <sys/types.h>
107    #include <sys/socket.h>
108    
109    #include <signal.h>
110    
111    // File descriptor for SIGUSR1 notifier.
112    static int g_fdUsr1[2];
113    
114    // Unix SIGUSR1 signal handler.
115    static void qsampler_sigusr1_handler ( int /* signo */ )
116    {
117            char c = 1;
118    
119            (::write(g_fdUsr1[0], &c, sizeof(c)) > 0);
120    }
121    
122    #endif  // HAVE_SIGNAL_H
123    
124    
125    //-------------------------------------------------------------------------
126    // QSampler -- namespace
127    
128    
129    namespace QSampler {
130    
131  // Timer constant stuff.  // Timer constant stuff.
132  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
133    
# Line 87  static inline long lroundf ( float x ) Line 138  static inline long lroundf ( float x )
138  #define QSAMPLER_STATUS_SESSION 3       // Current session modification state.  #define QSAMPLER_STATUS_SESSION 3       // Current session modification state.
139    
140    
141  // All winsock apps needs this.  // Specialties for thread-callback comunication.
142  #if defined(WIN32)  #define QSAMPLER_LSCP_EVENT   QEvent::Type(QEvent::User + 1)
 static WSADATA _wsaData;  
 #endif  
143    
144    
145  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
146  // qsamplerCustomEvent -- specialty for callback comunication.  // QSampler::LscpEvent -- specialty for LSCP callback comunication.
147    
148  #define QSAMPLER_CUSTOM_EVENT   QEvent::Type(QEvent::User + 0)  class LscpEvent : public QEvent
   
 class qsamplerCustomEvent : public QEvent  
149  {  {
150  public:  public:
151    
152          // Constructor.          // Constructor.
153          qsamplerCustomEvent(lscp_event_t event, const char *pchData, int cchData)          LscpEvent(lscp_event_t event, const char *pchData, int cchData)
154                  : QEvent(QSAMPLER_CUSTOM_EVENT)                  : QEvent(QSAMPLER_LSCP_EVENT)
155          {          {
156                  m_event = event;                  m_event = event;
157                  m_data  = QString::fromUtf8(pchData, cchData);                  m_data  = QString::fromUtf8(pchData, cchData);
158          }          }
159    
160          // Accessors.          // Accessors.
161          lscp_event_t event() { return m_event; }          lscp_event_t  event() { return m_event; }
162          QString&     data()  { return m_data;  }          const QString& data() { return m_data;  }
163    
164  private:  private:
165    
# Line 124  private: Line 171  private:
171    
172    
173  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
174  // qsamplerMainForm -- Main window form implementation.  // QSampler::Workspace -- Main window workspace (MDI Area) decl.
175    
176  namespace QSampler {  class Workspace : public QMdiArea
177    {
178    public:
179    
180            Workspace(MainForm *pMainForm) : QMdiArea(pMainForm) {}
181    
182    protected:
183    
184            void resizeEvent(QResizeEvent *)
185            {
186                    MainForm *pMainForm = static_cast<MainForm *> (parentWidget());
187                    if (pMainForm)
188                            pMainForm->channelsArrangeAuto();
189            }
190    };
191    
192    
193    //-------------------------------------------------------------------------
194    // QSampler::MainForm -- Main window form implementation.
195    
196  // Kind of singleton reference.  // Kind of singleton reference.
197  MainForm* MainForm::g_pMainForm = NULL;  MainForm *MainForm::g_pMainForm = NULL;
198    
199  MainForm::MainForm ( QWidget *pParent )  MainForm::MainForm ( QWidget *pParent )
200          : QMainWindow(pParent)          : QMainWindow(pParent)
# Line 149  MainForm::MainForm ( QWidget *pParent ) Line 214  MainForm::MainForm ( QWidget *pParent )
214    
215          // We'll start clean.          // We'll start clean.
216          m_iUntitled   = 0;          m_iUntitled   = 0;
217            m_iDirtySetup = 0;
218          m_iDirtyCount = 0;          m_iDirtyCount = 0;
219    
220          m_pServer = NULL;          m_pServer = NULL;
# Line 159  MainForm::MainForm ( QWidget *pParent ) Line 225  MainForm::MainForm ( QWidget *pParent )
225    
226          m_iTimerSlot = 0;          m_iTimerSlot = 0;
227    
228  #ifdef HAVE_SIGNAL_H  #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
229    
230          // Set to ignore any fatal "Broken pipe" signals.          // Set to ignore any fatal "Broken pipe" signals.
231          ::signal(SIGPIPE, SIG_IGN);          ::signal(SIGPIPE, SIG_IGN);
232  #endif  
233            // LADISH Level 1 suport.
234    
235            // Initialize file descriptors for SIGUSR1 socket notifier.
236            ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdUsr1);
237            m_pUsr1Notifier
238                    = new QSocketNotifier(g_fdUsr1[1], QSocketNotifier::Read, this);
239    
240            QObject::connect(m_pUsr1Notifier,
241                    SIGNAL(activated(int)),
242                    SLOT(handle_sigusr1()));
243    
244            // Install SIGUSR1 signal handler.
245        struct sigaction usr1;
246        usr1.sa_handler = qsampler_sigusr1_handler;
247        sigemptyset(&usr1.sa_mask);
248        usr1.sa_flags = 0;
249        usr1.sa_flags |= SA_RESTART;
250        ::sigaction(SIGUSR1, &usr1, NULL);
251    
252    #else   // HAVE_SIGNAL_H
253    
254            m_pUsr1Notifier = NULL;
255            
256    #endif  // !HAVE_SIGNAL_H
257    
258  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
259          // Make some extras into the toolbar...          // Make some extras into the toolbar...
# Line 171  MainForm::MainForm ( QWidget *pParent ) Line 262  MainForm::MainForm ( QWidget *pParent )
262          // Volume slider...          // Volume slider...
263          m_ui.channelsToolbar->addSeparator();          m_ui.channelsToolbar->addSeparator();
264          m_pVolumeSlider = new QSlider(Qt::Horizontal, m_ui.channelsToolbar);          m_pVolumeSlider = new QSlider(Qt::Horizontal, m_ui.channelsToolbar);
265          m_pVolumeSlider->setTickPosition(QSlider::TicksBelow);          m_pVolumeSlider->setTickPosition(QSlider::TicksBothSides);
266          m_pVolumeSlider->setTickInterval(10);          m_pVolumeSlider->setTickInterval(10);
267          m_pVolumeSlider->setPageStep(10);          m_pVolumeSlider->setPageStep(10);
268          m_pVolumeSlider->setSingleStep(10);          m_pVolumeSlider->setSingleStep(10);
# Line 183  MainForm::MainForm ( QWidget *pParent ) Line 274  MainForm::MainForm ( QWidget *pParent )
274          QObject::connect(m_pVolumeSlider,          QObject::connect(m_pVolumeSlider,
275                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
276                  SLOT(volumeChanged(int)));                  SLOT(volumeChanged(int)));
         //m_ui.channelsToolbar->setHorizontallyStretchable(true);  
         //m_ui.channelsToolbar->setStretchableWidget(m_pVolumeSlider);  
277          m_ui.channelsToolbar->addWidget(m_pVolumeSlider);          m_ui.channelsToolbar->addWidget(m_pVolumeSlider);
278          // Volume spin-box          // Volume spin-box
279          m_ui.channelsToolbar->addSeparator();          m_ui.channelsToolbar->addSeparator();
# Line 200  MainForm::MainForm ( QWidget *pParent ) Line 289  MainForm::MainForm ( QWidget *pParent )
289  #endif  #endif
290    
291          // Make it an MDI workspace.          // Make it an MDI workspace.
292          m_pWorkspace = new QWorkspace(this);          m_pWorkspace = new Workspace(this);
293          m_pWorkspace->setScrollBarsEnabled(true);          m_pWorkspace->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
294            m_pWorkspace->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
295          // Set the activation connection.          // Set the activation connection.
296          QObject::connect(m_pWorkspace,          QObject::connect(m_pWorkspace,
297                  SIGNAL(windowActivated(QWidget *)),                  SIGNAL(subWindowActivated(QMdiSubWindow *)),
298                  SLOT(stabilizeForm()));                  SLOT(activateStrip(QMdiSubWindow *)));
299          // Make it shine :-)          // Make it shine :-)
300          setCentralWidget(m_pWorkspace);          setCentralWidget(m_pWorkspace);
301    
# Line 238  MainForm::MainForm ( QWidget *pParent ) Line 328  MainForm::MainForm ( QWidget *pParent )
328          WSAStartup(MAKEWORD(1, 1), &_wsaData);          WSAStartup(MAKEWORD(1, 1), &_wsaData);
329  #endif  #endif
330    
331            // Some actions surely need those
332            // shortcuts firmly attached...
333            addAction(m_ui.viewMenubarAction);
334            addAction(m_ui.viewToolbarAction);
335    
336          QObject::connect(m_ui.fileNewAction,          QObject::connect(m_ui.fileNewAction,
337                  SIGNAL(triggered()),                  SIGNAL(triggered()),
338                  SLOT(fileNew()));                  SLOT(fileNew()));
# Line 317  MainForm::MainForm ( QWidget *pParent ) Line 412  MainForm::MainForm ( QWidget *pParent )
412          QObject::connect(m_ui.channelsMenu,          QObject::connect(m_ui.channelsMenu,
413                  SIGNAL(aboutToShow()),                  SIGNAL(aboutToShow()),
414                  SLOT(channelsMenuAboutToShow()));                  SLOT(channelsMenuAboutToShow()));
415    #ifdef CONFIG_VOLUME
416            QObject::connect(m_ui.channelsToolbar,
417                    SIGNAL(orientationChanged(Qt::Orientation)),
418                    SLOT(channelsToolbarOrientation(Qt::Orientation)));
419    #endif
420  }  }
421    
422  // Destructor.  // Destructor.
# Line 329  MainForm::~MainForm() Line 429  MainForm::~MainForm()
429          WSACleanup();          WSACleanup();
430  #endif  #endif
431    
432    #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
433            if (m_pUsr1Notifier)
434                    delete m_pUsr1Notifier;
435    #endif
436    
437          // Finally drop any widgets around...          // Finally drop any widgets around...
438          if (m_pDeviceForm)          if (m_pDeviceForm)
439                  delete m_pDeviceForm;                  delete m_pDeviceForm;
# Line 360  MainForm::~MainForm() Line 465  MainForm::~MainForm()
465    
466    
467  // Make and set a proper setup options step.  // Make and set a proper setup options step.
468  void MainForm::setup ( qsamplerOptions *pOptions )  void MainForm::setup ( Options *pOptions )
469  {  {
470          // We got options?          // We got options?
471          m_pOptions = pOptions;          m_pOptions = pOptions;
472    
473          // What style do we create these forms?          // What style do we create these forms?
474          Qt::WindowFlags wflags = Qt::Window          Qt::WindowFlags wflags = Qt::Window
 #if QT_VERSION >= 0x040200  
475                  | Qt::CustomizeWindowHint                  | Qt::CustomizeWindowHint
 #endif  
476                  | Qt::WindowTitleHint                  | Qt::WindowTitleHint
477                  | Qt::WindowSystemMenuHint                  | Qt::WindowSystemMenuHint
478                  | Qt::WindowMinMaxButtonsHint;                  | Qt::WindowMinMaxButtonsHint
479                    | Qt::WindowCloseButtonHint;
480          if (m_pOptions->bKeepOnTop)          if (m_pOptions->bKeepOnTop)
481                  wflags |= Qt::Tool;                  wflags |= Qt::Tool;
482    
483          // Some child forms are to be created right now.          // Some child forms are to be created right now.
484          m_pMessages = new qsamplerMessages(this);          m_pMessages = new Messages(this);
485          m_pDeviceForm = new DeviceForm(this, wflags);          m_pDeviceForm = new DeviceForm(this, wflags);
486  #ifdef CONFIG_MIDI_INSTRUMENT  #ifdef CONFIG_MIDI_INSTRUMENT
487          m_pInstrumentListForm = new InstrumentListForm(this, wflags);          m_pInstrumentListForm = new InstrumentListForm(this, wflags);
488  #else  #else
489          viewInstrumentsAction->setEnabled(false);          m_ui.viewInstrumentsAction->setEnabled(false);
490  #endif  #endif
491    
492            // Setup messages logging appropriately...
493            m_pMessages->setLogging(
494                    m_pOptions->bMessagesLog,
495                    m_pOptions->sMessagesLogPath);
496    
497          // Set message defaults...          // Set message defaults...
498          updateMessagesFont();          updateMessagesFont();
499          updateMessagesLimit();          updateMessagesLimit();
500          updateMessagesCapture();          updateMessagesCapture();
501    
502          // Set the visibility signal.          // Set the visibility signal.
503          QObject::connect(m_pMessages,          QObject::connect(m_pMessages,
504                  SIGNAL(visibilityChanged(bool)),                  SIGNAL(visibilityChanged(bool)),
# Line 413  void MainForm::setup ( qsamplerOptions * Line 525  void MainForm::setup ( qsamplerOptions *
525          }          }
526    
527          // Try to restore old window positioning and initial visibility.          // Try to restore old window positioning and initial visibility.
528          m_pOptions->loadWidgetGeometry(this);          m_pOptions->loadWidgetGeometry(this, true);
529          m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);          m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
530          m_pOptions->loadWidgetGeometry(m_pDeviceForm);          m_pOptions->loadWidgetGeometry(m_pDeviceForm);
531    
# Line 452  bool MainForm::queryClose (void) Line 564  bool MainForm::queryClose (void)
564                                  || m_ui.channelsToolbar->isVisible());                                  || m_ui.channelsToolbar->isVisible());
565                          m_pOptions->bStatusbar = statusBar()->isVisible();                          m_pOptions->bStatusbar = statusBar()->isVisible();
566                          // Save the dock windows state.                          // Save the dock windows state.
                         const QString sDockables = saveState().toBase64().data();  
567                          m_pOptions->settings().setValue("/Layout/DockWindows", saveState());                          m_pOptions->settings().setValue("/Layout/DockWindows", saveState());
568                          // And the children, and the main windows state,.                          // And the children, and the main windows state,.
569                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
570                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
571                          m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this, true);
572                          // Close popup widgets.                          // Close popup widgets.
573                          if (m_pInstrumentListForm)                          if (m_pInstrumentListForm)
574                                  m_pInstrumentListForm->close();                                  m_pInstrumentListForm->close();
575                          if (m_pDeviceForm)                          if (m_pDeviceForm)
576                                  m_pDeviceForm->close();                                  m_pDeviceForm->close();
577                          // Stop client and/or server, gracefully.                          // Stop client and/or server, gracefully.
578                          stopServer();                          stopServer(true /*interactive*/);
579                  }                  }
580          }          }
581    
# Line 474  bool MainForm::queryClose (void) Line 585  bool MainForm::queryClose (void)
585    
586  void MainForm::closeEvent ( QCloseEvent *pCloseEvent )  void MainForm::closeEvent ( QCloseEvent *pCloseEvent )
587  {  {
588          if (queryClose())          if (queryClose()) {
589                    DeviceStatusForm::deleteAllInstances();
590                  pCloseEvent->accept();                  pCloseEvent->accept();
591          else          } else
592                  pCloseEvent->ignore();                  pCloseEvent->ignore();
593  }  }
594    
# Line 494  void MainForm::dragEnterEvent ( QDragEnt Line 606  void MainForm::dragEnterEvent ( QDragEnt
606  }  }
607    
608    
609  void MainForm::dropEvent ( QDropEvent* pDropEvent )  void MainForm::dropEvent ( QDropEvent *pDropEvent )
610  {  {
611          // Accept externally originated drops only...          // Accept externally originated drops only...
612          if (pDropEvent->source())          if (pDropEvent->source())
# Line 505  void MainForm::dropEvent ( QDropEvent* p Line 617  void MainForm::dropEvent ( QDropEvent* p
617                  QListIterator<QUrl> iter(pMimeData->urls());                  QListIterator<QUrl> iter(pMimeData->urls());
618                  while (iter.hasNext()) {                  while (iter.hasNext()) {
619                          const QString& sPath = iter.next().toLocalFile();                          const QString& sPath = iter.next().toLocalFile();
620                          if (qsamplerChannel::isInstrumentFile(sPath)) {                  //      if (Channel::isDlsInstrumentFile(sPath)) {
621                            if (QFileInfo(sPath).exists()) {
622                                  // Try to create a new channel from instrument file...                                  // Try to create a new channel from instrument file...
623                                  qsamplerChannel *pChannel = new qsamplerChannel();                                  Channel *pChannel = new Channel();
624                                  if (pChannel == NULL)                                  if (pChannel == NULL)
625                                          return;                                          return;
626                                  // Start setting the instrument filename...                                  // Start setting the instrument filename...
# Line 539  void MainForm::dropEvent ( QDropEvent* p Line 652  void MainForm::dropEvent ( QDropEvent* p
652    
653    
654  // Custome event handler.  // Custome event handler.
655  void MainForm::customEvent(QEvent* pCustomEvent)  void MainForm::customEvent ( QEvent* pEvent )
656  {  {
657          // For the time being, just pump it to messages.          // For the time being, just pump it to messages.
658          if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {          if (pEvent->type() == QSAMPLER_LSCP_EVENT) {
659                  qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;                  LscpEvent *pLscpEvent = static_cast<LscpEvent *> (pEvent);
660                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {                  switch (pLscpEvent->event()) {
661                          int iChannelID = pEvent->data().toInt();                          case LSCP_EVENT_CHANNEL_COUNT:
662                          ChannelStrip *pChannelStrip = channelStrip(iChannelID);                                  updateAllChannelStrips(true);
663                          if (pChannelStrip)                                  break;
664                                  channelStripChanged(pChannelStrip);                          case LSCP_EVENT_CHANNEL_INFO: {
665                  } else {                                  const int iChannelID = pLscpEvent->data().toInt();
666                          appendMessagesColor(tr("Notify event: %1 data: %2")                                  ChannelStrip *pChannelStrip = channelStrip(iChannelID);
667                                  .arg(::lscp_event_to_text(pEvent->event()))                                  if (pChannelStrip)
668                                  .arg(pEvent->data()), "#996699");                                          channelStripChanged(pChannelStrip);
669                                    break;
670                            }
671                            case LSCP_EVENT_MIDI_INPUT_DEVICE_COUNT:
672                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
673                                    DeviceStatusForm::onDevicesChanged();
674                                    updateViewMidiDeviceStatusMenu();
675                                    break;
676                            case LSCP_EVENT_MIDI_INPUT_DEVICE_INFO: {
677                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
678                                    const int iDeviceID = pLscpEvent->data().section(' ', 0, 0).toInt();
679                                    DeviceStatusForm::onDeviceChanged(iDeviceID);
680                                    break;
681                            }
682                            case LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT:
683                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
684                                    break;
685                            case LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO:
686                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
687                                    break;
688                    #if CONFIG_EVENT_CHANNEL_MIDI
689                            case LSCP_EVENT_CHANNEL_MIDI: {
690                                    const int iChannelID = pLscpEvent->data().section(' ', 0, 0).toInt();
691                                    ChannelStrip *pChannelStrip = channelStrip(iChannelID);
692                                    if (pChannelStrip)
693                                            pChannelStrip->midiActivityLedOn();
694                                    break;
695                            }
696                    #endif
697                    #if CONFIG_EVENT_DEVICE_MIDI
698                            case LSCP_EVENT_DEVICE_MIDI: {
699                                    const int iDeviceID = pLscpEvent->data().section(' ', 0, 0).toInt();
700                                    const int iPortID   = pLscpEvent->data().section(' ', 1, 1).toInt();
701                                    DeviceStatusForm *pDeviceStatusForm
702                                            = DeviceStatusForm::getInstance(iDeviceID);
703                                    if (pDeviceStatusForm)
704                                            pDeviceStatusForm->midiArrived(iPortID);
705                                    break;
706                            }
707                    #endif
708                            default:
709                                    appendMessagesColor(tr("LSCP Event: %1 data: %2")
710                                            .arg(::lscp_event_to_text(pLscpEvent->event()))
711                                            .arg(pLscpEvent->data()), "#996699");
712                  }                  }
713          }          }
714  }  }
715    
716    
717    // LADISH Level 1 -- SIGUSR1 signal handler.
718    void MainForm::handle_sigusr1 (void)
719    {
720    #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
721    
722            char c;
723    
724            if (::read(g_fdUsr1[1], &c, sizeof(c)) > 0)
725                    saveSession(false);
726    
727    #endif
728    }
729    
730    
731    void MainForm::updateViewMidiDeviceStatusMenu (void)
732    {
733            m_ui.viewMidiDeviceStatusMenu->clear();
734            const std::map<int, DeviceStatusForm *> statusForms
735                    = DeviceStatusForm::getInstances();
736            std::map<int, DeviceStatusForm *>::const_iterator iter
737                    = statusForms.begin();
738            for ( ; iter != statusForms.end(); ++iter) {
739                    DeviceStatusForm *pStatusForm = iter->second;
740                    m_ui.viewMidiDeviceStatusMenu->addAction(
741                            pStatusForm->visibleAction());
742            }
743    }
744    
745    
746  // Context menu event handler.  // Context menu event handler.
747  void MainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void MainForm::contextMenuEvent( QContextMenuEvent *pEvent )
748  {  {
# Line 567  void MainForm::contextMenuEvent( QContex Line 753  void MainForm::contextMenuEvent( QContex
753    
754    
755  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
756  // qsamplerMainForm -- Brainless public property accessors.  // QSampler::MainForm -- Brainless public property accessors.
757    
758  // The global options settings property.  // The global options settings property.
759  qsamplerOptions *MainForm::options (void) const  Options *MainForm::options (void) const
760  {  {
761          return m_pOptions;          return m_pOptions;
762  }  }
# Line 591  MainForm *MainForm::getInstance (void) Line 777  MainForm *MainForm::getInstance (void)
777    
778    
779  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
780  // qsamplerMainForm -- Session file stuff.  // QSampler::MainForm -- Session file stuff.
781    
782  // Format the displayable session filename.  // Format the displayable session filename.
783  QString MainForm::sessionName ( const QString& sFilename )  QString MainForm::sessionName ( const QString& sFilename )
784  {  {
785          bool bCompletePath = (m_pOptions && m_pOptions->bCompletePath);          const bool bCompletePath = (m_pOptions && m_pOptions->bCompletePath);
786          QString sSessionName = sFilename;          QString sSessionName = sFilename;
787          if (sSessionName.isEmpty())          if (sSessionName.isEmpty())
788                  sSessionName = tr("Untitled") + QString::number(m_iUntitled);                  sSessionName = tr("Untitled") + QString::number(m_iUntitled);
# Line 688  bool MainForm::saveSession ( bool bPromp Line 874  bool MainForm::saveSession ( bool bPromp
874                                  "\"%1\"\n\n"                                  "\"%1\"\n\n"
875                                  "Do you want to replace it?")                                  "Do you want to replace it?")
876                                  .arg(sFilename),                                  .arg(sFilename),
877                                  tr("Replace"), tr("Cancel")) > 0)                                  QMessageBox::Yes | QMessageBox::No)
878                                    == QMessageBox::No)
879                                  return false;                                  return false;
880                  }                  }
881          }          }
# Line 711  bool MainForm::closeSession ( bool bForc Line 898  bool MainForm::closeSession ( bool bForc
898                          "\"%1\"\n\n"                          "\"%1\"\n\n"
899                          "Do you want to save the changes?")                          "Do you want to save the changes?")
900                          .arg(sessionName(m_sFilename)),                          .arg(sessionName(m_sFilename)),
901                          tr("Save"), tr("Discard"), tr("Cancel"))) {                          QMessageBox::Save |
902                  case 0:     // Save...                          QMessageBox::Discard |
903                            QMessageBox::Cancel)) {
904                    case QMessageBox::Save:
905                          bClose = saveSession(false);                          bClose = saveSession(false);
906                          // Fall thru....                          // Fall thru....
907                  case 1:     // Discard                  case QMessageBox::Discard:
908                          break;                          break;
909                  default:    // Cancel.                  default:    // Cancel.
910                          bClose = false;                          bClose = false;
# Line 727  bool MainForm::closeSession ( bool bForc Line 916  bool MainForm::closeSession ( bool bForc
916          if (bClose) {          if (bClose) {
917                  // Remove all channel strips from sight...                  // Remove all channel strips from sight...
918                  m_pWorkspace->setUpdatesEnabled(false);                  m_pWorkspace->setUpdatesEnabled(false);
919                  QWidgetList wlist = m_pWorkspace->windowList();                  const QList<QMdiSubWindow *>& wlist
920                  for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                          = m_pWorkspace->subWindowList();
921                          ChannelStrip *pChannelStrip = (ChannelStrip*) wlist.at(iChannel);                  const int iStripCount = wlist.count();
922                    for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
923                            ChannelStrip *pChannelStrip = NULL;
924                            QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
925                            if (pMdiSubWindow)
926                                    pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
927                          if (pChannelStrip) {                          if (pChannelStrip) {
928                                  qsamplerChannel *pChannel = pChannelStrip->channel();                                  Channel *pChannel = pChannelStrip->channel();
929                                  if (bForce && pChannel)                                  if (bForce && pChannel)
930                                          pChannel->removeChannel();                                          pChannel->removeChannel();
931                                  delete pChannelStrip;                                  delete pChannelStrip;
932                          }                          }
933                            if (pMdiSubWindow)
934                                    delete pMdiSubWindow;
935                  }                  }
936                  m_pWorkspace->setUpdatesEnabled(true);                  m_pWorkspace->setUpdatesEnabled(true);
937                  // We're now clean, for sure.                  // We're now clean, for sure.
# Line 847  bool MainForm::saveSessionFile ( const Q Line 1043  bool MainForm::saveSessionFile ( const Q
1043          QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));          QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1044    
1045          // Write the file.          // Write the file.
1046          int  iErrors = 0;          int iErrors = 0;
1047          QTextStream ts(&file);          QTextStream ts(&file);
1048          ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;          ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
1049          ts << "# " << tr("Version")          ts << "# " << tr("Version")
# Line 871  bool MainForm::saveSessionFile ( const Q Line 1067  bool MainForm::saveSessionFile ( const Q
1067    
1068          // Audio device mapping.          // Audio device mapping.
1069          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
1070          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = Device::getDevices(m_pClient, Device::Audio);
1071          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
1072                  ts << endl;                  ts << endl;
1073                  qsamplerDevice device(qsamplerDevice::Audio, piDeviceIDs[iDevice]);                  Device device(Device::Audio, piDeviceIDs[iDevice]);
1074                  // Audio device specification...                  // Audio device specification...
1075                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1076                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1077                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
1078                  qsamplerDeviceParamMap::ConstIterator deviceParam;                  DeviceParamMap::ConstIterator deviceParam;
1079                  for (deviceParam = device.params().begin();                  for (deviceParam = device.params().begin();
1080                                  deviceParam != device.params().end();                                  deviceParam != device.params().end();
1081                                          ++deviceParam) {                                          ++deviceParam) {
1082                          const qsamplerDeviceParam& param = deviceParam.value();                          const DeviceParam& param = deviceParam.value();
1083                          if (param.value.isEmpty()) ts << "# ";                          if (param.value.isEmpty()) ts << "# ";
1084                          ts << " " << deviceParam.key() << "='" << param.value << "'";                          ts << " " << deviceParam.key() << "='" << param.value << "'";
1085                  }                  }
1086                  ts << endl;                  ts << endl;
1087                  // Audio channel parameters...                  // Audio channel parameters...
1088                  int iPort = 0;                  int iPort = 0;
1089                  QListIterator<qsamplerDevicePort *> iter(device.ports());                  QListIterator<DevicePort *> iter(device.ports());
1090                  while (iter.hasNext()) {                  while (iter.hasNext()) {
1091                          qsamplerDevicePort *pPort = iter.next();                          DevicePort *pPort = iter.next();
1092                          qsamplerDeviceParamMap::ConstIterator portParam;                          DeviceParamMap::ConstIterator portParam;
1093                          for (portParam = pPort->params().begin();                          for (portParam = pPort->params().begin();
1094                                          portParam != pPort->params().end();                                          portParam != pPort->params().end();
1095                                                  ++portParam) {                                                  ++portParam) {
1096                                  const qsamplerDeviceParam& param = portParam.value();                                  const DeviceParam& param = portParam.value();
1097                                  if (param.fix || param.value.isEmpty()) ts << "# ";                                  if (param.fix || param.value.isEmpty()) ts << "# ";
1098                                  ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice                                  ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
1099                                          << " " << iPort << " " << portParam.key()                                          << " " << iPort << " " << portParam.key()
# Line 913  bool MainForm::saveSessionFile ( const Q Line 1109  bool MainForm::saveSessionFile ( const Q
1109    
1110          // MIDI device mapping.          // MIDI device mapping.
1111          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
1112          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = Device::getDevices(m_pClient, Device::Midi);
1113          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
1114                  ts << endl;                  ts << endl;
1115                  qsamplerDevice device(qsamplerDevice::Midi, piDeviceIDs[iDevice]);                  Device device(Device::Midi, piDeviceIDs[iDevice]);
1116                  // MIDI device specification...                  // MIDI device specification...
1117                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1118                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1119                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
1120                  qsamplerDeviceParamMap::ConstIterator deviceParam;                  DeviceParamMap::ConstIterator deviceParam;
1121                  for (deviceParam = device.params().begin();                  for (deviceParam = device.params().begin();
1122                                  deviceParam != device.params().end();                                  deviceParam != device.params().end();
1123                                          ++deviceParam) {                                          ++deviceParam) {
1124                          const qsamplerDeviceParam& param = deviceParam.value();                          const DeviceParam& param = deviceParam.value();
1125                          if (param.value.isEmpty()) ts << "# ";                          if (param.value.isEmpty()) ts << "# ";
1126                          ts << " " << deviceParam.key() << "='" << param.value << "'";                          ts << " " << deviceParam.key() << "='" << param.value << "'";
1127                  }                  }
1128                  ts << endl;                  ts << endl;
1129                  // MIDI port parameters...                  // MIDI port parameters...
1130                  int iPort = 0;                  int iPort = 0;
1131                  QListIterator<qsamplerDevicePort *> iter(device.ports());                  QListIterator<DevicePort *> iter(device.ports());
1132                  while (iter.hasNext()) {                  while (iter.hasNext()) {
1133                          qsamplerDevicePort *pPort = iter.next();                          DevicePort *pPort = iter.next();
1134                          qsamplerDeviceParamMap::ConstIterator portParam;                          DeviceParamMap::ConstIterator portParam;
1135                          for (portParam = pPort->params().begin();                          for (portParam = pPort->params().begin();
1136                                          portParam != pPort->params().end();                                          portParam != pPort->params().end();
1137                                                  ++portParam) {                                                  ++portParam) {
1138                                  const qsamplerDeviceParam& param = portParam.value();                                  const DeviceParam& param = portParam.value();
1139                                  if (param.fix || param.value.isEmpty()) ts << "# ";                                  if (param.fix || param.value.isEmpty()) ts << "# ";
1140                                  ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice                                  ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
1141                                  << " " << iPort << " " << portParam.key()                                  << " " << iPort << " " << portParam.key()
# Line 959  bool MainForm::saveSessionFile ( const Q Line 1155  bool MainForm::saveSessionFile ( const Q
1155          QMap<int, int> midiInstrumentMap;          QMap<int, int> midiInstrumentMap;
1156          int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);          int *piMaps = ::lscp_list_midi_instrument_maps(m_pClient);
1157          for (int iMap = 0; piMaps && piMaps[iMap] >= 0; iMap++) {          for (int iMap = 0; piMaps && piMaps[iMap] >= 0; iMap++) {
1158                  int iMidiMap = piMaps[iMap];                  const int iMidiMap = piMaps[iMap];
1159                  const char *pszMapName                  const char *pszMapName
1160                          = ::lscp_get_midi_instrument_map_name(m_pClient, iMidiMap);                          = ::lscp_get_midi_instrument_map_name(m_pClient, iMidiMap);
1161                  ts << "# " << tr("MIDI instrument map") << " " << iMap;                  ts << "# " << tr("MIDI instrument map") << " " << iMap;
# Line 1026  bool MainForm::saveSessionFile ( const Q Line 1222  bool MainForm::saveSessionFile ( const Q
1222  #endif  // CONFIG_MIDI_INSTRUMENT  #endif  // CONFIG_MIDI_INSTRUMENT
1223    
1224          // Sampler channel mapping.          // Sampler channel mapping.
1225          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
1226          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  = m_pWorkspace->subWindowList();
1227                  ChannelStrip* pChannelStrip          const int iStripCount = wlist.count();
1228                          = static_cast<ChannelStrip *> (wlist.at(iChannel));          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
1229                    ChannelStrip *pChannelStrip = NULL;
1230                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
1231                    if (pMdiSubWindow)
1232                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
1233                  if (pChannelStrip) {                  if (pChannelStrip) {
1234                          qsamplerChannel *pChannel = pChannelStrip->channel();                          Channel *pChannel = pChannelStrip->channel();
1235                          if (pChannel) {                          if (pChannel) {
1236                                  ts << "# " << tr("Channel") << " " << iChannel << endl;                                  const int iChannelID = pChannel->channelID();
1237                                    ts << "# " << tr("Channel") << " " << iChannelID << endl;
1238                                  ts << "ADD CHANNEL" << endl;                                  ts << "ADD CHANNEL" << endl;
1239                                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
1240                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID
1241                                                  << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
1242                                  } else {                                  } else {
1243                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID
1244                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
1245                                  }                                  }
1246                                  if (midiDeviceMap.isEmpty()) {                                  if (midiDeviceMap.isEmpty()) {
1247                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID
1248                                                  << " " << pChannel->midiDriver() << endl;                                                  << " " << pChannel->midiDriver() << endl;
1249                                  } else {                                  } else {
1250                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID
1251                                                  << " " << midiDeviceMap[pChannel->midiDevice()] << endl;                                                  << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
1252                                  }                                  }
1253                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID
1254                                          << " " << pChannel->midiPort() << endl;                                          << " " << pChannel->midiPort() << endl;
1255                                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";                                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";
1256                                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
1257                                          ts << "ALL";                                          ts << "ALL";
1258                                  else                                  else
1259                                          ts << pChannel->midiChannel();                                          ts << pChannel->midiChannel();
1260                                  ts << endl;                                  ts << endl;
1261                                  ts << "LOAD ENGINE " << pChannel->engineName()                                  ts << "LOAD ENGINE " << pChannel->engineName()
1262                                          << " " << iChannel << endl;                                          << " " << iChannelID << endl;
1263                                  if (pChannel->instrumentStatus() < 100) ts << "# ";                                  if (pChannel->instrumentStatus() < 100) ts << "# ";
1264                                  ts << "LOAD INSTRUMENT NON_MODAL '"                                  ts << "LOAD INSTRUMENT NON_MODAL '"
1265                                          << pChannel->instrumentFile() << "' "                                          << pChannel->instrumentFile() << "' "
1266                                          << pChannel->instrumentNr() << " " << iChannel << endl;                                          << pChannel->instrumentNr() << " " << iChannelID << endl;
1267                                  qsamplerChannelRoutingMap::ConstIterator audioRoute;                                  ChannelRoutingMap::ConstIterator audioRoute;
1268                                  for (audioRoute = pChannel->audioRouting().begin();                                  for (audioRoute = pChannel->audioRouting().begin();
1269                                                  audioRoute != pChannel->audioRouting().end();                                                  audioRoute != pChannel->audioRouting().end();
1270                                                          ++audioRoute) {                                                          ++audioRoute) {
1271                                          ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannelID
1272                                                  << " " << audioRoute.key()                                                  << " " << audioRoute.key()
1273                                                  << " " << audioRoute.value() << endl;                                                  << " " << audioRoute.value() << endl;
1274                                  }                                  }
1275                                  ts << "SET CHANNEL VOLUME " << iChannel                                  ts << "SET CHANNEL VOLUME " << iChannelID
1276                                          << " " << pChannel->volume() << endl;                                          << " " << pChannel->volume() << endl;
1277                                  if (pChannel->channelMute())                                  if (pChannel->channelMute())
1278                                          ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;                                          ts << "SET CHANNEL MUTE " << iChannelID << " 1" << endl;
1279                                  if (pChannel->channelSolo())                                  if (pChannel->channelSolo())
1280                                          ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;                                          ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl;
1281  #ifdef CONFIG_MIDI_INSTRUMENT                          #ifdef CONFIG_MIDI_INSTRUMENT
1282                                  if (pChannel->midiMap() >= 0) {                                  if (pChannel->midiMap() >= 0) {
1283                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannel                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID
1284                                                  << " " << midiInstrumentMap[pChannel->midiMap()] << endl;                                                  << " " << midiInstrumentMap[pChannel->midiMap()] << endl;
1285                                  }                                  }
1286  #endif                          #endif
1287  #ifdef CONFIG_FXSEND                          #ifdef CONFIG_FXSEND
                                 int iChannelID = pChannel->channelID();  
1288                                  int *piFxSends = ::lscp_list_fxsends(m_pClient, iChannelID);                                  int *piFxSends = ::lscp_list_fxsends(m_pClient, iChannelID);
1289                                  for (int iFxSend = 0;                                  for (int iFxSend = 0;
1290                                                  piFxSends && piFxSends[iFxSend] >= 0;                                                  piFxSends && piFxSends[iFxSend] >= 0;
# Line 1092  bool MainForm::saveSessionFile ( const Q Line 1292  bool MainForm::saveSessionFile ( const Q
1292                                          lscp_fxsend_info_t *pFxSendInfo = ::lscp_get_fxsend_info(                                          lscp_fxsend_info_t *pFxSendInfo = ::lscp_get_fxsend_info(
1293                                                  m_pClient, iChannelID, piFxSends[iFxSend]);                                                  m_pClient, iChannelID, piFxSends[iFxSend]);
1294                                          if (pFxSendInfo) {                                          if (pFxSendInfo) {
1295                                                  ts << "CREATE FX_SEND " << iChannel                                                  ts << "CREATE FX_SEND " << iChannelID
1296                                                          << " " << pFxSendInfo->midi_controller;                                                          << " " << pFxSendInfo->midi_controller;
1297                                                  if (pFxSendInfo->name)                                                  if (pFxSendInfo->name)
1298                                                          ts << " '" << pFxSendInfo->name << "'";                                                          ts << " '" << pFxSendInfo->name << "'";
# Line 1102  bool MainForm::saveSessionFile ( const Q Line 1302  bool MainForm::saveSessionFile ( const Q
1302                                                                  piRouting && piRouting[iAudioSrc] >= 0;                                                                  piRouting && piRouting[iAudioSrc] >= 0;
1303                                                                          iAudioSrc++) {                                                                          iAudioSrc++) {
1304                                                          ts << "SET FX_SEND AUDIO_OUTPUT_CHANNEL "                                                          ts << "SET FX_SEND AUDIO_OUTPUT_CHANNEL "
1305                                                                  << iChannel                                                                  << iChannelID
1306                                                                  << " " << iFxSend                                                                  << " " << iFxSend
1307                                                                  << " " << iAudioSrc                                                                  << " " << iAudioSrc
1308                                                                  << " " << piRouting[iAudioSrc] << endl;                                                                  << " " << piRouting[iAudioSrc] << endl;
1309                                                  }                                                  }
1310  #ifdef CONFIG_FXSEND_LEVEL                                          #ifdef CONFIG_FXSEND_LEVEL
1311                                                  ts << "SET FX_SEND LEVEL " << iChannel                                                  ts << "SET FX_SEND LEVEL " << iChannelID
1312                                                          << " " << iFxSend                                                          << " " << iFxSend
1313                                                          << " " << pFxSendInfo->level << endl;                                                          << " " << pFxSendInfo->level << endl;
1314  #endif                                          #endif
1315                                          }       // Check for errors...                                          }       // Check for errors...
1316                                          else if (::lscp_client_get_errno(m_pClient)) {                                          else if (::lscp_client_get_errno(m_pClient)) {
1317                                                  appendMessagesClient("lscp_get_fxsend_info");                                                  appendMessagesClient("lscp_get_fxsend_info");
1318                                                  iErrors++;                                                  iErrors++;
1319                                          }                                          }
1320                                  }                                  }
1321  #endif                          #endif
1322                                  ts << endl;                                  ts << endl;
1323                          }                          }
1324                  }                  }
# Line 1171  void MainForm::sessionDirty (void) Line 1371  void MainForm::sessionDirty (void)
1371    
1372    
1373  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1374  // qsamplerMainForm -- File Action slots.  // QSampler::MainForm -- File Action slots.
1375    
1376  // Create a new sampler session.  // Create a new sampler session.
1377  void MainForm::fileNew (void)  void MainForm::fileNew (void)
# Line 1195  void MainForm::fileOpenRecent (void) Line 1395  void MainForm::fileOpenRecent (void)
1395          // Retrive filename index from action data...          // Retrive filename index from action data...
1396          QAction *pAction = qobject_cast<QAction *> (sender());          QAction *pAction = qobject_cast<QAction *> (sender());
1397          if (pAction && m_pOptions) {          if (pAction && m_pOptions) {
1398                  int iIndex = pAction->data().toInt();                  const int iIndex = pAction->data().toInt();
1399                  if (iIndex >= 0 && iIndex < m_pOptions->recentFiles.count()) {                  if (iIndex >= 0 && iIndex < m_pOptions->recentFiles.count()) {
1400                          QString sFilename = m_pOptions->recentFiles[iIndex];                          QString sFilename = m_pOptions->recentFiles[iIndex];
1401                          // Check if we can safely close the current session...                          // Check if we can safely close the current session...
# Line 1229  void MainForm::fileReset (void) Line 1429  void MainForm::fileReset (void)
1429                  return;                  return;
1430    
1431          // Ask user whether he/she want's an internal sampler reset...          // Ask user whether he/she want's an internal sampler reset...
1432          if (QMessageBox::warning(this,          if (m_pOptions && m_pOptions->bConfirmReset) {
1433                  QSAMPLER_TITLE ": " + tr("Warning"),                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");
1434                  tr("Resetting the sampler instance will close\n"                  const QString& sText = tr(
1435                  "all device and channel configurations.\n\n"                          "Resetting the sampler instance will close\n"
1436                  "Please note that this operation may cause\n"                          "all device and channel configurations.\n\n"
1437                  "temporary MIDI and Audio disruption.\n\n"                          "Please note that this operation may cause\n"
1438                  "Do you want to reset the sampler engine now?"),                          "temporary MIDI and Audio disruption.\n\n"
1439                  tr("Reset"), tr("Cancel")) > 0)                          "Do you want to reset the sampler engine now?");
1440                  return;          #if 0
1441                    if (QMessageBox::warning(this, sTitle, sText,
1442                            QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
1443                            return;
1444            #else
1445                    QMessageBox mbox(this);
1446                    mbox.setIcon(QMessageBox::Warning);
1447                    mbox.setWindowTitle(sTitle);
1448                    mbox.setText(sText);
1449                    mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
1450                    QCheckBox cbox(tr("Don't ask this again"));
1451                    cbox.setChecked(false);
1452                    cbox.blockSignals(true);
1453                    mbox.addButton(&cbox, QMessageBox::ActionRole);
1454                    if (mbox.exec() == QMessageBox::Cancel)
1455                            return;
1456                    if (cbox.isChecked())
1457                            m_pOptions->bConfirmReset = false;
1458            #endif
1459            }
1460    
1461          // Trye closing the current session, first...          // Trye closing the current session, first...
1462          if (!closeSession(true))          if (!closeSession(true))
# Line 1269  void MainForm::fileRestart (void) Line 1488  void MainForm::fileRestart (void)
1488    
1489          // Ask user whether he/she want's a complete restart...          // Ask user whether he/she want's a complete restart...
1490          // (if we're currently up and running)          // (if we're currently up and running)
1491          if (bRestart && m_pClient) {          if (m_pOptions && m_pOptions->bConfirmRestart) {
1492                  bRestart = (QMessageBox::warning(this,                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");
1493                          QSAMPLER_TITLE ": " + tr("Warning"),                  const QString& sText = tr(
1494                          tr("New settings will be effective after\n"                          "New settings will be effective after\n"
1495                          "restarting the client/server connection.\n\n"                          "restarting the client/server connection.\n\n"
1496                          "Please note that this operation may cause\n"                          "Please note that this operation may cause\n"
1497                          "temporary MIDI and Audio disruption.\n\n"                          "temporary MIDI and Audio disruption.\n\n"
1498                          "Do you want to restart the connection now?"),                          "Do you want to restart the connection now?");
1499                          tr("Restart"), tr("Cancel")) == 0);          #if 0
1500                    if (QMessageBox::warning(this, sTitle, sText,
1501                            QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
1502                            bRestart = false;
1503            #else
1504                    QMessageBox mbox(this);
1505                    mbox.setIcon(QMessageBox::Warning);
1506                    mbox.setWindowTitle(sTitle);
1507                    mbox.setText(sText);
1508                    mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
1509                    QCheckBox cbox(tr("Don't ask this again"));
1510                    cbox.setChecked(false);
1511                    cbox.blockSignals(true);
1512                    mbox.addButton(&cbox, QMessageBox::ActionRole);
1513                    if (mbox.exec() == QMessageBox::Cancel)
1514                            bRestart = false;
1515                    else
1516                    if (cbox.isChecked())
1517                            m_pOptions->bConfirmRestart = false;
1518            #endif
1519          }          }
1520    
1521          // Are we still for it?          // Are we still for it?
# Line 1299  void MainForm::fileExit (void) Line 1537  void MainForm::fileExit (void)
1537    
1538    
1539  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1540  // qsamplerMainForm -- Edit Action slots.  // QSampler::MainForm -- Edit Action slots.
1541    
1542  // Add a new sampler channel.  // Add a new sampler channel.
1543  void MainForm::editAddChannel (void)  void MainForm::editAddChannel (void)
1544  {  {
1545            ++m_iDirtySetup;
1546            addChannelStrip();
1547            --m_iDirtySetup;
1548    }
1549    
1550    void MainForm::addChannelStrip (void)
1551    {
1552          if (m_pClient == NULL)          if (m_pClient == NULL)
1553                  return;                  return;
1554    
1555          // Just create the channel instance...          // Just create the channel instance...
1556          qsamplerChannel *pChannel = new qsamplerChannel();          Channel *pChannel = new Channel();
1557          if (pChannel == NULL)          if (pChannel == NULL)
1558                  return;                  return;
1559    
# Line 1326  void MainForm::editAddChannel (void) Line 1571  void MainForm::editAddChannel (void)
1571                  return;                  return;
1572          }          }
1573    
1574            // Do we auto-arrange?
1575            channelsArrangeAuto();
1576    
1577          // Make that an overall update.          // Make that an overall update.
1578          m_iDirtyCount++;          m_iDirtyCount++;
1579          stabilizeForm();          stabilizeForm();
# Line 1335  void MainForm::editAddChannel (void) Line 1583  void MainForm::editAddChannel (void)
1583  // Remove current sampler channel.  // Remove current sampler channel.
1584  void MainForm::editRemoveChannel (void)  void MainForm::editRemoveChannel (void)
1585  {  {
1586            ++m_iDirtySetup;
1587            removeChannelStrip();
1588            --m_iDirtySetup;
1589    }
1590    
1591    void MainForm::removeChannelStrip (void)
1592    {
1593          if (m_pClient == NULL)          if (m_pClient == NULL)
1594                  return;                  return;
1595    
1596          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1597          if (pChannelStrip == NULL)          if (pChannelStrip == NULL)
1598                  return;                  return;
1599    
1600          qsamplerChannel *pChannel = pChannelStrip->channel();          Channel *pChannel = pChannelStrip->channel();
1601          if (pChannel == NULL)          if (pChannel == NULL)
1602                  return;                  return;
1603    
1604          // Prompt user if he/she's sure about this...          // Prompt user if he/she's sure about this...
1605          if (m_pOptions && m_pOptions->bConfirmRemove) {          if (m_pOptions && m_pOptions->bConfirmRemove) {
1606                  if (QMessageBox::warning(this,                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");
1607                          QSAMPLER_TITLE ": " + tr("Warning"),                  const QString& sText = tr(
1608                          tr("About to remove channel:\n\n"                          "About to remove channel:\n\n"
1609                          "%1\n\n"                          "%1\n\n"
1610                          "Are you sure?")                          "Are you sure?")
1611                          .arg(pChannelStrip->windowTitle()),                          .arg(pChannelStrip->windowTitle());
1612                          tr("OK"), tr("Cancel")) > 0)          #if 0
1613                    if (QMessageBox::warning(this, sTitle, sText,
1614                            QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
1615                            return;
1616            #else
1617                    QMessageBox mbox(this);
1618                    mbox.setIcon(QMessageBox::Warning);
1619                    mbox.setWindowTitle(sTitle);
1620                    mbox.setText(sText);
1621                    mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
1622                    QCheckBox cbox(tr("Don't ask this again"));
1623                    cbox.setChecked(false);
1624                    cbox.blockSignals(true);
1625                    mbox.addButton(&cbox, QMessageBox::ActionRole);
1626                    if (mbox.exec() == QMessageBox::Cancel)
1627                          return;                          return;
1628                    if (cbox.isChecked())
1629                            m_pOptions->bConfirmRemove = false;
1630            #endif
1631          }          }
1632    
1633          // Remove the existing sampler channel.          // Remove the existing sampler channel.
# Line 1363  void MainForm::editRemoveChannel (void) Line 1635  void MainForm::editRemoveChannel (void)
1635                  return;                  return;
1636    
1637          // Just delete the channel strip.          // Just delete the channel strip.
1638          delete pChannelStrip;          destroyChannelStrip(pChannelStrip);
   
         // Do we auto-arrange?  
         if (m_pOptions && m_pOptions->bAutoArrange)  
                 channelsArrange();  
1639    
1640          // We'll be dirty, for sure...          // We'll be dirty, for sure...
1641          m_iDirtyCount++;          m_iDirtyCount++;
# Line 1381  void MainForm::editSetupChannel (void) Line 1649  void MainForm::editSetupChannel (void)
1649          if (m_pClient == NULL)          if (m_pClient == NULL)
1650                  return;                  return;
1651    
1652          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1653          if (pChannelStrip == NULL)          if (pChannelStrip == NULL)
1654                  return;                  return;
1655    
# Line 1396  void MainForm::editEditChannel (void) Line 1664  void MainForm::editEditChannel (void)
1664          if (m_pClient == NULL)          if (m_pClient == NULL)
1665                  return;                  return;
1666    
1667          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1668          if (pChannelStrip == NULL)          if (pChannelStrip == NULL)
1669                  return;                  return;
1670    
# Line 1411  void MainForm::editResetChannel (void) Line 1679  void MainForm::editResetChannel (void)
1679          if (m_pClient == NULL)          if (m_pClient == NULL)
1680                  return;                  return;
1681    
1682          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1683          if (pChannelStrip == NULL)          if (pChannelStrip == NULL)
1684                  return;                  return;
1685    
# Line 1429  void MainForm::editResetAllChannels (voi Line 1697  void MainForm::editResetAllChannels (voi
1697          // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1698          // for all channels out there...          // for all channels out there...
1699          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1700          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
1701          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  = m_pWorkspace->subWindowList();
1702                  ChannelStrip* pChannelStrip = (ChannelStrip*) wlist.at(iChannel);          const int iStripCount = wlist.count();
1703            for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
1704                    ChannelStrip *pChannelStrip = NULL;
1705                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
1706                    if (pMdiSubWindow)
1707                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
1708                  if (pChannelStrip)                  if (pChannelStrip)
1709                          pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1710          }          }
# Line 1440  void MainForm::editResetAllChannels (voi Line 1713  void MainForm::editResetAllChannels (voi
1713    
1714    
1715  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1716  // qsamplerMainForm -- View Action slots.  // QSampler::MainForm -- View Action slots.
1717    
1718  // Show/hide the main program window menubar.  // Show/hide the main program window menubar.
1719  void MainForm::viewMenubar ( bool bOn )  void MainForm::viewMenubar ( bool bOn )
# Line 1534  void MainForm::viewOptions (void) Line 1807  void MainForm::viewOptions (void)
1807          OptionsForm* pOptionsForm = new OptionsForm(this);          OptionsForm* pOptionsForm = new OptionsForm(this);
1808          if (pOptionsForm) {          if (pOptionsForm) {
1809                  // Check out some initial nullities(tm)...                  // Check out some initial nullities(tm)...
1810                  ChannelStrip* pChannelStrip = activeChannelStrip();                  ChannelStrip *pChannelStrip = activeChannelStrip();
1811                  if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)                  if (m_pOptions->sDisplayFont.isEmpty() && pChannelStrip)
1812                          m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();                          m_pOptions->sDisplayFont = pChannelStrip->displayFont().toString();
1813                  if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)                  if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1814                          m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();                          m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1815                  // To track down deferred or immediate changes.                  // To track down deferred or immediate changes.
1816                  QString sOldServerHost      = m_pOptions->sServerHost;                  const QString sOldServerHost      = m_pOptions->sServerHost;
1817                  int     iOldServerPort      = m_pOptions->iServerPort;                  const int     iOldServerPort      = m_pOptions->iServerPort;
1818                  int     iOldServerTimeout   = m_pOptions->iServerTimeout;                  const int     iOldServerTimeout   = m_pOptions->iServerTimeout;
1819                  bool    bOldServerStart     = m_pOptions->bServerStart;                  const bool    bOldServerStart     = m_pOptions->bServerStart;
1820                  QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;                  const QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1821                  QString sOldDisplayFont     = m_pOptions->sDisplayFont;                  const bool    bOldMessagesLog     = m_pOptions->bMessagesLog;
1822                  bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;                  const QString sOldMessagesLogPath = m_pOptions->sMessagesLogPath;
1823                  int     iOldMaxVolume       = m_pOptions->iMaxVolume;                  const QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1824                  QString sOldMessagesFont    = m_pOptions->sMessagesFont;                  const bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1825                  bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;                  const int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1826                  bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;                  const QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1827                  int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;                  const bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1828                  int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;                  const bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1829                  bool    bOldCompletePath    = m_pOptions->bCompletePath;                  const int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1830                  bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;                  const int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1831                  int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;                  const bool    bOldCompletePath    = m_pOptions->bCompletePath;
1832                    const bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1833                    const int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1834                    const int     iOldBaseFontSize    = m_pOptions->iBaseFontSize;
1835                  // Load the current setup settings.                  // Load the current setup settings.
1836                  pOptionsForm->setup(m_pOptions);                  pOptionsForm->setup(m_pOptions);
1837                  // Show the setup dialog...                  // Show the setup dialog...
# Line 1564  void MainForm::viewOptions (void) Line 1840  void MainForm::viewOptions (void)
1840                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1841                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1842                                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1843                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||
1844                                    (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {
1845                                  QMessageBox::information(this,                                  QMessageBox::information(this,
1846                                          QSAMPLER_TITLE ": " + tr("Information"),                                          QSAMPLER_TITLE ": " + tr("Information"),
1847                                          tr("Some settings may be only effective\n"                                          tr("Some settings may be only effective\n"
1848                                          "next time you start this program."), tr("OK"));                                          "next time you start this program."));
1849                                  updateMessagesCapture();                                  updateMessagesCapture();
1850                          }                          }
1851                          // Check wheather something immediate has changed.                          // Check wheather something immediate has changed.
1852                            if (( bOldMessagesLog && !m_pOptions->bMessagesLog) ||
1853                                    (!bOldMessagesLog &&  m_pOptions->bMessagesLog) ||
1854                                    (sOldMessagesLogPath != m_pOptions->sMessagesLogPath))
1855                                    m_pMessages->setLogging(
1856                                            m_pOptions->bMessagesLog, m_pOptions->sMessagesLogPath);
1857                          if (( bOldCompletePath && !m_pOptions->bCompletePath) ||                          if (( bOldCompletePath && !m_pOptions->bCompletePath) ||
1858                                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1859                                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
# Line 1612  void MainForm::viewOptions (void) Line 1894  void MainForm::viewOptions (void)
1894    
1895    
1896  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1897  // qsamplerMainForm -- Channels action slots.  // QSampler::MainForm -- Channels action slots.
1898    
1899  // Arrange channel strips.  // Arrange channel strips.
1900  void MainForm::channelsArrange (void)  void MainForm::channelsArrange (void)
1901  {  {
1902          // Full width vertical tiling          // Full width vertical tiling
1903          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
1904                    = m_pWorkspace->subWindowList();
1905          if (wlist.isEmpty())          if (wlist.isEmpty())
1906                  return;                  return;
1907    
1908          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1909          int y = 0;          int y = 0;
1910          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
1911                  ChannelStrip* pChannelStrip = (ChannelStrip*) wlist.at(iChannel);          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
1912          /*  if (pChannelStrip->testWState(WState_Maximized | WState_Minimized)) {                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
1913                          // Prevent flicker...                  if (pMdiSubWindow) {
1914                          pChannelStrip->hide();                          pMdiSubWindow->adjustSize();
1915                          pChannelStrip->showNormal();                          int iWidth = m_pWorkspace->width();
1916                  }   */                          if (iWidth < pMdiSubWindow->width())
1917                  pChannelStrip->adjustSize();                                  iWidth = pMdiSubWindow->width();
1918                  int iWidth  = m_pWorkspace->width();                          const int iHeight = pMdiSubWindow->frameGeometry().height();
1919                  if (iWidth < pChannelStrip->width())                          pMdiSubWindow->setGeometry(0, y, iWidth, iHeight);
1920                          iWidth = pChannelStrip->width();                          y += iHeight;
1921          //  int iHeight = pChannelStrip->height()                  }
         //              + pChannelStrip->parentWidget()->baseSize().height();  
                 int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();  
                 pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);  
                 y += iHeight;  
1922          }          }
1923          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1924    
# Line 1657  void MainForm::channelsAutoArrange ( boo Line 1936  void MainForm::channelsAutoArrange ( boo
1936          m_pOptions->bAutoArrange = bOn;          m_pOptions->bAutoArrange = bOn;
1937    
1938          // If on, update whole workspace...          // If on, update whole workspace...
1939          if (m_pOptions->bAutoArrange)          channelsArrangeAuto();
1940    }
1941    
1942    
1943    void MainForm::channelsArrangeAuto (void)
1944    {
1945            if (m_pOptions && m_pOptions->bAutoArrange)
1946                  channelsArrange();                  channelsArrange();
1947  }  }
1948    
1949    
1950  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
1951  // qsamplerMainForm -- Help Action slots.  // QSampler::MainForm -- Help Action slots.
1952    
1953  // Show information about the Qt toolkit.  // Show information about the Qt toolkit.
1954  void MainForm::helpAboutQt (void)  void MainForm::helpAboutQt (void)
# Line 1726  void MainForm::helpAbout (void) Line 2011  void MainForm::helpAbout (void)
2011          sText += tr("Instrument editing support disabled.");          sText += tr("Instrument editing support disabled.");
2012          sText += "</font></small><br />";          sText += "</font></small><br />";
2013  #endif  #endif
2014    #ifndef CONFIG_EVENT_CHANNEL_MIDI
2015            sText += "<small><font color=\"red\">";
2016            sText += tr("Channel MIDI event support disabled.");
2017            sText += "</font></small><br />";
2018    #endif
2019    #ifndef CONFIG_EVENT_DEVICE_MIDI
2020            sText += "<small><font color=\"red\">";
2021            sText += tr("Device MIDI event support disabled.");
2022            sText += "</font></small><br />";
2023    #endif
2024    #ifndef CONFIG_MAX_VOICES
2025            sText += "<small><font color=\"red\">";
2026            sText += tr("Runtime max. voices / disk streams support disabled.");
2027            sText += "</font></small><br />";
2028    #endif
2029          sText += "<br />\n";          sText += "<br />\n";
2030          sText += tr("Using") + ": ";          sText += tr("Using") + ": ";
2031          sText += ::lscp_client_package();          sText += ::lscp_client_package();
# Line 1755  void MainForm::helpAbout (void) Line 2055  void MainForm::helpAbout (void)
2055    
2056    
2057  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2058  // qsamplerMainForm -- Main window stabilization.  // QSampler::MainForm -- Main window stabilization.
2059    
2060  void MainForm::stabilizeForm (void)  void MainForm::stabilizeForm (void)
2061  {  {
# Line 1766  void MainForm::stabilizeForm (void) Line 2066  void MainForm::stabilizeForm (void)
2066          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
2067    
2068          // Update the main menu state...          // Update the main menu state...
2069          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
2070          bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);          const QList<QMdiSubWindow *>& wlist = m_pWorkspace->subWindowList();
2071          bool bHasChannel = (bHasClient && pChannelStrip != NULL);          const bool bHasClient = (m_pOptions != NULL && m_pClient != NULL);
2072            const bool bHasChannel = (bHasClient && pChannelStrip != NULL);
2073            const bool bHasChannels = (bHasClient && wlist.count() > 0);
2074          m_ui.fileNewAction->setEnabled(bHasClient);          m_ui.fileNewAction->setEnabled(bHasClient);
2075          m_ui.fileOpenAction->setEnabled(bHasClient);          m_ui.fileOpenAction->setEnabled(bHasClient);
2076          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
# Line 1784  void MainForm::stabilizeForm (void) Line 2086  void MainForm::stabilizeForm (void)
2086          m_ui.editEditChannelAction->setEnabled(false);          m_ui.editEditChannelAction->setEnabled(false);
2087  #endif  #endif
2088          m_ui.editResetChannelAction->setEnabled(bHasChannel);          m_ui.editResetChannelAction->setEnabled(bHasChannel);
2089          m_ui.editResetAllChannelsAction->setEnabled(bHasChannel);          m_ui.editResetAllChannelsAction->setEnabled(bHasChannels);
2090          m_ui.viewMessagesAction->setChecked(m_pMessages && m_pMessages->isVisible());          m_ui.viewMessagesAction->setChecked(m_pMessages && m_pMessages->isVisible());
2091  #ifdef CONFIG_MIDI_INSTRUMENT  #ifdef CONFIG_MIDI_INSTRUMENT
2092          m_ui.viewInstrumentsAction->setChecked(m_pInstrumentListForm          m_ui.viewInstrumentsAction->setChecked(m_pInstrumentListForm
# Line 1796  void MainForm::stabilizeForm (void) Line 2098  void MainForm::stabilizeForm (void)
2098          m_ui.viewDevicesAction->setChecked(m_pDeviceForm          m_ui.viewDevicesAction->setChecked(m_pDeviceForm
2099                  && m_pDeviceForm->isVisible());                  && m_pDeviceForm->isVisible());
2100          m_ui.viewDevicesAction->setEnabled(bHasClient);          m_ui.viewDevicesAction->setEnabled(bHasClient);
2101          m_ui.channelsArrangeAction->setEnabled(bHasChannel);          m_ui.viewMidiDeviceStatusMenu->setEnabled(
2102                    DeviceStatusForm::getInstances().size() > 0);
2103            m_ui.channelsArrangeAction->setEnabled(bHasChannels);
2104    
2105  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
2106          // Toolbar widgets are also affected...          // Toolbar widgets are also affected...
# Line 1846  void MainForm::volumeChanged ( int iVolu Line 2150  void MainForm::volumeChanged ( int iVolu
2150                  m_pVolumeSpinBox->setValue(iVolume);                  m_pVolumeSpinBox->setValue(iVolume);
2151    
2152          // Do it as commanded...          // Do it as commanded...
2153          float fVolume = 0.01f * float(iVolume);          const float fVolume = 0.01f * float(iVolume);
2154          if (::lscp_set_volume(m_pClient, fVolume) == LSCP_OK)          if (::lscp_set_volume(m_pClient, fVolume) == LSCP_OK)
2155                  appendMessages(QObject::tr("Volume: %1.").arg(fVolume));                  appendMessages(QObject::tr("Volume: %1.").arg(fVolume));
2156          else          else
# Line 1862  void MainForm::volumeChanged ( int iVolu Line 2166  void MainForm::volumeChanged ( int iVolu
2166    
2167    
2168  // Channel change receiver slot.  // Channel change receiver slot.
2169  void MainForm::channelStripChanged(ChannelStrip* pChannelStrip)  void MainForm::channelStripChanged ( ChannelStrip *pChannelStrip )
2170  {  {
2171          // Add this strip to the changed list...          // Add this strip to the changed list...
2172          if (!m_changedStrips.contains(pChannelStrip)) {          if (!m_changedStrips.contains(pChannelStrip)) {
# Line 1881  void MainForm::channelStripChanged(Chann Line 2185  void MainForm::channelStripChanged(Chann
2185  void MainForm::updateSession (void)  void MainForm::updateSession (void)
2186  {  {
2187  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
2188          int iVolume = ::lroundf(100.0f * ::lscp_get_volume(m_pClient));          const int iVolume = ::lroundf(100.0f * ::lscp_get_volume(m_pClient));
2189          m_iVolumeChanging++;          m_iVolumeChanging++;
2190          m_pVolumeSlider->setValue(iVolume);          m_pVolumeSlider->setValue(iVolume);
2191          m_pVolumeSpinBox->setValue(iVolume);          m_pVolumeSpinBox->setValue(iVolume);
# Line 1889  void MainForm::updateSession (void) Line 2193  void MainForm::updateSession (void)
2193  #endif  #endif
2194  #ifdef CONFIG_MIDI_INSTRUMENT  #ifdef CONFIG_MIDI_INSTRUMENT
2195          // FIXME: Make some room for default instrument maps...          // FIXME: Make some room for default instrument maps...
2196          int iMaps = ::lscp_get_midi_instrument_maps(m_pClient);          const int iMaps = ::lscp_get_midi_instrument_maps(m_pClient);
2197          if (iMaps < 0)          if (iMaps < 0)
2198                  appendMessagesClient("lscp_get_midi_instrument_maps");                  appendMessagesClient("lscp_get_midi_instrument_maps");
2199          else if (iMaps < 1) {          else if (iMaps < 1) {
# Line 1900  void MainForm::updateSession (void) Line 2204  void MainForm::updateSession (void)
2204          }          }
2205  #endif  #endif
2206    
2207            updateAllChannelStrips(false);
2208    
2209            // Do we auto-arrange?
2210            channelsArrangeAuto();
2211    
2212            // Remember to refresh devices and instruments...
2213            if (m_pInstrumentListForm)
2214                    m_pInstrumentListForm->refreshInstruments();
2215            if (m_pDeviceForm)
2216                    m_pDeviceForm->refreshDevices();
2217    }
2218    
2219    
2220    void MainForm::updateAllChannelStrips ( bool bRemoveDeadStrips )
2221    {
2222            // Skip if setting up a new channel strip...
2223            if (m_iDirtySetup > 0)
2224                    return;
2225    
2226          // Retrieve the current channel list.          // Retrieve the current channel list.
2227          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
2228          if (piChannelIDs == NULL) {          if (piChannelIDs == NULL) {
# Line 1911  void MainForm::updateSession (void) Line 2234  void MainForm::updateSession (void)
2234          } else {          } else {
2235                  // Try to (re)create each channel.                  // Try to (re)create each channel.
2236                  m_pWorkspace->setUpdatesEnabled(false);                  m_pWorkspace->setUpdatesEnabled(false);
2237                  for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {                  for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {
2238                          // Check if theres already a channel strip for this one...                          // Check if theres already a channel strip for this one...
2239                          if (!channelStrip(piChannelIDs[iChannel]))                          if (!channelStrip(piChannelIDs[iChannel]))
2240                                  createChannelStrip(new qsamplerChannel(piChannelIDs[iChannel]));                                  createChannelStrip(new Channel(piChannelIDs[iChannel]));
2241                    }
2242                    // Do we auto-arrange?
2243                    channelsArrangeAuto();
2244                    // remove dead channel strips
2245                    if (bRemoveDeadStrips) {
2246                            const QList<QMdiSubWindow *>& wlist
2247                                    = m_pWorkspace->subWindowList();
2248                            const int iStripCount = wlist.count();
2249                            for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2250                                    ChannelStrip *pChannelStrip = NULL;
2251                                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2252                                    if (pMdiSubWindow)
2253                                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2254                                    if (pChannelStrip) {
2255                                            bool bExists = false;
2256                                            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {
2257                                                    Channel *pChannel = pChannelStrip->channel();
2258                                                    if (pChannel == NULL)
2259                                                            break;
2260                                                    if (piChannelIDs[iChannel] == pChannel->channelID()) {
2261                                                            // strip exists, don't touch it
2262                                                            bExists = true;
2263                                                            break;
2264                                                    }
2265                                            }
2266                                            if (!bExists)
2267                                                    destroyChannelStrip(pChannelStrip);
2268                                    }
2269                            }
2270                  }                  }
2271                  m_pWorkspace->setUpdatesEnabled(true);                  m_pWorkspace->setUpdatesEnabled(true);
2272          }          }
2273    
2274          // Do we auto-arrange?          stabilizeForm();
         if (m_pOptions && m_pOptions->bAutoArrange)  
                 channelsArrange();  
   
         // Remember to refresh devices and instruments...  
         if (m_pInstrumentListForm)  
                 m_pInstrumentListForm->refreshInstruments();  
         if (m_pDeviceForm)  
                 m_pDeviceForm->refreshDevices();  
2275  }  }
2276    
2277    
# Line 1938  void MainForm::updateRecentFiles ( const Line 2282  void MainForm::updateRecentFiles ( const
2282                  return;                  return;
2283    
2284          // Remove from list if already there (avoid duplicates)          // Remove from list if already there (avoid duplicates)
2285          int iIndex = m_pOptions->recentFiles.indexOf(sFilename);          const int iIndex = m_pOptions->recentFiles.indexOf(sFilename);
2286          if (iIndex >= 0)          if (iIndex >= 0)
2287                  m_pOptions->recentFiles.removeAt(iIndex);                  m_pOptions->recentFiles.removeAt(iIndex);
2288          // Put it to front...          // Put it to front...
# Line 1977  void MainForm::updateRecentFilesMenu (vo Line 2321  void MainForm::updateRecentFilesMenu (vo
2321  void MainForm::updateInstrumentNames (void)  void MainForm::updateInstrumentNames (void)
2322  {  {
2323          // Full channel list update...          // Full channel list update...
2324          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2325                    = m_pWorkspace->subWindowList();
2326          if (wlist.isEmpty())          if (wlist.isEmpty())
2327                  return;                  return;
2328    
2329          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2330          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
2331                  ChannelStrip *pChannelStrip = (ChannelStrip *) wlist.at(iChannel);          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2332                    ChannelStrip *pChannelStrip = NULL;
2333                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2334                    if (pMdiSubWindow)
2335                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2336                  if (pChannelStrip)                  if (pChannelStrip)
2337                          pChannelStrip->updateInstrumentName(true);                          pChannelStrip->updateInstrumentName(true);
2338          }          }
# Line 2000  void MainForm::updateDisplayFont (void) Line 2349  void MainForm::updateDisplayFont (void)
2349          // Check if display font is legal.          // Check if display font is legal.
2350          if (m_pOptions->sDisplayFont.isEmpty())          if (m_pOptions->sDisplayFont.isEmpty())
2351                  return;                  return;
2352    
2353          // Realize it.          // Realize it.
2354          QFont font;          QFont font;
2355          if (!font.fromString(m_pOptions->sDisplayFont))          if (!font.fromString(m_pOptions->sDisplayFont))
2356                  return;                  return;
2357    
2358          // Full channel list update...          // Full channel list update...
2359          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2360                    = m_pWorkspace->subWindowList();
2361          if (wlist.isEmpty())          if (wlist.isEmpty())
2362                  return;                  return;
2363    
2364          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2365          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
2366                  ChannelStrip* pChannelStrip = (ChannelStrip*) wlist.at(iChannel);          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2367                    ChannelStrip *pChannelStrip = NULL;
2368                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2369                    if (pMdiSubWindow)
2370                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2371                  if (pChannelStrip)                  if (pChannelStrip)
2372                          pChannelStrip->setDisplayFont(font);                          pChannelStrip->setDisplayFont(font);
2373          }          }
# Line 2024  void MainForm::updateDisplayFont (void) Line 2379  void MainForm::updateDisplayFont (void)
2379  void MainForm::updateDisplayEffect (void)  void MainForm::updateDisplayEffect (void)
2380  {  {
2381          // Full channel list update...          // Full channel list update...
2382          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2383                    = m_pWorkspace->subWindowList();
2384          if (wlist.isEmpty())          if (wlist.isEmpty())
2385                  return;                  return;
2386    
2387          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2388          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
2389                  ChannelStrip* pChannelStrip = (ChannelStrip*) wlist.at(iChannel);          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2390                    ChannelStrip *pChannelStrip = NULL;
2391                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2392                    if (pMdiSubWindow)
2393                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2394                  if (pChannelStrip)                  if (pChannelStrip)
2395                          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);                          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
2396          }          }
# Line 2052  void MainForm::updateMaxVolume (void) Line 2412  void MainForm::updateMaxVolume (void)
2412  #endif  #endif
2413    
2414          // Full channel list update...          // Full channel list update...
2415          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2416                    = m_pWorkspace->subWindowList();
2417          if (wlist.isEmpty())          if (wlist.isEmpty())
2418                  return;                  return;
2419    
2420          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2421          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
2422                  ChannelStrip* pChannelStrip = (ChannelStrip*) wlist.at(iChannel);          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2423                    ChannelStrip *pChannelStrip = NULL;
2424                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2425                    if (pMdiSubWindow)
2426                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2427                  if (pChannelStrip)                  if (pChannelStrip)
2428                          pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);                          pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
2429          }          }
# Line 2067  void MainForm::updateMaxVolume (void) Line 2432  void MainForm::updateMaxVolume (void)
2432    
2433    
2434  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2435  // qsamplerMainForm -- Messages window form handlers.  // QSampler::MainForm -- Messages window form handlers.
2436    
2437  // Messages output methods.  // Messages output methods.
2438  void MainForm::appendMessages( const QString& s )  void MainForm::appendMessages( const QString& s )
# Line 2092  void MainForm::appendMessagesText( const Line 2457  void MainForm::appendMessagesText( const
2457                  m_pMessages->appendMessagesText(s);                  m_pMessages->appendMessagesText(s);
2458  }  }
2459    
2460  void MainForm::appendMessagesError( const QString& s )  void MainForm::appendMessagesError( const QString& sText )
2461  {  {
2462          if (m_pMessages)          if (m_pMessages)
2463                  m_pMessages->show();                  m_pMessages->show();
2464    
2465          appendMessagesColor(s.simplified(), "#ff0000");          appendMessagesColor(sText.simplified(), "#ff0000");
2466    
2467          // Make it look responsive...:)          // Make it look responsive...:)
2468          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2469    
2470          QMessageBox::critical(this,          if (m_pOptions && m_pOptions->bConfirmError) {
2471                  QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Error");
2472            #if 0
2473                    QMessageBox::critical(this, sTitle, sText, QMessageBox::Cancel);
2474            #else
2475                    QMessageBox mbox(this);
2476                    mbox.setIcon(QMessageBox::Critical);
2477                    mbox.setWindowTitle(sTitle);
2478                    mbox.setText(sText);
2479                    mbox.setStandardButtons(QMessageBox::Cancel);
2480                    QCheckBox cbox(tr("Don't show this again"));
2481                    cbox.setChecked(false);
2482                    cbox.blockSignals(true);
2483                    mbox.addButton(&cbox, QMessageBox::ActionRole);
2484                    if (mbox.exec() && cbox.isChecked())
2485                            m_pOptions->bConfirmError = false;
2486            #endif
2487            }
2488  }  }
2489    
2490    
# Line 2163  void MainForm::updateMessagesCapture (vo Line 2544  void MainForm::updateMessagesCapture (vo
2544    
2545    
2546  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2547  // qsamplerMainForm -- MDI channel strip management.  // QSampler::MainForm -- MDI channel strip management.
2548    
2549  // The channel strip creation executive.  // The channel strip creation executive.
2550  ChannelStrip* MainForm::createChannelStrip(qsamplerChannel* pChannel)  ChannelStrip *MainForm::createChannelStrip ( Channel *pChannel )
2551  {  {
2552          if (m_pClient == NULL || pChannel == NULL)          if (m_pClient == NULL || pChannel == NULL)
2553                  return NULL;                  return NULL;
2554    
         // Prepare for auto-arrange?  
         ChannelStrip* pChannelStrip = NULL;  
         int y = 0;  
         if (m_pOptions && m_pOptions->bAutoArrange) {  
                 QWidgetList wlist = m_pWorkspace->windowList();  
                 for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {  
                         pChannelStrip = static_cast<ChannelStrip *> (wlist.at(iChannel));  
                         if (pChannelStrip) {  
                         //  y += pChannelStrip->height()  
                         //              + pChannelStrip->parentWidget()->baseSize().height();  
                                 y += pChannelStrip->parentWidget()->frameGeometry().height();  
                         }  
                 }  
         }  
   
2555          // Add a new channel itema...          // Add a new channel itema...
2556          pChannelStrip = new ChannelStrip();          ChannelStrip *pChannelStrip = new ChannelStrip();
2557          if (pChannelStrip == NULL)          if (pChannelStrip == NULL)
2558                  return NULL;                  return NULL;
2559    
2560          m_pWorkspace->addWindow(pChannelStrip, Qt::FramelessWindowHint);          // Set some initial channel strip options...
   
         // Actual channel strip setup...  
         pChannelStrip->setup(pChannel);  
         QObject::connect(pChannelStrip,  
                 SIGNAL(channelChanged(ChannelStrip*)),  
                 SLOT(channelStripChanged(ChannelStrip*)));  
         // Set some initial aesthetic options...  
2561          if (m_pOptions) {          if (m_pOptions) {
2562                  // Background display effect...                  // Background display effect...
2563                  pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);                  pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
2564                  // We'll need a display font.                  // We'll need a display font.
2565                  QFont font;                  QFont font;
2566                  if (font.fromString(m_pOptions->sDisplayFont))                  if (!m_pOptions->sDisplayFont.isEmpty() &&
2567                            font.fromString(m_pOptions->sDisplayFont))
2568                          pChannelStrip->setDisplayFont(font);                          pChannelStrip->setDisplayFont(font);
2569                  // Maximum allowed volume setting.                  // Maximum allowed volume setting.
2570                  pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);                  pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
2571          }          }
2572    
2573            // Add it to workspace...
2574            m_pWorkspace->addSubWindow(pChannelStrip,
2575                    Qt::SubWindow | Qt::FramelessWindowHint);
2576    
2577            // Actual channel strip setup...
2578            pChannelStrip->setup(pChannel);
2579    
2580            QObject::connect(pChannelStrip,
2581                    SIGNAL(channelChanged(ChannelStrip *)),
2582                    SLOT(channelStripChanged(ChannelStrip *)));
2583    
2584          // Now we show up us to the world.          // Now we show up us to the world.
2585          pChannelStrip->show();          pChannelStrip->show();
         // Only then, we'll auto-arrange...  
         if (m_pOptions && m_pOptions->bAutoArrange) {  
                 int iWidth  = m_pWorkspace->width();  
         //  int iHeight = pChannel->height()  
         //              + pChannel->parentWidget()->baseSize().height();  
                 int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();  
                 pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);  
         }  
2586    
2587          // This is pretty new, so we'll watch for it closely.          // This is pretty new, so we'll watch for it closely.
2588          channelStripChanged(pChannelStrip);          channelStripChanged(pChannelStrip);
# Line 2229  ChannelStrip* MainForm::createChannelStr Line 2592  ChannelStrip* MainForm::createChannelStr
2592  }  }
2593    
2594    
2595    void MainForm::destroyChannelStrip ( ChannelStrip *pChannelStrip )
2596    {
2597            QMdiSubWindow *pMdiSubWindow
2598                    = static_cast<QMdiSubWindow *> (pChannelStrip->parentWidget());
2599            if (pMdiSubWindow == NULL)
2600                    return;
2601    
2602            // Just delete the channel strip.
2603            delete pChannelStrip;
2604            delete pMdiSubWindow;
2605    
2606            // Do we auto-arrange?
2607            channelsArrangeAuto();
2608    }
2609    
2610    
2611  // Retrieve the active channel strip.  // Retrieve the active channel strip.
2612  ChannelStrip* MainForm::activeChannelStrip (void)  ChannelStrip *MainForm::activeChannelStrip (void)
2613  {  {
2614          return static_cast<ChannelStrip *> (m_pWorkspace->activeWindow());          QMdiSubWindow *pMdiSubWindow = m_pWorkspace->activeSubWindow();
2615            if (pMdiSubWindow)
2616                    return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2617            else
2618                    return NULL;
2619  }  }
2620    
2621    
2622  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
2623  ChannelStrip* MainForm::channelStripAt ( int iChannel )  ChannelStrip *MainForm::channelStripAt ( int iStrip )
2624  {  {
2625          QWidgetList wlist = m_pWorkspace->windowList();          if (!m_pWorkspace) return NULL;
2626    
2627            const QList<QMdiSubWindow *>& wlist
2628                    = m_pWorkspace->subWindowList();
2629          if (wlist.isEmpty())          if (wlist.isEmpty())
2630                  return NULL;                  return NULL;
2631    
2632          return static_cast<ChannelStrip *> (wlist.at(iChannel));          if (iStrip < 0 || iStrip >= wlist.count())
2633                    return NULL;
2634    
2635            QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2636            if (pMdiSubWindow)
2637                    return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2638            else
2639                    return NULL;
2640  }  }
2641    
2642    
2643  // Retrieve a channel strip by sampler channel id.  // Retrieve a channel strip by sampler channel id.
2644  ChannelStrip* MainForm::channelStrip ( int iChannelID )  ChannelStrip *MainForm::channelStrip ( int iChannelID )
2645  {  {
2646          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2647                    = m_pWorkspace->subWindowList();
2648          if (wlist.isEmpty())          if (wlist.isEmpty())
2649                  return NULL;                  return NULL;
2650    
2651          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          const int iStripCount = wlist.count();
2652                  ChannelStrip* pChannelStrip          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2653                          = static_cast<ChannelStrip*> (wlist.at(iChannel));                  ChannelStrip *pChannelStrip = NULL;
2654                    QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2655                    if (pMdiSubWindow)
2656                            pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2657                  if (pChannelStrip) {                  if (pChannelStrip) {
2658                          qsamplerChannel *pChannel = pChannelStrip->channel();                          Channel *pChannel = pChannelStrip->channel();
2659                          if (pChannel && pChannel->channelID() == iChannelID)                          if (pChannel && pChannel->channelID() == iChannelID)
2660                                  return pChannelStrip;                                  return pChannelStrip;
2661                  }                  }
# Line 2276  void MainForm::channelsMenuAboutToShow ( Line 2673  void MainForm::channelsMenuAboutToShow (
2673          m_ui.channelsMenu->addAction(m_ui.channelsArrangeAction);          m_ui.channelsMenu->addAction(m_ui.channelsArrangeAction);
2674          m_ui.channelsMenu->addAction(m_ui.channelsAutoArrangeAction);          m_ui.channelsMenu->addAction(m_ui.channelsAutoArrangeAction);
2675    
2676          QWidgetList wlist = m_pWorkspace->windowList();          const QList<QMdiSubWindow *>& wlist
2677                    = m_pWorkspace->subWindowList();
2678          if (!wlist.isEmpty()) {          if (!wlist.isEmpty()) {
2679                  m_ui.channelsMenu->addSeparator();                  m_ui.channelsMenu->addSeparator();
2680                  for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  const int iStripCount = wlist.count();
2681                          ChannelStrip* pChannelStrip                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2682                                  = static_cast<ChannelStrip*> (wlist.at(iChannel));                          ChannelStrip *pChannelStrip = NULL;
2683                            QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2684                            if (pMdiSubWindow)
2685                                    pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2686                          if (pChannelStrip) {                          if (pChannelStrip) {
2687                                  QAction *pAction = m_ui.channelsMenu->addAction(                                  QAction *pAction = m_ui.channelsMenu->addAction(
2688                                          pChannelStrip->windowTitle(),                                          pChannelStrip->windowTitle(),
2689                                          this, SLOT(channelsMenuActivated()));                                          this, SLOT(channelsMenuActivated()));
2690                                  pAction->setCheckable(true);                                  pAction->setCheckable(true);
2691                                  pAction->setChecked(activeChannelStrip() == pChannelStrip);                                  pAction->setChecked(activeChannelStrip() == pChannelStrip);
2692                                  pAction->setData(iChannel);                                  pAction->setData(iStrip);
2693                          }                          }
2694                  }                  }
2695          }          }
# Line 2303  void MainForm::channelsMenuActivated (vo Line 2704  void MainForm::channelsMenuActivated (vo
2704          if (pAction == NULL)          if (pAction == NULL)
2705                  return;                  return;
2706    
2707          ChannelStrip* pChannelStrip = channelStripAt(pAction->data().toInt());          ChannelStrip *pChannelStrip = channelStripAt(pAction->data().toInt());
2708          if (pChannelStrip) {          if (pChannelStrip) {
2709                  pChannelStrip->showNormal();                  pChannelStrip->showNormal();
2710                  pChannelStrip->setFocus();                  pChannelStrip->setFocus();
# Line 2312  void MainForm::channelsMenuActivated (vo Line 2713  void MainForm::channelsMenuActivated (vo
2713    
2714    
2715  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2716  // qsamplerMainForm -- Timer stuff.  // QSampler::MainForm -- Timer stuff.
2717    
2718  // Set the pseudo-timer delay schedule.  // Set the pseudo-timer delay schedule.
2719  void MainForm::startSchedule ( int iStartDelay )  void MainForm::startSchedule ( int iStartDelay )
# Line 2353  void MainForm::timerSlot (void) Line 2754  void MainForm::timerSlot (void)
2754                          ChannelStrip *pChannelStrip = iter.next();                          ChannelStrip *pChannelStrip = iter.next();
2755                          // If successfull, remove from pending list...                          // If successfull, remove from pending list...
2756                          if (pChannelStrip->updateChannelInfo()) {                          if (pChannelStrip->updateChannelInfo()) {
2757                                  int iChannelStrip = m_changedStrips.indexOf(pChannelStrip);                                  const int iChannelStrip = m_changedStrips.indexOf(pChannelStrip);
2758                                  if (iChannelStrip >= 0)                                  if (iChannelStrip >= 0)
2759                                          m_changedStrips.removeAt(iChannelStrip);                                          m_changedStrips.removeAt(iChannelStrip);
2760                          }                          }
# Line 2364  void MainForm::timerSlot (void) Line 2765  void MainForm::timerSlot (void)
2765                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
2766                                  m_iTimerSlot = 0;                                  m_iTimerSlot = 0;
2767                                  // Update the channel stream usage for each strip...                                  // Update the channel stream usage for each strip...
2768                                  QWidgetList wlist = m_pWorkspace->windowList();                                  const QList<QMdiSubWindow *>& wlist
2769                                  for (int iChannel = 0;                                          = m_pWorkspace->subWindowList();
2770                                                  iChannel < (int) wlist.count(); iChannel++) {                                  const int iStripCount = wlist.count();
2771                                          ChannelStrip* pChannelStrip                                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2772                                                  = (ChannelStrip*) wlist.at(iChannel);                                          ChannelStrip *pChannelStrip = NULL;
2773                                            QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2774                                            if (pMdiSubWindow)
2775                                                    pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2776                                          if (pChannelStrip && pChannelStrip->isVisible())                                          if (pChannelStrip && pChannelStrip->isVisible())
2777                                                  pChannelStrip->updateChannelUsage();                                                  pChannelStrip->updateChannelUsage();
2778                                  }                                  }
# Line 2382  void MainForm::timerSlot (void) Line 2786  void MainForm::timerSlot (void)
2786    
2787    
2788  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2789  // qsamplerMainForm -- Server stuff.  // QSampler::MainForm -- Server stuff.
2790    
2791  // Start linuxsampler server...  // Start linuxsampler server...
2792  void MainForm::startServer (void)  void MainForm::startServer (void)
# Line 2396  void MainForm::startServer (void) Line 2800  void MainForm::startServer (void)
2800    
2801          // Is the server process instance still here?          // Is the server process instance still here?
2802          if (m_pServer) {          if (m_pServer) {
2803                  switch (QMessageBox::warning(this,                  if (QMessageBox::warning(this,
2804                          QSAMPLER_TITLE ": " + tr("Warning"),                          QSAMPLER_TITLE ": " + tr("Warning"),
2805                          tr("Could not start the LinuxSampler server.\n\n"                          tr("Could not start the LinuxSampler server.\n\n"
2806                          "Maybe it ss already started."),                          "Maybe it is already started."),
2807                          tr("Stop"), tr("Kill"), tr("Cancel"))) {                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
                 case 0:  
2808                          m_pServer->terminate();                          m_pServer->terminate();
                         break;  
                 case 1:  
2809                          m_pServer->kill();                          m_pServer->kill();
                         break;  
2810                  }                  }
2811                  return;                  return;
2812          }          }
# Line 2419  void MainForm::startServer (void) Line 2819  void MainForm::startServer (void)
2819                  return;                  return;
2820    
2821          // OK. Let's build the startup process...          // OK. Let's build the startup process...
2822          m_pServer = new QProcess(this);          m_pServer = new QProcess();
2823            bForceServerStop = true;
2824    
2825          // Setup stdout/stderr capture...          // Setup stdout/stderr capture...
2826  //      if (m_pOptions->bStdoutCapture) {          m_pServer->setProcessChannelMode(QProcess::ForwardedChannels);
2827                  //m_pServer->setProcessChannelMode(          QObject::connect(m_pServer,
2828                  //      QProcess::StandardOutput);                  SIGNAL(readyReadStandardOutput()),
2829                  QObject::connect(m_pServer,                  SLOT(readServerStdout()));
2830                          SIGNAL(readyReadStandardOutput()),          QObject::connect(m_pServer,
2831                          SLOT(readServerStdout()));                  SIGNAL(readyReadStandardError()),
2832                  QObject::connect(m_pServer,                  SLOT(readServerStdout()));
                         SIGNAL(readyReadStandardError()),  
                         SLOT(readServerStdout()));  
 //      }  
2833    
2834          // The unforgiveable signal communication...          // The unforgiveable signal communication...
2835          QObject::connect(m_pServer,          QObject::connect(m_pServer,
2836                  SIGNAL(finished(int,QProcess::ExitStatus)),                  SIGNAL(finished(int, QProcess::ExitStatus)),
2837                  SLOT(processServerExit()));                  SLOT(processServerExit()));
2838    
2839          // Build process arguments...          // Build process arguments...
# Line 2466  void MainForm::startServer (void) Line 2864  void MainForm::startServer (void)
2864    
2865    
2866  // Stop linuxsampler server...  // Stop linuxsampler server...
2867  void MainForm::stopServer (void)  void MainForm::stopServer (bool bInteractive)
2868  {  {
2869          // Stop client code.          // Stop client code.
2870          stopClient();          stopClient();
2871    
2872            if (m_pServer && bInteractive) {
2873                    if (QMessageBox::question(this,
2874                            QSAMPLER_TITLE ": " + tr("The backend's fate ..."),
2875                            tr("You have the option to keep the sampler backend (LinuxSampler)\n"
2876                            "running in the background. The sampler would continue to work\n"
2877                            "according to your current sampler session and you could alter the\n"
2878                            "sampler session at any time by relaunching QSampler.\n\n"
2879                            "Do you want LinuxSampler to stop?"),
2880                            QMessageBox::Yes | QMessageBox::No,
2881                            QMessageBox::Yes) == QMessageBox::No)
2882                    {
2883                            bForceServerStop = false;
2884                    }
2885            }
2886    
2887          // And try to stop server.          // And try to stop server.
2888          if (m_pServer) {          if (m_pServer && bForceServerStop) {
2889                  appendMessages(tr("Server is stopping..."));                  appendMessages(tr("Server is stopping..."));
2890                  if (m_pServer->state() == QProcess::Running)                  if (m_pServer->state() == QProcess::Running) {
2891                    #if defined(WIN32)
2892                            // Try harder...
2893                            m_pServer->kill();
2894                    #else
2895                            // Try softly...
2896                          m_pServer->terminate();                          m_pServer->terminate();
2897          }                  #endif
2898                    }
2899            }       // Do final processing anyway.
2900            else processServerExit();
2901    
2902          // Give it some time to terminate gracefully and stabilize...          // Give it some time to terminate gracefully and stabilize...
2903          QTime t;          QTime t;
2904          t.start();          t.start();
2905          while (t.elapsed() < QSAMPLER_TIMER_MSECS)          while (t.elapsed() < QSAMPLER_TIMER_MSECS)
2906                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
   
         // Do final processing anyway.  
         processServerExit();  
2907  }  }
2908    
2909    
# Line 2507  void MainForm::processServerExit (void) Line 2925  void MainForm::processServerExit (void)
2925          if (m_pMessages)          if (m_pMessages)
2926                  m_pMessages->flushStdoutBuffer();                  m_pMessages->flushStdoutBuffer();
2927    
2928          if (m_pServer) {          if (m_pServer && bForceServerStop) {
2929                    if (m_pServer->state() != QProcess::NotRunning) {
2930                            appendMessages(tr("Server is being forced..."));
2931                            // Force final server shutdown...
2932                            m_pServer->kill();
2933                            // Give it some time to terminate gracefully and stabilize...
2934                            QTime t;
2935                            t.start();
2936                            while (t.elapsed() < QSAMPLER_TIMER_MSECS)
2937                                    QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2938                    }
2939                  // Force final server shutdown...                  // Force final server shutdown...
2940                  appendMessages(                  appendMessages(
2941                          tr("Server was stopped with exit status %1.")                          tr("Server was stopped with exit status %1.")
2942                          .arg(m_pServer->exitStatus()));                          .arg(m_pServer->exitStatus()));
                 m_pServer->terminate();  
                 if (!m_pServer->waitForFinished(2000))  
                         m_pServer->kill();  
                 // Destroy it.  
2943                  delete m_pServer;                  delete m_pServer;
2944                  m_pServer = NULL;                  m_pServer = NULL;
2945          }          }
# Line 2526  void MainForm::processServerExit (void) Line 2950  void MainForm::processServerExit (void)
2950    
2951    
2952  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
2953  // qsamplerMainForm -- Client stuff.  // QSampler::MainForm -- Client stuff.
2954    
2955  // The LSCP client callback procedure.  // The LSCP client callback procedure.
2956  lscp_status_t qsampler_client_callback ( lscp_client_t */*pClient*/,  lscp_status_t qsampler_client_callback ( lscp_client_t */*pClient*/,
# Line 2540  lscp_status_t qsampler_client_callback ( Line 2964  lscp_status_t qsampler_client_callback (
2964          // as this is run under some other thread context.          // as this is run under some other thread context.
2965          // A custom event must be posted here...          // A custom event must be posted here...
2966          QApplication::postEvent(pMainForm,          QApplication::postEvent(pMainForm,
2967                  new qsamplerCustomEvent(event, pchData, cchData));                  new LscpEvent(event, pchData, cchData));
2968    
2969          return LSCP_OK;          return LSCP_OK;
2970  }  }
# Line 2585  bool MainForm::startClient (void) Line 3009  bool MainForm::startClient (void)
3009                  .arg(::lscp_client_get_timeout(m_pClient)));                  .arg(::lscp_client_get_timeout(m_pClient)));
3010    
3011          // Subscribe to channel info change notifications...          // Subscribe to channel info change notifications...
3012            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT) != LSCP_OK)
3013                    appendMessagesClient("lscp_client_subscribe(CHANNEL_COUNT)");
3014          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
3015                  appendMessagesClient("lscp_client_subscribe");                  appendMessagesClient("lscp_client_subscribe(CHANNEL_INFO)");
3016    
3017            DeviceStatusForm::onDevicesChanged(); // initialize
3018            updateViewMidiDeviceStatusMenu();
3019            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_COUNT) != LSCP_OK)
3020                    appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_COUNT)");
3021            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO) != LSCP_OK)
3022                    appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_INFO)");
3023            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT) != LSCP_OK)
3024                    appendMessagesClient("lscp_client_subscribe(AUDIO_OUTPUT_DEVICE_COUNT)");
3025            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO) != LSCP_OK)
3026                    appendMessagesClient("lscp_client_subscribe(AUDIO_OUTPUT_DEVICE_INFO)");
3027    
3028    #if CONFIG_EVENT_CHANNEL_MIDI
3029            // Subscribe to channel MIDI data notifications...
3030            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI) != LSCP_OK)
3031                    appendMessagesClient("lscp_client_subscribe(CHANNEL_MIDI)");
3032    #endif
3033    
3034    #if CONFIG_EVENT_DEVICE_MIDI
3035            // Subscribe to channel MIDI data notifications...
3036            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI) != LSCP_OK)
3037                    appendMessagesClient("lscp_client_subscribe(DEVICE_MIDI)");
3038    #endif
3039    
3040          // We may stop scheduling around.          // We may stop scheduling around.
3041          stopSchedule();          stopSchedule();
# Line 2613  bool MainForm::startClient (void) Line 3062  bool MainForm::startClient (void)
3062                  }                  }
3063          }          }
3064    
3065            // send the current / loaded fine tuning settings to the sampler
3066            m_pOptions->sendFineTuningSettings();
3067    
3068          // Make a new session          // Make a new session
3069          return newSession();          return newSession();
3070  }  }
# Line 2640  void MainForm::stopClient (void) Line 3092  void MainForm::stopClient (void)
3092          closeSession(false);          closeSession(false);
3093    
3094          // Close us as a client...          // Close us as a client...
3095    #if CONFIG_EVENT_DEVICE_MIDI
3096            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI);
3097    #endif
3098    #if CONFIG_EVENT_CHANNEL_MIDI
3099            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI);
3100    #endif
3101            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO);
3102            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT);
3103            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO);
3104            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_COUNT);
3105          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
3106            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);
3107          ::lscp_client_destroy(m_pClient);          ::lscp_client_destroy(m_pClient);
3108          m_pClient = NULL;          m_pClient = NULL;
3109    
# Line 2658  void MainForm::stopClient (void) Line 3121  void MainForm::stopClient (void)
3121          stabilizeForm();          stabilizeForm();
3122  }  }
3123    
3124    
3125    // Channel strip activation/selection.
3126    void MainForm::activateStrip ( QMdiSubWindow *pMdiSubWindow )
3127    {
3128            ChannelStrip *pChannelStrip = NULL;
3129            if (pMdiSubWindow)
3130                    pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
3131            if (pChannelStrip)
3132                    pChannelStrip->setSelected(true);
3133    
3134            stabilizeForm();
3135    }
3136    
3137    
3138    // Channel toolbar orientation change.
3139    void MainForm::channelsToolbarOrientation ( Qt::Orientation orientation )
3140    {
3141    #ifdef CONFIG_VOLUME
3142            m_pVolumeSlider->setOrientation(orientation);
3143            if (orientation == Qt::Horizontal) {
3144                    m_pVolumeSlider->setMinimumHeight(24);
3145                    m_pVolumeSlider->setMaximumHeight(32);
3146                    m_pVolumeSlider->setMinimumWidth(120);
3147                    m_pVolumeSlider->setMaximumWidth(640);
3148                    m_pVolumeSpinBox->setMaximumWidth(64);
3149                    m_pVolumeSpinBox->setButtonSymbols(QSpinBox::UpDownArrows);
3150            } else {
3151                    m_pVolumeSlider->setMinimumHeight(120);
3152                    m_pVolumeSlider->setMaximumHeight(480);
3153                    m_pVolumeSlider->setMinimumWidth(24);
3154                    m_pVolumeSlider->setMaximumWidth(32);
3155                    m_pVolumeSpinBox->setMaximumWidth(32);
3156                    m_pVolumeSpinBox->setButtonSymbols(QSpinBox::NoButtons);
3157            }
3158    #endif
3159    }
3160    
3161    
3162  } // namespace QSampler  } // namespace QSampler
3163    
3164    

Legend:
Removed from v.1509  
changed lines
  Added in v.2979

  ViewVC Help
Powered by ViewVC