/[svn]/qsampler/trunk/src/qsamplerMainForm.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMainForm.cpp

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

revision 1699 by schoenebeck, Sun Feb 17 10:46:17 2008 UTC revision 2112 by capela, Wed Jul 21 18:33:25 2010 UTC
# Line 1  Line 1 
1  // qsamplerMainForm.cpp  // qsamplerMainForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2010, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, 2008 Christian Schoenebeck     Copyright (C) 2007, 2008 Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
# Line 56  Line 56 
56  #include <QTimer>  #include <QTimer>
57  #include <QDateTime>  #include <QDateTime>
58    
59    #if QT_VERSION < 0x040500
60    namespace Qt {
61    const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000);
62    #if QT_VERSION < 0x040200
63    const WindowFlags CustomizeWindowHint   = WindowFlags(0x02000000);
64    #endif
65    }
66    #endif
67    
68  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
69  #include <signal.h>  #include <signal.h>
# Line 85  static WSADATA _wsaData; Line 93  static WSADATA _wsaData;
93  #endif  #endif
94    
95    
96    //-------------------------------------------------------------------------
97    // LADISH Level 1 support stuff.
98    
99    #ifdef HAVE_SIGNAL_H
100    
101    #include <QSocketNotifier>
102    
103    #include <sys/types.h>
104    #include <sys/socket.h>
105    
106    #include <signal.h>
107    
108    // File descriptor for SIGUSR1 notifier.
109    static int g_fdUsr1[2];
110    
111    // Unix SIGUSR1 signal handler.
112    static void qsampler_sigusr1_handler ( int /* signo */ )
113    {
114            char c = 1;
115    
116            (::write(g_fdUsr1[0], &c, sizeof(c)) > 0);
117    }
118    
119    #endif  // HAVE_SIGNAL_H
120    
121    
122    //-------------------------------------------------------------------------
123    // qsampler -- namespace
124    
125    
126  namespace QSampler {  namespace QSampler {
127    
128  // Timer constant stuff.  // Timer constant stuff.
# Line 97  namespace QSampler { Line 135  namespace QSampler {
135  #define QSAMPLER_STATUS_SESSION 3       // Current session modification state.  #define QSAMPLER_STATUS_SESSION 3       // Current session modification state.
136    
137    
138    // Specialties for thread-callback comunication.
139    #define QSAMPLER_LSCP_EVENT   QEvent::Type(QEvent::User + 1)
140    
141    
142  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
143  // CustomEvent -- specialty for callback comunication.  // LscpEvent -- specialty for LSCP callback comunication.
144    
 #define QSAMPLER_CUSTOM_EVENT   QEvent::Type(QEvent::User + 0)  
145    
146  class CustomEvent : public QEvent  class LscpEvent : public QEvent
147  {  {
148  public:  public:
149    
150          // Constructor.          // Constructor.
151          CustomEvent(lscp_event_t event, const char *pchData, int cchData)          LscpEvent(lscp_event_t event, const char *pchData, int cchData)
152                  : QEvent(QSAMPLER_CUSTOM_EVENT)                  : QEvent(QSAMPLER_LSCP_EVENT)
153          {          {
154                  m_event = event;                  m_event = event;
155                  m_data  = QString::fromUtf8(pchData, cchData);                  m_data  = QString::fromUtf8(pchData, cchData);
# Line 162  MainForm::MainForm ( QWidget *pParent ) Line 203  MainForm::MainForm ( QWidget *pParent )
203          m_iTimerSlot = 0;          m_iTimerSlot = 0;
204    
205  #ifdef HAVE_SIGNAL_H  #ifdef HAVE_SIGNAL_H
206    
207          // Set to ignore any fatal "Broken pipe" signals.          // Set to ignore any fatal "Broken pipe" signals.
208          ::signal(SIGPIPE, SIG_IGN);          ::signal(SIGPIPE, SIG_IGN);
209  #endif  
210            // LADISH Level 1 suport.
211    
212            // Initialize file descriptors for SIGUSR1 socket notifier.
213            ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdUsr1);
214            m_pUsr1Notifier
215                    = new QSocketNotifier(g_fdUsr1[1], QSocketNotifier::Read, this);
216    
217            QObject::connect(m_pUsr1Notifier,
218                    SIGNAL(activated(int)),
219                    SLOT(handle_sigusr1()));
220    
221            // Install SIGUSR1 signal handler.
222        struct sigaction usr1;
223        usr1.sa_handler = qsampler_sigusr1_handler;
224        ::sigemptyset(&usr1.sa_mask);
225        usr1.sa_flags = 0;
226        usr1.sa_flags |= SA_RESTART;
227        ::sigaction(SIGUSR1, &usr1, NULL);
228    
229    #else   // HAVE_SIGNAL_H
230    
231            m_pSocketNotifier = NULL;
232            
233    #endif  // !HAVE_SIGNAL_H
234    
235  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
236          // Make some extras into the toolbar...          // Make some extras into the toolbar...
# Line 337  MainForm::~MainForm() Line 403  MainForm::~MainForm()
403          WSACleanup();          WSACleanup();
404  #endif  #endif
405    
406    #ifdef HAVE_SIGNAL_H
407            if (m_pUsr1Notifier)
408                    delete m_pUsr1Notifier;
409    #endif
410    
411          // Finally drop any widgets around...          // Finally drop any widgets around...
412          if (m_pDeviceForm)          if (m_pDeviceForm)
413                  delete m_pDeviceForm;                  delete m_pDeviceForm;
# Line 375  void MainForm::setup ( Options *pOptions Line 446  void MainForm::setup ( Options *pOptions
446    
447          // What style do we create these forms?          // What style do we create these forms?
448          Qt::WindowFlags wflags = Qt::Window          Qt::WindowFlags wflags = Qt::Window
 #if QT_VERSION >= 0x040200  
449                  | Qt::CustomizeWindowHint                  | Qt::CustomizeWindowHint
 #endif  
450                  | Qt::WindowTitleHint                  | Qt::WindowTitleHint
451                  | Qt::WindowSystemMenuHint                  | Qt::WindowSystemMenuHint
452                  | Qt::WindowMinMaxButtonsHint;                  | Qt::WindowMinMaxButtonsHint
453                    | Qt::WindowCloseButtonHint;
454          if (m_pOptions->bKeepOnTop)          if (m_pOptions->bKeepOnTop)
455                  wflags |= Qt::Tool;                  wflags |= Qt::Tool;
456    
457          // Some child forms are to be created right now.          // Some child forms are to be created right now.
458          m_pMessages = new Messages(this);          m_pMessages = new Messages(this);
459          m_pDeviceForm = new DeviceForm(this, wflags);          m_pDeviceForm = new DeviceForm(this, wflags);
460  #ifdef CONFIG_MIDI_INSTRUMENT  #ifdef CONFIG_MIDI_INSTRUMENT
461          m_pInstrumentListForm = new InstrumentListForm(this, wflags);          m_pInstrumentListForm = new InstrumentListForm(this, wflags);
462  #else  #else
463          viewInstrumentsAction->setEnabled(false);          m_ui.viewInstrumentsAction->setEnabled(false);
464  #endif  #endif
465    
466            // Setup messages logging appropriately...
467            m_pMessages->setLogging(
468                    m_pOptions->bMessagesLog,
469                    m_pOptions->sMessagesLogPath);
470    
471          // Set message defaults...          // Set message defaults...
472          updateMessagesFont();          updateMessagesFont();
473          updateMessagesLimit();          updateMessagesLimit();
# Line 421  void MainForm::setup ( Options *pOptions Line 498  void MainForm::setup ( Options *pOptions
498          }          }
499    
500          // Try to restore old window positioning and initial visibility.          // Try to restore old window positioning and initial visibility.
501          m_pOptions->loadWidgetGeometry(this);          m_pOptions->loadWidgetGeometry(this, true);
502          m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);          m_pOptions->loadWidgetGeometry(m_pInstrumentListForm);
503          m_pOptions->loadWidgetGeometry(m_pDeviceForm);          m_pOptions->loadWidgetGeometry(m_pDeviceForm);
504    
# Line 465  bool MainForm::queryClose (void) Line 542  bool MainForm::queryClose (void)
542                          // And the children, and the main windows state,.                          // And the children, and the main windows state,.
543                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);                          m_pOptions->saveWidgetGeometry(m_pDeviceForm);
544                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);                          m_pOptions->saveWidgetGeometry(m_pInstrumentListForm);
545                          m_pOptions->saveWidgetGeometry(this);                          m_pOptions->saveWidgetGeometry(this, true);
546                          // Close popup widgets.                          // Close popup widgets.
547                          if (m_pInstrumentListForm)                          if (m_pInstrumentListForm)
548                                  m_pInstrumentListForm->close();                                  m_pInstrumentListForm->close();
# Line 514  void MainForm::dropEvent ( QDropEvent* p Line 591  void MainForm::dropEvent ( QDropEvent* p
591                  QListIterator<QUrl> iter(pMimeData->urls());                  QListIterator<QUrl> iter(pMimeData->urls());
592                  while (iter.hasNext()) {                  while (iter.hasNext()) {
593                          const QString& sPath = iter.next().toLocalFile();                          const QString& sPath = iter.next().toLocalFile();
594                          if (Channel::isInstrumentFile(sPath)) {                  //      if (Channel::isDlsInstrumentFile(sPath)) {
595                            if (QFileInfo(sPath).exists()) {
596                                  // Try to create a new channel from instrument file...                                  // Try to create a new channel from instrument file...
597                                  Channel *pChannel = new Channel();                                  Channel *pChannel = new Channel();
598                                  if (pChannel == NULL)                                  if (pChannel == NULL)
# Line 548  void MainForm::dropEvent ( QDropEvent* p Line 626  void MainForm::dropEvent ( QDropEvent* p
626    
627    
628  // Custome event handler.  // Custome event handler.
629  void MainForm::customEvent(QEvent* pCustomEvent)  void MainForm::customEvent ( QEvent* pEvent )
630  {  {
631          // For the time being, just pump it to messages.          // For the time being, just pump it to messages.
632          if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) {          if (pEvent->type() == QSAMPLER_LSCP_EVENT) {
633                  CustomEvent *pEvent = static_cast<CustomEvent *> (pCustomEvent);                  LscpEvent *pLscpEvent = static_cast<LscpEvent *> (pEvent);
634                  switch (pEvent->event()) {                  switch (pLscpEvent->event()) {
635                            case LSCP_EVENT_CHANNEL_COUNT:
636                                    updateAllChannelStrips(true);
637                                    break;
638                          case LSCP_EVENT_CHANNEL_INFO: {                          case LSCP_EVENT_CHANNEL_INFO: {
639                                  int iChannelID = pEvent->data().toInt();                                  int iChannelID = pLscpEvent->data().toInt();
640                                  ChannelStrip *pChannelStrip = channelStrip(iChannelID);                                  ChannelStrip *pChannelStrip = channelStrip(iChannelID);
641                                  if (pChannelStrip)                                  if (pChannelStrip)
642                                          channelStripChanged(pChannelStrip);                                          channelStripChanged(pChannelStrip);
# Line 568  void MainForm::customEvent(QEvent* pCust Line 649  void MainForm::customEvent(QEvent* pCust
649                                  break;                                  break;
650                          case LSCP_EVENT_MIDI_INPUT_DEVICE_INFO: {                          case LSCP_EVENT_MIDI_INPUT_DEVICE_INFO: {
651                                  if (m_pDeviceForm) m_pDeviceForm->refreshDevices();                                  if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
652                                  const int iDeviceID = pEvent->data().section(' ', 0, 0).toInt();                                  const int iDeviceID = pLscpEvent->data().section(' ', 0, 0).toInt();
653                                  DeviceStatusForm::onDeviceChanged(iDeviceID);                                  DeviceStatusForm::onDeviceChanged(iDeviceID);
654                                  break;                                  break;
655                          }                          }
656  #if CONFIG_LSCP_CHANNEL_MIDI                          case LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT:
657                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
658                                    break;
659                            case LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO:
660                                    if (m_pDeviceForm) m_pDeviceForm->refreshDevices();
661                                    break;
662                    #if CONFIG_EVENT_CHANNEL_MIDI
663                          case LSCP_EVENT_CHANNEL_MIDI: {                          case LSCP_EVENT_CHANNEL_MIDI: {
664                                  const int iChannelID = pEvent->data().section(' ', 0, 0).toInt();                                  const int iChannelID = pLscpEvent->data().section(' ', 0, 0).toInt();
665                                  ChannelStrip *pChannelStrip = channelStrip(iChannelID);                                  ChannelStrip *pChannelStrip = channelStrip(iChannelID);
666                                  if (pChannelStrip)                                  if (pChannelStrip)
667                                          pChannelStrip->midiArrived();                                          pChannelStrip->midiActivityLedOn();
668                                  break;                                  break;
669                          }                          }
670  #endif                  #endif
671  #if CONFIG_LSCP_DEVICE_MIDI                  #if CONFIG_EVENT_DEVICE_MIDI
672                          case LSCP_EVENT_DEVICE_MIDI: {                          case LSCP_EVENT_DEVICE_MIDI: {
673                                  const int iDeviceID = pEvent->data().section(' ', 0, 0).toInt();                                  const int iDeviceID = pLscpEvent->data().section(' ', 0, 0).toInt();
674                                  const int iPortID   = pEvent->data().section(' ', 1, 1).toInt();                                  const int iPortID   = pLscpEvent->data().section(' ', 1, 1).toInt();
675                                  DeviceStatusForm* pDeviceStatusForm =                                  DeviceStatusForm *pDeviceStatusForm
676                                          DeviceStatusForm::getInstance(iDeviceID);                                          = DeviceStatusForm::getInstance(iDeviceID);
677                                  if (pDeviceStatusForm)                                  if (pDeviceStatusForm)
678                                          pDeviceStatusForm->midiArrived(iPortID);                                          pDeviceStatusForm->midiArrived(iPortID);
679                                  break;                                  break;
680                          }                          }
681  #endif                  #endif
682                          default:                          default:
683                                  appendMessagesColor(tr("Notify event: %1 data: %2")                                  appendMessagesColor(tr("LSCP Event: %1 data: %2")
684                                          .arg(::lscp_event_to_text(pEvent->event()))                                          .arg(::lscp_event_to_text(pLscpEvent->event()))
685                                          .arg(pEvent->data()), "#996699");                                          .arg(pLscpEvent->data()), "#996699");
686                  }                  }
687          }          }
688  }  }
689    
690  void MainForm::updateViewMidiDeviceStatusMenu() {  
691    // LADISH Level 1 -- SIGUSR1 signal handler.
692    void MainForm::handle_sigusr1 (void)
693    {
694            char c;
695    
696            if (::read(g_fdUsr1[1], &c, sizeof(c)) > 0)
697                    saveSession(false);
698    }
699    
700    
701    void MainForm::updateViewMidiDeviceStatusMenu (void)
702    {
703          m_ui.viewMidiDeviceStatusMenu->clear();          m_ui.viewMidiDeviceStatusMenu->clear();
704          const std::map<int, DeviceStatusForm*> statusForms =          const std::map<int, DeviceStatusForm *> statusForms
705                  DeviceStatusForm::getInstances();                  = DeviceStatusForm::getInstances();
706          for (          std::map<int, DeviceStatusForm *>::const_iterator iter
707                  std::map<int, DeviceStatusForm*>::const_iterator iter = statusForms.begin();                  = statusForms.begin();
708                  iter != statusForms.end(); ++iter          for ( ; iter != statusForms.end(); ++iter) {
709          ) {                  DeviceStatusForm *pStatusForm = iter->second;
                 DeviceStatusForm* pForm = iter->second;  
710                  m_ui.viewMidiDeviceStatusMenu->addAction(                  m_ui.viewMidiDeviceStatusMenu->addAction(
711                          pForm->visibleAction()                          pStatusForm->visibleAction());
                 );  
712          }          }
713  }  }
714    
715    
716  // Context menu event handler.  // Context menu event handler.
717  void MainForm::contextMenuEvent( QContextMenuEvent *pEvent )  void MainForm::contextMenuEvent( QContextMenuEvent *pEvent )
718  {  {
# Line 746  bool MainForm::saveSession ( bool bPromp Line 844  bool MainForm::saveSession ( bool bPromp
844                                  "\"%1\"\n\n"                                  "\"%1\"\n\n"
845                                  "Do you want to replace it?")                                  "Do you want to replace it?")
846                                  .arg(sFilename),                                  .arg(sFilename),
847                                  tr("Replace"), tr("Cancel")) > 0)                                  QMessageBox::Yes | QMessageBox::No)
848                                    == QMessageBox::No)
849                                  return false;                                  return false;
850                  }                  }
851          }          }
# Line 769  bool MainForm::closeSession ( bool bForc Line 868  bool MainForm::closeSession ( bool bForc
868                          "\"%1\"\n\n"                          "\"%1\"\n\n"
869                          "Do you want to save the changes?")                          "Do you want to save the changes?")
870                          .arg(sessionName(m_sFilename)),                          .arg(sessionName(m_sFilename)),
871                          tr("Save"), tr("Discard"), tr("Cancel"))) {                          QMessageBox::Save |
872                  case 0:     // Save...                          QMessageBox::Discard |
873                            QMessageBox::Cancel)) {
874                    case QMessageBox::Save:
875                          bClose = saveSession(false);                          bClose = saveSession(false);
876                          // Fall thru....                          // Fall thru....
877                  case 1:     // Discard                  case QMessageBox::Discard:
878                          break;                          break;
879                  default:    // Cancel.                  default:    // Cancel.
880                          bClose = false;                          bClose = false;
# Line 1294  void MainForm::fileReset (void) Line 1395  void MainForm::fileReset (void)
1395                  "Please note that this operation may cause\n"                  "Please note that this operation may cause\n"
1396                  "temporary MIDI and Audio disruption.\n\n"                  "temporary MIDI and Audio disruption.\n\n"
1397                  "Do you want to reset the sampler engine now?"),                  "Do you want to reset the sampler engine now?"),
1398                  tr("Reset"), tr("Cancel")) > 0)                  QMessageBox::Ok | QMessageBox::Cancel)
1399                    == QMessageBox::Cancel)
1400                  return;                  return;
1401    
1402          // Trye closing the current session, first...          // Trye closing the current session, first...
# Line 1335  void MainForm::fileRestart (void) Line 1437  void MainForm::fileRestart (void)
1437                          "Please note that this operation may cause\n"                          "Please note that this operation may cause\n"
1438                          "temporary MIDI and Audio disruption.\n\n"                          "temporary MIDI and Audio disruption.\n\n"
1439                          "Do you want to restart the connection now?"),                          "Do you want to restart the connection now?"),
1440                          tr("Restart"), tr("Cancel")) == 0);                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok);
1441          }          }
1442    
1443          // Are we still for it?          // Are we still for it?
# Line 1416  void MainForm::editRemoveChannel (void) Line 1518  void MainForm::editRemoveChannel (void)
1518                          "%1\n\n"                          "%1\n\n"
1519                          "Are you sure?")                          "Are you sure?")
1520                          .arg(pChannelStrip->windowTitle()),                          .arg(pChannelStrip->windowTitle()),
1521                          tr("OK"), tr("Cancel")) > 0)                          QMessageBox::Ok | QMessageBox::Cancel)
1522                            == QMessageBox::Cancel)
1523                          return;                          return;
1524          }          }
1525    
# Line 1607  void MainForm::viewOptions (void) Line 1710  void MainForm::viewOptions (void)
1710                  int     iOldServerTimeout   = m_pOptions->iServerTimeout;                  int     iOldServerTimeout   = m_pOptions->iServerTimeout;
1711                  bool    bOldServerStart     = m_pOptions->bServerStart;                  bool    bOldServerStart     = m_pOptions->bServerStart;
1712                  QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;                  QString sOldServerCmdLine   = m_pOptions->sServerCmdLine;
1713                    bool    bOldMessagesLog     = m_pOptions->bMessagesLog;
1714                    QString sOldMessagesLogPath = m_pOptions->sMessagesLogPath;
1715                  QString sOldDisplayFont     = m_pOptions->sDisplayFont;                  QString sOldDisplayFont     = m_pOptions->sDisplayFont;
1716                  bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;                  bool    bOldDisplayEffect   = m_pOptions->bDisplayEffect;
1717                  int     iOldMaxVolume       = m_pOptions->iMaxVolume;                  int     iOldMaxVolume       = m_pOptions->iMaxVolume;
# Line 1618  void MainForm::viewOptions (void) Line 1723  void MainForm::viewOptions (void)
1723                  bool    bOldCompletePath    = m_pOptions->bCompletePath;                  bool    bOldCompletePath    = m_pOptions->bCompletePath;
1724                  bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;                  bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1725                  int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;                  int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1726                    int     iOldBaseFontSize    = m_pOptions->iBaseFontSize;
1727                  // Load the current setup settings.                  // Load the current setup settings.
1728                  pOptionsForm->setup(m_pOptions);                  pOptionsForm->setup(m_pOptions);
1729                  // Show the setup dialog...                  // Show the setup dialog...
# Line 1626  void MainForm::viewOptions (void) Line 1732  void MainForm::viewOptions (void)
1732                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||                          if (( bOldStdoutCapture && !m_pOptions->bStdoutCapture) ||
1733                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||                                  (!bOldStdoutCapture &&  m_pOptions->bStdoutCapture) ||
1734                                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||                                  ( bOldKeepOnTop     && !m_pOptions->bKeepOnTop)     ||
1735                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)) {                                  (!bOldKeepOnTop     &&  m_pOptions->bKeepOnTop)     ||
1736                                    (iOldBaseFontSize   !=  m_pOptions->iBaseFontSize)) {
1737                                  QMessageBox::information(this,                                  QMessageBox::information(this,
1738                                          QSAMPLER_TITLE ": " + tr("Information"),                                          QSAMPLER_TITLE ": " + tr("Information"),
1739                                          tr("Some settings may be only effective\n"                                          tr("Some settings may be only effective\n"
1740                                          "next time you start this program."), tr("OK"));                                          "next time you start this program."));
1741                                  updateMessagesCapture();                                  updateMessagesCapture();
1742                          }                          }
1743                          // Check wheather something immediate has changed.                          // Check wheather something immediate has changed.
1744                            if (( bOldMessagesLog && !m_pOptions->bMessagesLog) ||
1745                                    (!bOldMessagesLog &&  m_pOptions->bMessagesLog) ||
1746                                    (sOldMessagesLogPath != m_pOptions->sMessagesLogPath))
1747                                    m_pMessages->setLogging(
1748                                            m_pOptions->bMessagesLog, m_pOptions->sMessagesLogPath);
1749                          if (( bOldCompletePath && !m_pOptions->bCompletePath) ||                          if (( bOldCompletePath && !m_pOptions->bCompletePath) ||
1750                                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1751                                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
# Line 1788  void MainForm::helpAbout (void) Line 1900  void MainForm::helpAbout (void)
1900          sText += tr("Instrument editing support disabled.");          sText += tr("Instrument editing support disabled.");
1901          sText += "</font></small><br />";          sText += "</font></small><br />";
1902  #endif  #endif
1903    #ifndef CONFIG_EVENT_CHANNEL_MIDI
1904            sText += "<small><font color=\"red\">";
1905            sText += tr("Channel MIDI event support disabled.");
1906            sText += "</font></small><br />";
1907    #endif
1908    #ifndef CONFIG_EVENT_DEVICE_MIDI
1909            sText += "<small><font color=\"red\">";
1910            sText += tr("Device MIDI event support disabled.");
1911            sText += "</font></small><br />";
1912    #endif
1913    #ifndef CONFIG_MAX_VOICES
1914            sText += "<small><font color=\"red\">";
1915            sText += tr("Runtime max. voices / disk streams support disabled.");
1916            sText += "</font></small><br />";
1917    #endif
1918          sText += "<br />\n";          sText += "<br />\n";
1919          sText += tr("Using") + ": ";          sText += tr("Using") + ": ";
1920          sText += ::lscp_client_package();          sText += ::lscp_client_package();
# Line 1828  void MainForm::stabilizeForm (void) Line 1955  void MainForm::stabilizeForm (void)
1955          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));          setWindowTitle(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1956    
1957          // Update the main menu state...          // Update the main menu state...
1958          ChannelStrip* pChannelStrip = activeChannelStrip();          ChannelStrip *pChannelStrip = activeChannelStrip();
1959          bool bHasClient  = (m_pOptions != NULL && m_pClient != NULL);          bool bHasClient = (m_pOptions != NULL && m_pClient != NULL);
1960          bool bHasChannel = (bHasClient && pChannelStrip != NULL);          bool bHasChannel = (bHasClient && pChannelStrip != NULL);
1961            bool bHasChannels = (bHasClient && m_pWorkspace->windowList().count() > 0);
1962          m_ui.fileNewAction->setEnabled(bHasClient);          m_ui.fileNewAction->setEnabled(bHasClient);
1963          m_ui.fileOpenAction->setEnabled(bHasClient);          m_ui.fileOpenAction->setEnabled(bHasClient);
1964          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);          m_ui.fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0);
# Line 1846  void MainForm::stabilizeForm (void) Line 1974  void MainForm::stabilizeForm (void)
1974          m_ui.editEditChannelAction->setEnabled(false);          m_ui.editEditChannelAction->setEnabled(false);
1975  #endif  #endif
1976          m_ui.editResetChannelAction->setEnabled(bHasChannel);          m_ui.editResetChannelAction->setEnabled(bHasChannel);
1977          m_ui.editResetAllChannelsAction->setEnabled(bHasChannel);          m_ui.editResetAllChannelsAction->setEnabled(bHasChannels);
1978          m_ui.viewMessagesAction->setChecked(m_pMessages && m_pMessages->isVisible());          m_ui.viewMessagesAction->setChecked(m_pMessages && m_pMessages->isVisible());
1979  #ifdef CONFIG_MIDI_INSTRUMENT  #ifdef CONFIG_MIDI_INSTRUMENT
1980          m_ui.viewInstrumentsAction->setChecked(m_pInstrumentListForm          m_ui.viewInstrumentsAction->setChecked(m_pInstrumentListForm
# Line 1858  void MainForm::stabilizeForm (void) Line 1986  void MainForm::stabilizeForm (void)
1986          m_ui.viewDevicesAction->setChecked(m_pDeviceForm          m_ui.viewDevicesAction->setChecked(m_pDeviceForm
1987                  && m_pDeviceForm->isVisible());                  && m_pDeviceForm->isVisible());
1988          m_ui.viewDevicesAction->setEnabled(bHasClient);          m_ui.viewDevicesAction->setEnabled(bHasClient);
1989          m_ui.channelsArrangeAction->setEnabled(bHasChannel);          m_ui.viewMidiDeviceStatusMenu->setEnabled(
1990                    DeviceStatusForm::getInstances().size() > 0);
1991            m_ui.channelsArrangeAction->setEnabled(bHasChannels);
1992    
1993  #ifdef CONFIG_VOLUME  #ifdef CONFIG_VOLUME
1994          // Toolbar widgets are also affected...          // Toolbar widgets are also affected...
# Line 1962  void MainForm::updateSession (void) Line 2092  void MainForm::updateSession (void)
2092          }          }
2093  #endif  #endif
2094    
2095            updateAllChannelStrips(false);
2096    
2097            // Do we auto-arrange?
2098            if (m_pOptions && m_pOptions->bAutoArrange)
2099                    channelsArrange();
2100    
2101            // Remember to refresh devices and instruments...
2102            if (m_pInstrumentListForm)
2103                    m_pInstrumentListForm->refreshInstruments();
2104            if (m_pDeviceForm)
2105                    m_pDeviceForm->refreshDevices();
2106    }
2107    
2108    void MainForm::updateAllChannelStrips(bool bRemoveDeadStrips) {
2109          // Retrieve the current channel list.          // Retrieve the current channel list.
2110          int *piChannelIDs = ::lscp_list_channels(m_pClient);          int *piChannelIDs = ::lscp_list_channels(m_pClient);
2111          if (piChannelIDs == NULL) {          if (piChannelIDs == NULL) {
# Line 1978  void MainForm::updateSession (void) Line 2122  void MainForm::updateSession (void)
2122                          if (!channelStrip(piChannelIDs[iChannel]))                          if (!channelStrip(piChannelIDs[iChannel]))
2123                                  createChannelStrip(new Channel(piChannelIDs[iChannel]));                                  createChannelStrip(new Channel(piChannelIDs[iChannel]));
2124                  }                  }
                 m_pWorkspace->setUpdatesEnabled(true);  
         }  
