/[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 3357 by capela, Tue Oct 17 21:44:20 2017 UTC revision 3559 by capela, Thu Aug 22 18:58:38 2019 UTC
# Line 1  Line 1 
1  // qsamplerMainForm.cpp  // qsamplerMainForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2017, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2019, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007,2008,2015 Christian Schoenebeck     Copyright (C) 2007,2008,2015 Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
# Line 58  Line 58 
58  #include <QTimer>  #include <QTimer>
59  #include <QDateTime>  #include <QDateTime>
60    
61  #if QT_VERSION >= 0x050000  #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
62  #include <QMimeData>  #include <QMimeData>
63  #endif  #endif
64    
65  #if QT_VERSION < 0x040500  #if QT_VERSION < QT_VERSION_CHECK(4, 5, 0)
66  namespace Qt {  namespace Qt {
67  const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);  const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);
68  }  }
69  #endif  #endif
70    
 #ifdef HAVE_SIGNAL_H  
 #include <signal.h>  
 #endif  
   
71  #ifdef CONFIG_LIBGIG  #ifdef CONFIG_LIBGIG
72  #include <gig.h>  #include <gig.h>
73  #endif  #endif
# Line 91  static inline long lroundf ( float x ) Line 87  static inline long lroundf ( float x )
87    
88    
89  // All winsock apps needs this.  // All winsock apps needs this.
90  #if defined(_WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
91  static WSADATA _wsaData;  static WSADATA _wsaData;
92    #undef HAVE_SIGNAL_H
93  #endif  #endif
94    
95    
# Line 103  static WSADATA _wsaData; Line 100  static WSADATA _wsaData;
100    
101  #include <QSocketNotifier>  #include <QSocketNotifier>
102    
103    #include <unistd.h>
104  #include <sys/types.h>  #include <sys/types.h>
105  #include <sys/socket.h>  #include <sys/socket.h>
   
