/[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 418 by capela, Wed Mar 2 16:23:10 2005 UTC revision 605 by capela, Fri Jun 3 10:19:42 2005 UTC
# Line 41  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #include "config.h"
# Line 49  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 105  void qsamplerMainForm::init (void) Line 111  void qsamplerMainForm::init (void)
111      m_pOptions = NULL;      m_pOptions = NULL;
112    
113      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
114      m_pMessages = NULL;      m_pMessages   = NULL;
115        m_pDeviceForm = NULL;
116    
117      // We'll start clean.      // We'll start clean.
118      m_iUntitled   = 0;      m_iUntitled   = 0;
# Line 138  void qsamplerMainForm::init (void) Line 145  void qsamplerMainForm::init (void)
145      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
146      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
147      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
148      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
149      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
150      // Server address.      // Server address.
151      pLabel = new QLabel(this);      pLabel = new QLabel(this);
152      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
153      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
154      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
155      // Channel title.      // Channel title.
156      pLabel = new QLabel(this);      pLabel = new QLabel(this);
157      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
158      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
159      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
160      // Session modification status.      // Session modification status.
161      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
162      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
163      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
164      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
165      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
166    
167      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 179  void qsamplerMainForm::destroy (void) Line 186  void qsamplerMainForm::destroy (void)
186  #endif  #endif
187    
188      // Finally drop any widgets around...      // Finally drop any widgets around...
189        if (m_pDeviceForm)
190            delete m_pDeviceForm;
191      if (m_pMessages)      if (m_pMessages)
192          delete m_pMessages;          delete m_pMessages;
193      if (m_pWorkspace)      if (m_pWorkspace)
194          delete m_pWorkspace;          delete m_pWorkspace;
195    
196      // Delete status item labels one by one.      // Delete status item labels one by one.
197      if (m_status[QSAMPLER_STATUS_CLIENT])      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
198          delete m_status[QSAMPLER_STATUS_CLIENT];          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
199      if (m_status[QSAMPLER_STATUS_SERVER])      if (m_statusItem[QSAMPLER_STATUS_SERVER])
200          delete m_status[QSAMPLER_STATUS_SERVER];          delete m_statusItem[QSAMPLER_STATUS_SERVER];
201      if (m_status[QSAMPLER_STATUS_CHANNEL])      if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
202          delete m_status[QSAMPLER_STATUS_CHANNEL];          delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
203      if (m_status[QSAMPLER_STATUS_SESSION])      if (m_statusItem[QSAMPLER_STATUS_SESSION])
204          delete m_status[QSAMPLER_STATUS_SESSION];          delete m_statusItem[QSAMPLER_STATUS_SESSION];
205    
206      // Delete recentfiles menu.      // Delete recentfiles menu.
207      if (m_pRecentFilesMenu)      if (m_pRecentFilesMenu)
# Line 206  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, 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 236  void qsamplerMainForm::setup ( qsamplerO Line 251  void qsamplerMainForm::setup ( qsamplerO
251          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
252          istr >> *this;          istr >> *this;
253      }      }
254      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
255      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
256        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
257    
258      // Final startup stabilization...      // Final startup stabilization...
259      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 275  bool qsamplerMainForm::queryClose (void) Line 291  bool qsamplerMainForm::queryClose (void)
291              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
292              ostr << *this;              ostr << *this;
293              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
294              // And the main windows state.              // And the children, and the main windows state,.
295              m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
296                            m_pOptions->saveWidgetGeometry(this);
297                            // Close popup widgets.
298                            if (m_pDeviceForm)
299                                    m_pDeviceForm->close();
300              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
301              stopServer();              stopServer();
302          }          }
# Line 329  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 378  void qsamplerMainForm::customEvent ( QCu Line 398  void qsamplerMainForm::customEvent ( QCu
398  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent )
399  {  {
400      stabilizeForm();      stabilizeForm();
401        
402      editMenu->exec(pEvent->globalPos());      editMenu->exec(pEvent->globalPos());
403  }  }
404    
# Line 583  bool qsamplerMainForm::loadSessionFile ( Line 603  bool qsamplerMainForm::loadSessionFile (
603              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
604                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
605                  iErrors++;                  iErrors++;
                 break;  
606              }              }
607          }          }
608          // Try to make it snappy :)          // Try to make it snappy :)
# Line 593  bool qsamplerMainForm::loadSessionFile ( Line 612  bool qsamplerMainForm::loadSessionFile (
612      // Ok. we've read it.      // Ok. we've read it.
613      file.close();      file.close();
614    
     // Have we any errors?  
     if (iErrors > 0)  
         appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));  
   
