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

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

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

revision 1474 by schoenebeck, Mon Nov 5 20:47:38 2007 UTC revision 3435 by capela, Mon Dec 3 12:04:14 2018 UTC
# Line 1  Line 1 
1  // qsamplerChannelForm.cpp  // qsamplerChannelForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2018, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, 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
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 28  Line 28 
28  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
29  #include "qsamplerInstrument.h"  #include "qsamplerInstrument.h"
30    
31  #include <qvalidator.h>  #include <QValidator>
32  #include <qmessagebox.h>  #include <QMessageBox>
33  #include <qfiledialog.h>  #include <QFileDialog>
34  #include <qfileinfo.h>  #include <QFileInfo>
35    
36    #include <QHeaderView>
37    
38    
39  namespace QSampler {  namespace QSampler {
40    
41  ChannelForm::ChannelForm(QWidget* parent) : QDialog(parent) {  //-------------------------------------------------------------------------
42      ui.setupUi(this);  // QSampler::Channelform -- Channel form implementation.
43    //
44    
45    ChannelForm::ChannelForm ( QWidget* pParent )
46            : QDialog(pParent)
47    {
48            m_ui.setupUi(this);
49    
50          // Initialize locals.          // Initialize locals.
51          m_pChannel = NULL;          m_pChannel = NULL;
# Line 44  ChannelForm::ChannelForm(QWidget* parent Line 53  ChannelForm::ChannelForm(QWidget* parent
53          m_iDirtySetup = 0;          m_iDirtySetup = 0;
54          m_iDirtyCount = 0;          m_iDirtyCount = 0;
55    
56          m_midiDevices.setAutoDelete(true);  //      m_midiDevices.setAutoDelete(true);
57          m_audioDevices.setAutoDelete(true);  //      m_audioDevices.setAutoDelete(true);
58    
59          m_pDeviceForm = NULL;          m_pDeviceForm = NULL;
60    
61            const int iRowHeight = m_ui.AudioRoutingTable->fontMetrics().height() + 4;
62            m_ui.AudioRoutingTable->verticalHeader()->setDefaultSectionSize(iRowHeight);
63            m_ui.AudioRoutingTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
64    
65            m_ui.AudioRoutingTable->setModel(&m_routingModel);
66            m_ui.AudioRoutingTable->setItemDelegate(&m_routingDelegate);
67    #if QT_VERSION >= 0x050000
68            m_ui.AudioRoutingTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
69    #else
70            m_ui.AudioRoutingTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
71    #endif
72    //      m_ui.AudioRoutingTable->verticalHeader()->hide();
73    
74            // This goes initially hidden, and will be shown
75            // on setup() for currently existing channels...
76            m_ui.AudioRoutingTable->hide();
77    
78          // Try to restore normal window positioning.          // Try to restore normal window positioning.
79          adjustSize();          adjustSize();
80    
81          QObject::connect(ui.EngineNameComboBox,          QObject::connect(m_ui.EngineNameComboBox,
82                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
83                  SLOT(optionsChanged()));                  SLOT(optionsChanged()));
84          QObject::connect(ui.InstrumentFileComboBox,          QObject::connect(m_ui.InstrumentFileComboBox,
85                    SIGNAL(editTextChanged(const QString&)),
86                    SLOT(updateInstrumentName()));
87            QObject::connect(m_ui.InstrumentFileComboBox,
88                  SIGNAL(activated(const QString&)),                  SIGNAL(activated(const QString&)),
89                  SLOT(updateInstrumentName()));                  SLOT(updateInstrumentName()));
90          QObject::connect(ui.InstrumentFileToolButton,          QObject::connect(m_ui.InstrumentFileToolButton,
91                  SIGNAL(clicked()),                  SIGNAL(clicked()),
92                  SLOT(openInstrumentFile()));                  SLOT(openInstrumentFile()));
93          QObject::connect(ui.InstrumentNrComboBox,          QObject::connect(m_ui.InstrumentNrComboBox,
94                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
95                  SLOT(optionsChanged()));                  SLOT(optionsChanged()));
96          QObject::connect(ui.MidiDriverComboBox,          QObject::connect(m_ui.MidiDriverComboBox,
97                  SIGNAL(activated(const QString&)),                  SIGNAL(activated(const QString&)),
98                  SLOT(selectMidiDriver(const QString&)));                  SLOT(selectMidiDriver(const QString&)));
99          QObject::connect(ui.MidiDeviceComboBox,          QObject::connect(m_ui.MidiDeviceComboBox,
100                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
101                  SLOT(selectMidiDevice(int)));                  SLOT(selectMidiDevice(int)));
102          QObject::connect(ui.MidiPortSpinBox,          QObject::connect(m_ui.MidiPortSpinBox,
103                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
104                  SLOT(optionsChanged()));                  SLOT(optionsChanged()));
105          QObject::connect(ui.MidiChannelComboBox,          QObject::connect(m_ui.MidiChannelComboBox,
106                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
107                  SLOT(optionsChanged()));                  SLOT(optionsChanged()));
108          QObject::connect(ui.MidiMapComboBox,          QObject::connect(m_ui.MidiMapComboBox,
109                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
110                  SLOT(optionsChanged()));                  SLOT(optionsChanged()));
111          QObject::connect(ui.AudioDriverComboBox,          QObject::connect(m_ui.AudioDriverComboBox,
112                  SIGNAL(activated(const QString&)),                  SIGNAL(activated(const QString&)),
113                  SLOT(selectAudioDriver(const QString&)));                  SLOT(selectAudioDriver(const QString&)));
114          QObject::connect(ui.AudioDeviceComboBox,          QObject::connect(m_ui.AudioDeviceComboBox,
115                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
116                  SLOT(selectAudioDevice(int)));                  SLOT(selectAudioDevice(int)));
117          QObject::connect(ui.OkPushButton,          QObject::connect(m_ui.DialogButtonBox,
118                  SIGNAL(clicked()),                  SIGNAL(accepted()),
119                  SLOT(accept()));                  SLOT(accept()));
120          QObject::connect(ui.CancelPushButton,          QObject::connect(m_ui.DialogButtonBox,
121                  SIGNAL(clicked()),                  SIGNAL(rejected()),
122                  SLOT(reject()));                  SLOT(reject()));
123          QObject::connect(ui.MidiDeviceToolButton,          QObject::connect(m_ui.MidiDeviceToolButton,
124                  SIGNAL(clicked()),                  SIGNAL(clicked()),
125                  SLOT(setupMidiDevice()));                  SLOT(setupMidiDevice()));
126          QObject::connect(ui.AudioDeviceToolButton,          QObject::connect(m_ui.AudioDeviceToolButton,
127                  SIGNAL(clicked()),                  SIGNAL(clicked()),
128                  SLOT(setupAudioDevice()));                  SLOT(setupAudioDevice()));
129    
130            QObject::connect(&m_routingModel,
131                    SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
132                    SLOT(optionsChanged()));
133            QObject::connect(&m_routingModel,
134                    SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
135                    SLOT(updateTableCellRenderers(const QModelIndex&, const QModelIndex&)));
136            QObject::connect(&m_routingModel,
137                    SIGNAL(modelReset()),
138                    SLOT(updateTableCellRenderers()));
139  }  }
140    
141  ChannelForm::~ChannelForm() {  ChannelForm::~ChannelForm()
142    {
143          if (m_pDeviceForm)          if (m_pDeviceForm)
144                  delete m_pDeviceForm;                  delete m_pDeviceForm;
145          m_pDeviceForm = NULL;          m_pDeviceForm = NULL;
146    
147            qDeleteAll(m_midiDevices);
148            m_midiDevices.clear();
149    
150            qDeleteAll(m_audioDevices);
151            m_audioDevices.clear();
152  }  }
153    
154    
155  // Channel dialog setup formal initializer.  // Channel dialog setup formal initializer.
156  void ChannelForm::setup ( qsamplerChannel *pChannel )  void ChannelForm::setup ( Channel *pChannel )
157  {  {
158          m_pChannel = pChannel;          m_pChannel = pChannel;
159    
# Line 118  void ChannelForm::setup ( qsamplerChanne Line 164  void ChannelForm::setup ( qsamplerChanne
164                  return;                  return;
165    
166          // It can be a brand new channel, remember?          // It can be a brand new channel, remember?
167          bool bNew = (m_pChannel->channelID() < 0);          const bool bNew = (m_pChannel->channelID() < 0);
168          setCaption(QSAMPLER_TITLE ": " + m_pChannel->channelName());          setWindowTitle(QSAMPLER_TITLE ": " + m_pChannel->channelName());
169    
170          // Check if we're up and connected.          // Check if we're up and connected.
171          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
# Line 128  void ChannelForm::setup ( qsamplerChanne Line 174  void ChannelForm::setup ( qsamplerChanne
174          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
175                  return;                  return;
176    
177          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
178          if (pOptions == NULL)          if (pOptions == NULL)
179                  return;                  return;
180    
# Line 136  void ChannelForm::setup ( qsamplerChanne Line 182  void ChannelForm::setup ( qsamplerChanne
182          m_iDirtySetup++;          m_iDirtySetup++;
183    
184          // Load combo box history...          // Load combo box history...
185          pOptions->loadComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->loadComboBoxHistory(m_ui.InstrumentFileComboBox);
186            // Remove non-existant instrument file-paths...
187          // Notify.that we've just changed one audio route.          int i = m_ui.InstrumentFileComboBox->count() - 1;
188          QObject::connect(ui.AudioRoutingTable, SIGNAL(valueChanged(int,int)),          while (i >= 0) {
189                  this, SLOT(changeAudioRouting(int,int)));                  const QString& sInstrumentFile
190                            = m_ui.InstrumentFileComboBox->itemText(i);
191                    if (sInstrumentFile.isEmpty()
192                            || !QFileInfo(sInstrumentFile).exists())
193                            m_ui.InstrumentFileComboBox->removeItem(i);
194                    --i;
195            }
196    
197          // Populate Engines list.          // Populate Engines list.
198          const char **ppszEngines = ::lscp_list_available_engines(pMainForm->client());          const char **ppszEngines = ::lscp_list_available_engines(pMainForm->client());
199          if (ppszEngines) {          if (ppszEngines) {
200                  ui.EngineNameComboBox->clear();                  m_ui.EngineNameComboBox->clear();
201                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
202                          ui.EngineNameComboBox->addItem(QString(ppszEngines[iEngine]));                          m_ui.EngineNameComboBox->addItem(QString(ppszEngines[iEngine]));
203          }          }
204          else m_pChannel->appendMessagesClient("lscp_list_available_engines");          else m_pChannel->appendMessagesClient("lscp_list_available_engines");
205    
206          // Populate Audio output type list.          // Populate Audio output type list.
207          ui.AudioDriverComboBox->clear();          m_ui.AudioDriverComboBox->clear();
208          ui.AudioDriverComboBox->insertStringList(          m_ui.AudioDriverComboBox->insertItems(0,
209                  qsamplerDevice::getDrivers(pMainForm->client(), qsamplerDevice::Audio));                  Device::getDrivers(pMainForm->client(), Device::Audio));
210    
211          // Populate MIDI input type list.          // Populate MIDI input type list.
212          ui.MidiDriverComboBox->clear();          m_ui.MidiDriverComboBox->clear();
213          ui.MidiDriverComboBox->insertStringList(          m_ui.MidiDriverComboBox->insertItems(0,
214                  qsamplerDevice::getDrivers(pMainForm->client(), qsamplerDevice::Midi));                  Device::getDrivers(pMainForm->client(), Device::Midi));
215    
216          // Populate Maps list.          // Populate Maps list.
217          ui.MidiMapComboBox->clear();          m_ui.MidiMapComboBox->clear();
218          ui.MidiMapComboBox->insertStringList(qsamplerInstrument::getMapNames());          m_ui.MidiMapComboBox->insertItems(0,
219                    Instrument::getMapNames());
220    
221          // Read proper channel information,          // Read proper channel information,
222          // and populate the channel form fields.          // and populate the channel form fields.
# Line 173  void ChannelForm::setup ( qsamplerChanne Line 226  void ChannelForm::setup ( qsamplerChanne
226          if (sEngineName.isEmpty() || bNew)          if (sEngineName.isEmpty() || bNew)
227                  sEngineName = pOptions->sEngineName;                  sEngineName = pOptions->sEngineName;
228          if (sEngineName.isEmpty())          if (sEngineName.isEmpty())
229                  sEngineName = qsamplerChannel::noEngineName();                  sEngineName = Channel::noEngineName();
230          if (ui.EngineNameComboBox->findText(sEngineName,          if (m_ui.EngineNameComboBox->findText(sEngineName,
231                          Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {                          Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
232                  ui.EngineNameComboBox->addItem(sEngineName);                  m_ui.EngineNameComboBox->addItem(sEngineName);
233          }          }
234          ui.EngineNameComboBox->setCurrentIndex(          m_ui.EngineNameComboBox->setCurrentIndex(
235                  ui.EngineNameComboBox->findText(sEngineName,                  m_ui.EngineNameComboBox->findText(sEngineName,
236                          Qt::MatchExactly | Qt::MatchCaseSensitive));                          Qt::MatchExactly | Qt::MatchCaseSensitive));
237    
238          // Instrument filename and index...          // Instrument filename and index...
239          QString sInstrumentFile = pChannel->instrumentFile();          QString sInstrumentFile = pChannel->instrumentFile();
240          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
241                  sInstrumentFile = qsamplerChannel::noInstrumentName();                  sInstrumentFile = Channel::noInstrumentName();
242          ui.InstrumentFileComboBox->setCurrentText(sInstrumentFile);          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
243          ui.InstrumentNrComboBox->clear();          m_ui.InstrumentNrComboBox->clear();
244          ui.InstrumentNrComboBox->insertStringList(          m_ui.InstrumentNrComboBox->insertItems(0,
245                  qsamplerChannel::getInstrumentList(sInstrumentFile,                  Channel::getInstrumentList(sInstrumentFile,
246                  pOptions->bInstrumentNames));                  pOptions->bInstrumentNames));
247          ui.InstrumentNrComboBox->setCurrentItem(pChannel->instrumentNr());          int iInstrumentNr = pChannel->instrumentNr();
248            if (iInstrumentNr < 0)
249                    iInstrumentNr = 0;
250            m_ui.InstrumentNrComboBox->setCurrentIndex(iInstrumentNr);
251    
252          // MIDI input device...          // MIDI input device...
253          qsamplerDevice midiDevice(qsamplerDevice::Midi, m_pChannel->midiDevice());          const Device midiDevice(Device::Midi, m_pChannel->midiDevice());
254          // MIDI input driver...          // MIDI input driver...
255          QString sMidiDriver = midiDevice.driverName();          QString sMidiDriver = midiDevice.driverName();
256          if (sMidiDriver.isEmpty() || bNew)          if (sMidiDriver.isEmpty() || bNew)
257                  sMidiDriver = pOptions->sMidiDriver.upper();                  sMidiDriver = pOptions->sMidiDriver.toUpper();
258          if (!sMidiDriver.isEmpty()) {          if (!sMidiDriver.isEmpty()) {
259                  if (ui.MidiDriverComboBox->findText(sMidiDriver,                  if (m_ui.MidiDriverComboBox->findText(sMidiDriver,
260                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
261                          ui.MidiDriverComboBox->insertItem(sMidiDriver);                          m_ui.MidiDriverComboBox->insertItem(0, sMidiDriver);
262                  }                  }
263                  ui.MidiDriverComboBox->setCurrentText(sMidiDriver);                  m_ui.MidiDriverComboBox->setCurrentIndex(
264                            m_ui.MidiDriverComboBox->findText(sMidiDriver,
265                                    Qt::MatchExactly | Qt::MatchCaseSensitive)
266                    );
267          }          }
268          selectMidiDriverItem(sMidiDriver);          selectMidiDriverItem(sMidiDriver);
269          if (!bNew)          if (!bNew) {
270                  ui.MidiDeviceComboBox->setCurrentText(midiDevice.deviceName());                  m_ui.MidiDeviceComboBox->setCurrentIndex(
271          selectMidiDeviceItem(ui.MidiDeviceComboBox->currentItem());                          m_ui.MidiDeviceComboBox->findData(midiDevice.deviceID()));
272            }
273            selectMidiDeviceItem(m_ui.MidiDeviceComboBox->currentIndex());
274          // MIDI input port...          // MIDI input port...
275          ui.MidiPortSpinBox->setValue(pChannel->midiPort());          m_ui.MidiPortSpinBox->setValue(pChannel->midiPort());
276          // MIDI input channel...          // MIDI input channel...
277          int iMidiChannel = pChannel->midiChannel();          int iMidiChannel = pChannel->midiChannel();
278          // When new, try to suggest a sensible MIDI channel...          // When new, try to suggest a sensible MIDI channel...
279          if (iMidiChannel < 0)          if (iMidiChannel < 0)
280                  iMidiChannel = (::lscp_get_channels(pMainForm->client()) % 16);                  iMidiChannel = (::lscp_get_channels(pMainForm->client()) % 16);
281          ui.MidiChannelComboBox->setCurrentItem(iMidiChannel);          m_ui.MidiChannelComboBox->setCurrentIndex(iMidiChannel);
282          // MIDI instrument map...          // MIDI instrument map...
283          int iMidiMap = (bNew ? pOptions->iMidiMap : pChannel->midiMap());          int iMidiMap = (bNew ? pOptions->iMidiMap : pChannel->midiMap());
284          // When new, try to suggest a sensible MIDI map...          // When new, try to suggest a sensible MIDI map...
285          if (iMidiMap < 0)          if (iMidiMap < 0)
286                  iMidiMap = 0;                  iMidiMap = 0;
287          const QString& sMapName = qsamplerInstrument::getMapName(iMidiMap);          const QString& sMapName = Instrument::getMapName(iMidiMap);
288          if (!sMapName.isEmpty())          if (!sMapName.isEmpty()) {
289                  ui.MidiMapComboBox->setCurrentText(sMapName);                  m_ui.MidiMapComboBox->setItemText(
290                            m_ui.MidiMapComboBox->currentIndex(),
291                            sMapName);
292            }
293          // It might be no maps around...          // It might be no maps around...
294          bool bMidiMapEnabled = (ui.MidiMapComboBox->count() > 0);          const bool bMidiMapEnabled = (m_ui.MidiMapComboBox->count() > 0);
295          ui.MidiMapTextLabel->setEnabled(bMidiMapEnabled);          m_ui.MidiMapTextLabel->setEnabled(bMidiMapEnabled);
296          ui.MidiMapComboBox->setEnabled(bMidiMapEnabled);          m_ui.MidiMapComboBox->setEnabled(bMidiMapEnabled);
297    
298          // Audio output device...          // Audio output device...
299          qsamplerDevice audioDevice(qsamplerDevice::Audio, m_pChannel->audioDevice());          const Device audioDevice(Device::Audio, m_pChannel->audioDevice());
300          // Audio output driver...          // Audio output driver...
301          QString sAudioDriver = audioDevice.driverName();          QString sAudioDriver = audioDevice.driverName();
302          if (sAudioDriver.isEmpty() || bNew)          if (sAudioDriver.isEmpty() || bNew)
303                  sAudioDriver = pOptions->sAudioDriver.upper();                  sAudioDriver = pOptions->sAudioDriver.toUpper();
304          if (!sAudioDriver.isEmpty()) {          if (!sAudioDriver.isEmpty()) {
305                  if (ui.AudioDriverComboBox->findText(sAudioDriver,                  if (m_ui.AudioDriverComboBox->findText(sAudioDriver,
306                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
307                          ui.AudioDriverComboBox->insertItem(sAudioDriver);                          m_ui.AudioDriverComboBox->insertItem(0, sAudioDriver);
308                  }                  }
309                  ui.AudioDriverComboBox->setCurrentText(sAudioDriver);                  m_ui.AudioDriverComboBox->setCurrentIndex(
310                            m_ui.AudioDriverComboBox->findText(sAudioDriver,
311                                    Qt::MatchExactly | Qt::MatchCaseSensitive)
312                    );
313          }          }
314          selectAudioDriverItem(sAudioDriver);          selectAudioDriverItem(sAudioDriver);
315          if (!bNew)          if (!bNew) {
316                  ui.AudioDeviceComboBox->setCurrentText(audioDevice.deviceName());                  m_ui.AudioDeviceComboBox->setCurrentIndex(
317          selectAudioDeviceItem(ui.AudioDeviceComboBox->currentItem());                          m_ui.AudioDeviceComboBox->findData(audioDevice.deviceID()));
318            }
319            selectAudioDeviceItem(m_ui.AudioDeviceComboBox->currentIndex());
320    
321            // Let the audio routing table see the light,
322            // if we're editing an existing sampler channel...
323            m_ui.AudioRoutingTable->setVisible(!bNew);
324    
325            const QString sInstrumentNrToolTip =
326                    (pOptions->bInstrumentNames) ?
327                            tr("Select an instrument of the file") :
328                            tr("You might want to enable instrument name retrieval in the "
329                            "settings dialog");
330            m_ui.InstrumentNrComboBox->setToolTip(
331                    QObject::tr(sInstrumentNrToolTip.toUtf8().data())
332            );
333    
334    #if 0
335          // As convenient, make it ready on stabilizeForm() for          // As convenient, make it ready on stabilizeForm() for
336          // prompt acceptance, if we got the minimum required...          // prompt acceptance, if we got the minimum required...
337  /*      if (sEngineName != qsamplerChannel::noEngineName() &&          if (sEngineName != Channel::noEngineName() &&
338                  sInstrumentFile != qsamplerChannel::noInstrumentName())                  sInstrumentFile != Channel::noInstrumentName())
339                  m_iDirtyCount++; */                  m_iDirtyCount++;
340    #endif
341    
342          // Done.          // Done.
343          m_iDirtySetup--;          m_iDirtySetup--;
344          stabilizeForm();          stabilizeForm();
# Line 271  void ChannelForm::accept (void) Line 357  void ChannelForm::accept (void)
357          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
358                  return;                  return;
359    
360          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
361          if (pOptions == NULL)          if (pOptions == NULL)
362                  return;                  return;
363    
364          // Flush any pending editing...          // Flush any pending editing...
365          //ui.AudioRoutingTable->flush();          //m_ui.AudioRoutingTable->flush();
366    
367          // We'll go for it!          // We'll go for it!
368          if (m_iDirtyCount > 0) {          if (m_iDirtyCount > 0) {
# Line 286  void ChannelForm::accept (void) Line 372  void ChannelForm::accept (void)
372                          iErrors++;                          iErrors++;
373                  // Accept Audio driver or device selection...                  // Accept Audio driver or device selection...
374                  if (m_audioDevices.isEmpty()) {                  if (m_audioDevices.isEmpty()) {
375                          if (!m_pChannel->setAudioDriver(ui.AudioDriverComboBox->currentText()))                          if (!m_pChannel->setAudioDriver(m_ui.AudioDriverComboBox->currentText()))
376                                  iErrors++;                                  iErrors++;
377                  } else {                  } else {
378                          qsamplerDevice *pDevice = m_audioDevices.at(ui.AudioDeviceComboBox->currentItem());                          Device *pDevice = NULL;
379                            const int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
380                            if (iAudioItem >= 0) {
381                                    const int iAudioDevice
382                                            = m_ui.AudioDeviceComboBox->itemData(iAudioItem).toInt();
383                                    pDevice = m_audioDevices.value(iAudioDevice, NULL);
384                            }
385                            ChannelRoutingMap routingMap = m_routingModel.routingMap();
386                          if (pDevice == NULL)                          if (pDevice == NULL)
387                                  iErrors++;                                  iErrors++;
388                          else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))                          else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))
389                                  iErrors++;                                  iErrors++;
390                          else if (!m_audioRouting.isEmpty()) {                          else if (!routingMap.isEmpty()) {
391                                  // Set the audio route changes...                                  // Set the audio route changes...
392                                  qsamplerChannelRoutingMap::ConstIterator iter;                                  ChannelRoutingMap::ConstIterator iter;
393                                  for (iter = m_audioRouting.begin();                                  for (iter = routingMap.begin();
394                                                  iter != m_audioRouting.end(); ++iter) {                                                  iter != routingMap.end(); ++iter) {
395                                          if (!m_pChannel->setAudioChannel(iter.key(), iter.data()))                                          if (!m_pChannel->setAudioChannel(iter.key(), iter.value()))
396                                                  iErrors++;                                                  iErrors++;
397                                  }                                  }
398                          }                          }
399                  }                  }
400                  // Accept MIDI driver or device selection...                  // Accept MIDI driver or device selection...
401                  if (m_midiDevices.isEmpty()) {                  if (m_midiDevices.isEmpty()) {
402                          if (!m_pChannel->setMidiDriver(ui.MidiDriverComboBox->currentText()))                          if (!m_pChannel->setMidiDriver(m_ui.MidiDriverComboBox->currentText()))
403                                  iErrors++;                                  iErrors++;
404                  } else {                  } else {
405                          qsamplerDevice *pDevice = m_midiDevices.at(ui.MidiDeviceComboBox->currentItem());                          Device *pDevice = NULL;
406                            const int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
407                            if (iMidiItem >= 0) {
408                                    const int iMidiDevice
409                                            = m_ui.MidiDeviceComboBox->itemData(iMidiItem).toInt();
410                                    pDevice = m_midiDevices.value(iMidiDevice, NULL);
411                            }
412                          if (pDevice == NULL)                          if (pDevice == NULL)
413                                  iErrors++;                                  iErrors++;
414                          else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))                          else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))
415                                  iErrors++;                                  iErrors++;
416                  }                  }
417                  // MIDI input port number...                  // MIDI input port number...
418                  if (!m_pChannel->setMidiPort(ui.MidiPortSpinBox->value()))                  if (!m_pChannel->setMidiPort(m_ui.MidiPortSpinBox->value()))
419                          iErrors++;                          iErrors++;
420                  // MIDI input channel...                  // MIDI input channel...
421                  if (!m_pChannel->setMidiChannel(ui.MidiChannelComboBox->currentItem()))                  if (!m_pChannel->setMidiChannel(m_ui.MidiChannelComboBox->currentIndex()))
422                          iErrors++;                          iErrors++;
423                  // Engine name...                  // Engine name...
424                  if (!m_pChannel->loadEngine(ui.EngineNameComboBox->currentText()))                  if (!m_pChannel->loadEngine(m_ui.EngineNameComboBox->currentText()))
425                          iErrors++;                          iErrors++;
426                  // Instrument file and index...                  // Instrument file and index...
427                  const QString& sPath = ui.InstrumentFileComboBox->currentText();                  const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
428                  if (!sPath.isEmpty() && QFileInfo(sPath).exists()) {                  if (!sPath.isEmpty() && QFileInfo(sPath).exists()) {
429                          if (!m_pChannel->loadInstrument(sPath, ui.InstrumentNrComboBox->currentItem()))                          if (!m_pChannel->loadInstrument(sPath, m_ui.InstrumentNrComboBox->currentIndex()))
430                                  iErrors++;                                  iErrors++;
431                  }                  }
432                  // MIDI intrument map...                  // MIDI intrument map...
433                  if (!m_pChannel->setMidiMap(ui.MidiMapComboBox->currentItem()))                  if (!m_pChannel->setMidiMap(m_ui.MidiMapComboBox->currentIndex()))
434                          iErrors++;                          iErrors++;
435                  // Show error messages?                  // Show error messages?
436                  if (iErrors > 0)                  if (iErrors > 0) {
437                          m_pChannel->appendMessagesError(tr("Some channel settings could not be set.\n\nSorry."));                          m_pChannel->appendMessagesError(
438                                    tr("Some channel settings could not be set.\n\nSorry."));
439                    }
440          }          }
441    
442          // Save default engine name, instrument directory and history...          // Save default engine name, instrument directory and history...
443          pOptions->sInstrumentDir = QFileInfo(ui.InstrumentFileComboBox->currentText()).dirPath(true);          pOptions->sInstrumentDir = QFileInfo(
444          pOptions->sEngineName  = ui.EngineNameComboBox->currentText();                  m_ui.InstrumentFileComboBox->currentText()).dir().absolutePath();
445          pOptions->sAudioDriver = ui.AudioDriverComboBox->currentText();          pOptions->sEngineName  = m_ui.EngineNameComboBox->currentText();
446          pOptions->sMidiDriver  = ui.MidiDriverComboBox->currentText();          pOptions->sAudioDriver = m_ui.AudioDriverComboBox->currentText();
447          pOptions->iMidiMap     = ui.MidiMapComboBox->currentItem();          pOptions->sMidiDriver  = m_ui.MidiDriverComboBox->currentText();
448          pOptions->saveComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->iMidiMap     = m_ui.MidiMapComboBox->currentIndex();
449            pOptions->saveComboBoxHistory(m_ui.InstrumentFileComboBox);
450    
451          // Just go with dialog acceptance.          // Just go with dialog acceptance.
452          QDialog::accept();          QDialog::accept();
# Line 357  void ChannelForm::reject (void) Line 459  void ChannelForm::reject (void)
459          bool bReject = true;          bool bReject = true;
460    
461          // Check if there's any pending changes...          // Check if there's any pending changes...
462          if (m_iDirtyCount > 0 && ui.OkPushButton->isEnabled()) {          if (m_iDirtyCount > 0) {
463                  switch (QMessageBox::warning(this,                  switch (QMessageBox::warning(this,
464                          QSAMPLER_TITLE ": " + tr("Warning"),                          QSAMPLER_TITLE ": " + tr("Warning"),
465                          tr("Some channel settings have been changed.\n\n"                          tr("Some channel settings have been changed.\n\n"
466                          "Do you want to apply the changes?"),                          "Do you want to apply the changes?"),
467                          tr("Apply"), tr("Discard"), tr("Cancel"))) {                          QMessageBox::Apply |
468                  case 0:     // Apply...                          QMessageBox::Discard |
469                            QMessageBox::Cancel)) {
470                    case QMessageBox::Apply:
471                          accept();                          accept();
472                          return;                          return;
473                  case 1:     // Discard                  case QMessageBox::Discard:
474                          break;                          break;
475                  default:    // Cancel.                  default:    // Cancel.
476                          bReject = false;                          bReject = false;
# Line 388  void ChannelForm::openInstrumentFile (vo Line 492  void ChannelForm::openInstrumentFile (vo
492          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
493                  return;                  return;
494    
495          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
496          if (pOptions == NULL)          if (pOptions == NULL)
497                  return;                  return;
498    
499          // FIXME: the instrument file filters should be restricted,          // FIXME: the instrument file filters should be restricted,
500          // depending on the current engine.          // depending on the current engine.
501          QString sInstrumentFile = QFileDialog::getOpenFileName(          QStringList filters;
502                  pOptions->sInstrumentDir,                   // Start here.          const QString& sEngineName = m_ui.EngineNameComboBox->currentText().toUpper();
503                  tr("Instrument files") + " (*.gig *.dls)",  // Filter (GIG and DLS files)          if (sEngineName.contains("GIG"))
504                  this, 0,                                    // Parent and name (none)                  filters << tr("GIG Instrument files") + " (*.gig *.dls)";
505                  QSAMPLER_TITLE ": " + tr("Instrument files")    // Caption.          if (sEngineName.contains("SFZ"))
506                    filters << tr("SFZ Instrument files") + " (*.sfz)";
507            if (sEngineName.contains("SF2"))
508                    filters << tr("SF2 Instrument files") + " (*.sf2)";
509            filters << tr("All files") + " (*.*)";
510            const QString& filter = filters.join(";;");
511    
512            QString sInstrumentFile = QFileDialog::getOpenFileName(this,
513                    QSAMPLER_TITLE ": " + tr("Instrument files"), // Caption.
514                    pOptions->sInstrumentDir, // Start here.
515                    filter                    // File filter.
516          );          );
517    
518          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
519                  return;                  return;
520    
521          ui.InstrumentFileComboBox->setCurrentText(sInstrumentFile);          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
522          updateInstrumentName();          updateInstrumentName();
523  }  }
524    
# Line 418  void ChannelForm::updateInstrumentName ( Line 532  void ChannelForm::updateInstrumentName (
532          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
533                  return;                  return;
534    
535          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
536          if (pOptions == NULL)          if (pOptions == NULL)
537                  return;                  return;
538    
539          // Finally this better idea would be to use libgig          // Finally this better idea would be to use libgig
540          // to retrieve the REAL instrument names.          // to retrieve the REAL instrument names.
541          ui.InstrumentNrComboBox->clear();          m_ui.InstrumentNrComboBox->clear();
542          ui.InstrumentNrComboBox->insertStringList(          m_ui.InstrumentNrComboBox->insertItems(0,
543                  qsamplerChannel::getInstrumentList(                  Channel::getInstrumentList(
544                          ui.InstrumentFileComboBox->currentText(),                          m_ui.InstrumentFileComboBox->currentText(),
545                          pOptions->bInstrumentNames)                          pOptions->bInstrumentNames)
546          );          );
547    
# Line 436  void ChannelForm::updateInstrumentName ( Line 550  void ChannelForm::updateInstrumentName (
550    
551    
552  // Show device options dialog.  // Show device options dialog.
553  void ChannelForm::setupDevice ( qsamplerDevice *pDevice,  void ChannelForm::setupDevice ( Device *pDevice,
554          qsamplerDevice::qsamplerDeviceType deviceTypeMode,          Device::DeviceType deviceTypeMode,
555          const QString& sDriverName )          const QString& sDriverName )
556  {  {
557          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
# Line 449  void ChannelForm::setupDevice ( qsampler Line 563  void ChannelForm::setupDevice ( qsampler
563          // Create the device form if not already...          // Create the device form if not already...
564          if (m_pDeviceForm == NULL) {          if (m_pDeviceForm == NULL) {
565                  m_pDeviceForm = new DeviceForm(this, Qt::Dialog);                  m_pDeviceForm = new DeviceForm(this, Qt::Dialog);
566          m_pDeviceForm->setAttribute(Qt::WA_ShowModal);                  m_pDeviceForm->setAttribute(Qt::WA_ShowModal);
567                  QObject::connect(m_pDeviceForm, SIGNAL(devicesChanged()),                  QObject::connect(m_pDeviceForm, SIGNAL(devicesChanged()),
568                          this, SLOT(updateDevices()));                          this, SLOT(updateDevices()));
569          }          }
# Line 474  void ChannelForm::selectMidiDriverItem ( Line 588  void ChannelForm::selectMidiDriverItem (
588          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
589                  return;                  return;
590    
591          const QString sDriverName = sMidiDriver.upper();          const QString sDriverName = sMidiDriver.toUpper();
592    
593          // Save current device id.          // Save current device id.
594          int iDeviceID = 0;          int iDeviceID = 0;
595          qsamplerDevice *pDevice = m_midiDevices.at(ui.MidiDeviceComboBox->currentItem());          int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
596          if (pDevice)          if (iMidiItem >= 0)
597                  iDeviceID = pDevice->deviceID();                  iDeviceID = m_ui.MidiDeviceComboBox->itemData(iMidiItem).toInt();
598    
599          // Clean maplist.          // Clean maplist.
600          ui.MidiDeviceComboBox->clear();          m_ui.MidiDeviceComboBox->clear();
601            qDeleteAll(m_midiDevices);
602          m_midiDevices.clear();          m_midiDevices.clear();
603    
604          // Populate with the current ones...          // Populate with the current ones...
605          const QPixmap midiPixmap(":/qsampler/pixmaps/midi2.png");          Device *pDevice = NULL;
606          int *piDeviceIDs = qsamplerDevice::getDevices(pMainForm->client(),          const QPixmap midiPixmap(":/images/midi2.png");
607                  qsamplerDevice::Midi);          int *piDeviceIDs = Device::getDevices(pMainForm->client(), Device::Midi);
608          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
609                  pDevice = new qsamplerDevice(qsamplerDevice::Midi, piDeviceIDs[i]);                  pDevice = new Device(Device::Midi, piDeviceIDs[i]);
610                  if (pDevice->driverName().upper() == sDriverName) {                  if (pDevice->driverName().toUpper() == sDriverName) {
611                          ui.MidiDeviceComboBox->insertItem(midiPixmap, pDevice->deviceName());                          const int iMidiDevice = pDevice->deviceID();
612                          m_midiDevices.append(pDevice);                          m_ui.MidiDeviceComboBox->addItem(
613                                    midiPixmap, pDevice->deviceName());
614                            m_ui.MidiDeviceComboBox->setItemData(i, iMidiDevice);
615                            m_midiDevices.insert(iMidiDevice, pDevice);
616                            if (iMidiDevice == iDeviceID)
617                                    iMidiItem = i;
618                  } else {                  } else {
619                          delete pDevice;                          delete pDevice;
620                  }                  }
621          }          }
622    
623          // Do proper enabling...          // Do proper enabling...
624          bool bEnabled = !m_midiDevices.isEmpty();          const bool bEnabled = !m_midiDevices.isEmpty();
625          if (bEnabled) {          if (bEnabled) {
626                  // Select the previous current device...                  // Select the previous current device...
627                  int iMidiItem = 0;                  m_ui.MidiDeviceComboBox->setCurrentIndex(iMidiItem);
628                  for (pDevice = m_midiDevices.first();                  selectMidiDeviceItem(iMidiItem);
                                 pDevice;  
                                         pDevice = m_midiDevices.next()) {  
                         if (pDevice->deviceID() == iDeviceID) {  
                                 ui.MidiDeviceComboBox->setCurrentItem(iMidiItem);  
                                 selectMidiDeviceItem(iMidiItem);  
                                 break;  
                         }  
                         iMidiItem++;  
                 }  
629          } else {          } else {
630                  ui.MidiDeviceComboBox->insertItem(                  m_ui.MidiDeviceComboBox->insertItem(0,
631                          tr("(New MIDI %1 device)").arg(sMidiDriver));                          tr("(New MIDI %1 device)").arg(sMidiDriver));
632          }          }
633          ui.MidiDeviceTextLabel->setEnabled(bEnabled);  //      m_ui.MidiDeviceTextLabel->setEnabled(bEnabled);
634          ui.MidiDeviceComboBox->setEnabled(bEnabled);  //      m_ui.MidiDeviceComboBox->setEnabled(bEnabled);
635  }  }
636    
637    
# Line 538  void ChannelForm::selectMidiDriver ( con Line 649  void ChannelForm::selectMidiDriver ( con
649  // Select MIDI device item.  // Select MIDI device item.
650  void ChannelForm::selectMidiDeviceItem ( int iMidiItem )  void ChannelForm::selectMidiDeviceItem ( int iMidiItem )
651  {  {
652          qsamplerDevice *pDevice = m_midiDevices.at(iMidiItem);          Device *pDevice = NULL;
653            if (iMidiItem >= 0) {
654                    const int iMidiDevice
655                            = m_ui.MidiDeviceComboBox->itemData(iMidiItem).toInt();
656                    pDevice = m_midiDevices.value(iMidiDevice, NULL);
657            }
658          if (pDevice) {          if (pDevice) {
659                  const qsamplerDeviceParamMap& params = pDevice->params();                  const DeviceParamMap& params = pDevice->params();
660                  int iPorts = params["PORTS"].value.toInt();                  const int iPorts = params["PORTS"].value.toInt();
661                  ui.MidiPortTextLabel->setEnabled(iPorts > 0);                  m_ui.MidiPortTextLabel->setEnabled(iPorts > 0);
662                  ui.MidiPortSpinBox->setEnabled(iPorts > 0);                  m_ui.MidiPortSpinBox->setEnabled(iPorts > 0);
663                  if (iPorts > 0)                  if (iPorts > 0)
664                          ui.MidiPortSpinBox->setMaxValue(iPorts - 1);                          m_ui.MidiPortSpinBox->setMaximum(iPorts - 1);
665          }          }
666  }  }
667    
# Line 564  void ChannelForm::selectMidiDevice ( int Line 680  void ChannelForm::selectMidiDevice ( int
680  // MIDI device options.  // MIDI device options.
681  void ChannelForm::setupMidiDevice (void)  void ChannelForm::setupMidiDevice (void)
682  {  {
683          setupDevice(m_midiDevices.at(ui.MidiDeviceComboBox->currentItem()),          Device *pDevice = NULL;
684                  qsamplerDevice::Midi, ui.MidiDriverComboBox->currentText());          const int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
685            if (iMidiItem >= 0) {
686                    const int iMidiDevice
687                            = m_ui.MidiDeviceComboBox->itemData(iMidiItem).toInt();
688                    pDevice = m_midiDevices.value(iMidiDevice, NULL);
689            }
690            setupDevice(pDevice,
691                    Device::Midi, m_ui.MidiDriverComboBox->currentText());
692  }  }
693    
694    
# Line 578  void ChannelForm::selectAudioDriverItem Line 701  void ChannelForm::selectAudioDriverItem
701          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
702                  return;                  return;
703    
704          const QString sDriverName = sAudioDriver.upper();          const QString sDriverName = sAudioDriver.toUpper();
705    
706          // Save current device id.          // Save current device id.
707          int iDeviceID = 0;          int iDeviceID = 0;
708          qsamplerDevice *pDevice = m_audioDevices.at(ui.AudioDeviceComboBox->currentItem());          int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
709          if (pDevice)          if (iAudioItem >= 0)
710                  iDeviceID = pDevice->deviceID();                  iDeviceID = m_ui.AudioDeviceComboBox->itemData(iAudioItem).toInt();
711    
712          // Clean maplist.          // Clean maplist.
713          ui.AudioDeviceComboBox->clear();          m_ui.AudioDeviceComboBox->clear();
714            qDeleteAll(m_audioDevices);
715          m_audioDevices.clear();          m_audioDevices.clear();
716    
717          // Populate with the current ones...          // Populate with the current ones...
718          const QPixmap audioPixmap(":/qsampler/pixmaps/audio2.png");          Device *pDevice = NULL;
719          int *piDeviceIDs = qsamplerDevice::getDevices(pMainForm->client(),          const QPixmap audioPixmap(":/images/audio2.png");
720                  qsamplerDevice::Audio);          int *piDeviceIDs = Device::getDevices(pMainForm->client(), Device::Audio);
721          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) {
722                  pDevice = new qsamplerDevice(qsamplerDevice::Audio, piDeviceIDs[i]);                  pDevice = new Device(Device::Audio, piDeviceIDs[i]);
723                  if (pDevice->driverName().upper() == sDriverName) {                  if (pDevice->driverName().toUpper() == sDriverName) {
724                          ui.AudioDeviceComboBox->insertItem(audioPixmap, pDevice->deviceName());                          const int iAudioDevice = pDevice->deviceID();
725                          m_audioDevices.append(pDevice);                          m_ui.AudioDeviceComboBox->addItem(
726                                    audioPixmap, pDevice->deviceName());
727                            m_ui.AudioDeviceComboBox->setItemData(i, iAudioDevice);
728                            m_audioDevices.insert(iAudioDevice, pDevice);
729                            if (iAudioDevice == iDeviceID)
730                                    iAudioItem = i;
731                  } else {                  } else {
732                          delete pDevice;                          delete pDevice;
733                  }                  }
734          }          }
735    
736          // Do proper enabling...          // Do proper enabling...
737          bool bEnabled = !m_audioDevices.isEmpty();          const bool bEnabled = !m_audioDevices.isEmpty();
738          if (bEnabled) {          if (bEnabled) {
739                  // Select the previous current device...                  // Select the previous current device...
740                  int iAudioItem = 0;                  m_ui.AudioDeviceComboBox->setCurrentIndex(iAudioItem);
741                  for (pDevice = m_audioDevices.first();                  selectAudioDeviceItem(iAudioItem);
                                 pDevice;  
                                         pDevice = m_audioDevices.next()) {  
                         if (pDevice->deviceID() == iDeviceID) {  
                                 ui.AudioDeviceComboBox->setCurrentItem(iAudioItem);  
                                 selectAudioDeviceItem(iAudioItem);  
                                 break;  
                         }  
                         iAudioItem++;  
                 }  
742          } else {          } else {
743                  ui.AudioDeviceComboBox->insertItem(                  m_ui.AudioDeviceComboBox->insertItem(0,
744                          tr("(New Audio %1 device)").arg(sAudioDriver));                          tr("(New Audio %1 device)").arg(sAudioDriver));
                 //ui.AudioRoutingTable->setNumRows(0);  
745          }          }
746          ui.AudioDeviceTextLabel->setEnabled(bEnabled);  //      m_ui.AudioDeviceTextLabel->setEnabled(bEnabled);
747          ui.AudioDeviceComboBox->setEnabled(bEnabled);  //      m_ui.AudioDeviceComboBox->setEnabled(bEnabled);
748          ui.AudioRoutingTable->setEnabled(bEnabled);          m_ui.AudioRoutingTable->setEnabled(bEnabled);
749  }  }
750    
751    
# Line 644  void ChannelForm::selectAudioDriver ( co Line 763  void ChannelForm::selectAudioDriver ( co
763  // Select Audio device item.  // Select Audio device item.
764  void ChannelForm::selectAudioDeviceItem ( int iAudioItem )  void ChannelForm::selectAudioDeviceItem ( int iAudioItem )
765  {  {
766          qsamplerDevice *pDevice = m_audioDevices.at(iAudioItem);          Device *pDevice = NULL;
767            if (iAudioItem >= 0) {
768                    const int iAudioDevice
769                            = m_ui.AudioDeviceComboBox->itemData(iAudioItem).toInt();
770                    pDevice = m_audioDevices.value(iAudioDevice, NULL);
771            }
772          if (pDevice) {          if (pDevice) {
773                  // Refresh the audio routing table.                  // Refresh the audio routing table.
774                  routingModel.refresh(pDevice, m_pChannel->audioRouting());                  m_routingModel.refresh(pDevice, m_pChannel->audioRouting());
775                  // Reset routing change map.                  // Reset routing change map.
776                  m_audioRouting.clear();                  m_routingModel.clear();
777          }          }
778  }  }
779    
# Line 668  void ChannelForm::selectAudioDevice ( in Line 792  void ChannelForm::selectAudioDevice ( in
792  // Audio device options.  // Audio device options.
793  void ChannelForm::setupAudioDevice (void)  void ChannelForm::setupAudioDevice (void)
794  {  {
795          setupDevice(m_audioDevices.at(ui.AudioDeviceComboBox->currentItem()),          Device *pDevice = NULL;
796                  qsamplerDevice::Audio, ui.AudioDriverComboBox->currentText());          const int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
797  }          if (iAudioItem >= 0) {
798                    const int iAudioDevice
799                            = m_ui.AudioDeviceComboBox->itemData(iAudioItem).toInt();
800  // Audio routing change slot.                  pDevice = m_audioDevices.value(iAudioDevice, NULL);
801  void ChannelForm::changeAudioRouting ( int iRow, int iCol )          }
802  {          setupDevice(pDevice,
803  #if 0                  Device::Audio, m_ui.AudioDriverComboBox->currentText());
         if (m_iDirtySetup > 0)  
                 return;  
         if (iRow < 0 || iCol < 0)  
                 return;  
   
         // Verify that this is a QComboTableItem (magic rtti == 1)  
         QTableItem *pItem = ui.AudioRoutingTable->item(iRow, iCol);  
         if (pItem == NULL)  
                 return;  
         qsamplerChannelRoutingComboBox *pComboItem =  
                 static_cast<qsamplerChannelRoutingComboBox*> (pItem);  
         // FIXME: Its not garanteed that we must have  
         // iAudioOut == iRow on all times forth!  
         m_audioRouting[iRow] = pComboItem->currentItem();  
   
         // And let's get dirty...  
         optionsChanged();  
 #endif  
804  }  }
805    
   
806  // UPdate all device lists slot.  // UPdate all device lists slot.
807  void ChannelForm::updateDevices (void)  void ChannelForm::updateDevices (void)
808  {  {
809          if (m_iDirtySetup > 0)          if (m_iDirtySetup > 0)
810                  return;                  return;
811    
812          selectMidiDriverItem(ui.MidiDriverComboBox->currentText());          selectMidiDriverItem(m_ui.MidiDriverComboBox->currentText());
813          selectAudioDriverItem(ui.AudioDriverComboBox->currentText());          selectAudioDriverItem(m_ui.AudioDriverComboBox->currentText());
814          optionsChanged();          optionsChanged();
815  }  }
816    
# Line 724  void ChannelForm::optionsChanged (void) Line 829  void ChannelForm::optionsChanged (void)
829  // Stabilize current form state.  // Stabilize current form state.
830  void ChannelForm::stabilizeForm (void)  void ChannelForm::stabilizeForm (void)
831  {  {
832          bool bValid = true;          bool bValid = m_ui.EngineNameComboBox->currentIndex() >= 0 &&
833  #if 0                  m_ui.EngineNameComboBox->currentText() != Channel::noEngineName();
834          const QString& sPath = InstrumentFileComboBox->currentText();  
835            const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
836          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();
837  #endif  
838          ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);          m_ui.DialogButtonBox->button(
839                    QDialogButtonBox::Ok)->setEnabled(m_iDirtyCount > 0 && bValid);
840    }
841    
842    
843    void ChannelForm::updateTableCellRenderers (void)
844    {
845            const int rows = m_routingModel.rowCount();
846            const int cols = m_routingModel.columnCount();
847            updateTableCellRenderers(
848                    m_routingModel.index(0, 0),
849                    m_routingModel.index(rows - 1, cols - 1));
850  }  }
851    
852    
853    void ChannelForm::updateTableCellRenderers (
854            const QModelIndex& topLeft, const QModelIndex& bottomRight )
855    {
856            for (int r = topLeft.row(); r <= bottomRight.row(); r++) {
857                    for (int c = topLeft.column(); c <= bottomRight.column(); c++) {
858                            const QModelIndex index = m_routingModel.index(r, c);
859                            m_ui.AudioRoutingTable->openPersistentEditor(index);
860                    }
861            }
862    }
863    
864  } // namespace QSampler  } // namespace QSampler
865    
866    

Legend:
Removed from v.1474  
changed lines
  Added in v.3435

  ViewVC Help
Powered by ViewVC