/[svn]/qsampler/trunk/src/qsamplerMainForm.ui.h
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMainForm.ui.h

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

revision 456 by capela, Mon Mar 14 14:02:30 2005 UTC revision 871 by capela, Thu Jun 1 09:32:01 2006 UTC
# Line 45  Line 45 
45  #include "qsamplerDeviceForm.h"  #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
 #include "config.h"  
   
48  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
49  #include <signal.h>  #include <signal.h>
50  #endif  #endif
51    
52    #ifdef CONFIG_LIBGIG
53    #include <gig.h>
54    #endif
55    
56  // Timer constant stuff.  // Timer constant stuff.
57  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
58    
# Line 218  void qsamplerMainForm::setup ( qsamplerO Line 220  void qsamplerMainForm::setup ( qsamplerO
220      // Some child forms are to be created right now.      // Some child forms are to be created right now.
221      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
222      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
223        m_pDeviceForm->setMainForm(this); // An important life immutable!
224      // Set message defaults...      // Set message defaults...
225      updateMessagesFont();      updateMessagesFont();
226      updateMessagesLimit();      updateMessagesLimit();
# Line 287  bool qsamplerMainForm::queryClose (void) Line 290  bool qsamplerMainForm::queryClose (void)
290              ostr << *this;              ostr << *this;
291              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
292              // And the children, and the main windows state,.              // And the children, and the main windows state,.
293                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
294              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this);
295                  // Close popup widgets.                          // Close popup widgets.
296                  if (m_pDeviceForm)                          if (m_pDeviceForm)
297                      m_pDeviceForm->close();                                  m_pDeviceForm->close();
298              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
299              stopServer();              stopServer();
300          }          }
# Line 344  void qsamplerMainForm::dropEvent ( QDrop Line 347  void qsamplerMainForm::dropEvent ( QDrop
347      if (!decodeDragFiles(pDropEvent, files))      if (!decodeDragFiles(pDropEvent, files))
348          return;          return;
349    
350      for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
351                  const QString& sPath = *iter;                  const QString& sPath = *iter;
352                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
353                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
354                      qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel(this);
355                      if (pChannel == NULL)                          if (pChannel == NULL)
356                          return;                                  return;
357                          // Start setting the instrument filename...                          // Start setting the instrument filename...
358                          pChannel->setInstrument(sPath, 0);                          pChannel->setInstrument(sPath, 0);
359                      // Before we show it up, may be we'll                          // Before we show it up, may be we'll
360                      // better ask for some initial values?                          // better ask for some initial values?
361                      if (!pChannel->channelSetup(this)) {                          if (!pChannel->channelSetup(this)) {
362                          delete pChannel;                                  delete pChannel;
363                          return;                                  return;
364                      }                          }
365                      // Finally, give it to a new channel strip...                          // Finally, give it to a new channel strip...
366                          if (!createChannelStrip(pChannel)) {                          if (!createChannelStrip(pChannel)) {
367                          delete pChannel;                                  delete pChannel;
368                          return;                                  return;
369                          }                          }
370                      // Make that an overall update.                          // Make that an overall update.
371                      m_iDirtyCount++;                          m_iDirtyCount++;
372                      stabilizeForm();                          stabilizeForm();
373                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
374                  else if (closeSession(true))                  else if (closeSession(true))
375                          loadSessionFile(sPath);                          loadSessionFile(sPath);
# Line 382  void qsamplerMainForm::customEvent ( QCu Line 385  void qsamplerMainForm::customEvent ( QCu
385      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
386      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
387          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
388          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
389              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
390              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
391                            if (pChannelStrip)
392                                    channelStripChanged(pChannelStrip);
393                    } else {
394                            appendMessagesColor(tr("Notify event: %1 data: %2")
395                                    .arg(::lscp_event_to_text(pEvent->event()))
396                                    .arg(pEvent->data()), "#996699");
397                    }
398      }      }
399  }  }
400    
# Line 393  void qsamplerMainForm::customEvent ( QCu Line 403  void qsamplerMainForm::customEvent ( QCu
403  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
404  {  {
405      stabilizeForm();      stabilizeForm();
406        
407      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
408  }  }
409    
# Line 461  bool qsamplerMainForm::openSession (void Line 471  bool qsamplerMainForm::openSession (void
471    
472      // Ask for the filename to open...      // Ask for the filename to open...
473      QString sFilename = QFileDialog::getOpenFileName(      QString sFilename = QFileDialog::getOpenFileName(
474              m_pOptions->sSessionDir,                // Start here.                  m_pOptions->sSessionDir,                // Start here.
475              tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
476              this, 0,                                // Parent and name (none)                  this, 0,                                // Parent and name (none)
477              tr("Open Session")                      // Caption.                  QSAMPLER_TITLE ": " + tr("Open Session")        // Caption.
478      );      );
479    
480      // Have we cancelled?      // Have we cancelled?
# Line 495  bool qsamplerMainForm::saveSession ( boo Line 505  bool qsamplerMainForm::saveSession ( boo
505              sFilename = m_pOptions->sSessionDir;              sFilename = m_pOptions->sSessionDir;
506          // Prompt the guy...          // Prompt the guy...
507          sFilename = QFileDialog::getSaveFileName(          sFilename = QFileDialog::getSaveFileName(
508                  sFilename,                              // Start here.                          sFilename,                              // Start here.
509                  tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)                          tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files)
510                  this, 0,                                // Parent and name (none)                          this, 0,                                // Parent and name (none)
511                  tr("Save Session")                      // Caption.                          QSAMPLER_TITLE ": " + tr("Save Session")        // Caption.
512          );          );
513          // Have we cancelled it?          // Have we cancelled it?
514          if (sFilename.isEmpty())          if (sFilename.isEmpty())
# Line 508  bool qsamplerMainForm::saveSession ( boo Line 518  bool qsamplerMainForm::saveSession ( boo
518              sFilename += ".lscp";              sFilename += ".lscp";
519          // Check if already exists...          // Check if already exists...
520          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {          if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) {
521              if (QMessageBox::warning(this, tr("Warning"),              if (QMessageBox::warning(this,
522                                    QSAMPLER_TITLE ": " + tr("Warning"),
523                  tr("The file already exists:\n\n"                  tr("The file already exists:\n\n"
524                     "\"%1\"\n\n"                     "\"%1\"\n\n"
525                     "Do you want to replace it?")                     "Do you want to replace it?")
# Line 530  bool qsamplerMainForm::closeSession ( bo Line 541  bool qsamplerMainForm::closeSession ( bo
541    
542      // Are we dirty enough to prompt it?      // Are we dirty enough to prompt it?
543      if (m_iDirtyCount > 0) {      if (m_iDirtyCount > 0) {
544          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
545                            QSAMPLER_TITLE ": " + tr("Warning"),
546              tr("The current session has been changed:\n\n"              tr("The current session has been changed:\n\n"
547              "\"%1\"\n\n"              "\"%1\"\n\n"
548              "Do you want to save the changes?")              "Do you want to save the changes?")
# Line 588  bool qsamplerMainForm::loadSessionFile ( Line 600  bool qsamplerMainForm::loadSessionFile (
600      QTextStream ts(&file);      QTextStream ts(&file);
601      while (!ts.atEnd()) {      while (!ts.atEnd()) {
602          // Read the line.          // Read the line.
603          QString sCommand = ts.readLine().simplifyWhiteSpace();          QString sCommand = ts.readLine().stripWhiteSpace();
604          // If not empty, nor a comment, call the server...          // If not empty, nor a comment, call the server...
605          if (!sCommand.isEmpty() && sCommand[0] != '#') {          if (!sCommand.isEmpty() && sCommand[0] != '#') {
606              appendMessagesColor(sCommand, "#996633");              appendMessagesColor(sCommand, "#996633");
# Line 598  bool qsamplerMainForm::loadSessionFile ( Line 610  bool qsamplerMainForm::loadSessionFile (
610              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
611                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
612                  iErrors++;                  iErrors++;
                 break;  
613              }              }
614          }          }
615          // Try to make it snappy :)          // Try to make it snappy :)
# Line 608  bool qsamplerMainForm::loadSessionFile ( Line 619  bool qsamplerMainForm::loadSessionFile (
619      // Ok. we've read it.      // Ok. we've read it.
620      file.close();      file.close();
621    
     // Have we any errors?  
     if (iErrors > 0)  
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
   
622          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
623          updateSession();          updateSession();
624    
625            // Have we any errors?
626            if (iErrors > 0)
627                    appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
628    
629      // Save as default session directory.      // Save as default session directory.
630      if (m_pOptions)      if (m_pOptions)
631          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
632      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
633      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
634      // Stabilize form...      // Stabilize form...
635      m_sFilename = sFilename;      m_sFilename = sFilename;
636      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
637      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
638        
639      // Make that an overall update.      // Make that an overall update.
640      stabilizeForm();      stabilizeForm();
641      return true;      return true;
# Line 666  bool qsamplerMainForm::saveSessionFile ( Line 677  bool qsamplerMainForm::saveSessionFile (
677          QMap<int, int> audioDeviceMap;          QMap<int, int> audioDeviceMap;
678          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
679          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
                 qsamplerDevice device(m_pClient, qsamplerDevice::Audio, piDeviceIDs[iDevice]);  
680                  ts << endl;                  ts << endl;
681          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
682                     << " " << tr("Device") << " " << iDevice << endl;                  // Audio device specification...
683                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
684                            << " " << tr("Device") << " " << iDevice << endl;
685                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();                  ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
686                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
687                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
688                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
689                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
690                            const qsamplerDeviceParam& param = deviceParam.data();
691                            if (param.value.isEmpty()) ts << "# ";
692                            ts << " " << deviceParam.key() << "='" << param.value << "'";
693                    }
694                  ts << endl;                  ts << endl;
695                    // Audio channel parameters...
696                    int iPort = 0;
697                    for (qsamplerDevicePort *pPort = device.ports().first();
698                                    pPort;
699                                            pPort = device.ports().next(), ++iPort) {
700                            qsamplerDeviceParamMap::ConstIterator portParam;
701                            for (portParam = pPort->params().begin();
702                                            portParam != pPort->params().end();
703                                                    ++portParam) {
704                                    const qsamplerDeviceParam& param = portParam.data();
705                                    if (param.fix || param.value.isEmpty()) ts << "# ";
706                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
707                                            << " " << iPort << " " << portParam.key()
708                                            << "='" << param.value << "'" << endl;
709                            }
710                    }
711                    // Audio device index/id mapping.
712                  audioDeviceMap[device.deviceID()] = iDevice;                  audioDeviceMap[device.deviceID()] = iDevice;
713          // Try to keep it snappy :)          // Try to keep it snappy :)
714          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 684  bool qsamplerMainForm::saveSessionFile ( Line 717  bool qsamplerMainForm::saveSessionFile (
717          QMap<int, int> midiDeviceMap;          QMap<int, int> midiDeviceMap;
718          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);          piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
719          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {          for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
                 qsamplerDevice device(m_pClient, qsamplerDevice::Midi, piDeviceIDs[iDevice]);  
720                  ts << endl;                  ts << endl;
721          ts << "# " << device.deviceTypeName() << " " << device.driverName()                  qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
722                     << " " << tr("Device") << " " << iDevice << endl;                  // MIDI device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();                  ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
726                  qsamplerDeviceParamMap& params = device.params();                  qsamplerDeviceParamMap::ConstIterator deviceParam;
727                  qsamplerDeviceParamMap::ConstIterator iter;                  for (deviceParam = device.params().begin();
728                  for (iter = params.begin(); iter != params.end(); ++iter)                                  deviceParam != device.params().end();
729                          ts << " " << iter.key() << "='" << iter.data().value << "'";                                          ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                  ts << endl;                  ts << endl;
735                    // MIDI port parameters...
736                    int iPort = 0;
737                    for (qsamplerDevicePort *pPort = device.ports().first();
738                                    pPort;
739                                            pPort = device.ports().next(), ++iPort) {
740                            qsamplerDeviceParamMap::ConstIterator portParam;
741                            for (portParam = pPort->params().begin();
742                                            portParam != pPort->params().end();
743                                                    ++portParam) {
744                                    const qsamplerDeviceParam& param = portParam.data();
745                                    if (param.fix || param.value.isEmpty()) ts << "# ";
746                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
747                                       << " " << iPort << " " << portParam.key()
748                                       << "='" << param.value << "'" << endl;
749                            }
750                    }
751                    // MIDI device index/id mapping.
752                  midiDeviceMap[device.deviceID()] = iDevice;                  midiDeviceMap[device.deviceID()] = iDevice;
753          // Try to keep it snappy :)          // Try to keep it snappy :)
754          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);          QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
# Line 708  bool qsamplerMainForm::saveSessionFile ( Line 763  bool qsamplerMainForm::saveSessionFile (
763              if (pChannel) {              if (pChannel) {
764                  ts << "# " << tr("Channel") << " " << iChannel << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
765                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
766                  if (audioDeviceMap.isEmpty()) {                                  if (audioDeviceMap.isEmpty()) {
767                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
768                                              << " " << pChannel->audioDriver() << endl;                                                  << " " << pChannel->audioDriver() << endl;
769                              } else {                                  } else {
770                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel                                          ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
771                                             << " " << audioDeviceMap[pChannel->audioDevice()] << endl;                                                  << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
772                                    }
773                                    if (midiDeviceMap.isEmpty()) {
774                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
775                                                    << " " << pChannel->midiDriver() << endl;
776                                    } else {
777                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
778                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
779                                  }                                  }
780                  if (midiDeviceMap.isEmpty()) {                                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
781                          ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel                                          << " " << pChannel->midiPort() << endl;
                                        << " " << pChannel->midiDriver() << endl;  
                             } else {  
                         ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel  
                                            << " " << midiDeviceMap[pChannel->midiDevice()] << endl;  
                             }  
                 ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel  
                                << " " << pChannel->midiPort() << endl;  
782                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
783                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
784                      ts << "ALL";                      ts << "ALL";
# Line 732  bool qsamplerMainForm::saveSessionFile ( Line 787  bool qsamplerMainForm::saveSessionFile (
787                  ts << endl;                  ts << endl;
788                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
789                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
790                                    qsamplerChannelRoutingMap::ConstIterator audioRoute;
791                                    for (audioRoute = pChannel->audioRouting().begin();
792                                                    audioRoute != pChannel->audioRouting().end();
793                                                            ++audioRoute) {
794                                            ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel
795                                                    << " " << audioRoute.key()
796                                                    << " " << audioRoute.data() << endl;
797                                    }
798                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
799                                    if (pChannel->channelMute())
800                                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
801                                    if (pChannel->channelSolo())
802                                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
803                  ts << endl;                  ts << endl;
804              }              }
805          }          }
# Line 824  void qsamplerMainForm::fileReset (void) Line 891  void qsamplerMainForm::fileReset (void)
891          return;          return;
892    
893      // Ask user whether he/she want's an internal sampler reset...      // Ask user whether he/she want's an internal sampler reset...
894      if (QMessageBox::warning(this, tr("Warning"),      if (QMessageBox::warning(this,
895                    QSAMPLER_TITLE ": " + tr("Warning"),
896          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
897             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
898             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
899             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
900             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
901          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
902          return;          return;
# Line 853  void qsamplerMainForm::fileRestart (void Line 921  void qsamplerMainForm::fileRestart (void
921  {  {
922      if (m_pOptions == NULL)      if (m_pOptions == NULL)
923          return;          return;
924            
925      bool bRestart = true;      bool bRestart = true;
926        
927      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
928      // (if we're currently up and running)      // (if we're currently up and running)
929      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
930          bRestart = (QMessageBox::warning(this, tr("Warning"),          bRestart = (QMessageBox::warning(this,
931                            QSAMPLER_TITLE ": " + tr("Warning"),
932              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
933                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
934                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
935                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
936                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
937              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
938      }      }
# Line 906  void qsamplerMainForm::editAddChannel (v Line 975  void qsamplerMainForm::editAddChannel (v
975          delete pChannel;          delete pChannel;
976          return;          return;
977      }      }
978        
979      // And give it to the strip (will own the channel instance, if successful).      // And give it to the strip (will own the channel instance, if successful).
980      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
981          delete pChannel;          delete pChannel;
# Line 928  void qsamplerMainForm::editRemoveChannel Line 997  void qsamplerMainForm::editRemoveChannel
997      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
998      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
999          return;          return;
1000            
1001      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
1002      if (pChannel == NULL)      if (pChannel == NULL)
1003          return;          return;
1004    
1005      // Prompt user if he/she's sure about this...      // Prompt user if he/she's sure about this...
1006      if (m_pOptions && m_pOptions->bConfirmRemove) {      if (m_pOptions && m_pOptions->bConfirmRemove) {
1007          if (QMessageBox::warning(this, tr("Warning"),          if (QMessageBox::warning(this,
1008                            QSAMPLER_TITLE ": " + tr("Warning"),
1009              tr("About to remove channel:\n\n"              tr("About to remove channel:\n\n"
1010                 "%1\n\n"                 "%1\n\n"
1011                 "Are you sure?")                 "Are you sure?")
# Line 950  void qsamplerMainForm::editRemoveChannel Line 1020  void qsamplerMainForm::editRemoveChannel
1020    
1021      // Just delete the channel strip.      // Just delete the channel strip.
1022      delete pChannelStrip;      delete pChannelStrip;
1023        
1024      // Do we auto-arrange?      // Do we auto-arrange?
1025      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1026          channelsArrange();          channelsArrange();
# Line 994  void qsamplerMainForm::editResetChannel Line 1064  void qsamplerMainForm::editResetChannel
1064  // Reset all sampler channels.  // Reset all sampler channels.
1065  void qsamplerMainForm::editResetAllChannels (void)  void qsamplerMainForm::editResetAllChannels (void)
1066  {  {
1067      if (m_pClient == NULL)          if (m_pClient == NULL)
1068          return;                  return;
1069    
1070      // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1071          // for all channels out there...          // for all channels out there...
1072      m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1073      QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1074      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1075          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1076          if (pChannelStrip)                  if (pChannelStrip)
1077                  pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1078      }          }
1079      m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1080  }  }
1081    
1082    
# Line 1061  void qsamplerMainForm::viewMessages ( bo Line 1131  void qsamplerMainForm::viewMessages ( bo
1131  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1132  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1133  {  {
1134      if (m_pOptions == NULL)          if (m_pOptions == NULL)
1135          return;                  return;
1136    
1137      if (m_pDeviceForm) {          if (m_pDeviceForm) {
1138          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1139                  m_pDeviceForm->setClient(m_pClient);                  m_pDeviceForm->setClient(m_pClient);
1140          if (m_pDeviceForm->isVisible()) {                  if (m_pDeviceForm->isVisible()) {
1141              m_pDeviceForm->hide();                          m_pDeviceForm->hide();
1142          } else {                  } else {
1143              m_pDeviceForm->show();                          m_pDeviceForm->show();
1144              m_pDeviceForm->raise();                          m_pDeviceForm->raise();
1145              m_pDeviceForm->setActiveWindow();                          m_pDeviceForm->setActiveWindow();
1146          }                  }
1147      }          }
1148  }  }
1149    
1150    
# Line 1118  void qsamplerMainForm::viewOptions (void Line 1188  void qsamplerMainForm::viewOptions (void
1188                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1189                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1190                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1191                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this,
1192                                            QSAMPLER_TITLE ": " + tr("Information"),
1193                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1194                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
1195                  updateMessagesCapture();                  updateMessagesCapture();
# Line 1192  void qsamplerMainForm::channelsArrange ( Line 1263  void qsamplerMainForm::channelsArrange (
1263          y += iHeight;          y += iHeight;
1264      }      }
1265      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1266        
1267      stabilizeForm();      stabilizeForm();
1268  }  }
1269    
# Line 1246  void qsamplerMainForm::helpAbout (void) Line 1317  void qsamplerMainForm::helpAbout (void)
1317      sText += tr("LSCP (liblscp) instrument_name support disabled.");      sText += tr("LSCP (liblscp) instrument_name support disabled.");
1318      sText += "</font></small><br />";      sText += "</font></small><br />";
1319  #endif  #endif
1320    #ifndef CONFIG_MUTE_SOLO
1321        sText += "<small><font color=\"red\">";
1322        sText += tr("Sampler channel Mute/Solo support disabled.");
1323        sText += "</font></small><br />";
1324    #endif
1325      sText += "<br />\n";      sText += "<br />\n";
1326      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1327      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1328      sText += " ";      sText += " ";
1329      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1330    #ifdef CONFIG_LIBGIG
1331        sText += ", ";
1332        sText += gig::libraryName().c_str();
1333        sText += " ";
1334        sText += gig::libraryVersion().c_str();
1335    #endif
1336      sText += "<br />\n";      sText += "<br />\n";
1337      sText += "<br />\n";      sText += "<br />\n";
1338      sText += tr("Website") + ": <a href=\"" QSAMPLER_WEBSITE "\">" QSAMPLER_WEBSITE "</a><br />\n";      sText += tr("Website") + ": <a href=\"" QSAMPLER_WEBSITE "\">" QSAMPLER_WEBSITE "</a><br />\n";
# Line 1275  void qsamplerMainForm::stabilizeForm (vo Line 1357  void qsamplerMainForm::stabilizeForm (vo
1357      // Update the main application caption...      // Update the main application caption...
1358      QString sSessionName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1359      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1360          sSessionName += '*';          sSessionName += " *";
1361      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1362    
1363      // Update the main menu state...      // Update the main menu state...
# Line 1330  void qsamplerMainForm::stabilizeForm (vo Line 1412  void qsamplerMainForm::stabilizeForm (vo
1412  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1413  {  {
1414          // Add this strip to the changed list...          // Add this strip to the changed list...
1415          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1416                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1417                    pChannelStrip->resetErrorCount();
1418            }
1419    
1420      // Just mark the dirty form.      // Just mark the dirty form.
1421      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1363  void qsamplerMainForm::updateSession (vo Line 1447  void qsamplerMainForm::updateSession (vo
1447                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1448          }          }
1449          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1450            
1451            // Remember to refresh devices
1452            if (m_pDeviceForm)
1453                m_pDeviceForm->refreshDevices();
1454  }  }
1455    
1456    
# Line 1533  void qsamplerMainForm::appendMessagesErr Line 1621  void qsamplerMainForm::appendMessagesErr
1621    
1622      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");      appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000");
1623    
1624      QMessageBox::critical(this, tr("Error"), s, tr("Cancel"));      QMessageBox::critical(this,
1625                    QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));
1626  }  }
1627    
1628    
# Line 1573  void qsamplerMainForm::updateMessagesLim Line 1662  void qsamplerMainForm::updateMessagesLim
1662          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1663              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1664          else          else
1665              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1666      }      }
1667  }  }
1668    
# Line 1617  qsamplerChannelStrip *qsamplerMainForm:: Line 1706  qsamplerChannelStrip *qsamplerMainForm::
1706      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1707      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1708          return NULL;          return NULL;
1709            
1710      // Actual channel strip setup...      // Actual channel strip setup...
1711      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1712      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1675  qsamplerChannelStrip *qsamplerMainForm:: Line 1764  qsamplerChannelStrip *qsamplerMainForm::
1764          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1765          if (wlist.isEmpty())          if (wlist.isEmpty())
1766                  return NULL;                  return NULL;
1767            
1768          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1769                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1770                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1756  void qsamplerMainForm::timerSlot (void) Line 1845  void qsamplerMainForm::timerSlot (void)
1845              }              }
1846          }          }
1847      }      }
1848        
1849          // Refresh each channel usage, on each period...          if (m_pClient) {
1850      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1851          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1852          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1853              m_iTimerSlot = 0;                                          pChannelStrip; pChannelStrip = m_changedStrips.next()) {
             // Update the channel information for each pending strip...  
             for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();  
                     pChannelStrip;  
                                                 pChannelStrip = m_changedStrips.next()) {  
1854                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
1855                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
1856                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
1857                          }                          }
1858              // Update the channel stream usage for each strip...                  }
1859              QWidgetList wlist = m_pWorkspace->windowList();                  // Refresh each channel usage, on each period...
1860              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  if (m_pOptions->bAutoRefresh) {
1861                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1862                  if (pChannelStrip && pChannelStrip->isVisible())                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1863                      pChannelStrip->updateChannelUsage();                                  m_iTimerSlot = 0;
1864              }                                  // Update the channel stream usage for each strip...
1865          }                                  QWidgetList wlist = m_pWorkspace->windowList();
1866      }                                  for (int iChannel = 0;
1867                                                    iChannel < (int) wlist.count(); iChannel++) {
1868                                            qsamplerChannelStrip *pChannelStrip
1869                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1870                                            if (pChannelStrip && pChannelStrip->isVisible())
1871                                                    pChannelStrip->updateChannelUsage();
1872                                    }
1873                            }
1874                    }
1875            }
1876    
1877      // Register the next timer slot.      // Register the next timer slot.
1878      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1800  void qsamplerMainForm::startServer (void Line 1894  void qsamplerMainForm::startServer (void
1894    
1895      // Is the server process instance still here?      // Is the server process instance still here?
1896      if (m_pServer) {      if (m_pServer) {
1897          switch (QMessageBox::warning(this, tr("Warning"),          switch (QMessageBox::warning(this,
1898                            QSAMPLER_TITLE ": " + tr("Warning"),
1899              tr("Could not start the LinuxSampler server.\n\n"              tr("Could not start the LinuxSampler server.\n\n"
1900                 "Maybe it ss already started."),                 "Maybe it ss already started."),
1901              tr("Stop"), tr("Kill"), tr("Cancel"))) {              tr("Stop"), tr("Kill"), tr("Cancel"))) {
# Line 1959  bool qsamplerMainForm::startClient (void Line 2054  bool qsamplerMainForm::startClient (void
2054      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2055      appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient)));      appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient)));
2056    
2057            // Subscribe to channel info change notifications...
2058            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2059                    appendMessagesClient("lscp_client_subscribe");
2060    
2061      // We may stop scheduling around.      // We may stop scheduling around.
2062      stopSchedule();      stopSchedule();
2063    
# Line 1972  bool qsamplerMainForm::startClient (void Line 2071  bool qsamplerMainForm::startClient (void
2071          // if visible, that we're ready...          // if visible, that we're ready...
2072          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pDeviceForm && m_pDeviceForm->isVisible())
2073              m_pDeviceForm->setClient(m_pClient);              m_pDeviceForm->setClient(m_pClient);
2074                
2075      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2076      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2077          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 2012  void qsamplerMainForm::stopClient (void) Line 2111  void qsamplerMainForm::stopClient (void)
2111      // channels from the back-end server.      // channels from the back-end server.
2112      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2113      closeSession(false);      closeSession(false);
2114        
2115      // Close us as a client...      // Close us as a client...
2116      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2117        ::lscp_client_destroy(m_pClient);
2118      m_pClient = NULL;      m_pClient = NULL;
2119    
2120      // Log final here.      // Log final here.

Legend:
Removed from v.456  
changed lines
  Added in v.871

  ViewVC Help
Powered by ViewVC