615          // Now we'll try to create (update) the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
616          updateSession();          updateSession();
617    
618            // Have we any errors?
619            if (iErrors > 0)
620                    appendMessagesError(tr("Session loaded with errors\nfrom \"%1\".\n\nSorry.").arg(sFilename));
621    
622      // Save as default session directory.      // Save as default session directory.
623      if (m_pOptions)      if (m_pOptions)
624          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);          m_pOptions->sSessionDir = QFileInfo(sFilename).dirPath(true);
625      // We're not dirty anymore.          // We're not dirty anymore, if loaded without errors,
626      m_iDirtyCount = 0;          m_iDirtyCount = iErrors;
627      // Stabilize form...      // Stabilize form...
628      m_sFilename = sFilename;      m_sFilename = sFilename;
629      updateRecentFiles(sFilename);      updateRecentFiles(sFilename);
630      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
631        
632      // Make that an overall update.      // Make that an overall update.
633      stabilizeForm();      stabilizeForm();
634      return true;      return true;
# Line 627  bool qsamplerMainForm::saveSessionFile ( Line 646  bool qsamplerMainForm::saveSessionFile (
646      }      }
647    
648      // Write the file.      // Write the file.
649      int iErrors = 0;      int  iErrors = 0;
650      QTextStream ts(&file);      QTextStream ts(&file);
651      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;      ts << "# " << QSAMPLER_TITLE " - " << tr(QSAMPLER_SUBTITLE) << endl;
652      ts << "# " << tr("Version")      ts << "# " << tr("Version")
# Line 638  bool qsamplerMainForm::saveSessionFile ( Line 657  bool qsamplerMainForm::saveSessionFile (
657      ts << "# " << tr("File")      ts << "# " << tr("File")
658         << ": " << QFileInfo(sFilename).fileName() << endl;         << ": " << QFileInfo(sFilename).fileName() << endl;
659      ts << "# " << tr("Date")      ts << "# " << tr("Date")
660         << ": " << QDate::currentDate().toString("MMMM dd yyyy")         << ": " << QDate::currentDate().toString("MMM dd yyyy")
661         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;         << " "  << QTime::currentTime().toString("hh:mm:ss") << endl;
662      ts << "#"  << endl;      ts << "#"  << endl;
663      ts << endl;      ts << endl;
664            // It is assumed that this new kind of device+session file
665            // will be loaded from a complete
666            int *piDeviceIDs;
667            int  iDevice;
668            ts << "RESET" << endl;
669            // Audio device mapping.
670            QMap<int, int> audioDeviceMap;
671            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
672            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
673                    ts << endl;
674                    qsamplerDevice device(this, qsamplerDevice::Audio, piDeviceIDs[iDevice]);
675                    // Audio device specification...
676                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
677                            << " " << tr("Device") << " " << iDevice << endl;
678                    ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName();
679                    qsamplerDeviceParamMap::ConstIterator deviceParam;
680                    for (deviceParam = device.params().begin();
681                                    deviceParam != device.params().end();
682                                            ++deviceParam) {
683                            const qsamplerDeviceParam& param = deviceParam.data();
684                            if (param.value.isEmpty()) ts << "# ";
685                            ts << " " << deviceParam.key() << "='" << param.value << "'";
686                    }
687                    ts << endl;
688                    // Audio channel parameters...
689                    int iPort = 0;
690                    for (qsamplerDevicePort *pPort = device.ports().first();
691                                    pPort;
692                                            pPort = device.ports().next(), ++iPort) {
693                            qsamplerDeviceParamMap::ConstIterator portParam;
694                            for (portParam = pPort->params().begin();
695                                            portParam != pPort->params().end();
696                                                    ++portParam) {
697                                    const qsamplerDeviceParam& param = portParam.data();
698                                    if (param.fix || param.value.isEmpty()) ts << "# ";
699                                    ts << "SET AUDIO_OUTPUT_CHANNEL_PARAMETER " << iDevice
700                                            << " " << iPort << " " << portParam.key()
701                                            << "='" << param.value << "'" << endl;
702                            }
703                    }
704                    // Audio device index/id mapping.
705                    audioDeviceMap[device.deviceID()] = iDevice;
706            // Try to keep it snappy :)
707            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
708            }
709            // MIDI device mapping.
710            QMap<int, int> midiDeviceMap;
711            piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
712            for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) {
713                    ts << endl;
714                    qsamplerDevice device(this, qsamplerDevice::Midi, piDeviceIDs[iDevice]);
715                    // MIDI device specification...
716                    ts << "# " << device.deviceTypeName() << " " << device.driverName()
717                            << " " << tr("Device") << " " << iDevice << endl;
718                    ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName();
719                    qsamplerDeviceParamMap::ConstIterator deviceParam;
720                    for (deviceParam = device.params().begin();
721                                    deviceParam != device.params().end();
722                                            ++deviceParam) {
723                            const qsamplerDeviceParam& param = deviceParam.data();
724                            if (param.value.isEmpty()) ts << "# ";
725                            ts << " " << deviceParam.key() << "='" << param.value << "'";
726                    }
727                    ts << endl;
728                    // MIDI port parameters...
729                    int iPort = 0;
730                    for (qsamplerDevicePort *pPort = device.ports().first();
731                                    pPort;
732                                            pPort = device.ports().next(), ++iPort) {
733                            qsamplerDeviceParamMap::ConstIterator portParam;
734                            for (portParam = pPort->params().begin();
735                                            portParam != pPort->params().end();
736                                                    ++portParam) {
737                                    const qsamplerDeviceParam& param = portParam.data();
738                                    if (param.fix || param.value.isEmpty()) ts << "# ";
739                                    ts << "SET MIDI_INPUT_PORT_PARAMETER " << iDevice
740                                       << " " << iPort << " " << portParam.key()
741                                       << "='" << param.value << "'" << endl;
742                            }
743                    }
744                    // MIDI device index/id mapping.
745                    midiDeviceMap[device.deviceID()] = iDevice;
746            // Try to keep it snappy :)
747            QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
748            }
749            ts << endl;
750            // Sampler channel mapping.
751      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
752      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
753          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
754          if (pChannelStrip) {          if (pChannelStrip) {
755              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
756              if (pChannel) {              if (pChannel) {
757                  ts << "# Channel " << iChannel << endl;                  ts << "# " << tr("Channel") << " " << iChannel << endl;
758                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
759                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel << " " << pChannel->audioDriver() << endl;                                  if (audioDeviceMap.isEmpty()) {
760                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel << " " << pChannel->midiDriver() << endl;                                          ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel
761              //  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel << " " << pChannel->midiPort() << endl;                                                  << " " << pChannel->audioDriver() << endl;
762                                    } else {
763                                            ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannel
764                                                    << " " << audioDeviceMap[pChannel->audioDevice()] << endl;
765                                    }
766                                    if (midiDeviceMap.isEmpty()) {
767                                            ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel
768                                                    << " " << pChannel->midiDriver() << endl;
769                                    } else {
770                                            ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannel
771                                                    << " " << midiDeviceMap[pChannel->midiDevice()] << endl;
772                                    }
773                                    ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel
774                                            << " " << pChannel->midiPort() << endl;
775                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
776                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
777                      ts << "ALL";                      ts << "ALL";
# Line 690  bool qsamplerMainForm::saveSessionFile ( Line 809  bool qsamplerMainForm::saveSessionFile (
809  }  }
810    
811    
812    // Session change receiver slot.
813    void qsamplerMainForm::sessionDirty (void)
814    {
815        // Just mark the dirty form.
816        m_iDirtyCount++;
817        // and update the form status...
818        stabilizeForm();
819    }
820    
821    
822  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
823  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
824    
# Line 747  void qsamplerMainForm::fileReset (void) Line 876  void qsamplerMainForm::fileReset (void)
876          tr("Resetting the sampler instance will close\n"          tr("Resetting the sampler instance will close\n"
877             "all device and channel configurations.\n\n"             "all device and channel configurations.\n\n"
878             "Please note that this operation may cause\n"             "Please note that this operation may cause\n"
879             "temporary MIDI and Audio disruption\n\n"             "temporary MIDI and Audio disruption.\n\n"
880             "Do you want to reset the sampler engine now?"),             "Do you want to reset the sampler engine now?"),
881          tr("Reset"), tr("Cancel")) > 0)          tr("Reset"), tr("Cancel")) > 0)
882          return;          return;
# Line 772  void qsamplerMainForm::fileRestart (void Line 901  void qsamplerMainForm::fileRestart (void
901  {  {
902      if (m_pOptions == NULL)      if (m_pOptions == NULL)
903          return;          return;
904            
905      bool bRestart = true;      bool bRestart = true;
906        
907      // Ask user whether he/she want's a complete restart...      // Ask user whether he/she want's a complete restart...
908      // (if we're currently up and running)      // (if we're currently up and running)
909      if (bRestart && m_pClient) {      if (bRestart && m_pClient) {
# Line 782  void qsamplerMainForm::fileRestart (void Line 911  void qsamplerMainForm::fileRestart (void
911              tr("New settings will be effective after\n"              tr("New settings will be effective after\n"
912                 "restarting the client/server connection.\n\n"                 "restarting the client/server connection.\n\n"
913                 "Please note that this operation may cause\n"                 "Please note that this operation may cause\n"
914                 "temporary MIDI and Audio disruption\n\n"                 "temporary MIDI and Audio disruption.\n\n"
915                 "Do you want to restart the connection now?"),                 "Do you want to restart the connection now?"),
916              tr("Restart"), tr("Cancel")) == 0);              tr("Restart"), tr("Cancel")) == 0);
917      }      }
# Line 825  void qsamplerMainForm::editAddChannel (v Line 954  void qsamplerMainForm::editAddChannel (v
954          delete pChannel;          delete pChannel;
955          return;          return;
956      }      }
957        
958      // 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).
959      if (!createChannelStrip(pChannel)) {      if (!createChannelStrip(pChannel)) {
960          delete pChannel;          delete pChannel;
# Line 847  void qsamplerMainForm::editRemoveChannel Line 976  void qsamplerMainForm::editRemoveChannel
976      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
977      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
978          return;          return;
979            
980      qsamplerChannel *pChannel = pChannelStrip->channel();      qsamplerChannel *pChannel = pChannelStrip->channel();
981      if (pChannel == NULL)      if (pChannel == NULL)
982          return;          return;
# Line 869  void qsamplerMainForm::editRemoveChannel Line 998  void qsamplerMainForm::editRemoveChannel
998    
999      // Just delete the channel strip.      // Just delete the channel strip.
1000      delete pChannelStrip;      delete pChannelStrip;
1001        
1002      // Do we auto-arrange?      // Do we auto-arrange?
1003      if (m_pOptions && m_pOptions->bAutoArrange)      if (m_pOptions && m_pOptions->bAutoArrange)
1004          channelsArrange();          channelsArrange();
# Line 913  void qsamplerMainForm::editResetChannel Line 1042  void qsamplerMainForm::editResetChannel
1042  // Reset all sampler channels.  // Reset all sampler channels.
1043  void qsamplerMainForm::editResetAllChannels (void)  void qsamplerMainForm::editResetAllChannels (void)
1044  {  {
1045      if (m_pClient == NULL)          if (m_pClient == NULL)
1046          return;                  return;
1047    
1048      // Invoque the channel strip procedure,          // Invoque the channel strip procedure,
1049          // for all channels out there...          // for all channels out there...
1050      m_pWorkspace->setUpdatesEnabled(false);          m_pWorkspace->setUpdatesEnabled(false);
1051      QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1052      for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1053          qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1054          if (pChannelStrip)                  if (pChannelStrip)
1055                  pChannelStrip->channelReset();                          pChannelStrip->channelReset();
1056      }          }
1057      m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1058  }  }
1059    
1060    
# Line 977  void qsamplerMainForm::viewMessages ( bo Line 1106  void qsamplerMainForm::viewMessages ( bo
1106  }  }
1107    
1108    
1109    // Show/hide the device configurator form.
1110    void qsamplerMainForm::viewDevices (void)
1111    {
1112            if (m_pOptions == NULL)
1113                    return;
1114    
1115            if (m_pDeviceForm) {
1116                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1117                    m_pDeviceForm->setClient(m_pClient);
1118                    if (m_pDeviceForm->isVisible()) {
1119                            m_pDeviceForm->hide();
1120                    } else {
1121                            m_pDeviceForm->show();
1122                            m_pDeviceForm->raise();
1123                            m_pDeviceForm->setActiveWindow();
1124                    }
1125            }
1126    }
1127    
1128    
1129  // Show options dialog.  // Show options dialog.
1130  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1131  {  {
# Line 1001  void qsamplerMainForm::viewOptions (void Line 1150  void qsamplerMainForm::viewOptions (void
1150          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;          bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1151          int     iOldMaxVolume       = m_pOptions->iMaxVolume;          int     iOldMaxVolume       = m_pOptions->iMaxVolume;
1152          QString sOldMessagesFont    = m_pOptions->sMessagesFont;          QString sOldMessagesFont    = m_pOptions->sMessagesFont;
1153            bool    bOldKeepOnTop       = m_pOptions->bKeepOnTop;
1154          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;          bool    bOldStdoutCapture   = m_pOptions->bStdoutCapture;
1155          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1156          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
# Line 1013  void qsamplerMainForm::viewOptions (void Line 1163  void qsamplerMainForm::viewOptions (void
1163          if (pOptionsForm->exec()) {          if (pOptionsForm->exec()) {
1164              // Warn if something will be only effective on next run.              // Warn if something will be only effective on next run.
1165              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||              if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1166                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture)) {                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1167                    ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1168                    (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {
1169                  QMessageBox::information(this, tr("Information"),                  QMessageBox::information(this, tr("Information"),
1170                      tr("Some settings may be only effective\n"                      tr("Some settings may be only effective\n"
1171                         "next time you start this program."), tr("OK"));                         "next time you start this program."), tr("OK"));
# Line 1088  void qsamplerMainForm::channelsArrange ( Line 1240  void qsamplerMainForm::channelsArrange (
1240          y += iHeight;          y += iHeight;
1241      }      }
1242      m_pWorkspace->setUpdatesEnabled(true);      m_pWorkspace->setUpdatesEnabled(true);
1243        
1244      stabilizeForm();      stabilizeForm();
1245  }  }
1246    
# Line 1147  void qsamplerMainForm::helpAbout (void) Line 1299  void qsamplerMainForm::helpAbout (void)
1299      sText += ::lscp_client_package();      sText += ::lscp_client_package();
1300      sText += " ";      sText += " ";
1301      sText += ::lscp_client_version();      sText += ::lscp_client_version();
1302    #ifdef CONFIG_LIBGIG
1303        sText += ", ";
1304        sText += gig::libraryName();
1305        sText += " ";
1306        sText += gig::libraryVersion();
1307    #endif
1308      sText += "<br />\n";      sText += "<br />\n";
1309      sText += "<br />\n";      sText += "<br />\n";
1310      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 1189  void qsamplerMainForm::stabilizeForm (vo Line 1347  void qsamplerMainForm::stabilizeForm (vo
1347      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1348      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1349      editResetAllChannelsAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
     channelsArrangeAction->setEnabled(bHasChannel);  
1350      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1351        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1352        viewDevicesAction->setEnabled(bHasClient);
1353        channelsArrangeAction->setEnabled(bHasChannel);
1354    
1355      // Client/Server status...      // Client/Server status...
1356      if (bHasClient) {      if (bHasClient) {
1357          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1358          m_status[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));          m_statusItem[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));
1359      } else {      } else {
1360          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1361          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1362      }      }
1363      // Channel status...      // Channel status...
1364      if (bHasChannel)      if (bHasChannel)
1365          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1366      else      else
1367          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1368      // Session status...      // Session status...
1369      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1370          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1371      else      else
1372          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1373    
1374      // Recent files menu.      // Recent files menu.
1375      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1224  void qsamplerMainForm::stabilizeForm (vo Line 1384  void qsamplerMainForm::stabilizeForm (vo
1384  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1385  {  {
1386          // Add this strip to the changed list...          // Add this strip to the changed list...
1387          if (m_changedStrips.containsRef(pChannelStrip) == 0)          if (m_changedStrips.containsRef(pChannelStrip) == 0) {
1388                  m_changedStrips.append(pChannelStrip);                  m_changedStrips.append(pChannelStrip);
1389                    pChannelStrip->resetErrorCount();
1390            }
1391    
1392      // Just mark the dirty form.      // Just mark the dirty form.
1393      m_iDirtyCount++;      m_iDirtyCount++;
# Line 1257  void qsamplerMainForm::updateSession (vo Line 1419  void qsamplerMainForm::updateSession (vo
1419                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);                  QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1420          }          }
1421          m_pWorkspace->setUpdatesEnabled(true);          m_pWorkspace->setUpdatesEnabled(true);
1422            
1423            // Remember to refresh devices
1424            if (m_pDeviceForm)
1425                m_pDeviceForm->refreshDevices();
1426  }  }
1427    
1428    
# Line 1511  qsamplerChannelStrip *qsamplerMainForm:: Line 1677  qsamplerChannelStrip *qsamplerMainForm::
1677      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);      pChannelStrip = new qsamplerChannelStrip(m_pWorkspace, 0, wflags);
1678      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
1679          return NULL;          return NULL;
1680            
1681      // Actual channel strip setup...      // Actual channel strip setup...
1682      pChannelStrip->setup(pChannel);      pChannelStrip->setup(pChannel);
1683      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));      QObject::connect(pChannelStrip, SIGNAL(channelChanged(qsamplerChannelStrip *)), this, SLOT(channelStripChanged(qsamplerChannelStrip *)));
# Line 1569  qsamplerChannelStrip *qsamplerMainForm:: Line 1735  qsamplerChannelStrip *qsamplerMainForm::
1735          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1736          if (wlist.isEmpty())          if (wlist.isEmpty())
1737                  return NULL;                  return NULL;
1738            
1739          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1740                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1741                  if (pChannelStrip) {                  if (pChannelStrip) {
# Line 1650  void qsamplerMainForm::timerSlot (void) Line 1816  void qsamplerMainForm::timerSlot (void)
1816              }              }
1817          }          }
1818      }      }
1819        
1820          // Refresh each channel usage, on each period...          // Refresh each channel usage, on each period...
1821      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {          if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {
1822          m_iTimerSlot += QSAMPLER_TIMER_MSECS;                  m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1823          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {                  if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {
1824              m_iTimerSlot = 0;                          m_iTimerSlot = 0;
1825              // Update the channel information for each pending strip...                          // Update the channel information for each pending strip...
1826              for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();                          for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1827                      pChannelStrip;                                          pChannelStrip;
1828                                                  pChannelStrip = m_changedStrips.next()) {                                                  pChannelStrip = m_changedStrips.next()) {
1829                                  // If successfull, remove from pending list...                                  // If successfull, remove from pending list...
1830                                  if (pChannelStrip->updateChannelInfo())                                  if (pChannelStrip->updateChannelInfo())
1831                      m_changedStrips.remove(pChannelStrip);                                          m_changedStrips.remove(pChannelStrip);
1832                          }                          }
1833              // Update the channel stream usage for each strip...                          // Update the channel stream usage for each strip...
1834              QWidgetList wlist = m_pWorkspace->windowList();                          QWidgetList wlist = m_pWorkspace->windowList();
1835              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {                          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1836                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1837                  if (pChannelStrip && pChannelStrip->isVisible())                                  if (pChannelStrip && pChannelStrip->isVisible())
1838                      pChannelStrip->updateChannelUsage();                                          pChannelStrip->updateChannelUsage();
1839              }                          }
1840          }                  }
1841      }          }
1842    
1843      // Register the next timer slot.      // Register the next timer slot.
1844      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));      QTimer::singleShot(QSAMPLER_TIMER_MSECS, this, SLOT(timerSlot()));
# Line 1862  bool qsamplerMainForm::startClient (void Line 2028  bool qsamplerMainForm::startClient (void
2028      // Log success here.      // Log success here.
2029      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
2030    
2031            // Hard-notify device configuration form,
2032            // if visible, that we're ready...
2033            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2034                m_pDeviceForm->setClient(m_pClient);
2035                
2036      // Is any session pending to be loaded?      // Is any session pending to be loaded?
2037      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
2038          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1882  void qsamplerMainForm::stopClient (void) Line 2053  void qsamplerMainForm::stopClient (void)
2053      if (m_pClient == NULL)      if (m_pClient == NULL)
2054          return;          return;
2055    
2056            // Hard-notify device configuration form,
2057            // if visible, that we're running out...
2058            if (m_pDeviceForm && m_pDeviceForm->isVisible())
2059                m_pDeviceForm->setClient(NULL);
2060    
2061      // Log prepare here.      // Log prepare here.
2062      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
2063    
# Line 1896  void qsamplerMainForm::stopClient (void) Line 2072  void qsamplerMainForm::stopClient (void)
2072      // channels from the back-end server.      // channels from the back-end server.
2073      m_iDirtyCount = 0;      m_iDirtyCount = 0;
2074      closeSession(false);      closeSession(false);
2075        
2076      // Close us as a client...      // Close us as a client...
2077      lscp_client_destroy(m_pClient);      lscp_client_destroy(m_pClient);
2078      m_pClient = NULL;      m_pClient = NULL;

Legend:
Removed from v.418  
changed lines
  Added in v.605

  ViewVC Help
Powered by ViewVC