/[svn]/qsampler/trunk/src/qsamplerChannelForm.ui.h
ViewVC logotype

Contents of /qsampler/trunk/src/qsamplerChannelForm.ui.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 757 - (show annotations) (download) (as text)
Fri Aug 26 23:04:32 2005 UTC (18 years, 7 months ago) by capela
File MIME type: text/x-c++hdr
File size: 16667 byte(s)
* All widget captions changed to include proper application title prefix.

1 // qsamplerChannelForm.ui.h
2 //
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.
6
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.
11
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.
16
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.
20
21 *****************************************************************************/
22
23 #include "qsamplerAbout.h"
24 #include "qsamplerDeviceForm.h"
25
26 #include <qvalidator.h>
27 #include <qmessagebox.h>
28 #include <qfiledialog.h>
29 #include <qfileinfo.h>
30 #include <qlistbox.h>
31
32
33 // Kind of constructor.
34 void qsamplerChannelForm::init (void)
35 {
36 // Initialize locals.
37 m_pChannel = NULL;
38
39 m_iDirtySetup = 0;
40 m_iDirtyCount = 0;
41
42 m_midiDevices.setAutoDelete(true);
43 m_audioDevices.setAutoDelete(true);
44
45 m_pDeviceForm = NULL;
46
47 // Try to restore normal window positioning.
48 adjustSize();
49 }
50
51
52 // Kind of destructor.
53 void qsamplerChannelForm::destroy (void)
54 {
55 if (m_pDeviceForm)
56 delete m_pDeviceForm;
57 m_pDeviceForm = NULL;
58 }
59
60
61 // Channel dialog setup formal initializer.
62 void qsamplerChannelForm::setup ( qsamplerChannel *pChannel )
63 {
64 m_pChannel = pChannel;
65
66 m_iDirtySetup = 0;
67 m_iDirtyCount = 0;
68
69 if (m_pChannel == NULL)
70 return;
71
72 // It can be a brand new channel, remember?
73 bool bNew = (m_pChannel->channelID() < 0);
74 setCaption(QSAMPLER_TITLE ": " + m_pChannel->channelName());
75
76 // Check if we're up and connected.
77 if (m_pChannel->client() == NULL)
78 return;
79
80 qsamplerOptions *pOptions = m_pChannel->options();
81 if (pOptions == NULL)
82 return;
83
84 // Avoid nested changes.
85 m_iDirtySetup++;
86
87 // Load combo box history...
88 pOptions->loadComboBoxHistory(InstrumentFileComboBox);
89
90 // Populate Engines list.
91 const char **ppszEngines = ::lscp_list_available_engines(m_pChannel->client());
92 if (ppszEngines) {
93 EngineNameComboBox->clear();
94 for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
95 EngineNameComboBox->insertItem(ppszEngines[iEngine]);
96 }
97 else m_pChannel->appendMessagesClient("lscp_list_available_engines");
98
99 // Populate Audio output type list.
100 AudioDriverComboBox->clear();
101 AudioDriverComboBox->insertStringList(
102 qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Audio));
103
104 // Populate MIDI input type list.
105 MidiDriverComboBox->clear();
106 MidiDriverComboBox->insertStringList(
107 qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Midi));
108
109 // Read proper channel information,
110 // and populate the channel form fields.
111
112 // Engine name...
113 QString sEngineName = pChannel->engineName();
114 if (sEngineName.isEmpty() || bNew)
115 sEngineName = pOptions->sEngineName;
116 if (sEngineName.isEmpty())
117 sEngineName = qsamplerChannel::noEngineName();
118 if (EngineNameComboBox->listBox()->findItem(sEngineName,
119 Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
120 EngineNameComboBox->insertItem(sEngineName);
121 }
122 EngineNameComboBox->setCurrentText(sEngineName);
123 // Instrument filename and index...
124 QString sInstrumentFile = pChannel->instrumentFile();
125 if (sInstrumentFile.isEmpty())
126 sInstrumentFile = qsamplerChannel::noInstrumentName();
127 InstrumentFileComboBox->setCurrentText(sInstrumentFile);
128 InstrumentNrComboBox->clear();
129 InstrumentNrComboBox->insertStringList(
130 qsamplerChannel::getInstrumentList(sInstrumentFile,
131 pOptions->bInstrumentNames));
132 InstrumentNrComboBox->setCurrentItem(pChannel->instrumentNr());
133
134 // MIDI input device...
135 qsamplerDevice midiDevice(m_pChannel->mainForm(),
136 qsamplerDevice::Midi, m_pChannel->midiDevice());
137 // MIDI input driver...
138 QString sMidiDriver = midiDevice.driverName();
139 if (sMidiDriver.isEmpty() || bNew)
140 sMidiDriver = pOptions->sMidiDriver.upper();
141 if (!sMidiDriver.isEmpty()) {
142 if (MidiDriverComboBox->listBox()->findItem(sMidiDriver,
143 Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
144 MidiDriverComboBox->insertItem(sMidiDriver);
145 }
146 MidiDriverComboBox->setCurrentText(sMidiDriver);
147 }
148 selectMidiDriverItem(sMidiDriver);
149 if (!bNew)
150 MidiDeviceComboBox->setCurrentText(midiDevice.deviceName());
151 selectMidiDeviceItem(MidiDeviceComboBox->currentItem());
152 // MIDI input port...
153 MidiPortSpinBox->setValue(pChannel->midiPort());
154 // MIDI input channel...
155 int iMidiChannel = pChannel->midiChannel();
156 // When new, try to suggest a sensible MIDI channel...
157 if (iMidiChannel < 0)
158 iMidiChannel = (::lscp_get_channels(m_pChannel->client()) % 16);
159 MidiChannelComboBox->setCurrentItem(iMidiChannel);
160
161 // Audio output device...
162 qsamplerDevice audioDevice(m_pChannel->mainForm(),
163 qsamplerDevice::Audio, m_pChannel->audioDevice());
164 // Audio output driver...
165 QString sAudioDriver = audioDevice.driverName();
166 if (sAudioDriver.isEmpty() || bNew)
167 sAudioDriver = pOptions->sAudioDriver.upper();
168 if (!sAudioDriver.isEmpty()) {
169 if (AudioDriverComboBox->listBox()->findItem(sAudioDriver,
170 Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
171 AudioDriverComboBox->insertItem(sAudioDriver);
172 }
173 AudioDriverComboBox->setCurrentText(sAudioDriver);
174 }
175 selectAudioDriverItem(sAudioDriver);
176 if (!bNew)
177 AudioDeviceComboBox->setCurrentText(audioDevice.deviceName());
178 selectAudioDeviceItem(AudioDeviceComboBox->currentItem());
179
180 // As convenient, make it ready on stabilizeForm() for
181 // prompt acceptance, if we got the minimum required...
182 if (sEngineName != qsamplerChannel::noEngineName() &&
183 sInstrumentFile != qsamplerChannel::noInstrumentName())
184 m_iDirtyCount++;
185 // Done.
186 m_iDirtySetup--;
187 stabilizeForm();
188 }
189
190
191 // Accept settings (OK button slot).
192 void qsamplerChannelForm::accept (void)
193 {
194 if (m_pChannel == NULL)
195 return;
196
197 qsamplerOptions *pOptions = m_pChannel->options();
198 if (pOptions == NULL)
199 return;
200
201 // We'll go for it!
202 if (m_iDirtyCount > 0) {
203 int iErrors = 0;
204 // Are we a new channel?
205 if (!m_pChannel->addChannel())
206 iErrors++;
207 // Accept Audio driver or device selection...
208 if (m_audioDevices.isEmpty()) {
209 if (!m_pChannel->setAudioDriver(AudioDriverComboBox->currentText()))
210 iErrors++;
211 } else {
212 qsamplerDevice *pDevice = m_audioDevices.at(AudioDeviceComboBox->currentItem());
213 if (pDevice == NULL)
214 iErrors++;
215 else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))
216 iErrors++;
217 }
218 // Accept MIDI driver or device selection...
219 if (m_midiDevices.isEmpty()) {
220 if (!m_pChannel->setMidiDriver(MidiDriverComboBox->currentText()))
221 iErrors++;
222 } else {
223 qsamplerDevice *pDevice = m_midiDevices.at(MidiDeviceComboBox->currentItem());
224 if (pDevice == NULL)
225 iErrors++;
226 else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))
227 iErrors++;
228 }
229 // MIDI input port number...
230 if (!m_pChannel->setMidiPort(MidiPortSpinBox->value()))
231 iErrors++;
232 // MIDI input channel...
233 if (!m_pChannel->setMidiChannel(MidiChannelComboBox->currentItem()))
234 iErrors++;
235 // Engine name...
236 if (!m_pChannel->loadEngine(EngineNameComboBox->currentText()))
237 iErrors++;
238 // Instrument file and index...
239 if (!m_pChannel->loadInstrument(InstrumentFileComboBox->currentText(), InstrumentNrComboBox->currentItem()))
240 iErrors++;
241 // Show error messages?
242 if (iErrors > 0)
243 m_pChannel->appendMessagesError(tr("Some channel settings could not be set.\n\nSorry."));
244 }
245
246 // Save default engine name, instrument directory and history...
247 pOptions->sInstrumentDir = QFileInfo(InstrumentFileComboBox->currentText()).dirPath(true);
248 pOptions->sEngineName = EngineNameComboBox->currentText();
249 pOptions->sAudioDriver = AudioDriverComboBox->currentText();
250 pOptions->sMidiDriver = MidiDriverComboBox->currentText();
251 pOptions->saveComboBoxHistory(InstrumentFileComboBox);
252
253 // Just go with dialog acceptance.
254 QDialog::accept();
255 }
256
257
258 // Reject settings (Cancel button slot).
259 void qsamplerChannelForm::reject (void)
260 {
261 bool bReject = true;
262
263 // Check if there's any pending changes...
264 if (m_iDirtyCount > 0 && OkPushButton->isEnabled()) {
265 switch (QMessageBox::warning(this,
266 QSAMPLER_TITLE ": " + 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"))) {
270 case 0: // Apply...
271 accept();
272 return;
273 case 1: // Discard
274 break;
275 default: // Cancel.
276 bReject = false;
277 }
278 }
279
280 if (bReject)
281 QDialog::reject();
282 }
283
284
285 // Browse and open an instrument file.
286 void qsamplerChannelForm::openInstrumentFile (void)
287 {
288 qsamplerOptions *pOptions = m_pChannel->options();
289 if (pOptions == NULL)
290 return;
291
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 QSAMPLER_TITLE ": " + tr("Instrument files") // Caption.
299 );
300
301 if (sInstrumentFile.isEmpty())
302 return;
303
304 InstrumentFileComboBox->setCurrentText(sInstrumentFile);
305 updateInstrumentName();
306 }
307
308
309 // Refresh the actual instrument name.
310 void qsamplerChannelForm::updateInstrumentName (void)
311 {
312 qsamplerOptions *pOptions = m_pChannel->options();
313 if (pOptions == NULL)
314 return;
315
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)
323 );
324
325 optionsChanged();
326 }
327
328 // Show device options dialog.
329 void qsamplerChannelForm::setupDevice ( qsamplerDevice *pDevice,
330 qsamplerDevice::qsamplerDeviceType deviceTypeMode,
331 const QString& sDriverName )
332 {
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()));
340 }
341
342 // Refresh the device form with selected data.
343 if (m_pDeviceForm) {
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();
349 }
350 }
351
352
353 // Refresh MIDI driver item devices.
354 void qsamplerChannelForm::selectMidiDriverItem ( const QString& sMidiDriver )
355 {
356 const QString sDriverName = sMidiDriver.upper();
357
358 // Save current device id.
359 int iDeviceID = -1;
360 qsamplerDevice *pDevice = m_midiDevices.at(MidiDeviceComboBox->currentItem());
361 if (pDevice)
362 iDeviceID = pDevice->deviceID();
363
364 // Clean maplist.
365 MidiDeviceComboBox->clear();
366 m_midiDevices.clear();
367
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);
378 } else {
379 delete pDevice;
380 }
381 }
382
383 // Do proper enabling...
384 bool bEnabled = !m_midiDevices.isEmpty();
385 if (!bEnabled) {
386 MidiDeviceComboBox->insertItem(
387 tr("(New MIDI %1 device)").arg(sMidiDriver));
388 } else if (iDeviceID >= 0) {
389 // Select the previous current device...
390 int iMidiItem = 0;
391 for (pDevice = m_midiDevices.first();
392 pDevice;
393 pDevice = m_midiDevices.next()) {
394 if (pDevice->deviceID() == iDeviceID) {
395 MidiDeviceComboBox->setCurrentItem(iMidiItem);
396 // selectMidiDeviceItem(iMidiItem);
397 break;
398 }
399 iMidiItem++;
400 }
401 }
402 MidiDeviceTextLabel->setEnabled(bEnabled);
403 MidiDeviceComboBox->setEnabled(bEnabled);
404 }
405
406
407 // Refresh MIDI device options slot.
408 void qsamplerChannelForm::selectMidiDriver ( const QString& sMidiDriver )
409 {
410 if (m_iDirtySetup > 0)
411 return;
412
413 selectMidiDriverItem(sMidiDriver);
414 optionsChanged();
415 }
416
417
418 // Select MIDI device item.
419 void qsamplerChannelForm::selectMidiDeviceItem ( int iMidiItem )
420 {
421 qsamplerDevice *pDevice = m_midiDevices.at(iMidiItem);
422 if (pDevice) {
423 const qsamplerDeviceParamMap& params = pDevice->params();
424 int iPorts = params["PORTS"].value.toInt();
425 MidiPortTextLabel->setEnabled(iPorts > 0);
426 MidiPortSpinBox->setEnabled(iPorts > 0);
427 if (iPorts > 0)
428 MidiPortSpinBox->setMaxValue(iPorts - 1);
429 }
430 }
431
432
433 // Select MIDI device options slot.
434 void qsamplerChannelForm::selectMidiDevice ( int iMidiItem )
435 {
436 if (m_iDirtySetup > 0)
437 return;
438
439 selectMidiDeviceItem(iMidiItem);
440 optionsChanged();
441 }
442
443
444 // MIDI device options.
445 void qsamplerChannelForm::setupMidiDevice (void)
446 {
447 setupDevice(m_midiDevices.at(MidiDeviceComboBox->currentItem()),
448 qsamplerDevice::Midi, MidiDriverComboBox->currentText());
449 }
450
451
452 // Refresh Audio driver item devices.
453 void qsamplerChannelForm::selectAudioDriverItem ( const QString& sAudioDriver )
454 {
455 const QString sDriverName = sAudioDriver.upper();
456
457 // Save current device id.
458 int iDeviceID = -1;
459 qsamplerDevice *pDevice = m_audioDevices.at(AudioDeviceComboBox->currentItem());
460 if (pDevice)
461 iDeviceID = pDevice->deviceID();
462
463 // Clean maplist.
464 AudioDeviceComboBox->clear();
465 m_audioDevices.clear();
466
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);
477 } else {
478 delete pDevice;
479 }
480 }
481
482 // Do proper enabling...
483 bool bEnabled = !m_audioDevices.isEmpty();
484 if (!bEnabled) {
485 AudioDeviceComboBox->insertItem(
486 tr("(New Audio %1 device)").arg(sAudioDriver));
487 } else if (iDeviceID >= 0) {
488 // Select the previous current device...
489 int iAudioItem = 0;
490 for (pDevice = m_audioDevices.first();
491 pDevice;
492 pDevice = m_audioDevices.next()) {
493 if (pDevice->deviceID() == iDeviceID) {
494 AudioDeviceComboBox->setCurrentItem(iAudioItem);
495 // selectAudioDeviceItem(iAudioItem);
496 break;
497 }
498 iAudioItem++;
499 }
500 }
501 AudioDeviceTextLabel->setEnabled(bEnabled);
502 AudioDeviceComboBox->setEnabled(bEnabled);
503 }
504
505
506 // Refresh Audio device options slot.
507 void qsamplerChannelForm::selectAudioDriver ( const QString& sAudioDriver )
508 {
509 if (m_iDirtySetup > 0)
510 return;
511
512 selectAudioDriverItem(sAudioDriver);
513 optionsChanged();
514 }
515
516
517 // Select Audio device item.
518 void qsamplerChannelForm::selectAudioDeviceItem ( int iAudioItem )
519 {
520 qsamplerDevice *pDevice = m_audioDevices.at(iAudioItem);
521 if (pDevice) {
522 // Is there anything to do here?
523 }
524 }
525
526
527 // Select Audio device options slot.
528 void qsamplerChannelForm::selectAudioDevice ( int iAudioItem )
529 {
530 if (m_iDirtySetup > 0)
531 return;
532
533 selectAudioDeviceItem(iAudioItem);
534 optionsChanged();
535 }
536
537
538 // Audio device options.
539 void qsamplerChannelForm::setupAudioDevice (void)
540 {
541 setupDevice(m_audioDevices.at(AudioDeviceComboBox->currentItem()),
542 qsamplerDevice::Audio, AudioDriverComboBox->currentText());
543 }
544
545
546 // UPdate all device lists slot.
547 void qsamplerChannelForm::updateDevices (void)
548 {
549 if (m_iDirtySetup > 0)
550 return;
551
552 selectMidiDriverItem(MidiDriverComboBox->currentText());
553 selectAudioDriverItem(AudioDriverComboBox->currentText());
554 optionsChanged();
555 }
556
557
558 // Dirty up settings.
559 void qsamplerChannelForm::optionsChanged (void)
560 {
561 if (m_iDirtySetup > 0)
562 return;
563
564 m_iDirtyCount++;
565 stabilizeForm();
566 }
567
568
569 // Stabilize current form state.
570 void qsamplerChannelForm::stabilizeForm (void)
571 {
572 const QString& sFilename = InstrumentFileComboBox->currentText();
573 OkPushButton->setEnabled(m_iDirtyCount > 0 && !sFilename.isEmpty() && QFileInfo(sFilename).exists());
574 }
575
576
577 // end of qsamplerChannelForm.ui.h

  ViewVC Help
Powered by ViewVC