/[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 2979 by capela, Tue Aug 16 15:34:45 2016 UTC revision 4038 by capela, Sun May 15 18:43:41 2022 UTC
# Line 1  Line 1 
1  // qsamplerMainForm.cpp  // qsamplerMainForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2016, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2022, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007,2008,2015 Christian Schoenebeck     Copyright (C) 2007-2019 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 35  Line 35 
35  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
36  #include "qsamplerDeviceStatusForm.h"  #include "qsamplerDeviceStatusForm.h"
37    
38    #include "qsamplerPaletteForm.h"
39    
40    #include <QStyleFactory>
41    
42  #include <QMdiArea>  #include <QMdiArea>
43  #include <QMdiSubWindow>  #include <QMdiSubWindow>
44    
# Line 42  Line 46 
46  #include <QProcess>  #include <QProcess>
47  #include <QMessageBox>  #include <QMessageBox>
48    
 #include <QRegExp>  
49  #include <QTextStream>  #include <QTextStream>
50  #include <QFileDialog>  #include <QFileDialog>
51  #include <QFileInfo>  #include <QFileInfo>
# Line 58  Line 61 
61  #include <QTimer>  #include <QTimer>
62  #include <QDateTime>  #include <QDateTime>
63    
64  #if QT_VERSION >= 0x050000  #include <QElapsedTimer>
65    
66    #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
67  #include <QMimeData>  #include <QMimeData>
68  #endif  #endif
69    
70  #if QT_VERSION < 0x040500  #if QT_VERSION < QT_VERSION_CHECK(4, 5, 0)
71  namespace Qt {  namespace Qt {
72  const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);  const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);
73  }  }
74  #endif  #endif
75    
 #ifdef HAVE_SIGNAL_H  
 #include <signal.h>  
 #endif  
   