2125    
2126          // Do we auto-arrange?                  // Do we auto-arrange?
2127          if (m_pOptions && m_pOptions->bAutoArrange)                  if (m_pOptions && m_pOptions->bAutoArrange)
2128                  channelsArrange();                          channelsArrange();
2129    
2130          // Remember to refresh devices and instruments...                  stabilizeForm();
         if (m_pInstrumentListForm)  
                 m_pInstrumentListForm->refreshInstruments();  
         if (m_pDeviceForm)  
                 m_pDeviceForm->refreshDevices();  
 }  
2131    
2132                    // remove dead channel strips
2133                    if (bRemoveDeadStrips) {
2134                            for (int i = 0; channelStripAt(i); ++i) {
2135                                    ChannelStrip* pChannelStrip = channelStripAt(i);
2136                                    bool bExists = false;
2137                                    for (int j = 0; piChannelIDs[j] >= 0; ++j) {
2138                                            if (!pChannelStrip->channel()) break;
2139                                            if (piChannelIDs[j] == pChannelStrip->channel()->channelID()) {
2140                                                    // strip exists, don't touch it
2141                                                    bExists = true;
2142                                                    break;
2143                                            }
2144                                    }
2145                                    if (!bExists) destroyChannelStrip(pChannelStrip);
2146                            }
2147                    }
2148                    m_pWorkspace->setUpdatesEnabled(true);
2149            }
2150    }
2151    
2152  // Update the recent files list and menu.  // Update the recent files list and menu.
2153  void MainForm::updateRecentFiles ( const QString& sFilename )  void MainForm::updateRecentFiles ( const QString& sFilename )
# Line 2165  void MainForm::appendMessagesError( cons Line 2321  void MainForm::appendMessagesError( cons
2321          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);          QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
2322    
2323          QMessageBox::critical(this,          QMessageBox::critical(this,
2324                  QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel"));                  QSAMPLER_TITLE ": " + tr("Error"), s, QMessageBox::Cancel);
2325  }  }
2326    
2327    
# Line 2270  ChannelStrip* MainForm::createChannelStr Line 2426  ChannelStrip* MainForm::createChannelStr
2426          return pChannelStrip;          return pChannelStrip;
2427  }  }
2428    
2429    void MainForm::destroyChannelStrip(ChannelStrip* pChannelStrip) {
2430            // Just delete the channel strip.
2431            delete pChannelStrip;
2432    
2433            // Do we auto-arrange?
2434            if (m_pOptions && m_pOptions->bAutoArrange)
2435                    channelsArrange();
2436    
2437            stabilizeForm();
2438    }
2439    
2440  // Retrieve the active channel strip.  // Retrieve the active channel strip.
2441  ChannelStrip* MainForm::activeChannelStrip (void)  ChannelStrip* MainForm::activeChannelStrip (void)
# Line 2281  ChannelStrip* MainForm::activeChannelStr Line 2447  ChannelStrip* MainForm::activeChannelStr
2447  // Retrieve a channel strip by index.  // Retrieve a channel strip by index.
2448  ChannelStrip* MainForm::channelStripAt ( int iChannel )  ChannelStrip* MainForm::channelStripAt ( int iChannel )
2449  {  {
2450            if (!m_pWorkspace) return NULL;
2451    
2452          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
2453          if (wlist.isEmpty())          if (wlist.isEmpty())
2454                  return NULL;                  return NULL;
2455    
2456          return static_cast<ChannelStrip *> (wlist.at(iChannel));          if (iChannel < 0 || iChannel >= wlist.size())
2457                    return NULL;
2458    
2459            return dynamic_cast<ChannelStrip *> (wlist.at(iChannel));
2460  }  }
2461    
2462    
# Line 2438  void MainForm::startServer (void) Line 2609  void MainForm::startServer (void)
2609    
2610          // Is the server process instance still here?          // Is the server process instance still here?
2611          if (m_pServer) {          if (m_pServer) {
2612                  switch (QMessageBox::warning(this,                  if (QMessageBox::warning(this,
2613                          QSAMPLER_TITLE ": " + tr("Warning"),                          QSAMPLER_TITLE ": " + tr("Warning"),
2614                          tr("Could not start the LinuxSampler server.\n\n"                          tr("Could not start the LinuxSampler server.\n\n"
2615                          "Maybe it is already started."),                          "Maybe it is already started."),
2616                          tr("Stop"), tr("Kill"), tr("Cancel"))) {                          QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
                 case 0:  
2617                          m_pServer->terminate();                          m_pServer->terminate();
                         break;  
                 case 1:  
2618                          m_pServer->kill();                          m_pServer->kill();
                         break;  
2619                  }                  }
2620                  return;                  return;
2621          }          }
# Line 2522  void MainForm::stopServer (bool bInterac Line 2689  void MainForm::stopServer (bool bInterac
2689                          "running in the background. The sampler would continue to work\n"                          "running in the background. The sampler would continue to work\n"
2690                          "according to your current sampler session and you could alter the\n"                          "according to your current sampler session and you could alter the\n"
2691                          "sampler session at any time by relaunching QSampler.\n\n"                          "sampler session at any time by relaunching QSampler.\n\n"
2692                          "Do you want LinuxSampler to stop or to keep running in\n"                          "Do you want LinuxSampler to stop?"),
2693                          "the background?"),                          QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
                         tr("Stop"), tr("Keep Running")) == 1)  
