1
// qsamplerChannelForm.ui.h
3
// ui.h extension file, included from the uic-generated form implementation.
4
/****************************************************************************
5
Copyright (C) 2004-2005, rncbc aka Rui Nuno Capela. All rights reserved.
7
This program is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License
9
as published by the Free Software Foundation; either version 2
10
of the License, or (at your option) any later version.
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
*****************************************************************************/
23
#include <qvalidator.h>
24
#include <qmessagebox.h>
25
#include <qfiledialog.h>
26
#include <qfileinfo.h>
29
#include "qsamplerDeviceForm.h"
34
// Kind of constructor.
35
void qsamplerChannelForm::init (void)
43
m_midiDevices.setAutoDelete(true);
44
m_audioDevices.setAutoDelete(true);
48
// Try to restore normal window positioning.
53
// Kind of destructor.
54
void qsamplerChannelForm::destroy (void)
62
// Channel dialog setup formal initializer.
63
void qsamplerChannelForm::setup ( qsamplerChannel *pChannel )
65
m_pChannel = pChannel;
70
if (m_pChannel == NULL)
73
// It can be a brand new channel, remember?
74
bool bNew = (m_pChannel->channelID() < 0);
75
setCaption(m_pChannel->channelName());
77
// Check if we're up and connected.
78
if (m_pChannel->client() == NULL)
81
qsamplerOptions *pOptions = m_pChannel->options();
85
// Avoid nested changes.
88
// Load combo box history...
89
pOptions->loadComboBoxHistory(InstrumentFileComboBox);
91
// Populate Engines list.
92
const char **ppszEngines = ::lscp_list_available_engines(m_pChannel->client());
94
EngineNameComboBox->clear();
95
for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
96
EngineNameComboBox->insertItem(ppszEngines[iEngine]);
98
else m_pChannel->appendMessagesClient("lscp_list_available_engines");
100
// Populate Audio output type list.
101
AudioDriverComboBox->clear();
102
AudioDriverComboBox->insertStringList(
103
qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Audio));
105
// Populate MIDI input type list.
106
MidiDriverComboBox->clear();
107
MidiDriverComboBox->insertStringList(
108
qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Midi));
110
// Read proper channel information,
111
// and populate the channel form fields.
114
QString sEngineName = pChannel->engineName();
115
if (sEngineName.isEmpty() || bNew)
116
sEngineName = pOptions->sEngineName;
117
if (sEngineName.isEmpty())
118
sEngineName = qsamplerChannel::noEngineName();
119
if (EngineNameComboBox->listBox()->findItem(sEngineName,
120
Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
121
EngineNameComboBox->insertItem(sEngineName);
123
EngineNameComboBox->setCurrentText(sEngineName);
124
// Instrument filename and index...
125
QString sInstrumentFile = pChannel->instrumentFile();
126
if (sInstrumentFile.isEmpty())
127
sInstrumentFile = qsamplerChannel::noInstrumentName();
128
InstrumentFileComboBox->setCurrentText(sInstrumentFile);
129
InstrumentNrComboBox->clear();
130
InstrumentNrComboBox->insertStringList(
131
qsamplerChannel::getInstrumentList(sInstrumentFile,
132
pOptions->bInstrumentNames));
133
InstrumentNrComboBox->setCurrentItem(pChannel->instrumentNr());
135
// MIDI input device...
136
qsamplerDevice midiDevice(m_pChannel->mainForm(),
137
qsamplerDevice::Midi, m_pChannel->midiDevice());
138
// MIDI input driver...
139
QString sMidiDriver = midiDevice.driverName();
140
if (sMidiDriver.isEmpty() || bNew)
141
sMidiDriver = pOptions->sMidiDriver.upper();
142
if (!sMidiDriver.isEmpty()) {
143
if (MidiDriverComboBox->listBox()->findItem(sMidiDriver,
144
Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
145
MidiDriverComboBox->insertItem(sMidiDriver);
147
MidiDriverComboBox->setCurrentText(sMidiDriver);
149
selectMidiDriverItem(sMidiDriver);
151
MidiDeviceComboBox->setCurrentText(midiDevice.deviceName());
152
selectMidiDeviceItem(MidiDeviceComboBox->currentItem());
153
// MIDI input port...
154
MidiPortSpinBox->setValue(pChannel->midiPort());
155
// MIDI input channel...
156
int iMidiChannel = pChannel->midiChannel();
157
// When new, try to suggest a sensible MIDI channel...
158
if (iMidiChannel < 0)
159
iMidiChannel = (::lscp_get_channels(m_pChannel->client()) % 16);
160
MidiChannelComboBox->setCurrentItem(iMidiChannel);
162
// Audio output device...
163
qsamplerDevice audioDevice(m_pChannel->mainForm(),
164
qsamplerDevice::Audio, m_pChannel->audioDevice());
165
// Audio output driver...
166
QString sAudioDriver = audioDevice.driverName();
167
if (sAudioDriver.isEmpty() || bNew)
168
sAudioDriver = pOptions->sAudioDriver.upper();
169
if (!sAudioDriver.isEmpty()) {
170
if (AudioDriverComboBox->listBox()->findItem(sAudioDriver,
171
Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
172
AudioDriverComboBox->insertItem(sAudioDriver);
174
AudioDriverComboBox->setCurrentText(sAudioDriver);
176
selectAudioDriverItem(sAudioDriver);
178
AudioDeviceComboBox->setCurrentText(audioDevice.deviceName());
179
selectAudioDeviceItem(AudioDeviceComboBox->currentItem());
181
// As convenient, make it ready on stabilizeForm() for
182
// prompt acceptance, if we got the minimum required...
183
if (sEngineName != qsamplerChannel::noEngineName() &&
184
sInstrumentFile != qsamplerChannel::noInstrumentName())
192
// Accept settings (OK button slot).
193
void qsamplerChannelForm::accept (void)
195
if (m_pChannel == NULL)
198
qsamplerOptions *pOptions = m_pChannel->options();
199
if (pOptions == NULL)
203
if (m_iDirtyCount > 0) {
205
// Are we a new channel?
206
if (!m_pChannel->addChannel())
208
// Accept Audio driver or device selection...
209
if (m_audioDevices.isEmpty()) {
210
if (!m_pChannel->setAudioDriver(AudioDriverComboBox->currentText()))
213
qsamplerDevice *pDevice = m_audioDevices.at(AudioDeviceComboBox->currentItem());
216
else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))
219
// Accept MIDI driver or device selection...
220
if (m_midiDevices.isEmpty()) {
221
if (!m_pChannel->setMidiDriver(MidiDriverComboBox->currentText()))
224
qsamplerDevice *pDevice = m_midiDevices.at(MidiDeviceComboBox->currentItem());
227
else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))
230
// MIDI input port number...
231
if (!m_pChannel->setMidiPort(MidiPortSpinBox->value()))
233
// MIDI input channel...
234
if (!m_pChannel->setMidiChannel(MidiChannelComboBox->currentItem()))
237
if (!m_pChannel->loadEngine(EngineNameComboBox->currentText()))
239
// Instrument file and index...
240
if (!m_pChannel->loadInstrument(InstrumentFileComboBox->currentText(), InstrumentNrComboBox->currentItem()))
242
// Show error messages?
244
m_pChannel->appendMessagesError(tr("Some channel settings could not be set.\n\nSorry."));
247
// Save default engine name, instrument directory and history...
248
pOptions->sInstrumentDir = QFileInfo(InstrumentFileComboBox->currentText()).dirPath(true);
249
pOptions->sEngineName = EngineNameComboBox->currentText();
250
pOptions->sAudioDriver = AudioDriverComboBox->currentText();
251
pOptions->sMidiDriver = MidiDriverComboBox->currentText();
252
pOptions->saveComboBoxHistory(InstrumentFileComboBox);
254
// Just go with dialog acceptance.
259
// Reject settings (Cancel button slot).
260
void qsamplerChannelForm::reject (void)
264
// Check if there's any pending changes...
265
if (m_iDirtyCount > 0 && OkPushButton->isEnabled()) {
266
switch (QMessageBox::warning(this, tr("Warning"),
267
tr("Some channel settings have been changed.\n\n"
268
"Do you want to apply the changes?"),
269
tr("Apply"), tr("Discard"), tr("Cancel"))) {
285
// Browse and open an instrument file.
286
void qsamplerChannelForm::openInstrumentFile (void)
288
qsamplerOptions *pOptions = m_pChannel->options();
289
if (pOptions == NULL)
292
// FIXME: the instrument file filters should be restricted,
293
// depending on the current engine.
294
QString sInstrumentFile = QFileDialog::getOpenFileName(
295
pOptions->sInstrumentDir, // Start here.
296
tr("Instrument files") + " (*.gig *.dls)", // Filter (GIG and DLS files)
297
this, 0, // Parent and name (none)
298
tr("Instrument files") // Caption.
301
if (sInstrumentFile.isEmpty())
304
InstrumentFileComboBox->setCurrentText(sInstrumentFile);
305
updateInstrumentName();
309
// Refresh the actual instrument name.
310
void qsamplerChannelForm::updateInstrumentName (void)
312
qsamplerOptions *pOptions = m_pChannel->options();
313
if (pOptions == NULL)
316
// Finally this better idea would be to use libgig
317
// to retrieve the REAL instrument names.
318
InstrumentNrComboBox->clear();
319
InstrumentNrComboBox->insertStringList(
320
qsamplerChannel::getInstrumentList(
321
InstrumentFileComboBox->currentText(),
322
pOptions->bInstrumentNames)
328
// Show device options dialog.
329
void qsamplerChannelForm::setupDevice ( qsamplerDevice *pDevice,
330
qsamplerDevice::qsamplerDeviceType deviceTypeMode,
331
const QString& sDriverName )
333
// Create the device form if not already...
334
if (m_pDeviceForm == NULL) {
335
m_pDeviceForm = new qsamplerDeviceForm(this, 0,
336
WType_Dialog | WShowModal);
337
m_pDeviceForm->setMainForm(m_pChannel->mainForm());
338
QObject::connect(m_pDeviceForm, SIGNAL(devicesChanged()),
339
this, SLOT(updateDevices()));
342
// Refresh the device form with selected data.
344
m_pDeviceForm->setDeviceTypeMode(deviceTypeMode);
345
m_pDeviceForm->setClient(m_pChannel->client()); // -> refreshDevices();
346
m_pDeviceForm->setDevice(pDevice);
347
m_pDeviceForm->setDriverName(sDriverName);
348
m_pDeviceForm->show();
353
// Refresh MIDI driver item devices.
354
void qsamplerChannelForm::selectMidiDriverItem ( const QString& sMidiDriver )
356
const QString sDriverName = sMidiDriver.upper();
358
// Save current device id.
360
qsamplerDevice *pDevice = m_midiDevices.at(MidiDeviceComboBox->currentItem());
362
iDeviceID = pDevice->deviceID();
365
MidiDeviceComboBox->clear();
366
m_midiDevices.clear();
368
// Populate with the current ones...
369
const QPixmap& midiPixmap = QPixmap::fromMimeSource("midi2.png");
370
int *piDeviceIDs = qsamplerDevice::getDevices(m_pChannel->client(),
371
qsamplerDevice::Midi);
372
for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
373
pDevice = new qsamplerDevice(m_pChannel->mainForm(),
374
qsamplerDevice::Midi, piDeviceIDs[i]);
375
if (pDevice->driverName().upper() == sDriverName) {
376
MidiDeviceComboBox->insertItem(midiPixmap, pDevice->deviceName());
377
m_midiDevices.append(pDevice);
383
// Do proper enabling...
384
bool bEnabled = !m_midiDevices.isEmpty();
386
MidiDeviceComboBox->insertItem(
387
tr("(New MIDI %1 device)").arg(sMidiDriver));
388
} else if (iDeviceID >= 0) {
389
// Select the previous current device...
391
for (pDevice = m_midiDevices.first();
393
pDevice = m_midiDevices.next()) {
394
if (pDevice->deviceID() == iDeviceID) {
395
MidiDeviceComboBox->setCurrentItem(iMidiItem);
396
// selectMidiDeviceItem(iMidiItem);
402
MidiDeviceTextLabel->setEnabled(bEnabled);
403
MidiDeviceComboBox->setEnabled(bEnabled);
407
// Refresh MIDI device options slot.
408
void qsamplerChannelForm::selectMidiDriver ( const QString& sMidiDriver )
410
if (m_iDirtySetup > 0)
413
selectMidiDriverItem(sMidiDriver);
418
// Select MIDI device item.
419
void qsamplerChannelForm::selectMidiDeviceItem ( int iMidiItem )
421
qsamplerDevice *pDevice = m_midiDevices.at(iMidiItem);
423
const qsamplerDeviceParamMap& params = pDevice->params();
424
int iPorts = params["PORTS"].value.toInt();
425
MidiPortTextLabel->setEnabled(iPorts > 0);
426
MidiPortSpinBox->setEnabled(iPorts > 0);
428
MidiPortSpinBox->setMaxValue(iPorts - 1);
433
// Select MIDI device options slot.
434
void qsamplerChannelForm::selectMidiDevice ( int iMidiItem )
436
if (m_iDirtySetup > 0)
439
selectMidiDeviceItem(iMidiItem);
444
// MIDI device options.
445
void qsamplerChannelForm::setupMidiDevice (void)
447
setupDevice(m_midiDevices.at(MidiDeviceComboBox->currentItem()),
448
qsamplerDevice::Midi, MidiDriverComboBox->currentText());
452
// Refresh Audio driver item devices.
453
void qsamplerChannelForm::selectAudioDriverItem ( const QString& sAudioDriver )
455
const QString sDriverName = sAudioDriver.upper();
457
// Save current device id.
459
qsamplerDevice *pDevice = m_audioDevices.at(AudioDeviceComboBox->currentItem());
461
iDeviceID = pDevice->deviceID();
464
AudioDeviceComboBox->clear();
465
m_audioDevices.clear();
467
// Populate with the current ones...
468
const QPixmap& audioPixmap = QPixmap::fromMimeSource("audio2.png");
469
int *piDeviceIDs = qsamplerDevice::getDevices(m_pChannel->client(),
470
qsamplerDevice::Audio);
471
for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
472
pDevice = new qsamplerDevice(m_pChannel->mainForm(),
473
qsamplerDevice::Audio, piDeviceIDs[i]);
474
if (pDevice->driverName().upper() == sDriverName) {
475
AudioDeviceComboBox->insertItem(audioPixmap, pDevice->deviceName());
476
m_audioDevices.append(pDevice);
482
// Do proper enabling...
483
bool bEnabled = !m_audioDevices.isEmpty();
485
AudioDeviceComboBox->insertItem(
486
tr("(New Audio %1 device)").arg(sAudioDriver));
487
} else if (iDeviceID >= 0) {
488
// Select the previous current device...
490
for (pDevice = m_audioDevices.first();
492
pDevice = m_audioDevices.next()) {
493
if (pDevice->deviceID() == iDeviceID) {
494
AudioDeviceComboBox->setCurrentItem(iAudioItem);
495
// selectAudioDeviceItem(iAudioItem);
501
AudioDeviceTextLabel->setEnabled(bEnabled);
502
AudioDeviceComboBox->setEnabled(bEnabled);
506
// Refresh Audio device options slot.
507
void qsamplerChannelForm::selectAudioDriver ( const QString& sAudioDriver )
509
if (m_iDirtySetup > 0)
512
selectAudioDriverItem(sAudioDriver);
517
// Select Audio device item.
518
void qsamplerChannelForm::selectAudioDeviceItem ( int iAudioItem )
520
qsamplerDevice *pDevice = m_audioDevices.at(iAudioItem);
522
// Is there anything to do here?
527
// Select Audio device options slot.
528
void qsamplerChannelForm::selectAudioDevice ( int iAudioItem )
530
if (m_iDirtySetup > 0)
533
selectAudioDeviceItem(iAudioItem);
538
// Audio device options.
539
void qsamplerChannelForm::setupAudioDevice (void)
541
setupDevice(m_audioDevices.at(AudioDeviceComboBox->currentItem()),
542
qsamplerDevice::Audio, AudioDriverComboBox->currentText());
546
// UPdate all device lists slot.
547
void qsamplerChannelForm::updateDevices (void)
549
if (m_iDirtySetup > 0)
552
selectMidiDriverItem(MidiDriverComboBox->currentText());
553
selectAudioDriverItem(AudioDriverComboBox->currentText());
558
// Dirty up settings.
559
void qsamplerChannelForm::optionsChanged (void)
561
if (m_iDirtySetup > 0)
569
// Stabilize current form state.
570
void qsamplerChannelForm::stabilizeForm (void)
572
const QString& sFilename = InstrumentFileComboBox->currentText();
573
OkPushButton->setEnabled(m_iDirtyCount > 0 && !sFilename.isEmpty() && QFileInfo(sFilename).exists());
577
// end of qsamplerChannelForm.ui.h