76  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
77    #if defined(Q_CC_GNU) || defined(Q_CC_MINGW)
78    #pragma GCC diagnostic push
79    #pragma GCC diagnostic ignored "-Wunused-parameter"
80    #endif
81  #include <gig.h>  #include <gig.h>
82    #if defined(Q_CC_GNU) || defined(Q_CC_MINGW)
83    #pragma GCC diagnostic pop
84    #endif
85  #endif  #endif
86    
87  // Needed for lroundf()  // Deprecated QTextStreamFunctions/Qt namespaces workaround.
88  #include <math.h>  #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
89    #define endl    Qt::endl
90    #endif
91    
92  #ifndef CONFIG_ROUND  // Needed for lroundf()
93    #ifdef CONFIG_ROUND
94    #include <cmath>
95    #else
96  static inline long lroundf ( float x )  static inline long lroundf ( float x )
97  {  {
98          if (x >= 0.0f)          if (x >= 0.0f)
# Line 91  static inline long lroundf ( float x ) Line 104  static inline long lroundf ( float x )
104    
105    
106  // All winsock apps needs this.  // All winsock apps needs this.
107  #if defined(WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
108  static WSADATA _wsaData;  static WSADATA _wsaData;
109    #undef HAVE_SIGNAL_H
110  #endif  #endif
111    
112    
# Line 103  static WSADATA _wsaData; Line 117  static WSADATA _wsaData;
117    
118  #include <QSocketNotifier>  #include <QSocketNotifier>
119    
120    #include <unistd.h>
121  #include <sys/types.h>  #include <sys/types.h>
122  #include <sys/socket.h>  #include <sys/socket.h>
   
123  #include <signal.h>  #include <signal.h>
124    
125  // File descriptor for SIGUSR1 notifier.  // File descriptor for SIGUSR1 notifier.
126  static int g_fdUsr1[2];  static int g_fdSigusr1[2] = { -1, -1 };
127    
128  // Unix SIGUSR1 signal handler.  // Unix SIGUSR1 signal handler.
129  static void qsampler_sigusr1_handler ( int /* signo */ )  static void qsampler_sigusr1_handler ( int /* signo */ )
130  {  {
131          char c = 1;          char c = 1;
132    
133          (::write(g_fdUsr1[0], &c, sizeof(c)) > 0);          (void) (::write(g_fdSigusr1[0], &c, sizeof(c)) > 0);
134    }
135    
136    // File descriptor for SIGTERM notifier.
137    static int g_fdSigterm[2] = { -1, -1 };
138    
139    // Unix SIGTERM signal handler.
140    static void qsampler_sigterm_handler ( int /* signo */ )
141    {
142            char c = 1;
143    
144            (void) (::write(g_fdSigterm[0], &c, sizeof(c)) > 0);
145  }  }
146    
147  #endif  // HAVE_SIGNAL_H  #endif  // HAVE_SIGNAL_H
# Line 194  protected: Line 219  protected:
219  // QSampler::MainForm -- Main window form implementation.  // QSampler::MainForm -- Main window form implementation.
220    
221  // Kind of singleton reference.  // Kind of singleton reference.
222  MainForm *MainForm::g_pMainForm = NULL;  MainForm *MainForm::g_pMainForm = nullptr;
223    
224  MainForm::MainForm ( QWidget *pParent )  MainForm::MainForm ( QWidget *pParent )
225          : QMainWindow(pParent)          : QMainWindow(pParent)
226  {  {
227          m_ui.setupUi(this);          m_ui.setupUi(this);
228    #if QT_VERSION < QT_VERSION_CHECK(6, 1, 0)
229            QMainWindow::setWindowIcon(QIcon(":/images/qsampler.png"));
230    #endif
231          // Pseudo-singleton reference setup.          // Pseudo-singleton reference setup.
232          g_pMainForm = this;          g_pMainForm = this;
233    
234          // Initialize some pointer references.          // Initialize some pointer references.
235          m_pOptions = NULL;          m_pOptions = nullptr;
236    
237          // All child forms are to be created later, not earlier than setup.          // All child forms are to be created later, not earlier than setup.
238          m_pMessages = NULL;          m_pMessages = nullptr;
239          m_pInstrumentListForm = NULL;          m_pInstrumentListForm = nullptr;
240          m_pDeviceForm = NULL;          m_pDeviceForm = nullptr;
241    
242          // We'll start clean.          // We'll start clean.
243          m_iUntitled   = 0;          m_iUntitled   = 0;
244          m_iDirtySetup = 0;          m_iDirtySetup = 0;
245          m_iDirtyCount = 0;          m_iDirtyCount = 0;
246    
247          m_pServer = NULL;          m_pServer = nullptr;
248          m_pClient = NULL;          m_pClient = nullptr;
249    
250          m_iStartDelay = 0;          m_iStartDelay = 0;
251          m_iTimerDelay = 0;          m_iTimerDelay = 0;
# Line 233  MainForm::MainForm ( QWidget *pParent ) Line 260  MainForm::MainForm ( QWidget *pParent )
260          // LADISH Level 1 suport.          // LADISH Level 1 suport.
261    
262          // Initialize file descriptors for SIGUSR1 socket notifier.          // Initialize file descriptors for SIGUSR1 socket notifier.
263          ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdUsr1);          ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdSigusr1);
264          m_pUsr1Notifier          m_pSigusr1Notifier
265                  = new QSocketNotifier(g_fdUsr1[1], QSocketNotifier::Read, this);                  = new QSocketNotifier(g_fdSigusr1[1], QSocketNotifier::Read, this);
266    
267          QObject::connect(m_pUsr1Notifier,          QObject::connect(m_pSigusr1Notifier,
268                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
269                  SLOT(handle_sigusr1()));                  SLOT(handle_sigusr1()));
270    
271          // Install SIGUSR1 signal handler.          // Install SIGUSR1 signal handler.
272      struct sigaction usr1;          struct sigaction sigusr1;
273      usr1.sa_handler = qsampler_sigusr1_handler;          sigusr1.sa_handler = qsampler_sigusr1_handler;
274      sigemptyset(&usr1.sa_mask);          sigemptyset(&sigusr1.sa_mask);
275      usr1.sa_flags = 0;          sigusr1.sa_flags = 0;
276      usr1.sa_flags |= SA_RESTART;          sigusr1.sa_flags |= SA_RESTART;
277      ::sigaction(SIGUSR1, &usr1, NULL);          ::sigaction(SIGUSR1, &sigusr1, nullptr);
278    
279            // Initialize file descriptors for SIGTERM socket notifier.
280            ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdSigterm);
281            m_pSigtermNotifier
282                    = new QSocketNotifier(g_fdSigterm[1], QSocketNotifier::Read, this);
283    
284            QObject::connect(m_pSigtermNotifier,
285                    SIGNAL(activated(int)),
286                    SLOT(handle_sigterm()));
287    
288            // Install SIGTERM signal handler.
289            struct sigaction sigterm;
290            sigterm.sa_handler = qsampler_sigterm_handler;
291            sigemptyset(&sigterm.sa_mask);
292            sigterm.sa_flags = 0;
293            sigterm.sa_flags |= SA_RESTART;
294            ::sigaction(SIGTERM, &sigterm, nullptr);
295            ::sigaction(SIGQUIT, &sigterm, nullptr);
296    
297            // Ignore SIGHUP/SIGINT signals.
298            ::signal(SIGHUP, SIG_IGN);
299            ::signal(SIGINT, SIG_IGN);
300    
301  #else   // HAVE_SIGNAL_H  #else   // HAVE_SIGNAL_H
302    
303          m_pUsr1Notifier = NULL;          m_pSigusr1Notifier = nullptr;
304            m_pSigtermNotifier = nullptr;
305                    
306  #endif  // !HAVE_SIGNAL_H  #endif  // !HAVE_SIGNAL_H
307    
# Line 324  MainForm::MainForm ( QWidget *pParent ) Line 374  MainForm::MainForm ( QWidget *pParent )
374          m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;          m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
375          statusBar()->addWidget(pLabel);          statusBar()->addWidget(pLabel);
376    
377  #if defined(WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
378          WSAStartup(MAKEWORD(1, 1), &_wsaData);          WSAStartup(MAKEWORD(1, 1), &_wsaData);
379  #endif  #endif
380    
# Line 425  MainForm::~MainForm() Line 475  MainForm::~MainForm()
475          // Do final processing anyway.          // Do final processing anyway.
476          processServerExit();          processServerExit();
477    
478  #if defined(WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
479          WSACleanup();          WSACleanup();
480  #endif  #endif
481    
482  #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)  #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
483          if (m_pUsr1Notifier)          if (m_pSigusr1Notifier)
484                  delete m_pUsr1Notifier;                  delete m_pSigusr1Notifier;
485            if (m_pSigtermNotifier)
486                    delete m_pSigtermNotifier;
487  #endif  #endif
488    
489          // Finally drop any widgets around...          // Finally drop any widgets around...
# Line 460  MainForm::~MainForm() Line 512  MainForm::~MainForm()
512  #endif  #endif
513    
514          // Pseudo-singleton reference shut-down.          // Pseudo-singleton reference shut-down.
515          g_pMainForm = NULL;          g_pMainForm = nullptr;
516  }  }
517    
518    
# Line 597  void MainForm::closeEvent ( QCloseEvent Line 649  void MainForm::closeEvent ( QCloseEvent
649  void MainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  void MainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
650  {  {
651          // Accept external drags only...          // Accept external drags only...
652          if (pDragEnterEvent->source() == NULL          if (pDragEnterEvent->source() == nullptr
653                  && pDragEnterEvent->mimeData()->hasUrls()) {                  && pDragEnterEvent->mimeData()->hasUrls()) {
654                  pDragEnterEvent->accept();                  pDragEnterEvent->accept();
655          } else {          } else {
# Line 621  void MainForm::dropEvent ( QDropEvent *p Line 673  void MainForm::dropEvent ( QDropEvent *p
673                          if (QFileInfo(sPath).exists()) {                          if (QFileInfo(sPath).exists()) {
674                                  // Try to create a new channel from instrument file...                                  // Try to create a new channel from instrument file...
675                                  Channel *pChannel = new Channel();                                  Channel *pChannel = new Channel();
676                                  if (pChannel == NULL)                                  if (pChannel == nullptr)
677                                          return;                                          return;
678                                  // Start setting the instrument filename...                                  // Start setting the instrument filename...
679                                  pChannel->setInstrument(sPath, 0);                                  pChannel->setInstrument(sPath, 0);
# Line 721  void MainForm::handle_sigusr1 (void) Line 773  void MainForm::handle_sigusr1 (void)
773    
774          char c;          char c;
775    
776          if (::read(g_fdUsr1[1], &c, sizeof(c)) > 0)          if (::read(g_fdSigusr1[1], &c, sizeof(c)) > 0)
777                  saveSession(false);                  saveSession(false);
778    
779  #endif  #endif
780  }  }
781    
782    
783    void MainForm::handle_sigterm (void)
784    {
785    #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
786    
787            char c;
788    
789            if (::read(g_fdSigterm[1], &c, sizeof(c)) > 0)
790                    close();
791    
792    #endif
793    }
794    
795    
796  void MainForm::updateViewMidiDeviceStatusMenu (void)  void MainForm::updateViewMidiDeviceStatusMenu (void)
797  {  {
798          m_ui.viewMidiDeviceStatusMenu->clear();          m_ui.viewMidiDeviceStatusMenu->clear();
# Line 806  bool MainForm::newSession (void) Line 871  bool MainForm::newSession (void)
871          m_iUntitled++;          m_iUntitled++;
872    
873          // Stabilize form.          // Stabilize form.
874          m_sFilename = QString::null;          m_sFilename = QString();
875          m_iDirtyCount = 0;          m_iDirtyCount = 0;
876          appendMessages(tr("New session: \"%1\".").arg(sessionName(m_sFilename)));          appendMessages(tr("New session: \"%1\".").arg(sessionName(m_sFilename)));
877          stabilizeForm();          stabilizeForm();
# Line 818  bool MainForm::newSession (void) Line 883  bool MainForm::newSession (void)
883  // Open an existing sampler session.  // Open an existing sampler session.
884  bool MainForm::openSession (void)  bool MainForm::openSession (void)
885  {  {
886          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
887                  return false;                  return false;
888    
889          // Ask for the filename to open...          // Ask for the filename to open...
890          QString sFilename = QFileDialog::getOpenFileName(this,          QString sFilename = QFileDialog::getOpenFileName(this,
891                  QSAMPLER_TITLE ": " + tr("Open Session"), // Caption.                  tr("Open Session"),                       // Caption.
892                  m_pOptions->sSessionDir,                  // Start here.                  m_pOptions->sSessionDir,                  // Start here.
893                  tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)
894          );          );
# Line 844  bool MainForm::openSession (void) Line 909  bool MainForm::openSession (void)
909  // Save current sampler session with another name.  // Save current sampler session with another name.
910  bool MainForm::saveSession ( bool bPrompt )  bool MainForm::saveSession ( bool bPrompt )
911  {  {
912          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
913                  return false;                  return false;
914    
915          QString sFilename = m_sFilename;          QString sFilename = m_sFilename;
# Line 856  bool MainForm::saveSession ( bool bPromp Line 921  bool MainForm::saveSession ( bool bPromp
921                          sFilename = m_pOptions->sSessionDir;                          sFilename = m_pOptions->sSessionDir;
922                  // Prompt the guy...                  // Prompt the guy...
923                  sFilename = QFileDialog::getSaveFileName(this,                  sFilename = QFileDialog::getSaveFileName(this,
924                          QSAMPLER_TITLE ": " + tr("Save Session"), // Caption.                          tr("Save Session"),                       // Caption.
925                          sFilename,                                // Start here.                          sFilename,                                // Start here.
926                          tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)
927                  );                  );
# Line 866  bool MainForm::saveSession ( bool bPromp Line 931  bool MainForm::saveSession ( bool bPromp
931                  // Enforce .lscp extension...                  // Enforce .lscp extension...
932                  if (QFileInfo(sFilename).suffix().isEmpty())                  if (QFileInfo(sFilename).suffix().isEmpty())
933                          sFilename += ".lscp";                          sFilename += ".lscp";
934            #if 0
935                  // Check if already exists...                  // Check if already exists...
936                  if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {                  if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
937                          if (QMessageBox::warning(this,                          if (QMessageBox::warning(this,
938                                  QSAMPLER_TITLE ": " + tr("Warning"),                                  tr("Warning"),
939                                  tr("The file already exists:\n\n"                                  tr("The file already exists:\n\n"
940                                  "\"%1\"\n\n"                                  "\"%1\"\n\n"
941                                  "Do you want to replace it?")                                  "Do you want to replace it?")
# Line 878  bool MainForm::saveSession ( bool bPromp Line 944  bool MainForm::saveSession ( bool bPromp
944                                  == QMessageBox::No)                                  == QMessageBox::No)
945                                  return false;                                  return false;
946                  }                  }
947            #endif
948          }          }
949    
950          // Save it right away.          // Save it right away.
# Line 893  bool MainForm::closeSession ( bool bForc Line 960  bool MainForm::closeSession ( bool bForc
960          // Are we dirty enough to prompt it?          // Are we dirty enough to prompt it?
961          if (m_iDirtyCount > 0) {          if (m_iDirtyCount > 0) {
962                  switch (QMessageBox::warning(this,                  switch (QMessageBox::warning(this,
963                          QSAMPLER_TITLE ": " + tr("Warning"),                          tr("Warning"),
964                          tr("The current session has been changed:\n\n"                          tr("The current session has been changed:\n\n"
965                          "\"%1\"\n\n"                          "\"%1\"\n\n"
966                          "Do you want to save the changes?")                          "Do you want to save the changes?")
# Line 918  bool MainForm::closeSession ( bool bForc Line 985  bool MainForm::closeSession ( bool bForc
985                  m_pWorkspace->setUpdatesEnabled(false);                  m_pWorkspace->setUpdatesEnabled(false);
986                  const QList<QMdiSubWindow *>& wlist                  const QList<QMdiSubWindow *>& wlist
987                          = m_pWorkspace->subWindowList();                          = m_pWorkspace->subWindowList();
988                  const int iStripCount = wlist.count();                  foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
989                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                          ChannelStrip *pChannelStrip
990                          ChannelStrip *pChannelStrip = NULL;                                  = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                         QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                         if (pMdiSubWindow)  
                                 pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
991                          if (pChannelStrip) {                          if (pChannelStrip) {
992                                  Channel *pChannel = pChannelStrip->channel();                                  Channel *pChannel = pChannelStrip->channel();
993                                  if (bForce && pChannel)                                  if (bForce && pChannel)
994                                          pChannel->removeChannel();                                          pChannel->removeChannel();
995                                  delete pChannelStrip;                                  delete pChannelStrip;
996                          }                          }
997                          if (pMdiSubWindow)                          delete pMdiSubWindow;
                                 delete pMdiSubWindow;  
998                  }                  }
999                  m_pWorkspace->setUpdatesEnabled(true);                  m_pWorkspace->setUpdatesEnabled(true);
1000                  // We're now clean, for sure.                  // We're now clean, for sure.
# Line 945  bool MainForm::closeSession ( bool bForc Line 1008  bool MainForm::closeSession ( bool bForc
1008  // Load a session from specific file path.  // Load a session from specific file path.
1009  bool MainForm::loadSessionFile ( const QString& sFilename )  bool MainForm::loadSessionFile ( const QString& sFilename )
1010  {  {
1011          if (m_pClient == NULL)          if (m_pClient == nullptr)
1012                  return false;                  return false;
1013    
1014          // Open and read from real file.          // Open and read from real file.
# Line 1021  bool MainForm::loadSessionFile ( const Q Line 1084  bool MainForm::loadSessionFile ( const Q
1084  // Save current session to specific file path.  // Save current session to specific file path.
1085  bool MainForm::saveSessionFile ( const QString& sFilename )  bool MainForm::saveSessionFile ( const QString& sFilename )
1086  {  {
1087          if (m_pClient == NULL)          if (m_pClient == nullptr)
1088                  return false;                  return false;
1089    
1090          // Check whether server is apparently OK...          // Check whether server is apparently OK...
# Line 1046  bool MainForm::saveSessionFile ( const Q Line 1109  bool MainForm::saveSessionFile ( const Q
1109          int iErrors = 0;          int iErrors = 0;
1110          QTextStream ts(&file);          QTextStream ts(&file);
1111          ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;          ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
1112          ts << "# " << tr("Version")          ts << "# " << tr("Version") << ": " CONFIG_BUILD_VERSION << endl;
1113          << ": " QSAMPLER_VERSION << endl;  //      ts << "# " << tr("Build") << ": " CONFIG_BUILD_DATE << endl;
         ts << "# " << tr("Build")  
         << ": " __DATE__ " " __TIME__ << endl;  
1114          ts << "#"  << endl;          ts << "#"  << endl;
1115          ts << "# " << tr("File")          ts << "# " << tr("File")
1116          << ": " << QFileInfo(sFilename).fileName() << endl;          << ": " << QFileInfo(sFilename).fileName() << endl;
# Line 1062  bool MainForm::saveSessionFile ( const Q Line 1123  bool MainForm::saveSessionFile ( const Q
1123          // It is assumed that this new kind of device+session file          // It is assumed that this new kind of device+session file
1124          // will be loaded from a complete initialized server...          // will be loaded from a complete initialized server...
1125          int *piDeviceIDs;          int *piDeviceIDs;
1126          int  iDevice;          int  i, iDevice;
1127          ts << "RESET" << endl;          ts << "RESET" << endl;
1128    
1129          // Audio device mapping.          // Audio device mapping.
1130          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap; iDevice = 0;
1131          piDeviceIDs = Device::getDevices(m_pClient, Device::Audio);          piDeviceIDs = Device::getDevices(m_pClient, Device::Audio);
1132          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
1133                  ts << endl;                  Device device(Device::Audio, piDeviceIDs[i]);
1134                  Device device(Device::Audio, piDeviceIDs[iDevice]);                  // Avoid plug-in driver devices...
1135                    if (device.driverName().toUpper() == "PLUGIN")
1136                            continue;
1137                  // Audio device specification...                  // Audio device specification...
1138                    ts << endl;
1139                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1140                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1141                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
# Line 1102  bool MainForm::saveSessionFile ( const Q Line 1166  bool MainForm::saveSessionFile ( const Q
1166                          iPort++;                          iPort++;
1167                  }                  }
1168                  // Audio device index/id mapping.                  // Audio device index/id mapping.
1169                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap.insert(device.deviceID(), iDevice++);
1170                  // Try to keep it snappy :)                  // Try to keep it snappy :)
1171                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
1172          }          }
1173    
1174          // MIDI device mapping.          // MIDI device mapping.
1175          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap; iDevice = 0;
1176          piDeviceIDs = Device::getDevices(m_pClient, Device::Midi);          piDeviceIDs = Device::getDevices(m_pClient, Device::Midi);
1177          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
1178                  ts << endl;                  Device device(Device::Midi, piDeviceIDs[i]);
1179                  Device device(Device::Midi, piDeviceIDs[iDevice]);                  // Avoid plug-in driver devices...
1180                    if (device.driverName().toUpper() == "PLUGIN")
1181                            continue;
1182                  // MIDI device specification...                  // MIDI device specification...
1183                    ts << endl;
1184                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1185                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1186                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
# Line 1144  bool MainForm::saveSessionFile ( const Q Line 1211  bool MainForm::saveSessionFile ( const Q
1211                          iPort++;                          iPort++;
1212                  }                  }
1213                  // MIDI device index/id mapping.                  // MIDI device index/id mapping.
1214                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap.insert(device.deviceID(), iDevice++);
1215                  // Try to keep it snappy :)                  // Try to keep it snappy :)
1216                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
1217          }          }
# Line 1207  bool MainForm::saveSessionFile ( const Q Line 1274  bool MainForm::saveSessionFile ( const Q
1274                  }                  }
1275                  ts << endl;                  ts << endl;
1276                  // Check for errors...                  // Check for errors...
1277                  if (pInstrs == NULL && ::lscp_client_get_errno(m_pClient)) {                  if (pInstrs == nullptr && ::lscp_client_get_errno(m_pClient)) {
1278                          appendMessagesClient("lscp_list_midi_instruments");                          appendMessagesClient("lscp_list_midi_instruments");
1279                          iErrors++;                          iErrors++;
1280                  }                  }
1281                  // MIDI strument index/id mapping.                  // MIDI strument index/id mapping.
1282                  midiInstrumentMap[iMidiMap] = iMap;                  midiInstrumentMap.insert(iMidiMap, iMap);
1283          }          }
1284          // Check for errors...          // Check for errors...
1285          if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) {          if (piMaps == nullptr && ::lscp_client_get_errno(m_pClient)) {
1286                  appendMessagesClient("lscp_list_midi_instrument_maps");                  appendMessagesClient("lscp_list_midi_instrument_maps");
1287                  iErrors++;                  iErrors++;
1288          }          }
1289  #endif  // CONFIG_MIDI_INSTRUMENT  #endif  // CONFIG_MIDI_INSTRUMENT
1290    
1291          // Sampler channel mapping.          // Sampler channel mapping...
1292            int iChannelID = 0;
1293          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
1294                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
1295          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
1296          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
1297                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
1298                  if (pChannelStrip) {                  if (pChannelStrip) {
1299                          Channel *pChannel = pChannelStrip->channel();                          Channel *pChannel = pChannelStrip->channel();
1300                          if (pChannel) {                          if (pChannel) {
1301                                  const int iChannelID = pChannel->channelID();                                  // Avoid "artifial" plug-in devices...
1302                                    const int iAudioDevice = pChannel->audioDevice();
1303                                    if (!audioDeviceMap.contains(iAudioDevice))
1304                                            continue;
1305                                    const int iMidiDevice = pChannel->midiDevice();
1306                                    if (!midiDeviceMap.contains(iMidiDevice))
1307                                            continue;
1308                                    // Go for regular, canonical devices...
1309                                  ts << "# " << tr("Channel") << " " << iChannelID << endl;                                  ts << "# " << tr("Channel") << " " << iChannelID << endl;
1310                                  ts << "ADD CHANNEL" << endl;                                  ts << "ADD CHANNEL" << endl;
1311                                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
# Line 1241  bool MainForm::saveSessionFile ( const Q Line 1313  bool MainForm::saveSessionFile ( const Q
1313                                                  << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
1314                                  } else {                                  } else {
1315                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID
1316                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap.value(iAudioDevice) << endl;
1317                                  }                                  }
1318                                  if (midiDeviceMap.isEmpty()) {                                  if (midiDeviceMap.isEmpty()) {
1319                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID
1320                                                  << " " << pChannel->midiDriver() << endl;                                                  << " " << pChannel->midiDriver() << endl;
1321                                  } else {                                  } else {
1322                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID
1323                                                  << " " << midiDeviceMap[pChannel->midiDevice()] << endl;                                                  << " " << midiDeviceMap.value(iMidiDevice) << endl;
1324                                  }                                  }
1325                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID
1326                                          << " " << pChannel->midiPort() << endl;                                          << " " << pChannel->midiPort() << endl;
# Line 1279  bool MainForm::saveSessionFile ( const Q Line 1351  bool MainForm::saveSessionFile ( const Q
1351                                  if (pChannel->channelSolo())                                  if (pChannel->channelSolo())
1352                                          ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl;                                          ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl;
1353                          #ifdef CONFIG_MIDI_INSTRUMENT                          #ifdef CONFIG_MIDI_INSTRUMENT
1354                                  if (pChannel->midiMap() >= 0) {                                  const int iMidiMap = pChannel->midiMap();
1355                                    if (midiInstrumentMap.contains(iMidiMap)) {
1356                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID
1357                                                  << " " << midiInstrumentMap[pChannel->midiMap()] << endl;                                                  << " " << midiInstrumentMap.value(iMidiMap) << endl;
1358                                  }                                  }
1359                          #endif                          #endif
1360                          #ifdef CONFIG_FXSEND                          #ifdef CONFIG_FXSEND
# Line 1320  bool MainForm::saveSessionFile ( const Q Line 1393  bool MainForm::saveSessionFile ( const Q
1393                                  }                                  }
1394                          #endif                          #endif
1395                                  ts << endl;                                  ts << endl;
1396                                    // Go for next channel...
1397                                    ++iChannelID;
1398                          }                          }
1399                  }                  }
1400                  // Try to keep it snappy :)                  // Try to keep it snappy :)
# Line 1425  void MainForm::fileSaveAs (void) Line 1500  void MainForm::fileSaveAs (void)
1500  // Reset the sampler instance.  // Reset the sampler instance.
1501  void MainForm::fileReset (void)  void MainForm::fileReset (void)
1502  {  {
1503          if (m_pClient == NULL)          if (m_pClient == nullptr)
1504                  return;                  return;
1505    
1506          // Ask user whether he/she want's an internal sampler reset...          // Ask user whether he/she want's an internal sampler reset...
1507          if (m_pOptions && m_pOptions->bConfirmReset) {          if (m_pOptions && m_pOptions->bConfirmReset) {
1508                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1509                  const QString& sText = tr(                  const QString& sText = tr(
1510                          "Resetting the sampler instance will close\n"                          "Resetting the sampler instance will close\n"
1511                          "all device and channel configurations.\n\n"                          "all device and channel configurations.\n\n"
# Line 1481  void MainForm::fileReset (void) Line 1556  void MainForm::fileReset (void)
1556  // Restart the client/server instance.  // Restart the client/server instance.
1557  void MainForm::fileRestart (void)  void MainForm::fileRestart (void)
1558  {  {
1559          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1560                  return;                  return;
1561    
1562          bool bRestart = true;          bool bRestart = true;
# Line 1489  void MainForm::fileRestart (void) Line 1564  void MainForm::fileRestart (void)
1564          // Ask user whether he/she want's a complete restart...          // Ask user whether he/she want's a complete restart...
1565          // (if we're currently up and running)          // (if we're currently up and running)
1566          if (m_pOptions && m_pOptions->bConfirmRestart) {          if (m_pOptions && m_pOptions->bConfirmRestart) {
1567                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1568                  const QString& sText = tr(                  const QString& sText = tr(
1569                          "New settings will be effective after\n"                          "New settings will be effective after\n"
1570                          "restarting the client/server connection.\n\n"                          "restarting the client/server connection.\n\n"
# Line 1549  void MainForm::editAddChannel (void) Line 1624  void MainForm::editAddChannel (void)
1624    
1625  void MainForm::addChannelStrip (void)  void MainForm::addChannelStrip (void)
1626  {  {
1627          if (m_pClient == NULL)          if (m_pClient == nullptr)
1628                  return;                  return;
1629    
1630          // Just create the channel instance...          // Just create the channel instance...
1631          Channel *pChannel = new Channel();          Channel *pChannel = new Channel();
1632          if (pChannel == NULL)          if (pChannel == nullptr)
1633                  return;                  return;
1634    
1635          // Before we show it up, may be we'll          // Before we show it up, may be we'll
# Line 1590  void MainForm::editRemoveChannel (void) Line 1665  void MainForm::editRemoveChannel (void)
1665    
1666  void MainForm::removeChannelStrip (void)  void MainForm::removeChannelStrip (void)
1667  {  {
1668          if (m_pClient == NULL)          if (m_pClient == nullptr)
1669                  return;                  return;
1670    
1671          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1672          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1673                  return;                  return;
1674    
1675          Channel *pChannel = pChannelStrip->channel();          Channel *pChannel = pChannelStrip->channel();
1676          if (pChannel == NULL)          if (pChannel == nullptr)
1677                  return;                  return;
1678    
1679          // Prompt user if he/she's sure about this...          // Prompt user if he/she's sure about this...
1680          if (m_pOptions && m_pOptions->bConfirmRemove) {          if (m_pOptions && m_pOptions->bConfirmRemove) {
1681                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1682                  const QString& sText = tr(                  const QString& sText = tr(
1683                          "About to remove channel:\n\n"                          "About to remove channel:\n\n"
1684                          "%1\n\n"                          "%1\n\n"
# Line 1646  void MainForm::removeChannelStrip (void) Line 1721  void MainForm::removeChannelStrip (void)
1721  // Setup current sampler channel.  // Setup current sampler channel.
1722  void MainForm::editSetupChannel (void)  void MainForm::editSetupChannel (void)
1723  {  {
1724          if (m_pClient == NULL)          if (m_pClient == nullptr)
1725                  return;                  return;
1726    
1727          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1728          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1729                  return;                  return;
1730    
1731          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1661  void MainForm::editSetupChannel (void) Line 1736  void MainForm::editSetupChannel (void)
1736  // Edit current sampler channel.  // Edit current sampler channel.
1737  void MainForm::editEditChannel (void)  void MainForm::editEditChannel (void)
1738  {  {
1739          if (m_pClient == NULL)          if (m_pClient == nullptr)
1740                  return;                  return;
1741    
1742          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1743          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1744                  return;                  return;
1745    
1746          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1676  void MainForm::editEditChannel (void) Line 1751  void MainForm::editEditChannel (void)
1751  // Reset current sampler channel.  // Reset current sampler channel.
1752  void MainForm::editResetChannel (void)  void MainForm::editResetChannel (void)
1753  {  {
1754          if (m_pClient == NULL)          if (m_pClient == nullptr)
1755                  return;                  return;
1756    
1757          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1758          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1759                  return;                  return;
1760    
1761          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1691  void MainForm::editResetChannel (void) Line 1766  void MainForm::editResetChannel (void)
1766  // Reset all sampler channels.  // Reset all sampler channels.
1767  void MainForm::editResetAllChannels (void)  void MainForm::editResetAllChannels (void)
1768  {  {
1769          if (m_pClient == NULL)          if (m_pClient == nullptr)
1770                  return;                  return;
1771    
1772          // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
# Line 1699  void MainForm::editResetAllChannels (voi Line 1774  void MainForm::editResetAllChannels (voi
1774          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1775          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
1776                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
1777          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
1778          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
1779                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
1780                  if (pChannelStrip)                  if (pChannelStrip)
1781                          pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1782          }          }
# Line 1763  void MainForm::viewMessages ( bool bOn ) Line 1835  void MainForm::viewMessages ( bool bOn )
1835  // Show/hide the MIDI instrument list-view form.  // Show/hide the MIDI instrument list-view form.
1836  void MainForm::viewInstruments (void)  void MainForm::viewInstruments (void)
1837  {  {
1838          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1839                  return;                  return;
1840    
1841          if (m_pInstrumentListForm) {          if (m_pInstrumentListForm) {
# Line 1782  void MainForm::viewInstruments (void) Line 1854  void MainForm::viewInstruments (void)
1854  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1855  void MainForm::viewDevices (void)  void MainForm::viewDevices (void)
1856  {  {
1857          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1858                  return;                  return;
1859    
1860          if (m_pDeviceForm) {          if (m_pDeviceForm) {
# Line 1801  void MainForm::viewDevices (void) Line 1873  void MainForm::viewDevices (void)
1873  // Show options dialog.  // Show options dialog.
1874  void MainForm::viewOptions (void)  void MainForm::viewOptions (void)
1875  {  {
1876          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1877                  return;                  return;
1878    
1879          OptionsForm* pOptionsForm = new OptionsForm(this);          OptionsForm* pOptionsForm = new OptionsForm(this);
# Line 1813  void MainForm::viewOptions (void) Line 1885  void MainForm::viewOptions (void)
1885                  if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)                  if (m_pOptions->sMessagesFont.isEmpty() && m_pMessages)
1886                          m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();                          m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
1887                  // To track down deferred or immediate changes.                  // To track down deferred or immediate changes.
1888                  const QString sOldServerHost      = m_pOptions->sServerHost;                  const QString sOldServerHost       = m_pOptions->sServerHost;
1889                  const int     iOldServerPort      = m_pOptions->iServerPort;                  const int     iOldServerPort       = m_pOptions->iServerPort;
1890                  const int     iOldServerTimeout   = m_pOptions->iServerTimeout;                  const int     iOldServerTimeout    = m_pOptions->iServerTimeout;
1891                  const bool    bOldServerStart     = m_pOptions->bServerStart;                  const bool    bOldServerStart      = m_pOptions->bServerStart;
1892                  const QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;                  const QString sOldServerCmdLine    = m_pOptions->sServerCmdLine;
1893                  const bool    bOldMessagesLog     = m_pOptions->bMessagesLog;                  const bool    bOldMessagesLog      = m_pOptions->bMessagesLog;
1894                  const QString sOldMessagesLogPath = m_pOptions->sMessagesLogPath;                  const QString sOldMessagesLogPath  = m_pOptions->sMessagesLogPath;
1895                  const QString sOldDisplayFont     = m_pOptions->sDisplayFont;                  const QString sOldDisplayFont      = m_pOptions->sDisplayFont;
1896                  const bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;                  const bool    bOldDisplayEffect    = m_pOptions->bDisplayEffect;
1897                  const int     iOldMaxVolume       = m_pOptions->iMaxVolume;                  const int     iOldMaxVolume        = m_pOptions->iMaxVolume;
1898                  const QString sOldMessagesFont    = m_pOptions->sMessagesFont;                  const QString sOldMessagesFont     = m_pOptions->sMessagesFont;
1899                  const bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;                  const bool    bOldKeepOnTop        = m_pOptions->bKeepOnTop;
1900                  const bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;                  const bool    bOldStdoutCapture    = m_pOptions->bStdoutCapture;
1901                  const int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;                  const int     bOldMessagesLimit    = m_pOptions->bMessagesLimit;
1902                  const int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;                  const int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1903                  const bool    bOldCompletePath    = m_pOptions->bCompletePath;                  const bool    bOldCompletePath     = m_pOptions->bCompletePath;
1904                  const bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;                  const bool    bOldInstrumentNames  = m_pOptions->bInstrumentNames;
1905                  const int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;                  const int     iOldMaxRecentFiles   = m_pOptions->iMaxRecentFiles;
1906                  const int     iOldBaseFontSize    = m_pOptions->iBaseFontSize;                  const int     iOldBaseFontSize     = m_pOptions->iBaseFontSize;
1907                    const QString sOldCustomStyleTheme = m_pOptions->sCustomStyleTheme;
1908                    const QString sOldCustomColorTheme = m_pOptions->sCustomColorTheme;
1909                  // Load the current setup settings.                  // Load the current setup settings.
1910                  pOptionsForm->setup(m_pOptions);                  pOptionsForm->setup(m_pOptions);
1911                  // Show the setup dialog...                  // Show the setup dialog...
1912                  if (pOptionsForm->exec()) {                  if (pOptionsForm->exec()) {
1913                          // Warn if something will be only effective on next run.                          // Warn if something will be only effective on next run.
1914                            int iNeedRestart = 0;
1915                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1916                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {
1917                                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                                  updateMessagesCapture();
1918                                    ++iNeedRestart;
1919                            }
1920                            if (( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1921                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||
1922                                  (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {                                  (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {
1923                                  QMessageBox::information(this,                                  ++iNeedRestart;
1924                                          QSAMPLER_TITLE ": " + tr("Information"),                          }
1925                                          tr("Some settings may be only effective\n"                          // Check whether restart is needed or whether
1926                                          "next time you start this program."));                          // custom options maybe set up immediately...
1927                                  updateMessagesCapture();                          if (m_pOptions->sCustomStyleTheme != sOldCustomStyleTheme) {
1928                                    if (m_pOptions->sCustomStyleTheme.isEmpty()) {
1929                                            ++iNeedRestart;
1930                                    } else {
1931                                            QApplication::setStyle(
1932                                                    QStyleFactory::create(m_pOptions->sCustomStyleTheme));
1933                                    }
1934                            }
1935                            if (m_pOptions->sCustomColorTheme != sOldCustomColorTheme) {
1936                                    if (m_pOptions->sCustomColorTheme.isEmpty()) {
1937                                            ++iNeedRestart;
1938                                    } else {
1939                                            QPalette pal;
1940                                            if (PaletteForm::namedPalette(
1941                                                            &m_pOptions->settings(), m_pOptions->sCustomColorTheme, pal))
1942                                                    QApplication::setPalette(pal);
1943                                    }
1944                          }                          }
1945                          // Check wheather something immediate has changed.                          // Check wheather something immediate has changed.
1946                          if (( bOldMessagesLog && !m_pOptions->bMessagesLog) ||                          if (( bOldMessagesLog && !m_pOptions->bMessagesLog) ||
# Line 1874  void MainForm::viewOptions (void) Line 1968  void MainForm::viewOptions (void)
1968                                  (!bOldMessagesLimit &&  m_pOptions->bMessagesLimit) ||                                  (!bOldMessagesLimit &&  m_pOptions->bMessagesLimit) ||
1969                                  (iOldMessagesLimitLines !=  m_pOptions->iMessagesLimitLines))                                  (iOldMessagesLimitLines !=  m_pOptions->iMessagesLimitLines))
1970                                  updateMessagesLimit();                                  updateMessagesLimit();
1971                            // Show restart needed message...
1972                            if (iNeedRestart > 0) {
1973                                    QMessageBox::information(this,
1974                                            tr("Information"),
1975                                            tr("Some settings may be only effective\n"
1976                                            "next time you start this program."));
1977                            }
1978                          // And now the main thing, whether we'll do client/server recycling?                          // And now the main thing, whether we'll do client/server recycling?
1979                          if ((sOldServerHost != m_pOptions->sServerHost) ||                          if ((sOldServerHost != m_pOptions->sServerHost) ||
1980                                  (iOldServerPort != m_pOptions->iServerPort) ||                                  (iOldServerPort != m_pOptions->iServerPort) ||
# Line 1907  void MainForm::channelsArrange (void) Line 2008  void MainForm::channelsArrange (void)
2008    
2009          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2010          int y = 0;          int y = 0;
2011          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2012          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  pMdiSubWindow->adjustSize();
2013                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  const QRect& frameRect
2014                  if (pMdiSubWindow) {                          = pMdiSubWindow->frameGeometry();
2015                          pMdiSubWindow->adjustSize();                  int w = m_pWorkspace->width();
2016                          int iWidth = m_pWorkspace->width();                  if (w < frameRect.width())
2017                          if (iWidth < pMdiSubWindow->width())                          w = frameRect.width();
2018                                  iWidth = pMdiSubWindow->width();                  const int h = frameRect.height();
2019                          const int iHeight = pMdiSubWindow->frameGeometry().height();                  pMdiSubWindow->setGeometry(0, y, w, h);
2020                          pMdiSubWindow->setGeometry(0, y, iWidth, iHeight);                  y += h;
                         y += iHeight;  
                 }  
2021          }          }
2022          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
2023    
# Line 1929  void MainForm::channelsArrange (void) Line 2028  void MainForm::channelsArrange (void)
2028  // Auto-arrange channel strips.  // Auto-arrange channel strips.
2029  void MainForm::channelsAutoArrange ( bool bOn )  void MainForm::channelsAutoArrange ( bool bOn )
2030  {  {
2031          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2032                  return;                  return;
2033    
2034          // Toggle the auto-arrange flag.          // Toggle the auto-arrange flag.
# Line 1960  void MainForm::helpAboutQt (void) Line 2059  void MainForm::helpAboutQt (void)
2059  // Show information about application program.  // Show information about application program.
2060  void MainForm::helpAbout (void)  void MainForm::helpAbout (void)
2061  {  {
2062          // Stuff the about box text...          QStringList list;
         QString sText = "<p>\n";  
         sText += "<b>" QSAMPLER_TITLE " - " + tr(QSAMPLER_SUBTITLE) + "</b><br />\n";  
         sText += "<br />\n";  
         sText += tr("Version") + ": <b>" QSAMPLER_VERSION "</b><br />\n";  
         sText += "<small>" + tr("Build") + ": " __DATE__ " " __TIME__ "</small><br />\n";  
2063  #ifdef CONFIG_DEBUG  #ifdef CONFIG_DEBUG
2064          sText += "<small><font color=\"red\">";          list << tr("Debugging option enabled.");
         sText += tr("Debugging option enabled.");  
         sText += "</font></small><br />";  
2065  #endif  #endif
2066  #ifndef CONFIG_LIBGIG  #ifndef CONFIG_LIBGIG
2067          sText += "<small><font color=\"red\">";          list << tr("GIG (libgig) file support disabled.");
         sText += tr("GIG (libgig) file support disabled.");  
         sText += "</font></small><br />";  
2068  #endif  #endif
2069  #ifndef CONFIG_INSTRUMENT_NAME  #ifndef CONFIG_INSTRUMENT_NAME
2070          sText += "<small><font color=\"red\">";          list << tr("LSCP (liblscp) instrument_name support disabled.");
         sText += tr("LSCP (liblscp) instrument_name support disabled.");  
         sText += "</font></small><br />";  
2071  #endif  #endif
2072  #ifndef CONFIG_MUTE_SOLO  #ifndef CONFIG_MUTE_SOLO
2073          sText += "<small><font color=\"red\">";          list << tr("Sampler channel Mute/Solo support disabled.");
         sText += tr("Sampler channel Mute/Solo support disabled.");  
         sText += "</font></small><br />";  
2074  #endif  #endif
2075  #ifndef CONFIG_AUDIO_ROUTING  #ifndef CONFIG_AUDIO_ROUTING
2076          sText += "<small><font color=\"red\">";          list << tr("LSCP (liblscp) audio_routing support disabled.");
         sText += tr("LSCP (liblscp) audio_routing support disabled.");  
         sText += "</font></small><br />";  
2077  #endif  #endif
2078  #ifndef CONFIG_FXSEND  #ifndef CONFIG_FXSEND
2079          sText += "<small><font color=\"red\">";          list << tr("Sampler channel Effect Sends support disabled.");
         sText += tr("Sampler channel Effect Sends support disabled.");  
         sText += "</font></small><br />";  
2080  #endif  #endif
2081  #ifndef CONFIG_VOLUME  #ifndef CONFIG_VOLUME
2082          sText += "<small><font color=\"red\">";          list << tr("Global volume support disabled.");
         sText += tr("Global volume support disabled.");  
         sText += "</font></small><br />";  
2083  #endif  #endif
2084  #ifndef CONFIG_MIDI_INSTRUMENT  #ifndef CONFIG_MIDI_INSTRUMENT
2085          sText += "<small><font color=\"red\">";          list << tr("MIDI instrument mapping support disabled.");
         sText += tr("MIDI instrument mapping support disabled.");  
         sText += "</font></small><br />";  
2086  #endif  #endif
2087  #ifndef CONFIG_EDIT_INSTRUMENT  #ifndef CONFIG_EDIT_INSTRUMENT
2088          sText += "<small><font color=\"red\">";          list << tr("Instrument editing support disabled.");
         sText += tr("Instrument editing support disabled.");  
         sText += "</font></small><br />";  
2089  #endif  #endif
2090  #ifndef CONFIG_EVENT_CHANNEL_MIDI  #ifndef CONFIG_EVENT_CHANNEL_MIDI
2091          sText += "<small><font color=\"red\">";          list << tr("Channel MIDI event support disabled.");
         sText += tr("Channel MIDI event support disabled.");  
         sText += "</font></small><br />";  
2092  #endif  #endif
2093  #ifndef CONFIG_EVENT_DEVICE_MIDI  #ifndef CONFIG_EVENT_DEVICE_MIDI
2094          sText += "<small><font color=\"red\">";          list << tr("Device MIDI event support disabled.");
         sText += tr("Device MIDI event support disabled.");  
         sText += "</font></small><br />";  
2095  #endif  #endif
2096  #ifndef CONFIG_MAX_VOICES  #ifndef CONFIG_MAX_VOICES
2097          sText += "<small><font color=\"red\">";          list << tr("Runtime max. voices / disk streams support disabled.");
         sText += tr("Runtime max. voices / disk streams support disabled.");  
         sText += "</font></small><br />";  
2098  #endif  #endif
2099    
2100            // Stuff the about box text...
2101            QString sText = "<p>\n";
2102            sText += "<b>" QSAMPLER_TITLE " - " + tr(QSAMPLER_SUBTITLE) + "</b><br />\n";
2103            sText += "<br />\n";
2104            sText += tr("Version") + ": <b>" CONFIG_BUILD_VERSION "</b><br />\n";
2105    //      sText += "<small>" + tr("Build") + ": " CONFIG_BUILD_DATE "</small><br />\n";
2106            if (!list.isEmpty()) {
2107                    sText += "<small><font color=\"red\">";
2108                    sText += list.join("<br />\n");
2109                    sText += "</font></small>";
2110            }
2111          sText += "<br />\n";          sText += "<br />\n";
2112          sText += tr("Using") + ": ";          sText += tr("Using: Qt %1").arg(qVersion());
2113    #if defined(QT_STATIC)
2114            sText += "-static";
2115    #endif
2116            sText += ", ";
2117          sText += ::lscp_client_package();          sText += ::lscp_client_package();
2118          sText += " ";          sText += " ";
2119          sText += ::lscp_client_version();          sText += ::lscp_client_version();
# Line 2050  void MainForm::helpAbout (void) Line 2136  void MainForm::helpAbout (void)
2136          sText += "</small>";          sText += "</small>";
2137          sText += "</p>\n";          sText += "</p>\n";
2138    
2139          QMessageBox::about(this, tr("About") + " " QSAMPLER_TITLE, sText);          QMessageBox::about(this, tr("About"), sText);
2140  }  }
2141    
2142    
# Line 2063  void MainForm::stabilizeForm (void) Line 2149  void MainForm::stabilizeForm (void)
2149          QString sSessionName = sessionName(m_sFilename);          QString sSessionName = sessionName(m_sFilename);
2150          if (m_iDirtyCount > 0)          if (m_iDirtyCount > 0)
2151                  sSessionName += " *";                  sSessionName += " *";
2152          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));          setWindowTitle(sSessionName);
2153    
2154          // Update the main menu state...          // Update the main menu state...
2155          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
2156          const QList<QMdiSubWindow *>& wlist = m_pWorkspace->subWindowList();          const QList<QMdiSubWindow *>& wlist = m_pWorkspace->subWindowList();
2157          const bool bHasClient = (m_pOptions != NULL && m_pClient != NULL);          const bool bHasClient = (m_pOptions != nullptr && m_pClient != nullptr);
2158          const bool bHasChannel = (bHasClient && pChannelStrip != NULL);          const bool bHasChannel = (bHasClient && pChannelStrip != nullptr);
2159          const bool bHasChannels = (bHasClient && wlist.count() > 0);          const bool bHasChannels = (bHasClient && wlist.count() > 0);
2160          m_ui.fileNewAction->setEnabled(bHasClient);          m_ui.fileNewAction->setEnabled(bHasClient);
2161          m_ui.fileOpenAction->setEnabled(bHasClient);          m_ui.fileOpenAction->setEnabled(bHasClient);
2162          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
2163          m_ui.fileSaveAsAction->setEnabled(bHasClient);          m_ui.fileSaveAsAction->setEnabled(bHasClient);
2164          m_ui.fileResetAction->setEnabled(bHasClient);          m_ui.fileResetAction->setEnabled(bHasClient);
2165          m_ui.fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);          m_ui.fileRestartAction->setEnabled(bHasClient || m_pServer == nullptr);
2166          m_ui.editAddChannelAction->setEnabled(bHasClient);          m_ui.editAddChannelAction->setEnabled(bHasClient);
2167          m_ui.editRemoveChannelAction->setEnabled(bHasChannel);          m_ui.editRemoveChannelAction->setEnabled(bHasChannel);
2168          m_ui.editSetupChannelAction->setEnabled(bHasChannel);          m_ui.editSetupChannelAction->setEnabled(bHasChannel);
# Line 2225  void MainForm::updateAllChannelStrips ( Line 2311  void MainForm::updateAllChannelStrips (
2311    
2312          // Retrieve the current channel list.          // Retrieve the current channel list.
2313          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
2314          if (piChannelIDs == NULL) {          if (piChannelIDs == nullptr) {
2315                  if (::lscp_client_get_errno(m_pClient)) {                  if (::lscp_client_get_errno(m_pClient)) {
2316                          appendMessagesClient("lscp_list_channels");                          appendMessagesClient("lscp_list_channels");
2317                          appendMessagesError(                          appendMessagesError(
# Line 2245  void MainForm::updateAllChannelStrips ( Line 2331  void MainForm::updateAllChannelStrips (
2331                  if (bRemoveDeadStrips) {                  if (bRemoveDeadStrips) {
2332                          const QList<QMdiSubWindow *>& wlist                          const QList<QMdiSubWindow *>& wlist
2333                                  = m_pWorkspace->subWindowList();                                  = m_pWorkspace->subWindowList();
2334                          const int iStripCount = wlist.count();                          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2335                          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                                  ChannelStrip *pChannelStrip
2336                                  ChannelStrip *pChannelStrip = NULL;                                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                                 if (pMdiSubWindow)  
                                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2337                                  if (pChannelStrip) {                                  if (pChannelStrip) {
2338                                          bool bExists = false;                                          bool bExists = false;
2339                                          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {                                          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {
2340                                                  Channel *pChannel = pChannelStrip->channel();                                                  Channel *pChannel = pChannelStrip->channel();
2341                                                  if (pChannel == NULL)                                                  if (pChannel == nullptr)
2342                                                          break;                                                          break;
2343                                                  if (piChannelIDs[iChannel] == pChannel->channelID()) {                                                  if (piChannelIDs[iChannel] == pChannel->channelID()) {
2344                                                          // strip exists, don't touch it                                                          // strip exists, don't touch it
# Line 2278  void MainForm::updateAllChannelStrips ( Line 2361  void MainForm::updateAllChannelStrips (
2361  // Update the recent files list and menu.  // Update the recent files list and menu.
2362  void MainForm::updateRecentFiles ( const QString& sFilename )  void MainForm::updateRecentFiles ( const QString& sFilename )
2363  {  {
2364          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2365                  return;                  return;
2366    
2367          // Remove from list if already there (avoid duplicates)          // Remove from list if already there (avoid duplicates)
# Line 2293  void MainForm::updateRecentFiles ( const Line 2376  void MainForm::updateRecentFiles ( const
2376  // Update the recent files list and menu.  // Update the recent files list and menu.
2377  void MainForm::updateRecentFilesMenu (void)  void MainForm::updateRecentFilesMenu (void)
2378  {  {
2379          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2380                  return;                  return;
2381    
2382          // Time to keep the list under limits.          // Time to keep the list under limits.
# Line 2327  void MainForm::updateInstrumentNames (vo Line 2410  void MainForm::updateInstrumentNames (vo
2410                  return;                  return;
2411    
2412          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2413          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2414          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
2415                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2416                  if (pChannelStrip)                  if (pChannelStrip)
2417                          pChannelStrip->updateInstrumentName(true);                          pChannelStrip->updateInstrumentName(true);
2418          }          }
# Line 2343  void MainForm::updateInstrumentNames (vo Line 2423  void MainForm::updateInstrumentNames (vo
2423  // Force update of the channels display font.  // Force update of the channels display font.
2424  void MainForm::updateDisplayFont (void)  void MainForm::updateDisplayFont (void)
2425  {  {
2426          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2427                  return;                  return;
2428    
2429          // Check if display font is legal.          // Check if display font is legal.
# Line 2362  void MainForm::updateDisplayFont (void) Line 2442  void MainForm::updateDisplayFont (void)
2442                  return;                  return;
2443    
2444          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2445          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2446          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
2447                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2448                  if (pChannelStrip)                  if (pChannelStrip)
2449                          pChannelStrip->setDisplayFont(font);                          pChannelStrip->setDisplayFont(font);
2450          }          }
# Line 2385  void MainForm::updateDisplayEffect (void Line 2462  void MainForm::updateDisplayEffect (void
2462                  return;                  return;
2463    
2464          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2465          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2466          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
2467                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2468                  if (pChannelStrip)                  if (pChannelStrip)
2469                          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);                          pChannelStrip->setDisplayEffect(m_pOptions->bDisplayEffect);
2470          }          }
# Line 2401  void MainForm::updateDisplayEffect (void Line 2475  void MainForm::updateDisplayEffect (void
2475  // Force update of the channels maximum volume setting.  // Force update of the channels maximum volume setting.
2476  void MainForm::updateMaxVolume (void)  void MainForm::updateMaxVolume (void)
2477  {  {
2478          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2479                  return;                  return;
2480    
2481  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
# Line 2418  void MainForm::updateMaxVolume (void) Line 2492  void MainForm::updateMaxVolume (void)
2492                  return;                  return;
2493    
2494          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2495          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2496          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
2497                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2498                  if (pChannelStrip)                  if (pChannelStrip)
2499                          pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);                          pChannelStrip->setMaxVolume(m_pOptions->iMaxVolume);
2500          }          }
# Line 2435  void MainForm::updateMaxVolume (void) Line 2506  void MainForm::updateMaxVolume (void)
2506  // QSampler::MainForm -- Messages window form handlers.  // QSampler::MainForm -- Messages window form handlers.
2507    
2508  // Messages output methods.  // Messages output methods.
2509  void MainForm::appendMessages( const QString& s )  void MainForm::appendMessages ( const QString& s )
2510  {  {
2511          if (m_pMessages)          if (m_pMessages)
2512                  m_pMessages->appendMessages(s);                  m_pMessages->appendMessages(s);
# Line 2443  void MainForm::appendMessages( const QSt Line 2514  void MainForm::appendMessages( const QSt
2514          statusBar()->showMessage(s, 3000);          statusBar()->showMessage(s, 3000);
2515  }  }
2516    
2517  void MainForm::appendMessagesColor( const QString& s, const QString& c )  void MainForm::appendMessagesColor ( const QString& s, const QColor& rgb )
2518  {  {
2519          if (m_pMessages)          if (m_pMessages)
2520                  m_pMessages->appendMessagesColor(s, c);                  m_pMessages->appendMessagesColor(s, rgb);
2521    
2522          statusBar()->showMessage(s, 3000);          statusBar()->showMessage(s, 3000);
2523  }  }
2524    
2525  void MainForm::appendMessagesText( const QString& s )  void MainForm::appendMessagesText ( const QString& s )
2526  {  {
2527          if (m_pMessages)          if (m_pMessages)
2528                  m_pMessages->appendMessagesText(s);                  m_pMessages->appendMessagesText(s);
2529  }  }
2530    
2531  void MainForm::appendMessagesError( const QString& sText )  void MainForm::appendMessagesError ( const QString& s )
2532  {  {
2533          if (m_pMessages)          if (m_pMessages)
2534                  m_pMessages->show();                  m_pMessages->show();
2535    
2536          appendMessagesColor(sText.simplified(), "#ff0000");          appendMessagesColor(s.simplified(), Qt::red);
2537    
2538          // Make it look responsive...:)          // Make it look responsive...:)
2539          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2540    
2541          if (m_pOptions && m_pOptions->bConfirmError) {          if (m_pOptions && m_pOptions->bConfirmError) {
2542                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Error");                  const QString& sTitle = tr("Error");
2543          #if 0          #if 0
2544                  QMessageBox::critical(this, sTitle, sText, QMessageBox::Cancel);                  QMessageBox::critical(this, sTitle, sText, QMessageBox::Cancel);
2545          #else          #else
2546                  QMessageBox mbox(this);                  QMessageBox mbox(this);
2547                  mbox.setIcon(QMessageBox::Critical);                  mbox.setIcon(QMessageBox::Critical);
2548                  mbox.setWindowTitle(sTitle);                  mbox.setWindowTitle(sTitle);
2549                  mbox.setText(sText);                  mbox.setText(s);
2550                  mbox.setStandardButtons(QMessageBox::Cancel);                  mbox.setStandardButtons(QMessageBox::Cancel);
2551                  QCheckBox cbox(tr("Don't show this again"));                  QCheckBox cbox(tr("Don't show this again"));
2552                  cbox.setChecked(false);                  cbox.setChecked(false);
# Line 2491  void MainForm::appendMessagesError( cons Line 2562  void MainForm::appendMessagesError( cons
2562  // This is a special message format, just for client results.  // This is a special message format, just for client results.
2563  void MainForm::appendMessagesClient( const QString& s )  void MainForm::appendMessagesClient( const QString& s )
2564  {  {
2565          if (m_pClient == NULL)          if (m_pClient == nullptr)
2566                  return;                  return;
2567    
2568          appendMessagesColor(s + QString(": %1 (errno=%2)")          appendMessagesColor(s + QString(": %1 (errno=%2)")
# Line 2506  void MainForm::appendMessagesClient( con Line 2577  void MainForm::appendMessagesClient( con
2577  // Force update of the messages font.  // Force update of the messages font.
2578  void MainForm::updateMessagesFont (void)  void MainForm::updateMessagesFont (void)
2579  {  {
2580          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2581                  return;                  return;
2582    
2583          if (m_pMessages && !m_pOptions->sMessagesFont.isEmpty()) {          if (m_pMessages && !m_pOptions->sMessagesFont.isEmpty()) {
# Line 2520  void MainForm::updateMessagesFont (void) Line 2591  void MainForm::updateMessagesFont (void)
2591  // Update messages window line limit.  // Update messages window line limit.
2592  void MainForm::updateMessagesLimit (void)  void MainForm::updateMessagesLimit (void)
2593  {  {
2594          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2595                  return;                  return;
2596    
2597          if (m_pMessages) {          if (m_pMessages) {
# Line 2535  void MainForm::updateMessagesLimit (void Line 2606  void MainForm::updateMessagesLimit (void
2606  // Enablement of the messages capture feature.  // Enablement of the messages capture feature.
2607  void MainForm::updateMessagesCapture (void)  void MainForm::updateMessagesCapture (void)
2608  {  {
2609          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2610                  return;                  return;
2611    
2612          if (m_pMessages)          if (m_pMessages)
# Line 2549  void MainForm::updateMessagesCapture (vo Line 2620  void MainForm::updateMessagesCapture (vo
2620  // The channel strip creation executive.  // The channel strip creation executive.
2621  ChannelStrip *MainForm::createChannelStrip ( Channel *pChannel )  ChannelStrip *MainForm::createChannelStrip ( Channel *pChannel )
2622  {  {
2623          if (m_pClient == NULL || pChannel == NULL)          if (m_pClient == nullptr || pChannel == nullptr)
2624                  return NULL;                  return nullptr;
2625    
2626          // Add a new channel itema...          // Add a new channel itema...
2627          ChannelStrip *pChannelStrip = new ChannelStrip();          ChannelStrip *pChannelStrip = new ChannelStrip();
2628          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
2629                  return NULL;                  return nullptr;
2630    
2631          // Set some initial channel strip options...          // Set some initial channel strip options...
2632          if (m_pOptions) {          if (m_pOptions) {
# Line 2571  ChannelStrip *MainForm::createChannelStr Line 2642  ChannelStrip *MainForm::createChannelStr
2642          }          }
2643    
2644          // Add it to workspace...          // Add it to workspace...
2645          m_pWorkspace->addSubWindow(pChannelStrip,          QMdiSubWindow *pMdiSubWindow
2646                  Qt::SubWindow | Qt::FramelessWindowHint);                  = m_pWorkspace->addSubWindow(pChannelStrip,
2647                            Qt::SubWindow | Qt::FramelessWindowHint);
2648            pMdiSubWindow->setAttribute(Qt::WA_DeleteOnClose);
2649    
2650          // Actual channel strip setup...          // Actual channel strip setup...
2651          pChannelStrip->setup(pChannel);          pChannelStrip->setup(pChannel);
# Line 2596  void MainForm::destroyChannelStrip ( Cha Line 2669  void MainForm::destroyChannelStrip ( Cha
2669  {  {
2670          QMdiSubWindow *pMdiSubWindow          QMdiSubWindow *pMdiSubWindow
2671                  = static_cast<QMdiSubWindow *> (pChannelStrip->parentWidget());                  = static_cast<QMdiSubWindow *> (pChannelStrip->parentWidget());
2672          if (pMdiSubWindow == NULL)          if (pMdiSubWindow == nullptr)
2673                  return;                  return;
2674    
2675          // Just delete the channel strip.          // Just delete the channel strip.
# Line 2615  ChannelStrip *MainForm::activeChannelStr Line 2688  ChannelStrip *MainForm::activeChannelStr
2688          if (pMdiSubWindow)          if (pMdiSubWindow)
2689                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2690          else          else
2691                  return NULL;                  return nullptr;
2692  }  }
2693    
2694    
2695  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
2696  ChannelStrip *MainForm::channelStripAt ( int iStrip )  ChannelStrip *MainForm::channelStripAt ( int iStrip )
2697  {  {
2698          if (!m_pWorkspace) return NULL;          if (!m_pWorkspace) return nullptr;
2699    
2700          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
2701                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
2702          if (wlist.isEmpty())          if (wlist.isEmpty())
2703                  return NULL;                  return nullptr;
2704    
2705          if (iStrip < 0 || iStrip >= wlist.count())          if (iStrip < 0 || iStrip >= wlist.count())
2706                  return NULL;                  return nullptr;
2707    
2708          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2709          if (pMdiSubWindow)          if (pMdiSubWindow)
2710                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2711          else          else
2712                  return NULL;                  return nullptr;
2713  }  }
2714    
2715    
# Line 2646  ChannelStrip *MainForm::channelStrip ( i Line 2719  ChannelStrip *MainForm::channelStrip ( i
2719          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
2720                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
2721          if (wlist.isEmpty())          if (wlist.isEmpty())
2722                  return NULL;                  return nullptr;
2723    
2724          const int iStripCount = wlist.count();          foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2725          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  ChannelStrip *pChannelStrip
2726                  ChannelStrip *pChannelStrip = NULL;                          = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                 QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                 if (pMdiSubWindow)  
                         pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2727                  if (pChannelStrip) {                  if (pChannelStrip) {
2728                          Channel *pChannel = pChannelStrip->channel();                          Channel *pChannel = pChannelStrip->channel();
2729                          if (pChannel && pChannel->channelID() == iChannelID)                          if (pChannel && pChannel->channelID() == iChannelID)
# Line 2662  ChannelStrip *MainForm::channelStrip ( i Line 2732  ChannelStrip *MainForm::channelStrip ( i
2732          }          }
2733    
2734          // Not found.          // Not found.
2735          return NULL;          return nullptr;
2736  }  }
2737    
2738    
# Line 2677  void MainForm::channelsMenuAboutToShow ( Line 2747  void MainForm::channelsMenuAboutToShow (
2747                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
2748          if (!wlist.isEmpty()) {          if (!wlist.isEmpty()) {
2749                  m_ui.channelsMenu->addSeparator();                  m_ui.channelsMenu->addSeparator();
2750                  const int iStripCount = wlist.count();                  int iStrip = 0;
2751                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2752                          ChannelStrip *pChannelStrip = NULL;                          ChannelStrip *pChannelStrip
2753                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                                  = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                         if (pMdiSubWindow)  
                                 pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2754                          if (pChannelStrip) {                          if (pChannelStrip) {
2755                                  QAction *pAction = m_ui.channelsMenu->addAction(                                  QAction *pAction = m_ui.channelsMenu->addAction(
2756                                          pChannelStrip->windowTitle(),                                          pChannelStrip->windowTitle(),
# Line 2691  void MainForm::channelsMenuAboutToShow ( Line 2759  void MainForm::channelsMenuAboutToShow (
2759                                  pAction->setChecked(activeChannelStrip() == pChannelStrip);                                  pAction->setChecked(activeChannelStrip() == pChannelStrip);
2760                                  pAction->setData(iStrip);                                  pAction->setData(iStrip);
2761                          }                          }
2762                            ++iStrip;
2763                  }                  }
2764          }          }
2765  }  }
# Line 2701  void MainForm::channelsMenuActivated (vo Line 2770  void MainForm::channelsMenuActivated (vo
2770  {  {
2771          // Retrive channel index from action data...          // Retrive channel index from action data...
2772          QAction *pAction = qobject_cast<QAction *> (sender());          QAction *pAction = qobject_cast<QAction *> (sender());
2773          if (pAction == NULL)          if (pAction == nullptr)
2774                  return;                  return;
2775    
2776          ChannelStrip *pChannelStrip = channelStripAt(pAction->data().toInt());          ChannelStrip *pChannelStrip = channelStripAt(pAction->data().toInt());
# Line 2732  void MainForm::stopSchedule (void) Line 2801  void MainForm::stopSchedule (void)
2801  // Timer slot funtion.  // Timer slot funtion.
2802  void MainForm::timerSlot (void)  void MainForm::timerSlot (void)
2803  {  {
2804          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2805                  return;                  return;
2806    
2807          // Is it the first shot on server start after a few delay?          // Is it the first shot on server start after a few delay?
# Line 2767  void MainForm::timerSlot (void) Line 2836  void MainForm::timerSlot (void)
2836                                  // Update the channel stream usage for each strip...                                  // Update the channel stream usage for each strip...
2837                                  const QList<QMdiSubWindow *>& wlist                                  const QList<QMdiSubWindow *>& wlist
2838                                          = m_pWorkspace->subWindowList();                                          = m_pWorkspace->subWindowList();
2839                                  const int iStripCount = wlist.count();                                  foreach (QMdiSubWindow *pMdiSubWindow, wlist) {
2840                                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                                          ChannelStrip *pChannelStrip
2841                                          ChannelStrip *pChannelStrip = NULL;                                                  = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
                                         QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);  
                                         if (pMdiSubWindow)  
                                                 pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());  
2842                                          if (pChannelStrip && pChannelStrip->isVisible())                                          if (pChannelStrip && pChannelStrip->isVisible())
2843                                                  pChannelStrip->updateChannelUsage();                                                  pChannelStrip->updateChannelUsage();
2844                                  }                                  }
2845                          }                          }
2846                  }                  }
2847    
2848            #if CONFIG_LSCP_CLIENT_CONNECTION_LOST
2849                    // If we lost connection to server: Try to automatically reconnect if we
2850                    // did not start the server.
2851                    //
2852                    // TODO: If we started the server, then we might inform the user that
2853                    // the server probably crashed and asking user ONCE whether we should
2854                    // restart the server.
2855                    if (lscp_client_connection_lost(m_pClient) && !m_pServer)
2856                            startAutoReconnectClient();
2857            #endif // CONFIG_LSCP_CLIENT_CONNECTION_LOST
2858          }          }
2859    
2860          // Register the next timer slot.          // Register the next timer slot.
# Line 2791  void MainForm::timerSlot (void) Line 2868  void MainForm::timerSlot (void)
2868  // Start linuxsampler server...  // Start linuxsampler server...
2869  void MainForm::startServer (void)  void MainForm::startServer (void)
2870  {  {
2871          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2872                  return;                  return;
2873    
2874          // Aren't already a client, are we?          // Aren't already a client, are we?
# Line 2801  void MainForm::startServer (void) Line 2878  void MainForm::startServer (void)
2878          // Is the server process instance still here?          // Is the server process instance still here?
2879          if (m_pServer) {          if (m_pServer) {
2880                  if (QMessageBox::warning(this,                  if (QMessageBox::warning(this,
2881                          QSAMPLER_TITLE ": " + tr("Warning"),                          tr("Warning"),
2882                          tr("Could not start the LinuxSampler server.\n\n"                          tr("Could not start the LinuxSampler server.\n\n"
2883                          "Maybe it is already started."),                          "Maybe it is already started."),
2884                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
# Line 2820  void MainForm::startServer (void) Line 2897  void MainForm::startServer (void)
2897    
2898          // OK. Let's build the startup process...          // OK. Let's build the startup process...
2899          m_pServer = new QProcess();          m_pServer = new QProcess();
2900          bForceServerStop = true;          m_bForceServerStop = true;
2901    
2902          // Setup stdout/stderr capture...          // Setup stdout/stderr capture...
2903          m_pServer->setProcessChannelMode(QProcess::ForwardedChannels);          m_pServer->setProcessChannelMode(QProcess::ForwardedChannels);
# Line 2854  void MainForm::startServer (void) Line 2931  void MainForm::startServer (void)
2931    
2932          // Show startup results...          // Show startup results...
2933          appendMessages(          appendMessages(
2934                  tr("Server was started with PID=%1.").arg((long) m_pServer->pid()));                  tr("Server was started with PID=%1.")
2935                    #if QT_VERSION < QT_VERSION_CHECK(5, 3, 0)
2936                            .arg(quint64(m_pServer->pid())));
2937                    #else
2938                            .arg(quint64(m_pServer->processId())));
2939                    #endif
2940    
2941          // Reset (yet again) the timer counters,          // Reset (yet again) the timer counters,
2942          // but this time is deferred as the user opted.          // but this time is deferred as the user opted.
# Line 2864  void MainForm::startServer (void) Line 2946  void MainForm::startServer (void)
2946    
2947    
2948  // Stop linuxsampler server...  // Stop linuxsampler server...
2949  void MainForm::stopServer (bool bInteractive)  void MainForm::stopServer ( bool bInteractive )
2950  {  {
2951          // Stop client code.          // Stop client code.
2952          stopClient();          stopClient();
2953    
2954          if (m_pServer && bInteractive) {          if (m_pServer && bInteractive) {
2955                  if (QMessageBox::question(this,                  if (QMessageBox::question(this,
2956                          QSAMPLER_TITLE ": " + tr("The backend's fate ..."),                          tr("The backend's fate ..."),
2957                          tr("You have the option to keep the sampler backend (LinuxSampler)\n"                          tr("You have the option to keep the sampler backend (LinuxSampler)\n"
2958                          "running in the background. The sampler would continue to work\n"                          "running in the background. The sampler would continue to work\n"
2959                          "according to your current sampler session and you could alter the\n"                          "according to your current sampler session and you could alter the\n"
2960                          "sampler session at any time by relaunching QSampler.\n\n"                          "sampler session at any time by relaunching QSampler.\n\n"
2961                          "Do you want LinuxSampler to stop?"),                          "Do you want LinuxSampler to stop?"),
2962                          QMessageBox::Yes | QMessageBox::No,                          QMessageBox::Yes | QMessageBox::No,
2963                          QMessageBox::Yes) == QMessageBox::No)                          QMessageBox::Yes) == QMessageBox::No) {
2964                  {                          m_bForceServerStop = false;
                         bForceServerStop = false;  
2965                  }                  }
2966          }          }
2967    
2968            bool bGraceWait = true;
2969    
2970          // And try to stop server.          // And try to stop server.
2971          if (m_pServer && bForceServerStop) {          if (m_pServer && m_bForceServerStop) {
2972                  appendMessages(tr("Server is stopping..."));                  appendMessages(tr("Server is stopping..."));
2973                  if (m_pServer->state() == QProcess::Running) {                  if (m_pServer->state() == QProcess::Running) {
2974                  #if defined(WIN32)                  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
2975                          // Try harder...                          // Try harder...
2976                          m_pServer->kill();                          m_pServer->kill();
2977                  #else                  #else
2978                          // Try softly...                          // Try softly...
2979                          m_pServer->terminate();                          m_pServer->terminate();
2980                            bool bFinished = m_pServer->waitForFinished(QSAMPLER_TIMER_MSECS * 1000);
2981                            if (bFinished) bGraceWait = false;
2982                  #endif                  #endif
2983                  }                  }
2984          }       // Do final processing anyway.          }       // Do final processing anyway.
2985          else processServerExit();          else processServerExit();
2986    
2987          // Give it some time to terminate gracefully and stabilize...          // Give it some time to terminate gracefully and stabilize...
2988          QTime t;          if (bGraceWait) {
2989          t.start();                  QElapsedTimer timer;
2990          while (t.elapsed() < QSAMPLER_TIMER_MSECS)                  timer.start();
2991                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  while (timer.elapsed() < QSAMPLER_TIMER_MSECS)
2992                            QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2993            }
2994  }  }
2995    
2996    
# Line 2925  void MainForm::processServerExit (void) Line 3012  void MainForm::processServerExit (void)
3012          if (m_pMessages)          if (m_pMessages)
3013                  m_pMessages->flushStdoutBuffer();                  m_pMessages->flushStdoutBuffer();
3014    
3015          if (m_pServer && bForceServerStop) {          if (m_pServer && m_bForceServerStop) {
3016                  if (m_pServer->state() != QProcess::NotRunning) {                  if (m_pServer->state() != QProcess::NotRunning) {
3017                          appendMessages(tr("Server is being forced..."));                          appendMessages(tr("Server is being forced..."));
3018                          // Force final server shutdown...                          // Force final server shutdown...
3019                          m_pServer->kill();                          m_pServer->kill();
3020                          // Give it some time to terminate gracefully and stabilize...                          // Give it some time to terminate gracefully and stabilize...
3021                          QTime t;                          QElapsedTimer timer;
3022                          t.start();                          timer.start();
3023                          while (t.elapsed() < QSAMPLER_TIMER_MSECS)                          while (timer.elapsed() < QSAMPLER_TIMER_MSECS)
3024                                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
3025                  }                  }
3026                  // Force final server shutdown...                  // Force final server shutdown...
# Line 2941  void MainForm::processServerExit (void) Line 3028  void MainForm::processServerExit (void)
3028                          tr("Server was stopped with exit status %1.")                          tr("Server was stopped with exit status %1.")
3029                          .arg(m_pServer->exitStatus()));                          .arg(m_pServer->exitStatus()));
3030                  delete m_pServer;                  delete m_pServer;
3031                  m_pServer = NULL;                  m_pServer = nullptr;
3032          }          }
3033    
3034          // Again, make status visible stable.          // Again, make status visible stable.
# Line 2957  lscp_status_t qsampler_client_callback ( Line 3044  lscp_status_t qsampler_client_callback (
3044          lscp_event_t event, const char *pchData, int cchData, void *pvData )          lscp_event_t event, const char *pchData, int cchData, void *pvData )
3045  {  {
3046          MainForm* pMainForm = (MainForm *) pvData;          MainForm* pMainForm = (MainForm *) pvData;
3047          if (pMainForm == NULL)          if (pMainForm == nullptr)
3048                  return LSCP_FAILED;                  return LSCP_FAILED;
3049    
3050          // ATTN: DO NOT EVER call any GUI code here,          // ATTN: DO NOT EVER call any GUI code here,
# Line 2971  lscp_status_t qsampler_client_callback ( Line 3058  lscp_status_t qsampler_client_callback (
3058    
3059    
3060  // Start our almighty client...  // Start our almighty client...
3061  bool MainForm::startClient (void)  bool MainForm::startClient (bool bReconnectOnly)
3062  {  {
3063          // Have it a setup?          // Have it a setup?
3064          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
3065                  return false;                  return false;
3066    
3067          // Aren't we already started, are we?          // Aren't we already started, are we?
# Line 2988  bool MainForm::startClient (void) Line 3075  bool MainForm::startClient (void)
3075          m_pClient = ::lscp_client_create(          m_pClient = ::lscp_client_create(
3076                  m_pOptions->sServerHost.toUtf8().constData(),                  m_pOptions->sServerHost.toUtf8().constData(),
3077                  m_pOptions->iServerPort, qsampler_client_callback, this);                  m_pOptions->iServerPort, qsampler_client_callback, this);
3078          if (m_pClient == NULL) {          if (m_pClient == nullptr) {
3079                  // Is this the first try?                  // Is this the first try?
3080                  // maybe we need to start a local server...                  // maybe we need to start a local server...
3081                  if ((m_pServer && m_pServer->state() == QProcess::Running)                  if ((m_pServer && m_pServer->state() == QProcess::Running)
3082                          || !m_pOptions->bServerStart) {                          || !m_pOptions->bServerStart || bReconnectOnly)
3083                          appendMessagesError(                  {
3084                                  tr("Could not connect to server as client.\n\nSorry."));                          // if this method is called from autoReconnectClient()
3085                            // then don't bother user with an error message...
3086                            if (!bReconnectOnly) {
3087                                    appendMessagesError(
3088                                            tr("Could not connect to server as client.\n\nSorry.")
3089                                    );
3090                            }
3091                  } else {                  } else {
3092                          startServer();                          startServer();
3093                  }                  }
# Line 3002  bool MainForm::startClient (void) Line 3095  bool MainForm::startClient (void)
3095                  stabilizeForm();                  stabilizeForm();
3096                  return false;                  return false;
3097          }          }
3098    
3099          // Just set receive timeout value, blindly.          // Just set receive timeout value, blindly.
3100          ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);          ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
3101          appendMessages(          appendMessages(
# Line 3057  bool MainForm::startClient (void) Line 3151  bool MainForm::startClient (void)
3151          if (!m_pOptions->sSessionFile.isEmpty()) {          if (!m_pOptions->sSessionFile.isEmpty()) {
3152                  // Just load the prabably startup session...                  // Just load the prabably startup session...
3153                  if (loadSessionFile(m_pOptions->sSessionFile)) {                  if (loadSessionFile(m_pOptions->sSessionFile)) {
3154                          m_pOptions->sSessionFile = QString::null;                          m_pOptions->sSessionFile = QString();
3155                          return true;                          return true;
3156                  }                  }
3157          }          }
# Line 3073  bool MainForm::startClient (void) Line 3167  bool MainForm::startClient (void)
3167  // Stop client...  // Stop client...
3168  void MainForm::stopClient (void)  void MainForm::stopClient (void)
3169  {  {
3170          if (m_pClient == NULL)          if (m_pClient == nullptr)
3171                  return;                  return;
3172    
3173          // Log prepare here.          // Log prepare here.
# Line 3105  void MainForm::stopClient (void) Line 3199  void MainForm::stopClient (void)
3199          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
3200          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);
3201          ::lscp_client_destroy(m_pClient);          ::lscp_client_destroy(m_pClient);
3202          m_pClient = NULL;          m_pClient = nullptr;
3203    
3204          // Hard-notify instrumnet and device configuration forms,          // Hard-notify instrumnet and device configuration forms,
3205          // if visible, that we're running out...          // if visible, that we're running out...
# Line 3122  void MainForm::stopClient (void) Line 3216  void MainForm::stopClient (void)
3216  }  }
3217    
3218    
3219    void MainForm::startAutoReconnectClient (void)
3220    {
3221            stopClient();
3222            appendMessages(tr("Trying to reconnect..."));
3223            QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(autoReconnectClient()));
3224    }
3225    
3226    
3227    void MainForm::autoReconnectClient (void)
3228    {
3229            const bool bSuccess = startClient(true);
3230            if (!bSuccess)
3231                    QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(autoReconnectClient()));
3232    }
3233    
3234    
3235  // Channel strip activation/selection.  // Channel strip activation/selection.
3236  void MainForm::activateStrip ( QMdiSubWindow *pMdiSubWindow )  void MainForm::activateStrip ( QMdiSubWindow *pMdiSubWindow )
3237  {  {
3238          ChannelStrip *pChannelStrip = NULL;          ChannelStrip *pChannelStrip = nullptr;
3239          if (pMdiSubWindow)          if (pMdiSubWindow)
3240                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
3241          if (pChannelStrip)          if (pChannelStrip)

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

  ViewVC Help
Powered by ViewVC