2694                  {                  {
2695                          bForceServerStop = false;                          bForceServerStop = false;
2696                  }                  }
# Line 2610  lscp_status_t qsampler_client_callback ( Line 2776  lscp_status_t qsampler_client_callback (
2776          // as this is run under some other thread context.          // as this is run under some other thread context.
2777          // A custom event must be posted here...          // A custom event must be posted here...
2778          QApplication::postEvent(pMainForm,          QApplication::postEvent(pMainForm,
2779                  new CustomEvent(event, pchData, cchData));                  new LscpEvent(event, pchData, cchData));
2780    
2781          return LSCP_OK;          return LSCP_OK;
2782  }  }
# Line 2655  bool MainForm::startClient (void) Line 2821  bool MainForm::startClient (void)
2821                  .arg(::lscp_client_get_timeout(m_pClient)));                  .arg(::lscp_client_get_timeout(m_pClient)));
2822    
2823          // Subscribe to channel info change notifications...          // Subscribe to channel info change notifications...
2824            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT) != LSCP_OK)
2825                    appendMessagesClient("lscp_client_subscribe(CHANNEL_COUNT)");
2826          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK)
2827                  appendMessagesClient("lscp_client_subscribe(CHANNEL_INFO)");                  appendMessagesClient("lscp_client_subscribe(CHANNEL_INFO)");
2828    
# Line 2664  bool MainForm::startClient (void) Line 2832  bool MainForm::startClient (void)
2832                  appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_COUNT)");                  appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_COUNT)");
2833          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO) != LSCP_OK)          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO) != LSCP_OK)
2834                  appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_INFO)");                  appendMessagesClient("lscp_client_subscribe(MIDI_INPUT_DEVICE_INFO)");
2835            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT) != LSCP_OK)
2836                    appendMessagesClient("lscp_client_subscribe(AUDIO_OUTPUT_DEVICE_COUNT)");
2837            if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO) != LSCP_OK)
2838                    appendMessagesClient("lscp_client_subscribe(AUDIO_OUTPUT_DEVICE_INFO)");
2839    
2840  #if CONFIG_LSCP_CHANNEL_MIDI  #if CONFIG_EVENT_CHANNEL_MIDI
2841          // Subscribe to channel MIDI data notifications...          // Subscribe to channel MIDI data notifications...
2842          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI) != LSCP_OK)          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI) != LSCP_OK)
2843                  appendMessagesClient("lscp_client_subscribe(CHANNEL_MIDI)");                  appendMessagesClient("lscp_client_subscribe(CHANNEL_MIDI)");
2844  #endif  #endif
2845    
2846  #if CONFIG_LSCP_DEVICE_MIDI  #if CONFIG_EVENT_DEVICE_MIDI
2847          // Subscribe to channel MIDI data notifications...          // Subscribe to channel MIDI data notifications...
2848          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI) != LSCP_OK)          if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI) != LSCP_OK)
2849                  appendMessagesClient("lscp_client_subscribe(DEVICE_MIDI)");                  appendMessagesClient("lscp_client_subscribe(DEVICE_MIDI)");
# Line 2702  bool MainForm::startClient (void) Line 2874  bool MainForm::startClient (void)
2874                  }                  }
2875          }          }
2876    
2877            // send the current / loaded fine tuning settings to the sampler
2878            m_pOptions->sendFineTuningSettings();
2879    
2880          // Make a new session          // Make a new session
2881          return newSession();          return newSession();
2882  }  }
# Line 2729  void MainForm::stopClient (void) Line 2904  void MainForm::stopClient (void)
2904          closeSession(false);          closeSession(false);
2905    
2906          // Close us as a client...          // Close us as a client...
2907  #if CONFIG_LSCP_DEVICE_MIDI  #if CONFIG_EVENT_DEVICE_MIDI
2908          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_DEVICE_MIDI);
2909  #endif  #endif
2910  #if CONFIG_LSCP_CHANNEL_MIDI  #if CONFIG_EVENT_CHANNEL_MIDI
2911          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_MIDI);
2912  #endif  #endif
2913            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_INFO);
2914            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_AUDIO_OUTPUT_DEVICE_COUNT);
2915          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_INFO);
2916          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_COUNT);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_MIDI_INPUT_DEVICE_COUNT);
2917          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);          ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO);
2918            ::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_COUNT);
2919          ::lscp_client_destroy(m_pClient);          ::lscp_client_destroy(m_pClient);
2920          m_pClient = NULL;          m_pClient = NULL;
2921    

Legend:
Removed from v.1699  
changed lines
  Added in v.2112

  ViewVC Help
Powered by ViewVC