/[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 428 by capela, Mon Mar 7 17:05:55 2005 UTC revision 751 by capela, Fri Aug 19 17:10:16 2005 UTC
# Line 51  Line 51 
51  #include <signal.h>  #include <signal.h>
52  #endif  #endif
53    
54    #ifdef CONFIG_LIBGIG
55    #include <gig.h>
56    #endif
57    
58  // Timer constant stuff.  // Timer constant stuff.
59  #define QSAMPLER_TIMER_MSECS    200  #define QSAMPLER_TIMER_MSECS    200
60    
# Line 211  void qsamplerMainForm::setup ( qsamplerO Line 215  void qsamplerMainForm::setup ( qsamplerO
215      // We got options?      // We got options?
216      m_pOptions = pOptions;      m_pOptions = pOptions;
217    
218        // What style do we create these forms?
219        WFlags wflags = Qt::WType_TopLevel;
220        if (m_pOptions->bKeepOnTop)
221            wflags |= Qt::WStyle_Tool;
222      // Some child forms are to be created right now.      // Some child forms are to be created right now.
223      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
224      m_pDeviceForm = new qsamplerDeviceForm(this);      m_pDeviceForm = new qsamplerDeviceForm(this, 0, wflags);
225        m_pDeviceForm->setMainForm(this); // An important life immutable!
226      // Set message defaults...      // Set message defaults...
227      updateMessagesFont();      updateMessagesFont();
228      updateMessagesLimit();      updateMessagesLimit();
# Line 271  bool qsamplerMainForm::queryClose (void) Line 280  bool qsamplerMainForm::queryClose (void)
280          // Some windows default fonts is here on demand too.          // Some windows default fonts is here on demand too.
281          if (bQueryClose && m_pMessages)          if (bQueryClose && m_pMessages)
282              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();              m_pOptions->sMessagesFont = m_pMessages->messagesFont().toString();
                 // Other windows just need asking if it can close gracefully...  
         if (bQueryClose && m_pDeviceForm)  
                 bQueryClose = m_pDeviceForm->queryClose();  
283          // Try to save current positioning.          // Try to save current positioning.
284          if (bQueryClose) {          if (bQueryClose) {
285              // Save decorations state.              // Save decorations state.
# Line 286  bool qsamplerMainForm::queryClose (void) Line 292  bool qsamplerMainForm::queryClose (void)
292              ostr << *this;              ostr << *this;
293              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
294              // And the children, and the main windows state,.              // And the children, and the main windows state,.
295                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
296              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this);
297                  // Close popup widgets.                          // Close popup widgets.
298                  if (m_pDeviceForm)                          if (m_pDeviceForm)
299                      m_pDeviceForm->close();                                  m_pDeviceForm->close();
300              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
301              stopServer();              stopServer();
302          }          }
# Line 343  void qsamplerMainForm::dropEvent ( QDrop Line 349  void qsamplerMainForm::dropEvent ( QDrop
349      if (!decodeDragFiles(pDropEvent, files))      if (!decodeDragFiles(pDropEvent, files))
350          return;          return;
351    
352      for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {          for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
353                  const QString& sPath = *iter;                  const QString& sPath = *iter;
354                  if (qsamplerChannel::isInstrumentFile(sPath)) {                  if (qsamplerChannel::isInstrumentFile(sPath)) {
355                          // Try to create a new channel from instrument file...                          // Try to create a new channel from instrument file...
356                      qsamplerChannel *pChannel = new qsamplerChannel(this);                          qsamplerChannel *pChannel = new qsamplerChannel(this);
357                      if (pChannel == NULL)                          if (pChannel == NULL)
358                          return;                                  return;
359                          // Start setting the instrument filename...                          // Start setting the instrument filename...
360                          pChannel->setInstrument(sPath, 0);                          pChannel->setInstrument(sPath, 0);
361                      // Before we show it up, may be we'll                          // Before we show it up, may be we'll
362                      // better ask for some initial values?                          // better ask for some initial values?
363                      if (!pChannel->channelSetup(this)) {                          if (!pChannel->channelSetup(this)) {
364                          delete pChannel;                                  delete pChannel;
365                          return;                                  return;
366                      }                          }
367                      // Finally, give it to a new channel strip...                          // Finally, give it to a new channel strip...
368                          if (!createChannelStrip(pChannel)) {                          if (!createChannelStrip(pChannel)) {
369                          delete pChannel;                                  delete pChannel;
370                          return;                                  return;
371                          }                          }
372                      // Make that an overall update.                          // Make that an overall update.
373                      m_iDirtyCount++;                          m_iDirtyCount++;
374                      stabilizeForm();                          stabilizeForm();
375                  }   // Otherwise, load an usual session file (LSCP script)...                  }   // Otherwise, load an usual session file (LSCP script)...
376                  else if (closeSession(true))                  else if (closeSession(true))
377                          loadSessionFile(sPath);                          loadSessionFile(sPath);
# Line 381  void qsamplerMainForm::customEvent ( QCu Line 387  void qsamplerMainForm::customEvent ( QCu
387      // For the time being, just pump it to messages.      // For the time being, just pump it to messages.
388      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {      if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {
389          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;          qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent;
390          appendMessagesColor(tr("Notify event: %1 data: %2")                  if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) {
391              .arg(::lscp_event_to_text(pEvent->event()))                          int iChannelID = pEvent->data().toInt();
392              .arg(pEvent->data()), "#996699");                          qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID);
393                            if (pChannelStrip)
394                                    channelStripChanged(pChannelStrip);
395                    } else {
396                            appendMessagesColor(tr("Notify event: %1 data: %2")
397                                    .arg(::lscp_event_to_text(pEvent->event()))
398                                    .arg(pEvent->data()), "#996699");
399                    }
400      }      }
401  }  }
402    
# Line 392  void qsamplerMainForm::customEvent ( QCu Line 405  void qsamplerMainForm::customEvent ( QCu
405  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
406  {  {
407      stabilizeForm();      stabilizeForm();
408        
409      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
410  }  }
411    
# Line 597  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 607  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 641  bool qsamplerMainForm::saveSessionFile ( Line 653  bool qsamplerMainForm::saveSessionFile (
653      }      }
654    
655      // Write the file.      // Write the file.
656      int iErrors = 0;      int  iErrors = 0;
657      QTextStream ts(&file);      QTextStream ts(&file);
658      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
659      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 652  bool qsamplerMainForm::saveSessionFile ( Line 664  bool qsamplerMainForm::saveSessionFile (
664      ts << "# " << tr("File")      ts << "# " << tr("File")
665         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
666      ts << "# " << tr("Date")      ts << "# " << tr("Date")
667         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
668         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
669      ts << "#"  << endl;      ts << "#"  << endl;
670      ts << endl;      ts << endl;
671            // It is assumed that this new kind of device+session file
672            // will be loaded from a complete
673            int *piDeviceIDs;
674            int  iDevice;
675            ts << "RESET" << endl;
676            // Audio device mapping.
677            QMap<int, int> audioDeviceMap;
678            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
679            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
680                    ts << endl;
681                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
682                    // Audio device specification...
683                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
684                            << " " << tr("Device") << " " << iDevice << endl;
685                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
686                    qsamplerDeviceParamMap::ConstIterator deviceParam;
687                    for (deviceParam = device.params().begin();
688                                    deviceParam != device.params().end();
689                                            ++deviceParam) {
690                            const qsamplerDeviceParam& param = deviceParam.data();
691                            if (param.value.isEmpty()) ts << "# ";
692                            ts << " " << deviceParam.key() << "='" << param.value << "'";
693                    }
694                    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;
713            // Try to keep it snappy :)
714            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
715            }
716            // MIDI device mapping.
717            QMap<int, int> midiDeviceMap;
718            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
719            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
720                    ts << endl;
721                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
722                    // MIDI device specification...
723                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
724                            << " " << tr("Device") << " " << iDevice << endl;
725                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
726                    qsamplerDeviceParamMap::ConstIterator deviceParam;
727                    for (deviceParam = device.params().begin();
728                                    deviceParam != device.params().end();
729                                            ++deviceParam) {
730                            const qsamplerDeviceParam& param = deviceParam.data();
731                            if (param.value.isEmpty()) ts << "# ";
732                            ts << " " << deviceParam.key() << "='" << param.value << "'";
733                    }
734                    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;
753            // Try to keep it snappy :)
754            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
755            }
756            ts << endl;
757            // Sampler channel mapping.
758      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
759      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
760          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
761          if (pChannelStrip) {          if (pChannelStrip) {
762              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
763              if (pChannel) {              if (pChannel) {
764                  ts << "# Channel " << iChannel << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
765                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
766                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel << " " << pChannel->audioDriver() << endl;                                  if (audioDeviceMap.isEmpty()) {
767                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel << " " << pChannel->midiDriver() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
768              //  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel << " " << pChannel->midiPort() << endl;                                                  << " " << pChannel->audioDriver() << endl;
769                                    } else {
770                                            ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
771                                                    << " " << 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                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
781                                            << " " << 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 676  bool qsamplerMainForm::saveSessionFile ( Line 788  bool qsamplerMainForm::saveSessionFile (
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                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
791                    if (pChannel->channelMute())
792                            ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl;
793                    if (pChannel->channelSolo())
794                            ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl;
795                  ts << endl;                  ts << endl;
796              }              }
797          }          }
# Line 704  bool qsamplerMainForm::saveSessionFile ( Line 820  bool qsamplerMainForm::saveSessionFile (
820  }  }
821    
822    
823    // Session change receiver slot.
824    void qsamplerMainForm::sessionDirty (void)
825    {
826        // Just mark the dirty form.
827        m_iDirtyCount++;
828        // and update the form status...
829        stabilizeForm();
830    }
831    
832    
833  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
834  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
835    
# Line 761  void qsamplerMainForm::fileReset (void) Line 887  void qsamplerMainForm::fileReset (void)
887          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
888             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
889             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
890             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
891             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
892          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
893          return;          return;
# Line 786  void qsamplerMainForm::fileRestart (void Line 912  void qsamplerMainForm::fileRestart (void
912  {  {
913      if (m_pOptions == NULL)      if (m_pOptions == NULL)
914          return;          return;
915            
916      bool bRestart = true;      bool bRestart = true;
917        
918      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
919      // (if we're currently up and running)      // (if we're currently up and running)
920      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
# Line 796  void qsamplerMainForm::fileRestart (void Line 922  void qsamplerMainForm::fileRestart (void
922              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
923                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
924                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
925                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
926                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
927              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
928      }      }
# Line 839  void qsamplerMainForm::editAddChannel (v Line 965  void qsamplerMainForm::editAddChannel (v
965          delete pChannel;          delete pChannel;
966          return;          return;
967      }      }
968        
969      // 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).
970      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
971          delete pChannel;          delete pChannel;
# Line 861  void qsamplerMainForm::editRemoveChannel Line 987  void qsamplerMainForm::editRemoveChannel
987      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
988      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
989          return;          return;
990            
991      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
992      if (pChannel == NULL)      if (pChannel == NULL)
993          return;          return;
# Line 883  void qsamplerMainForm::editRemoveChannel Line 1009  void qsamplerMainForm::editRemoveChannel
1009    
1010      // Just delete the channel strip.      // Just delete the channel strip.
1011      delete pChannelStrip;      delete pChannelStrip;
1012        
1013      // Do we auto-arrange?      // Do we auto-arrange?
1014      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1015          channelsArrange();          channelsArrange();
# Line 927  void qsamplerMainForm::editResetChannel Line 1053  void qsamplerMainForm::editResetChannel
1053  // Reset all sampler channels.  // Reset all sampler channels.
1054  void qsamplerMainForm::editResetAllChannels (void)  void qsamplerMainForm::editResetAllChannels (void)
1055  {  {
1056      if (m_pClient == NULL)          if (m_pClient == NULL)
1057          return;                  return;
1058    
1059      // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1060          // for all channels out there...          // for all channels out there...
1061      m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1062      QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1063      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1064          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1065          if (pChannelStrip)                  if (pChannelStrip)
1066                  pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1067      }          }
1068      m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1069  }  }
1070    
1071    
# Line 994  void qsamplerMainForm::viewMessages ( bo Line 1120  void qsamplerMainForm::viewMessages ( bo
1120  // Show/hide the device configurator form.  // Show/hide the device configurator form.
1121  void qsamplerMainForm::viewDevices (void)  void qsamplerMainForm::viewDevices (void)
1122  {  {
1123      if (m_pOptions == NULL)          if (m_pOptions == NULL)
1124          return;                  return;
1125    
1126      if (m_pDeviceForm) {          if (m_pDeviceForm) {
1127          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                  m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1128                  m_pDeviceForm->setClient(m_pClient);                  m_pDeviceForm->setClient(m_pClient);
1129          if (m_pDeviceForm->isVisible()) {                  if (m_pDeviceForm->isVisible()) {
1130              m_pDeviceForm->hide();                          m_pDeviceForm->hide();
1131          } else {                  } else {
1132              m_pDeviceForm->show();                          m_pDeviceForm->show();
1133              m_pDeviceForm->raise();                          m_pDeviceForm->raise();
1134              m_pDeviceForm->setActiveWindow();                          m_pDeviceForm->setActiveWindow();
1135          }                  }
1136      }          }
1137  }  }
1138    
1139    
# Line 1035  void qsamplerMainForm::viewOptions (void Line 1161  void qsamplerMainForm::viewOptions (void
1161          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1162          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1163          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1164            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1165          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1166          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1167          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
# Line 1047  void qsamplerMainForm::viewOptions (void Line 1174  void qsamplerMainForm::viewOptions (void
1174          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1175              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1176              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1177                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1178                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1179                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1180                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1181                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1182                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 1122  void qsamplerMainForm::channelsArrange ( Line 1251  void qsamplerMainForm::channelsArrange (
1251          y += iHeight;          y += iHeight;
1252      }      }
1253      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1254        
1255      stabilizeForm();      stabilizeForm();
1256  }  }
1257    
# Line 1176  void qsamplerMainForm::helpAbout (void) Line 1305  void qsamplerMainForm::helpAbout (void)
1305      sText += tr("LSCP (liblscp) instrument_name support disabled.");      sText += tr("LSCP (liblscp) instrument_name support disabled.");
1306      sText += "</font></small><br />";      sText += "</font></small><br />";
1307  #endif  #endif
1308    #ifndef CONFIG_MUTE_SOLO
1309        sText += "<small><font color=\"red\">";
1310        sText += tr("Sampler channel Mute/Solo support disabled.");
1311        sText += "</font></small><br />";
1312    #endif
1313      sText += "<br />\n";      sText += "<br />\n";
1314      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1315      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1316      sText += " ";      sText += " ";
1317      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1318    #ifdef CONFIG_LIBGIG
1319        sText += ", ";
1320        sText += gig::libraryName().c_str();
1321        sText += " ";
1322        sText += gig::libraryVersion().c_str();
1323    #endif
1324      sText += "<br />\n";      sText += "<br />\n";
1325      sText += "<br />\n";      sText += "<br />\n";
1326      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 1260  void qsamplerMainForm::stabilizeForm (vo Line 1400  void qsamplerMainForm::stabilizeForm (vo
1400  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1401  {  {
1402          // Add this strip to the changed list...          // Add this strip to the changed list...
1403          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1404                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1405                    pChannelStrip->resetErrorCount();
1406            }
1407    
1408      // Just mark the dirty form.      // Just mark the dirty form.
1409      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1293  void qsamplerMainForm::updateSession (vo Line 1435  void qsamplerMainForm::updateSession (vo
1435                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1436          }          }
1437          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1438            
1439            // Remember to refresh devices
1440            if (m_pDeviceForm)
1441                m_pDeviceForm->refreshDevices();
1442  }  }
1443    
1444    
# Line 1503  void qsamplerMainForm::updateMessagesLim Line 1649  void qsamplerMainForm::updateMessagesLim
1649          if (m_pOptions->bMessagesLimit)          if (m_pOptions->bMessagesLimit)
1650              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);              m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines);
1651          else          else
1652              m_pMessages->setMessagesLimit(0);              m_pMessages->setMessagesLimit(-1);
1653      }      }
1654  }  }
1655    
# Line 1547  qsamplerChannelStrip *qsamplerMainForm:: Line 1693  qsamplerChannelStrip *qsamplerMainForm::
1693      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1694      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1695          return NULL;          return NULL;
1696            
1697      // Actual channel strip setup...      // Actual channel strip setup...
1698      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1699      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1605  qsamplerChannelStrip *qsamplerMainForm:: Line 1751  qsamplerChannelStrip *qsamplerMainForm::
1751          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1752          if (wlist.isEmpty())          if (wlist.isEmpty())
1753                  return NULL;                  return NULL;
1754            
1755          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1756                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1757                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1686  void qsamplerMainForm::timerSlot (void) Line 1832  void qsamplerMainForm::timerSlot (void)
1832              }              }
1833          }          }
1834      }      }
1835        
1836          // Refresh each channel usage, on each period...          if (m_pClient) {
1837      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {                  // Update the channel information for each pending strip...
1838          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  if (m_changedStrips.count() > 0) {
1839          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1840              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()) {  
1841                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
1842                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
1843                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
1844                          }                          }
1845              // Update the channel stream usage for each strip...                  }
1846              QWidgetList wlist = m_pWorkspace->windowList();                  // Refresh each channel usage, on each period...
1847              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                  if (m_pOptions->bAutoRefresh) {
1848                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1849                  if (pChannelStrip && pChannelStrip->isVisible())                          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime)  {
1850                      pChannelStrip->updateChannelUsage();                                  m_iTimerSlot = 0;
1851              }                                  // Update the channel stream usage for each strip...
1852          }                                  QWidgetList wlist = m_pWorkspace->windowList();
1853      }                                  for (int iChannel = 0;
1854                                                    iChannel < (int) wlist.count(); iChannel++) {
1855                                            qsamplerChannelStrip *pChannelStrip
1856                                                    = (qsamplerChannelStrip *) wlist.at(iChannel);
1857                                            if (pChannelStrip && pChannelStrip->isVisible())
1858                                                    pChannelStrip->updateChannelUsage();
1859                                    }
1860                            }
1861                    }
1862            }
1863    
1864      // Register the next timer slot.      // Register the next timer slot.
1865      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1889  bool qsamplerMainForm::startClient (void Line 2040  bool qsamplerMainForm::startClient (void
2040      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);      ::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout);
2041      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)));
2042    
2043            // Subscribe to channel info change notifications...
2044            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2045                    appendMessagesClient("lscp_client_subscribe");
2046    
2047      // We may stop scheduling around.      // We may stop scheduling around.
2048      stopSchedule();      stopSchedule();
2049    
# Line 1902  bool qsamplerMainForm::startClient (void Line 2057  bool qsamplerMainForm::startClient (void
2057          // if visible, that we're ready...          // if visible, that we're ready...
2058          if (m_pDeviceForm && m_pDeviceForm->isVisible())          if (m_pDeviceForm && m_pDeviceForm->isVisible())
2059              m_pDeviceForm->setClient(m_pClient);              m_pDeviceForm->setClient(m_pClient);
2060                
2061      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2062      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2063          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1942  void qsamplerMainForm::stopClient (void) Line 2097  void qsamplerMainForm::stopClient (void)
2097      // channels from the back-end server.      // channels from the back-end server.
2098      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2099      closeSession(false);      closeSession(false);
2100        
2101      // Close us as a client...      // Close us as a client...
2102      lscp_client_destroy(m_pClient);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2103        ::lscp_client_destroy(m_pClient);
2104      m_pClient = NULL;      m_pClient = NULL;
2105    
2106      // Log final here.      // Log final here.

Legend:
Removed from v.428  
changed lines
  Added in v.751

  ViewVC Help
Powered by ViewVC