106  #include <signal.h>  #include <signal.h>
107    
108  // File descriptor for SIGUSR1 notifier.  // File descriptor for SIGUSR1 notifier.
109  static int g_fdUsr1[2];  static int g_fdSigusr1[2] = { -1, -1 };
110    
111  // Unix SIGUSR1 signal handler.  // Unix SIGUSR1 signal handler.
112  static void qsampler_sigusr1_handler ( int /* signo */ )  static void qsampler_sigusr1_handler ( int /* signo */ )
113  {  {
114          char c = 1;          char c = 1;
115    
116          (::write(g_fdUsr1[0], &c, sizeof(c)) > 0);          (::write(g_fdSigusr1[0], &c, sizeof(c)) > 0);
117    }
118    
119    // File descriptor for SIGTERM notifier.
120    static int g_fdSigterm[2] = { -1, -1 };
121    
122    // Unix SIGTERM signal handler.
123    static void qsampler_sigterm_handler ( int /* signo */ )
124    {
125            char c = 1;
126    
127            (::write(g_fdSigterm[0], &c, sizeof(c)) > 0);
128  }  }
129    
130  #endif  // HAVE_SIGNAL_H  #endif  // HAVE_SIGNAL_H
# Line 194  protected: Line 202  protected:
202  // QSampler::MainForm -- Main window form implementation.  // QSampler::MainForm -- Main window form implementation.
203    
204  // Kind of singleton reference.  // Kind of singleton reference.
205  MainForm *MainForm::g_pMainForm = NULL;  MainForm *MainForm::g_pMainForm = nullptr;
206    
207  MainForm::MainForm ( QWidget *pParent )  MainForm::MainForm ( QWidget *pParent )
208          : QMainWindow(pParent)          : QMainWindow(pParent)
# Line 205  MainForm::MainForm ( QWidget *pParent ) Line 213  MainForm::MainForm ( QWidget *pParent )
213          g_pMainForm = this;          g_pMainForm = this;
214    
215          // Initialize some pointer references.          // Initialize some pointer references.
216          m_pOptions = NULL;          m_pOptions = nullptr;
217    
218          // All child forms are to be created later, not earlier than setup.          // All child forms are to be created later, not earlier than setup.
219          m_pMessages = NULL;          m_pMessages = nullptr;
220          m_pInstrumentListForm = NULL;          m_pInstrumentListForm = nullptr;
221          m_pDeviceForm = NULL;          m_pDeviceForm = nullptr;
222    
223          // We'll start clean.          // We'll start clean.
224          m_iUntitled   = 0;          m_iUntitled   = 0;
225          m_iDirtySetup = 0;          m_iDirtySetup = 0;
226          m_iDirtyCount = 0;          m_iDirtyCount = 0;
227    
228          m_pServer = NULL;          m_pServer = nullptr;
229          m_pClient = NULL;          m_pClient = nullptr;
230    
231          m_iStartDelay = 0;          m_iStartDelay = 0;
232          m_iTimerDelay = 0;          m_iTimerDelay = 0;
# Line 233  MainForm::MainForm ( QWidget *pParent ) Line 241  MainForm::MainForm ( QWidget *pParent )
241          // LADISH Level 1 suport.          // LADISH Level 1 suport.
242    
243          // Initialize file descriptors for SIGUSR1 socket notifier.          // Initialize file descriptors for SIGUSR1 socket notifier.
244          ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdUsr1);          ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdSigusr1);
245          m_pUsr1Notifier          m_pSigusr1Notifier
246                  = new QSocketNotifier(g_fdUsr1[1], QSocketNotifier::Read, this);                  = new QSocketNotifier(g_fdSigusr1[1], QSocketNotifier::Read, this);
247    
248          QObject::connect(m_pUsr1Notifier,          QObject::connect(m_pSigusr1Notifier,
249                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
250                  SLOT(handle_sigusr1()));                  SLOT(handle_sigusr1()));
251    
252          // Install SIGUSR1 signal handler.          // Install SIGUSR1 signal handler.
253      struct sigaction usr1;          struct sigaction sigusr1;
254      usr1.sa_handler = qsampler_sigusr1_handler;          sigusr1.sa_handler = qsampler_sigusr1_handler;
255      sigemptyset(&usr1.sa_mask);          sigemptyset(&sigusr1.sa_mask);
256      usr1.sa_flags = 0;          sigusr1.sa_flags = 0;
257      usr1.sa_flags |= SA_RESTART;          sigusr1.sa_flags |= SA_RESTART;
258      ::sigaction(SIGUSR1, &usr1, NULL);          ::sigaction(SIGUSR1, &sigusr1, nullptr);
259    
260            // Initialize file descriptors for SIGTERM socket notifier.
261            ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdSigterm);
262            m_pSigtermNotifier
263                    = new QSocketNotifier(g_fdSigterm[1], QSocketNotifier::Read, this);
264    
265            QObject::connect(m_pSigtermNotifier,
266                    SIGNAL(activated(int)),
267                    SLOT(handle_sigterm()));
268    
269            // Install SIGTERM signal handler.
270            struct sigaction sigterm;
271            sigterm.sa_handler = qsampler_sigterm_handler;
272            sigemptyset(&sigterm.sa_mask);
273            sigterm.sa_flags = 0;
274            sigterm.sa_flags |= SA_RESTART;
275            ::sigaction(SIGTERM, &sigterm, nullptr);
276            ::sigaction(SIGQUIT, &sigterm, nullptr);
277    
278            // Ignore SIGHUP/SIGINT signals.
279            ::signal(SIGHUP, SIG_IGN);
280            ::signal(SIGINT, SIG_IGN);
281    
282  #else   // HAVE_SIGNAL_H  #else   // HAVE_SIGNAL_H
283    
284          m_pUsr1Notifier = NULL;          m_pSigusr1Notifier = nullptr;
285            m_pSigtermNotifier = nullptr;
286                    
287  #endif  // !HAVE_SIGNAL_H  #endif  // !HAVE_SIGNAL_H
288    
# Line 324  MainForm::MainForm ( QWidget *pParent ) Line 355  MainForm::MainForm ( QWidget *pParent )
355          m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;          m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
356          statusBar()->addWidget(pLabel);          statusBar()->addWidget(pLabel);
357    
358  #if defined(_WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
359          WSAStartup(MAKEWORD(1, 1), &_wsaData);          WSAStartup(MAKEWORD(1, 1), &_wsaData);
360  #endif  #endif
361    
# Line 425  MainForm::~MainForm() Line 456  MainForm::~MainForm()
456          // Do final processing anyway.          // Do final processing anyway.
457          processServerExit();          processServerExit();
458    
459  #if defined(_WIN32)  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
460          WSACleanup();          WSACleanup();
461  #endif  #endif
462    
463  #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)  #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
464          if (m_pUsr1Notifier)          if (m_pSigusr1Notifier)
465                  delete m_pUsr1Notifier;                  delete m_pSigusr1Notifier;
466            if (m_pSigtermNotifier)
467                    delete m_pSigtermNotifier;
468  #endif  #endif
469    
470          // Finally drop any widgets around...          // Finally drop any widgets around...
# Line 460  MainForm::~MainForm() Line 493  MainForm::~MainForm()
493  #endif  #endif
494    
495          // Pseudo-singleton reference shut-down.          // Pseudo-singleton reference shut-down.
496          g_pMainForm = NULL;          g_pMainForm = nullptr;
497  }  }
498    
499    
# Line 597  void MainForm::closeEvent ( QCloseEvent Line 630  void MainForm::closeEvent ( QCloseEvent
630  void MainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  void MainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
631  {  {
632          // Accept external drags only...          // Accept external drags only...
633          if (pDragEnterEvent->source() == NULL          if (pDragEnterEvent->source() == nullptr
634                  && pDragEnterEvent->mimeData()->hasUrls()) {                  && pDragEnterEvent->mimeData()->hasUrls()) {
635                  pDragEnterEvent->accept();                  pDragEnterEvent->accept();
636          } else {          } else {
# Line 621  void MainForm::dropEvent ( QDropEvent *p Line 654  void MainForm::dropEvent ( QDropEvent *p
654                          if (QFileInfo(sPath).exists()) {                          if (QFileInfo(sPath).exists()) {
655                                  // Try to create a new channel from instrument file...                                  // Try to create a new channel from instrument file...
656                                  Channel *pChannel = new Channel();                                  Channel *pChannel = new Channel();
657                                  if (pChannel == NULL)                                  if (pChannel == nullptr)
658                                          return;                                          return;
659                                  // Start setting the instrument filename...                                  // Start setting the instrument filename...
660                                  pChannel->setInstrument(sPath, 0);                                  pChannel->setInstrument(sPath, 0);
# Line 721  void MainForm::handle_sigusr1 (void) Line 754  void MainForm::handle_sigusr1 (void)
754    
755          char c;          char c;
756    
757          if (::read(g_fdUsr1[1], &c, sizeof(c)) > 0)          if (::read(g_fdSigusr1[1], &c, sizeof(c)) > 0)
758                  saveSession(false);                  saveSession(false);
759    
760  #endif  #endif
761  }  }
762    
763    
764    void MainForm::handle_sigterm (void)
765    {
766    #if defined(HAVE_SIGNAL_H) && defined(HAVE_SYS_SOCKET_H)
767    
768            char c;
769    
770            if (::read(g_fdSigterm[1], &c, sizeof(c)) > 0)
771                    close();
772    
773    #endif
774    }
775    
776    
777  void MainForm::updateViewMidiDeviceStatusMenu (void)  void MainForm::updateViewMidiDeviceStatusMenu (void)
778  {  {
779          m_ui.viewMidiDeviceStatusMenu->clear();          m_ui.viewMidiDeviceStatusMenu->clear();
# Line 806  bool MainForm::newSession (void) Line 852  bool MainForm::newSession (void)
852          m_iUntitled++;          m_iUntitled++;
853    
854          // Stabilize form.          // Stabilize form.
855          m_sFilename = QString::null;          m_sFilename = QString();
856          m_iDirtyCount = 0;          m_iDirtyCount = 0;
857          appendMessages(tr("New session: \"%1\".").arg(sessionName(m_sFilename)));          appendMessages(tr("New session: \"%1\".").arg(sessionName(m_sFilename)));
858          stabilizeForm();          stabilizeForm();
# Line 818  bool MainForm::newSession (void) Line 864  bool MainForm::newSession (void)
864  // Open an existing sampler session.  // Open an existing sampler session.
865  bool MainForm::openSession (void)  bool MainForm::openSession (void)
866  {  {
867          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
868                  return false;                  return false;
869    
870          // Ask for the filename to open...          // Ask for the filename to open...
871          QString sFilename = QFileDialog::getOpenFileName(this,          QString sFilename = QFileDialog::getOpenFileName(this,
872                  QSAMPLER_TITLE ": " + tr("Open Session"), // Caption.                  tr("Open Session"),                       // Caption.
873                  m_pOptions->sSessionDir,                  // Start here.                  m_pOptions->sSessionDir,                  // Start here.
874                  tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)
875          );          );
# Line 844  bool MainForm::openSession (void) Line 890  bool MainForm::openSession (void)
890  // Save current sampler session with another name.  // Save current sampler session with another name.
891  bool MainForm::saveSession ( bool bPrompt )  bool MainForm::saveSession ( bool bPrompt )
892  {  {
893          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
894                  return false;                  return false;
895    
896          QString sFilename = m_sFilename;          QString sFilename = m_sFilename;
# Line 856  bool MainForm::saveSession ( bool bPromp Line 902  bool MainForm::saveSession ( bool bPromp
902                          sFilename = m_pOptions->sSessionDir;                          sFilename = m_pOptions->sSessionDir;
903                  // Prompt the guy...                  // Prompt the guy...
904                  sFilename = QFileDialog::getSaveFileName(this,                  sFilename = QFileDialog::getSaveFileName(this,
905                          QSAMPLER_TITLE ": " + tr("Save Session"), // Caption.                          tr("Save Session"),                       // Caption.
906                          sFilename,                                // Start here.                          sFilename,                                // Start here.
907                          tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)"    // Filter (LSCP files)
908                  );                  );
# Line 866  bool MainForm::saveSession ( bool bPromp Line 912  bool MainForm::saveSession ( bool bPromp
912                  // Enforce .lscp extension...                  // Enforce .lscp extension...
913                  if (QFileInfo(sFilename).suffix().isEmpty())                  if (QFileInfo(sFilename).suffix().isEmpty())
914                          sFilename += ".lscp";                          sFilename += ".lscp";
915            #if 0
916                  // Check if already exists...                  // Check if already exists...
917                  if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {                  if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
918                          if (QMessageBox::warning(this,                          if (QMessageBox::warning(this,
919                                  QSAMPLER_TITLE ": " + tr("Warning"),                                  tr("Warning"),
920                                  tr("The file already exists:\n\n"                                  tr("The file already exists:\n\n"
921                                  "\"%1\"\n\n"                                  "\"%1\"\n\n"
922                                  "Do you want to replace it?")                                  "Do you want to replace it?")
# Line 878  bool MainForm::saveSession ( bool bPromp Line 925  bool MainForm::saveSession ( bool bPromp
925                                  == QMessageBox::No)                                  == QMessageBox::No)
926                                  return false;                                  return false;
927                  }                  }
928            #endif
929          }          }
930    
931          // Save it right away.          // Save it right away.
# Line 893  bool MainForm::closeSession ( bool bForc Line 941  bool MainForm::closeSession ( bool bForc
941          // Are we dirty enough to prompt it?          // Are we dirty enough to prompt it?
942          if (m_iDirtyCount > 0) {          if (m_iDirtyCount > 0) {
943                  switch (QMessageBox::warning(this,                  switch (QMessageBox::warning(this,
944                          QSAMPLER_TITLE ": " + tr("Warning"),                          tr("Warning"),
945                          tr("The current session has been changed:\n\n"                          tr("The current session has been changed:\n\n"
946                          "\"%1\"\n\n"                          "\"%1\"\n\n"
947                          "Do you want to save the changes?")                          "Do you want to save the changes?")
# Line 920  bool MainForm::closeSession ( bool bForc Line 968  bool MainForm::closeSession ( bool bForc
968                          = m_pWorkspace->subWindowList();                          = m_pWorkspace->subWindowList();
969                  const int iStripCount = wlist.count();                  const int iStripCount = wlist.count();
970                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
971                          ChannelStrip *pChannelStrip = NULL;                          ChannelStrip *pChannelStrip = nullptr;
972                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
973                          if (pMdiSubWindow)                          if (pMdiSubWindow)
974                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 945  bool MainForm::closeSession ( bool bForc Line 993  bool MainForm::closeSession ( bool bForc
993  // Load a session from specific file path.  // Load a session from specific file path.
994  bool MainForm::loadSessionFile ( const QString& sFilename )  bool MainForm::loadSessionFile ( const QString& sFilename )
995  {  {
996          if (m_pClient == NULL)          if (m_pClient == nullptr)
997                  return false;                  return false;
998    
999          // Open and read from real file.          // Open and read from real file.
# Line 1021  bool MainForm::loadSessionFile ( const Q Line 1069  bool MainForm::loadSessionFile ( const Q
1069  // Save current session to specific file path.  // Save current session to specific file path.
1070  bool MainForm::saveSessionFile ( const QString& sFilename )  bool MainForm::saveSessionFile ( const QString& sFilename )
1071  {  {
1072          if (m_pClient == NULL)          if (m_pClient == nullptr)
1073                  return false;                  return false;
1074    
1075          // Check whether server is apparently OK...          // Check whether server is apparently OK...
# Line 1060  bool MainForm::saveSessionFile ( const Q Line 1108  bool MainForm::saveSessionFile ( const Q
1108          // It is assumed that this new kind of device+session file          // It is assumed that this new kind of device+session file
1109          // will be loaded from a complete initialized server...          // will be loaded from a complete initialized server...
1110          int *piDeviceIDs;          int *piDeviceIDs;
1111          int  iDevice;          int  i, iDevice;
1112          ts << "RESET" << endl;          ts << "RESET" << endl;
1113    
1114          // Audio device mapping.          // Audio device mapping.
1115          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap; iDevice = 0;
1116          piDeviceIDs = Device::getDevices(m_pClient, Device::Audio);          piDeviceIDs = Device::getDevices(m_pClient, Device::Audio);
1117          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
1118                  ts << endl;                  Device device(Device::Audio, piDeviceIDs[i]);
1119                  Device device(Device::Audio, piDeviceIDs[iDevice]);                  // Avoid plug-in driver devices...
1120                    if (device.driverName().toUpper() == "PLUGIN")
1121                            continue;
1122                  // Audio device specification...                  // Audio device specification...
1123                    ts << endl;
1124                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1125                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1126                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
# Line 1100  bool MainForm::saveSessionFile ( const Q Line 1151  bool MainForm::saveSessionFile ( const Q
1151                          iPort++;                          iPort++;
1152                  }                  }
1153                  // Audio device index/id mapping.                  // Audio device index/id mapping.
1154                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap.insert(device.deviceID(), iDevice++);
1155                  // Try to keep it snappy :)                  // Try to keep it snappy :)
1156                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
1157          }          }
1158    
1159          // MIDI device mapping.          // MIDI device mapping.
1160          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap; iDevice = 0;
1161          piDeviceIDs = Device::getDevices(m_pClient, Device::Midi);          piDeviceIDs = Device::getDevices(m_pClient, Device::Midi);
1162          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
1163                  ts << endl;                  Device device(Device::Midi, piDeviceIDs[i]);
1164                  Device device(Device::Midi, piDeviceIDs[iDevice]);                  // Avoid plug-in driver devices...
1165                    if (device.driverName().toUpper() == "PLUGIN")
1166                            continue;
1167                  // MIDI device specification...                  // MIDI device specification...
1168                    ts << endl;
1169                  ts << "# " << device.deviceTypeName() << " " << device.driverName()                  ts << "# " << device.deviceTypeName() << " " << device.driverName()
1170                          << " " << tr("Device") << " " << iDevice << endl;                          << " " << tr("Device") << " " << iDevice << endl;
1171                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
# Line 1142  bool MainForm::saveSessionFile ( const Q Line 1196  bool MainForm::saveSessionFile ( const Q
1196                          iPort++;                          iPort++;
1197                  }                  }
1198                  // MIDI device index/id mapping.                  // MIDI device index/id mapping.
1199                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap.insert(device.deviceID(), iDevice++);
1200                  // Try to keep it snappy :)                  // Try to keep it snappy :)
1201                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
1202          }          }
# Line 1205  bool MainForm::saveSessionFile ( const Q Line 1259  bool MainForm::saveSessionFile ( const Q
1259                  }                  }
1260                  ts << endl;                  ts << endl;
1261                  // Check for errors...                  // Check for errors...
1262                  if (pInstrs == NULL && ::lscp_client_get_errno(m_pClient)) {                  if (pInstrs == nullptr && ::lscp_client_get_errno(m_pClient)) {
1263                          appendMessagesClient("lscp_list_midi_instruments");                          appendMessagesClient("lscp_list_midi_instruments");
1264                          iErrors++;                          iErrors++;
1265                  }                  }
1266                  // MIDI strument index/id mapping.                  // MIDI strument index/id mapping.
1267                  midiInstrumentMap[iMidiMap] = iMap;                  midiInstrumentMap.insert(iMidiMap, iMap);
1268          }          }
1269          // Check for errors...          // Check for errors...
1270          if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) {          if (piMaps == nullptr && ::lscp_client_get_errno(m_pClient)) {
1271                  appendMessagesClient("lscp_list_midi_instrument_maps");                  appendMessagesClient("lscp_list_midi_instrument_maps");
1272                  iErrors++;                  iErrors++;
1273          }          }
1274  #endif  // CONFIG_MIDI_INSTRUMENT  #endif  // CONFIG_MIDI_INSTRUMENT
1275    
1276          // Sampler channel mapping.          // Sampler channel mapping...
1277            int iChannelID = 0;
1278          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
1279                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
1280          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
1281          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
1282                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
1283                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
1284                  if (pMdiSubWindow)                  if (pMdiSubWindow)
1285                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
1286                  if (pChannelStrip) {                  if (pChannelStrip) {
1287                          Channel *pChannel = pChannelStrip->channel();                          Channel *pChannel = pChannelStrip->channel();
1288                          if (pChannel) {                          if (pChannel) {
1289                                  const int iChannelID = pChannel->channelID();                                  // Avoid "artifial" plug-in devices...
1290                                    const int iAudioDevice = pChannel->audioDevice();
1291                                    if (!audioDeviceMap.contains(iAudioDevice))
1292                                            continue;
1293                                    const int iMidiDevice = pChannel->midiDevice();
1294                                    if (!midiDeviceMap.contains(iMidiDevice))
1295                                            continue;
1296                                    // Go for regular, canonical devices...
1297                                  ts << "# " << tr("Channel") << " " << iChannelID << endl;                                  ts << "# " << tr("Channel") << " " << iChannelID << endl;
1298                                  ts << "ADD CHANNEL" << endl;                                  ts << "ADD CHANNEL" << endl;
1299                                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
# Line 1239  bool MainForm::saveSessionFile ( const Q Line 1301  bool MainForm::saveSessionFile ( const Q
1301                                                  << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
1302                                  } else {                                  } else {
1303                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID
1304                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap.value(iAudioDevice) << endl;
1305                                  }                                  }
1306                                  if (midiDeviceMap.isEmpty()) {                                  if (midiDeviceMap.isEmpty()) {
1307                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID                                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID
1308                                                  << " " << pChannel->midiDriver() << endl;                                                  << " " << pChannel->midiDriver() << endl;
1309                                  } else {                                  } else {
1310                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID                                          ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID
1311                                                  << " " << midiDeviceMap[pChannel->midiDevice()] << endl;                                                  << " " << midiDeviceMap.value(iMidiDevice) << endl;
1312                                  }                                  }
1313                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID
1314                                          << " " << pChannel->midiPort() << endl;                                          << " " << pChannel->midiPort() << endl;
# Line 1277  bool MainForm::saveSessionFile ( const Q Line 1339  bool MainForm::saveSessionFile ( const Q
1339                                  if (pChannel->channelSolo())                                  if (pChannel->channelSolo())
1340                                          ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl;                                          ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl;
1341                          #ifdef CONFIG_MIDI_INSTRUMENT                          #ifdef CONFIG_MIDI_INSTRUMENT
1342                                  if (pChannel->midiMap() >= 0) {                                  const int iMidiMap = pChannel->midiMap();
1343                                    if (midiInstrumentMap.contains(iMidiMap)) {
1344                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID                                          ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID
1345                                                  << " " << midiInstrumentMap[pChannel->midiMap()] << endl;                                                  << " " << midiInstrumentMap.value(iMidiMap) << endl;
1346                                  }                                  }
1347                          #endif                          #endif
1348                          #ifdef CONFIG_FXSEND                          #ifdef CONFIG_FXSEND
# Line 1318  bool MainForm::saveSessionFile ( const Q Line 1381  bool MainForm::saveSessionFile ( const Q
1381                                  }                                  }
1382                          #endif                          #endif
1383                                  ts << endl;                                  ts << endl;
1384                                    // Go for next channel...
1385                                    ++iChannelID;
1386                          }                          }
1387                  }                  }
1388                  // Try to keep it snappy :)                  // Try to keep it snappy :)
# Line 1423  void MainForm::fileSaveAs (void) Line 1488  void MainForm::fileSaveAs (void)
1488  // Reset the sampler instance.  // Reset the sampler instance.
1489  void MainForm::fileReset (void)  void MainForm::fileReset (void)
1490  {  {
1491          if (m_pClient == NULL)          if (m_pClient == nullptr)
1492                  return;                  return;
1493    
1494          // Ask user whether he/she want's an internal sampler reset...          // Ask user whether he/she want's an internal sampler reset...
1495          if (m_pOptions && m_pOptions->bConfirmReset) {          if (m_pOptions && m_pOptions->bConfirmReset) {
1496                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1497                  const QString& sText = tr(                  const QString& sText = tr(
1498                          "Resetting the sampler instance will close\n"                          "Resetting the sampler instance will close\n"
1499                          "all device and channel configurations.\n\n"                          "all device and channel configurations.\n\n"
# Line 1479  void MainForm::fileReset (void) Line 1544  void MainForm::fileReset (void)
1544  // Restart the client/server instance.  // Restart the client/server instance.
1545  void MainForm::fileRestart (void)  void MainForm::fileRestart (void)
1546  {  {
1547          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1548                  return;                  return;
1549    
1550          bool bRestart = true;          bool bRestart = true;
# Line 1487  void MainForm::fileRestart (void) Line 1552  void MainForm::fileRestart (void)
1552          // Ask user whether he/she want's a complete restart...          // Ask user whether he/she want's a complete restart...
1553          // (if we're currently up and running)          // (if we're currently up and running)
1554          if (m_pOptions && m_pOptions->bConfirmRestart) {          if (m_pOptions && m_pOptions->bConfirmRestart) {
1555                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1556                  const QString& sText = tr(                  const QString& sText = tr(
1557                          "New settings will be effective after\n"                          "New settings will be effective after\n"
1558                          "restarting the client/server connection.\n\n"                          "restarting the client/server connection.\n\n"
# Line 1547  void MainForm::editAddChannel (void) Line 1612  void MainForm::editAddChannel (void)
1612    
1613  void MainForm::addChannelStrip (void)  void MainForm::addChannelStrip (void)
1614  {  {
1615          if (m_pClient == NULL)          if (m_pClient == nullptr)
1616                  return;                  return;
1617    
1618          // Just create the channel instance...          // Just create the channel instance...
1619          Channel *pChannel = new Channel();          Channel *pChannel = new Channel();
1620          if (pChannel == NULL)          if (pChannel == nullptr)
1621                  return;                  return;
1622    
1623          // Before we show it up, may be we'll          // Before we show it up, may be we'll
# Line 1588  void MainForm::editRemoveChannel (void) Line 1653  void MainForm::editRemoveChannel (void)
1653    
1654  void MainForm::removeChannelStrip (void)  void MainForm::removeChannelStrip (void)
1655  {  {
1656          if (m_pClient == NULL)          if (m_pClient == nullptr)
1657                  return;                  return;
1658    
1659          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1660          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1661                  return;                  return;
1662    
1663          Channel *pChannel = pChannelStrip->channel();          Channel *pChannel = pChannelStrip->channel();
1664          if (pChannel == NULL)          if (pChannel == nullptr)
1665                  return;                  return;
1666    
1667          // Prompt user if he/she's sure about this...          // Prompt user if he/she's sure about this...
1668          if (m_pOptions && m_pOptions->bConfirmRemove) {          if (m_pOptions && m_pOptions->bConfirmRemove) {
1669                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Warning");                  const QString& sTitle = tr("Warning");
1670                  const QString& sText = tr(                  const QString& sText = tr(
1671                          "About to remove channel:\n\n"                          "About to remove channel:\n\n"
1672                          "%1\n\n"                          "%1\n\n"
# Line 1644  void MainForm::removeChannelStrip (void) Line 1709  void MainForm::removeChannelStrip (void)
1709  // Setup current sampler channel.  // Setup current sampler channel.
1710  void MainForm::editSetupChannel (void)  void MainForm::editSetupChannel (void)
1711  {  {
1712          if (m_pClient == NULL)          if (m_pClient == nullptr)
1713                  return;                  return;
1714    
1715          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1716          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1717                  return;                  return;
1718    
1719          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1659  void MainForm::editSetupChannel (void) Line 1724  void MainForm::editSetupChannel (void)
1724  // Edit current sampler channel.  // Edit current sampler channel.
1725  void MainForm::editEditChannel (void)  void MainForm::editEditChannel (void)
1726  {  {
1727          if (m_pClient == NULL)          if (m_pClient == nullptr)
1728                  return;                  return;
1729    
1730          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1731          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1732                  return;                  return;
1733    
1734          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1674  void MainForm::editEditChannel (void) Line 1739  void MainForm::editEditChannel (void)
1739  // Reset current sampler channel.  // Reset current sampler channel.
1740  void MainForm::editResetChannel (void)  void MainForm::editResetChannel (void)
1741  {  {
1742          if (m_pClient == NULL)          if (m_pClient == nullptr)
1743                  return;                  return;
1744    
1745          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1746          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
1747                  return;                  return;
1748    
1749          // Just invoque the channel strip procedure.          // Just invoque the channel strip procedure.
# Line 1689  void MainForm::editResetChannel (void) Line 1754  void MainForm::editResetChannel (void)
1754  // Reset all sampler channels.  // Reset all sampler channels.
1755  void MainForm::editResetAllChannels (void)  void MainForm::editResetAllChannels (void)
1756  {  {
1757          if (m_pClient == NULL)          if (m_pClient == nullptr)
1758                  return;                  return;
1759    
1760          // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
# Line 1699  void MainForm::editResetAllChannels (voi Line 1764  void MainForm::editResetAllChannels (voi
1764                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
1765          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
1766          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
1767                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
1768                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
1769                  if (pMdiSubWindow)                  if (pMdiSubWindow)
1770                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 1761  void MainForm::viewMessages ( bool bOn ) Line 1826  void MainForm::viewMessages ( bool bOn )
1826  // Show/hide the MIDI instrument list-view form.  // Show/hide the MIDI instrument list-view form.
1827  void MainForm::viewInstruments (void)  void MainForm::viewInstruments (void)
1828  {  {
1829          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1830                  return;                  return;
1831    
1832          if (m_pInstrumentListForm) {          if (m_pInstrumentListForm) {
# Line 1780  void MainForm::viewInstruments (void) Line 1845  void MainForm::viewInstruments (void)
1845  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1846  void MainForm::viewDevices (void)  void MainForm::viewDevices (void)
1847  {  {
1848          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1849                  return;                  return;
1850    
1851          if (m_pDeviceForm) {          if (m_pDeviceForm) {
# Line 1799  void MainForm::viewDevices (void) Line 1864  void MainForm::viewDevices (void)
1864  // Show options dialog.  // Show options dialog.
1865  void MainForm::viewOptions (void)  void MainForm::viewOptions (void)
1866  {  {
1867          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1868                  return;                  return;
1869    
1870          OptionsForm* pOptionsForm = new OptionsForm(this);          OptionsForm* pOptionsForm = new OptionsForm(this);
# Line 1841  void MainForm::viewOptions (void) Line 1906  void MainForm::viewOptions (void)
1906                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||
1907                                  (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {                                  (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {
1908                                  QMessageBox::information(this,                                  QMessageBox::information(this,
1909                                          QSAMPLER_TITLE ": " + tr("Information"),                                          tr("Information"),
1910                                          tr("Some settings may be only effective\n"                                          tr("Some settings may be only effective\n"
1911                                          "next time you start this program."));                                          "next time you start this program."));
1912                                  updateMessagesCapture();                                  updateMessagesCapture();
# Line 1927  void MainForm::channelsArrange (void) Line 1992  void MainForm::channelsArrange (void)
1992  // Auto-arrange channel strips.  // Auto-arrange channel strips.
1993  void MainForm::channelsAutoArrange ( bool bOn )  void MainForm::channelsAutoArrange ( bool bOn )
1994  {  {
1995          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
1996                  return;                  return;
1997    
1998          // Toggle the auto-arrange flag.          // Toggle the auto-arrange flag.
# Line 2031  void MainForm::helpAbout (void) Line 2096  void MainForm::helpAbout (void)
2096          sText += "</small>";          sText += "</small>";
2097          sText += "</p>\n";          sText += "</p>\n";
2098    
2099          QMessageBox::about(this, tr("About") + " " QSAMPLER_TITLE, sText);          QMessageBox::about(this, tr("About"), sText);
2100  }  }
2101    
2102    
# Line 2044  void MainForm::stabilizeForm (void) Line 2109  void MainForm::stabilizeForm (void)
2109          QString sSessionName = sessionName(m_sFilename);          QString sSessionName = sessionName(m_sFilename);
2110          if (m_iDirtyCount > 0)          if (m_iDirtyCount > 0)
2111                  sSessionName += " *";                  sSessionName += " *";
2112          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));          setWindowTitle(sSessionName);
2113    
2114          // Update the main menu state...          // Update the main menu state...
2115          ChannelStrip *pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
2116          const QList<QMdiSubWindow *>& wlist = m_pWorkspace->subWindowList();          const QList<QMdiSubWindow *>& wlist = m_pWorkspace->subWindowList();
2117          const bool bHasClient = (m_pOptions != NULL && m_pClient != NULL);          const bool bHasClient = (m_pOptions != nullptr && m_pClient != nullptr);
2118          const bool bHasChannel = (bHasClient && pChannelStrip != NULL);          const bool bHasChannel = (bHasClient && pChannelStrip != nullptr);
2119          const bool bHasChannels = (bHasClient && wlist.count() > 0);          const bool bHasChannels = (bHasClient && wlist.count() > 0);
2120          m_ui.fileNewAction->setEnabled(bHasClient);          m_ui.fileNewAction->setEnabled(bHasClient);
2121          m_ui.fileOpenAction->setEnabled(bHasClient);          m_ui.fileOpenAction->setEnabled(bHasClient);
2122          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
2123          m_ui.fileSaveAsAction->setEnabled(bHasClient);          m_ui.fileSaveAsAction->setEnabled(bHasClient);
2124          m_ui.fileResetAction->setEnabled(bHasClient);          m_ui.fileResetAction->setEnabled(bHasClient);
2125          m_ui.fileRestartAction->setEnabled(bHasClient || m_pServer == NULL);          m_ui.fileRestartAction->setEnabled(bHasClient || m_pServer == nullptr);
2126          m_ui.editAddChannelAction->setEnabled(bHasClient);          m_ui.editAddChannelAction->setEnabled(bHasClient);
2127          m_ui.editRemoveChannelAction->setEnabled(bHasChannel);          m_ui.editRemoveChannelAction->setEnabled(bHasChannel);
2128          m_ui.editSetupChannelAction->setEnabled(bHasChannel);          m_ui.editSetupChannelAction->setEnabled(bHasChannel);
# Line 2206  void MainForm::updateAllChannelStrips ( Line 2271  void MainForm::updateAllChannelStrips (
2271    
2272          // Retrieve the current channel list.          // Retrieve the current channel list.
2273          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
2274          if (piChannelIDs == NULL) {          if (piChannelIDs == nullptr) {
2275                  if (::lscp_client_get_errno(m_pClient)) {                  if (::lscp_client_get_errno(m_pClient)) {
2276                          appendMessagesClient("lscp_list_channels");                          appendMessagesClient("lscp_list_channels");
2277                          appendMessagesError(                          appendMessagesError(
# Line 2228  void MainForm::updateAllChannelStrips ( Line 2293  void MainForm::updateAllChannelStrips (
2293                                  = m_pWorkspace->subWindowList();                                  = m_pWorkspace->subWindowList();
2294                          const int iStripCount = wlist.count();                          const int iStripCount = wlist.count();
2295                          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2296                                  ChannelStrip *pChannelStrip = NULL;                                  ChannelStrip *pChannelStrip = nullptr;
2297                                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2298                                  if (pMdiSubWindow)                                  if (pMdiSubWindow)
2299                                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2236  void MainForm::updateAllChannelStrips ( Line 2301  void MainForm::updateAllChannelStrips (
2301                                          bool bExists = false;                                          bool bExists = false;
2302                                          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {                                          for (int iChannel = 0; piChannelIDs[iChannel] >= 0; ++iChannel) {
2303                                                  Channel *pChannel = pChannelStrip->channel();                                                  Channel *pChannel = pChannelStrip->channel();
2304                                                  if (pChannel == NULL)                                                  if (pChannel == nullptr)
2305                                                          break;                                                          break;
2306                                                  if (piChannelIDs[iChannel] == pChannel->channelID()) {                                                  if (piChannelIDs[iChannel] == pChannel->channelID()) {
2307                                                          // strip exists, don't touch it                                                          // strip exists, don't touch it
# Line 2259  void MainForm::updateAllChannelStrips ( Line 2324  void MainForm::updateAllChannelStrips (
2324  // Update the recent files list and menu.  // Update the recent files list and menu.
2325  void MainForm::updateRecentFiles ( const QString& sFilename )  void MainForm::updateRecentFiles ( const QString& sFilename )
2326  {  {
2327          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2328                  return;                  return;
2329    
2330          // Remove from list if already there (avoid duplicates)          // Remove from list if already there (avoid duplicates)
# Line 2274  void MainForm::updateRecentFiles ( const Line 2339  void MainForm::updateRecentFiles ( const
2339  // Update the recent files list and menu.  // Update the recent files list and menu.
2340  void MainForm::updateRecentFilesMenu (void)  void MainForm::updateRecentFilesMenu (void)
2341  {  {
2342          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2343                  return;                  return;
2344    
2345          // Time to keep the list under limits.          // Time to keep the list under limits.
# Line 2310  void MainForm::updateInstrumentNames (vo Line 2375  void MainForm::updateInstrumentNames (vo
2375          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2376          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
2377          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2378                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
2379                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2380                  if (pMdiSubWindow)                  if (pMdiSubWindow)
2381                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2324  void MainForm::updateInstrumentNames (vo Line 2389  void MainForm::updateInstrumentNames (vo
2389  // Force update of the channels display font.  // Force update of the channels display font.
2390  void MainForm::updateDisplayFont (void)  void MainForm::updateDisplayFont (void)
2391  {  {
2392          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2393                  return;                  return;
2394    
2395          // Check if display font is legal.          // Check if display font is legal.
# Line 2345  void MainForm::updateDisplayFont (void) Line 2410  void MainForm::updateDisplayFont (void)
2410          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2411          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
2412          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2413                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
2414                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2415                  if (pMdiSubWindow)                  if (pMdiSubWindow)
2416                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2368  void MainForm::updateDisplayEffect (void Line 2433  void MainForm::updateDisplayEffect (void
2433          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2434          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
2435          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2436                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
2437                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2438                  if (pMdiSubWindow)                  if (pMdiSubWindow)
2439                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2382  void MainForm::updateDisplayEffect (void Line 2447  void MainForm::updateDisplayEffect (void
2447  // Force update of the channels maximum volume setting.  // Force update of the channels maximum volume setting.
2448  void MainForm::updateMaxVolume (void)  void MainForm::updateMaxVolume (void)
2449  {  {
2450          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2451                  return;                  return;
2452    
2453  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
# Line 2401  void MainForm::updateMaxVolume (void) Line 2466  void MainForm::updateMaxVolume (void)
2466          m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
2467          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
2468          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2469                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
2470                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2471                  if (pMdiSubWindow)                  if (pMdiSubWindow)
2472                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2449  void MainForm::appendMessagesError( cons Line 2514  void MainForm::appendMessagesError( cons
2514          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2515    
2516          if (m_pOptions && m_pOptions->bConfirmError) {          if (m_pOptions && m_pOptions->bConfirmError) {
2517                  const QString& sTitle = QSAMPLER_TITLE ": " + tr("Error");                  const QString& sTitle = tr("Error");
2518          #if 0          #if 0
2519                  QMessageBox::critical(this, sTitle, sText, QMessageBox::Cancel);                  QMessageBox::critical(this, sTitle, sText, QMessageBox::Cancel);
2520          #else          #else
# Line 2472  void MainForm::appendMessagesError( cons Line 2537  void MainForm::appendMessagesError( cons
2537  // This is a special message format, just for client results.  // This is a special message format, just for client results.
2538  void MainForm::appendMessagesClient( const QString& s )  void MainForm::appendMessagesClient( const QString& s )
2539  {  {
2540          if (m_pClient == NULL)          if (m_pClient == nullptr)
2541                  return;                  return;
2542    
2543          appendMessagesColor(s + QString(": %1 (errno=%2)")          appendMessagesColor(s + QString(": %1 (errno=%2)")
# Line 2487  void MainForm::appendMessagesClient( con Line 2552  void MainForm::appendMessagesClient( con
2552  // Force update of the messages font.  // Force update of the messages font.
2553  void MainForm::updateMessagesFont (void)  void MainForm::updateMessagesFont (void)
2554  {  {
2555          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2556                  return;                  return;
2557    
2558          if (m_pMessages && !m_pOptions->sMessagesFont.isEmpty()) {          if (m_pMessages && !m_pOptions->sMessagesFont.isEmpty()) {
# Line 2501  void MainForm::updateMessagesFont (void) Line 2566  void MainForm::updateMessagesFont (void)
2566  // Update messages window line limit.  // Update messages window line limit.
2567  void MainForm::updateMessagesLimit (void)  void MainForm::updateMessagesLimit (void)
2568  {  {
2569          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2570                  return;                  return;
2571    
2572          if (m_pMessages) {          if (m_pMessages) {
# Line 2516  void MainForm::updateMessagesLimit (void Line 2581  void MainForm::updateMessagesLimit (void
2581  // Enablement of the messages capture feature.  // Enablement of the messages capture feature.
2582  void MainForm::updateMessagesCapture (void)  void MainForm::updateMessagesCapture (void)
2583  {  {
2584          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2585                  return;                  return;
2586    
2587          if (m_pMessages)          if (m_pMessages)
# Line 2530  void MainForm::updateMessagesCapture (vo Line 2595  void MainForm::updateMessagesCapture (vo
2595  // The channel strip creation executive.  // The channel strip creation executive.
2596  ChannelStrip *MainForm::createChannelStrip ( Channel *pChannel )  ChannelStrip *MainForm::createChannelStrip ( Channel *pChannel )
2597  {  {
2598          if (m_pClient == NULL || pChannel == NULL)          if (m_pClient == nullptr || pChannel == nullptr)
2599                  return NULL;                  return nullptr;
2600    
2601          // Add a new channel itema...          // Add a new channel itema...
2602          ChannelStrip *pChannelStrip = new ChannelStrip();          ChannelStrip *pChannelStrip = new ChannelStrip();
2603          if (pChannelStrip == NULL)          if (pChannelStrip == nullptr)
2604                  return NULL;                  return nullptr;
2605    
2606          // Set some initial channel strip options...          // Set some initial channel strip options...
2607          if (m_pOptions) {          if (m_pOptions) {
# Line 2577  void MainForm::destroyChannelStrip ( Cha Line 2642  void MainForm::destroyChannelStrip ( Cha
2642  {  {
2643          QMdiSubWindow *pMdiSubWindow          QMdiSubWindow *pMdiSubWindow
2644                  = static_cast<QMdiSubWindow *> (pChannelStrip->parentWidget());                  = static_cast<QMdiSubWindow *> (pChannelStrip->parentWidget());
2645          if (pMdiSubWindow == NULL)          if (pMdiSubWindow == nullptr)
2646                  return;                  return;
2647    
2648          // Just delete the channel strip.          // Just delete the channel strip.
# Line 2596  ChannelStrip *MainForm::activeChannelStr Line 2661  ChannelStrip *MainForm::activeChannelStr
2661          if (pMdiSubWindow)          if (pMdiSubWindow)
2662                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2663          else          else
2664                  return NULL;                  return nullptr;
2665  }  }
2666    
2667    
2668  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
2669  ChannelStrip *MainForm::channelStripAt ( int iStrip )  ChannelStrip *MainForm::channelStripAt ( int iStrip )
2670  {  {
2671          if (!m_pWorkspace) return NULL;          if (!m_pWorkspace) return nullptr;
2672    
2673          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
2674                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
2675          if (wlist.isEmpty())          if (wlist.isEmpty())
2676                  return NULL;                  return nullptr;
2677    
2678          if (iStrip < 0 || iStrip >= wlist.count())          if (iStrip < 0 || iStrip >= wlist.count())
2679                  return NULL;                  return nullptr;
2680    
2681          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2682          if (pMdiSubWindow)          if (pMdiSubWindow)
2683                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  return static_cast<ChannelStrip *> (pMdiSubWindow->widget());
2684          else          else
2685                  return NULL;                  return nullptr;
2686  }  }
2687    
2688    
# Line 2627  ChannelStrip *MainForm::channelStrip ( i Line 2692  ChannelStrip *MainForm::channelStrip ( i
2692          const QList<QMdiSubWindow *>& wlist          const QList<QMdiSubWindow *>& wlist
2693                  = m_pWorkspace->subWindowList();                  = m_pWorkspace->subWindowList();
2694          if (wlist.isEmpty())          if (wlist.isEmpty())
2695                  return NULL;                  return nullptr;
2696    
2697          const int iStripCount = wlist.count();          const int iStripCount = wlist.count();
2698          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {          for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2699                  ChannelStrip *pChannelStrip = NULL;                  ChannelStrip *pChannelStrip = nullptr;
2700                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                  QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2701                  if (pMdiSubWindow)                  if (pMdiSubWindow)
2702                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                          pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2643  ChannelStrip *MainForm::channelStrip ( i Line 2708  ChannelStrip *MainForm::channelStrip ( i
2708          }          }
2709    
2710          // Not found.          // Not found.
2711          return NULL;          return nullptr;
2712  }  }
2713    
2714    
# Line 2660  void MainForm::channelsMenuAboutToShow ( Line 2725  void MainForm::channelsMenuAboutToShow (
2725                  m_ui.channelsMenu->addSeparator();                  m_ui.channelsMenu->addSeparator();
2726                  const int iStripCount = wlist.count();                  const int iStripCount = wlist.count();
2727                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2728                          ChannelStrip *pChannelStrip = NULL;                          ChannelStrip *pChannelStrip = nullptr;
2729                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2730                          if (pMdiSubWindow)                          if (pMdiSubWindow)
2731                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2682  void MainForm::channelsMenuActivated (vo Line 2747  void MainForm::channelsMenuActivated (vo
2747  {  {
2748          // Retrive channel index from action data...          // Retrive channel index from action data...
2749          QAction *pAction = qobject_cast<QAction *> (sender());          QAction *pAction = qobject_cast<QAction *> (sender());
2750          if (pAction == NULL)          if (pAction == nullptr)
2751                  return;                  return;
2752    
2753          ChannelStrip *pChannelStrip = channelStripAt(pAction->data().toInt());          ChannelStrip *pChannelStrip = channelStripAt(pAction->data().toInt());
# Line 2713  void MainForm::stopSchedule (void) Line 2778  void MainForm::stopSchedule (void)
2778  // Timer slot funtion.  // Timer slot funtion.
2779  void MainForm::timerSlot (void)  void MainForm::timerSlot (void)
2780  {  {
2781          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2782                  return;                  return;
2783    
2784          // 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 2750  void MainForm::timerSlot (void) Line 2815  void MainForm::timerSlot (void)
2815                                          = m_pWorkspace->subWindowList();                                          = m_pWorkspace->subWindowList();
2816                                  const int iStripCount = wlist.count();                                  const int iStripCount = wlist.count();
2817                                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {                                  for (int iStrip = 0; iStrip < iStripCount; ++iStrip) {
2818                                          ChannelStrip *pChannelStrip = NULL;                                          ChannelStrip *pChannelStrip = nullptr;
2819                                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);                                          QMdiSubWindow *pMdiSubWindow = wlist.at(iStrip);
2820                                          if (pMdiSubWindow)                                          if (pMdiSubWindow)
2821                                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                                                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
# Line 2772  void MainForm::timerSlot (void) Line 2837  void MainForm::timerSlot (void)
2837  // Start linuxsampler server...  // Start linuxsampler server...
2838  void MainForm::startServer (void)  void MainForm::startServer (void)
2839  {  {
2840          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
2841                  return;                  return;
2842    
2843          // Aren't already a client, are we?          // Aren't already a client, are we?
# Line 2782  void MainForm::startServer (void) Line 2847  void MainForm::startServer (void)
2847          // Is the server process instance still here?          // Is the server process instance still here?
2848          if (m_pServer) {          if (m_pServer) {
2849                  if (QMessageBox::warning(this,                  if (QMessageBox::warning(this,
2850                          QSAMPLER_TITLE ": " + tr("Warning"),                          tr("Warning"),
2851                          tr("Could not start the LinuxSampler server.\n\n"                          tr("Could not start the LinuxSampler server.\n\n"
2852                          "Maybe it is already started."),                          "Maybe it is already started."),
2853                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
# Line 2852  void MainForm::stopServer ( bool bIntera Line 2917  void MainForm::stopServer ( bool bIntera
2917    
2918          if (m_pServer && bInteractive) {          if (m_pServer && bInteractive) {
2919                  if (QMessageBox::question(this,                  if (QMessageBox::question(this,
2920                          QSAMPLER_TITLE ": " + tr("The backend's fate ..."),                          tr("The backend's fate ..."),
2921                          tr("You have the option to keep the sampler backend (LinuxSampler)\n"                          tr("You have the option to keep the sampler backend (LinuxSampler)\n"
2922                          "running in the background. The sampler would continue to work\n"                          "running in the background. The sampler would continue to work\n"
2923                          "according to your current sampler session and you could alter the\n"                          "according to your current sampler session and you could alter the\n"
# Line 2864  void MainForm::stopServer ( bool bIntera Line 2929  void MainForm::stopServer ( bool bIntera
2929                  }                  }
2930          }          }
2931    
2932            bool bGraceWait = true;
2933    
2934          // And try to stop server.          // And try to stop server.
2935          if (m_pServer && m_bForceServerStop) {          if (m_pServer && m_bForceServerStop) {
2936                  appendMessages(tr("Server is stopping..."));                  appendMessages(tr("Server is stopping..."));
2937                  if (m_pServer->state() == QProcess::Running) {                  if (m_pServer->state() == QProcess::Running) {
2938                  #if defined(_WIN32)                  #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
2939                          // Try harder...                          // Try harder...
2940                          m_pServer->kill();                          m_pServer->kill();
2941                  #else                  #else
2942                          // Try softly...                          // Try softly...
2943                          m_pServer->terminate();                          m_pServer->terminate();
2944                            bool bFinished = m_pServer->waitForFinished(QSAMPLER_TIMER_MSECS * 1000);
2945                            if (bFinished) bGraceWait = false;
2946                  #endif                  #endif
2947                  }                  }
2948          }       // Do final processing anyway.          }       // Do final processing anyway.
2949          else processServerExit();          else processServerExit();
2950    
2951          // Give it some time to terminate gracefully and stabilize...          // Give it some time to terminate gracefully and stabilize...
2952          QTime t;          if (bGraceWait) {
2953          t.start();                  QTime t;
2954          while (t.elapsed() < QSAMPLER_TIMER_MSECS)                  t.start();
2955                  QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);                  while (t.elapsed() < QSAMPLER_TIMER_MSECS)
2956                            QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2957            }
2958  }  }
2959    
2960    
# Line 2921  void MainForm::processServerExit (void) Line 2992  void MainForm::processServerExit (void)
2992                          tr("Server was stopped with exit status %1.")                          tr("Server was stopped with exit status %1.")
2993                          .arg(m_pServer->exitStatus()));                          .arg(m_pServer->exitStatus()));
2994                  delete m_pServer;                  delete m_pServer;
2995                  m_pServer = NULL;                  m_pServer = nullptr;
2996          }          }
2997    
2998          // Again, make status visible stable.          // Again, make status visible stable.
# Line 2937  lscp_status_t qsampler_client_callback ( Line 3008  lscp_status_t qsampler_client_callback (
3008          lscp_event_t event, const char *pchData, int cchData, void *pvData )          lscp_event_t event, const char *pchData, int cchData, void *pvData )
3009  {  {
3010          MainForm* pMainForm = (MainForm *) pvData;          MainForm* pMainForm = (MainForm *) pvData;
3011          if (pMainForm == NULL)          if (pMainForm == nullptr)
3012                  return LSCP_FAILED;                  return LSCP_FAILED;
3013    
3014          // ATTN: DO NOT EVER call any GUI code here,          // ATTN: DO NOT EVER call any GUI code here,
# Line 2954  lscp_status_t qsampler_client_callback ( Line 3025  lscp_status_t qsampler_client_callback (
3025  bool MainForm::startClient (void)  bool MainForm::startClient (void)
3026  {  {
3027          // Have it a setup?          // Have it a setup?
3028          if (m_pOptions == NULL)          if (m_pOptions == nullptr)
3029                  return false;                  return false;
3030    
3031          // Aren't we already started, are we?          // Aren't we already started, are we?
# Line 2968  bool MainForm::startClient (void) Line 3039  bool MainForm::startClient (void)
3039          m_pClient = ::lscp_client_create(          m_pClient = ::lscp_client_create(
3040                  m_pOptions->sServerHost.toUtf8().constData(),                  m_pOptions->sServerHost.toUtf8().constData(),
3041                  m_pOptions->iServerPort, qsampler_client_callback, this);                  m_pOptions->iServerPort, qsampler_client_callback, this);
3042          if (m_pClient == NULL) {          if (m_pClient == nullptr) {
3043                  // Is this the first try?                  // Is this the first try?
3044                  // maybe we need to start a local server...                  // maybe we need to start a local server...
3045                  if ((m_pServer && m_pServer->state() == QProcess::Running)                  if ((m_pServer && m_pServer->state() == QProcess::Running)
# Line 3038  bool MainForm::startClient (void) Line 3109  bool MainForm::startClient (void)
3109          if (!m_pOptions->sSessionFile.isEmpty()) {          if (!m_pOptions->sSessionFile.isEmpty()) {
3110                  // Just load the prabably startup session...                  // Just load the prabably startup session...
3111                  if (loadSessionFile(m_pOptions->sSessionFile)) {                  if (loadSessionFile(m_pOptions->sSessionFile)) {
3112                          m_pOptions->sSessionFile = QString::null;                          m_pOptions->sSessionFile = QString();
3113                          return true;                          return true;
3114                  }                  }
3115          }          }
# Line 3054  bool MainForm::startClient (void) Line 3125  bool MainForm::startClient (void)
3125  // Stop client...  // Stop client...
3126  void MainForm::stopClient (void)  void MainForm::stopClient (void)
3127  {  {
3128          if (m_pClient == NULL)          if (m_pClient == nullptr)
3129                  return;                  return;
3130    
3131          // Log prepare here.          // Log prepare here.
# Line 3086  void MainForm::stopClient (void) Line 3157  void MainForm::stopClient (void)
3157          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
3158          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);
3159          ::lscp_client_destroy(m_pClient);          ::lscp_client_destroy(m_pClient);
3160          m_pClient = NULL;          m_pClient = nullptr;
3161    
3162          // Hard-notify instrumnet and device configuration forms,          // Hard-notify instrumnet and device configuration forms,
3163          // if visible, that we're running out...          // if visible, that we're running out...
# Line 3106  void MainForm::stopClient (void) Line 3177  void MainForm::stopClient (void)
3177  // Channel strip activation/selection.  // Channel strip activation/selection.
3178  void MainForm::activateStrip ( QMdiSubWindow *pMdiSubWindow )  void MainForm::activateStrip ( QMdiSubWindow *pMdiSubWindow )
3179  {  {
3180          ChannelStrip *pChannelStrip = NULL;          ChannelStrip *pChannelStrip = nullptr;
3181          if (pMdiSubWindow)          if (pMdiSubWindow)
3182                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());                  pChannelStrip = static_cast<ChannelStrip *> (pMdiSubWindow->widget());
3183          if (pChannelStrip)          if (pChannelStrip)

Legend:
Removed from v.3357  
changed lines
  Added in v.3559

  ViewVC Help
Powered by ViewVC