/[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 462 - (show annotations) (download) (as text)
Tue Mar 15 11:39:12 2005 UTC (14 years, 11 months ago) by capela
File MIME type: text/x-c++hdr
File size: 13657 byte(s)
Device port/channel configuration preparations.

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 <qvalidator.h>
24 #include <qmessagebox.h>
25 #include <qfiledialog.h>
26 #include <qfileinfo.h>
27 #include <qlistbox.h>
28
29 #include "config.h"
30
31
32 // Kind of constructor.
33 void qsamplerChannelForm::init (void)
34 {
35 // Initialize locals.
36 m_pChannel = NULL;
37
38 m_iDirtySetup = 0;
39 m_iDirtyCount = 0;
40
41 m_midiDevices.setAutoDelete(true);
42 m_audioDevices.setAutoDelete(true);
43
44 // Try to restore normal window positioning.
45 adjustSize();
46 }
47
48
49 // Kind of destructor.
50 void qsamplerChannelForm::destroy (void)
51 {
52 }
53
54
55 // Channel dialog setup formal initializer.
56 void qsamplerChannelForm::setup ( qsamplerChannel *pChannel )
57 {
58 m_pChannel = pChannel;
59
60 m_iDirtySetup = 0;
61 m_iDirtyCount = 0;
62
63 if (m_pChannel == NULL)
64 return;
65
66 // It can be a brand new channel, remember?
67 bool bNew = (m_pChannel->channelID() < 0);
68 setCaption(m_pChannel->channelName());
69
70 // Check if we're up and connected.
71 if (m_pChannel->client() == NULL)
72 return;
73
74 qsamplerOptions *pOptions = m_pChannel->options();
75 if (pOptions == NULL)
76 return;
77
78 // Avoid nested changes.
79 m_iDirtySetup++;
80
81 // Load combo box history...
82 pOptions->loadComboBoxHistory(InstrumentFileComboBox);
83
84 // Populate Engines list.
85 const char **ppszEngines = ::lscp_get_available_engines(m_pChannel->client());
86 if (ppszEngines) {
87 EngineNameComboBox->clear();
88 for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
89 EngineNameComboBox->insertItem(ppszEngines[iEngine]);
90 }
91 else m_pChannel->appendMessagesClient("lscp_get_available_engines");
92
93 // Populate Audio output type list.
94 AudioDriverComboBox->clear();
95 AudioDriverComboBox->insertStringList(
96 qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Audio));
97
98 // Populate MIDI input type list.
99 MidiDriverComboBox->clear();
100 MidiDriverComboBox->insertStringList(
101 qsamplerDevice::getDrivers(m_pChannel->client(), qsamplerDevice::Midi));
102
103 // Read proper channel information,
104 // and populate the channel form fields.
105
106 // Engine name...
107 QString sEngineName = pChannel->engineName();
108 if (sEngineName.isEmpty() || bNew)
109 sEngineName = pOptions->sEngineName;
110 if (sEngineName.isEmpty())
111 sEngineName = qsamplerChannel::noEngineName();
112 if (EngineNameComboBox->listBox()->findItem(sEngineName, Qt::ExactMatch) == NULL)
113 EngineNameComboBox->insertItem(sEngineName);
114 EngineNameComboBox->setCurrentText(sEngineName);
115 // Instrument filename and index...
116 QString sInstrumentFile = pChannel->instrumentFile();
117 if (sInstrumentFile.isEmpty())
118 sInstrumentFile = qsamplerChannel::noInstrumentName();
119 InstrumentFileComboBox->setCurrentText(sInstrumentFile);
120 InstrumentNrComboBox->clear();
121 InstrumentNrComboBox->insertStringList(
122 qsamplerChannel::getInstrumentList(sInstrumentFile,
123 pOptions->bInstrumentNames));
124 InstrumentNrComboBox->setCurrentItem(pChannel->instrumentNr());
125
126 // MIDI input device...
127 qsamplerDevice midiDevice(m_pChannel->client(),
128 qsamplerDevice::Midi, m_pChannel->midiDevice());
129 // MIDI input driver...
130 QString sMidiDriver = midiDevice.driverName();
131 if (sMidiDriver.isEmpty() || bNew)
132 sMidiDriver = pOptions->sMidiDriver;
133 if (!sMidiDriver.isEmpty()) {
134 if (MidiDriverComboBox->listBox()->findItem(sMidiDriver, Qt::ExactMatch) == NULL)
135 MidiDriverComboBox->insertItem(sMidiDriver);
136 MidiDriverComboBox->setCurrentText(sMidiDriver);
137 }
138 selectMidiDriver(sMidiDriver);
139 if (!bNew)
140 MidiDeviceComboBox->setCurrentText(midiDevice.deviceName());
141 selectMidiDevice(MidiDeviceComboBox->currentItem());
142 // MIDI input port...
143 MidiPortSpinBox->setValue(pChannel->midiPort());
144 // MIDI input channel...
145 int iMidiChannel = pChannel->midiChannel();
146 // When new, try to suggest a sensible MIDI channel...
147 if (iMidiChannel < 0)
148 iMidiChannel = (::lscp_get_channels(m_pChannel->client()) % 16);
149 MidiChannelComboBox->setCurrentItem(iMidiChannel);
150
151 // Audio output device...
152 qsamplerDevice audioDevice(m_pChannel->client(),
153 qsamplerDevice::Audio, m_pChannel->audioDevice());
154 // Audio output driver...
155 QString sAudioDriver = audioDevice.driverName();
156 if (sAudioDriver.isEmpty() || bNew)
157 sAudioDriver = pOptions->sAudioDriver;
158 if (!sAudioDriver.isEmpty()) {
159 if (AudioDriverComboBox->listBox()->findItem(sAudioDriver, Qt::ExactMatch) == NULL)
160 AudioDriverComboBox->insertItem(sAudioDriver);
161 AudioDriverComboBox->setCurrentText(sAudioDriver);
162 }
163 selectAudioDriver(sAudioDriver);
164 if (!bNew)
165 AudioDeviceComboBox->setCurrentText(audioDevice.deviceName());
166 selectAudioDevice(AudioDeviceComboBox->currentItem());
167
168 // As convenient, make it ready on stabilizeForm() for
169 // prompt acceptance, if we got the minimum required...
170 if (sEngineName != qsamplerChannel::noEngineName() &&
171 sInstrumentFile != qsamplerChannel::noInstrumentName())
172 m_iDirtyCount++;
173 // FIXME: These are better leave disabled...
174 MidiPortTextLabel->setEnabled(false);
175 MidiPortSpinBox->setEnabled(false);
176 // Done.
177 m_iDirtySetup--;
178 stabilizeForm();
179 }
180
181
182 // Accept settings (OK button slot).
183 void qsamplerChannelForm::accept (void)
184 {
185 if (m_pChannel == NULL)
186 return;
187
188 qsamplerOptions *pOptions = m_pChannel->options();
189 if (pOptions == NULL)
190 return;
191
192 // We'll go for it!
193 if (m_iDirtyCount > 0) {
194 int iErrors = 0;
195 // Are we a new channel?
196 if (!m_pChannel->addChannel())
197 iErrors++;
198 // Accept Audio driver or device selection...
199 if (m_audioDevices.isEmpty()) {
200 if (!m_pChannel->setAudioDriver(AudioDriverComboBox->currentText()))
201 iErrors++;
202 } else {
203 qsamplerDevice *pDevice = m_audioDevices.at(AudioDeviceComboBox->currentItem());
204 if (pDevice == NULL)
205 iErrors++;
206 else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))
207 iErrors++;
208 }
209 // Accept MIDI driver or device selection...
210 if (m_midiDevices.isEmpty()) {
211 if (!m_pChannel->setMidiDriver(MidiDriverComboBox->currentText()))
212 iErrors++;
213 } else {
214 qsamplerDevice *pDevice = m_midiDevices.at(MidiDeviceComboBox->currentItem());
215 if (pDevice == NULL)
216 iErrors++;
217 else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))
218 iErrors++;
219 }
220 // MIDI input port number...
221 if (!m_pChannel->setMidiPort(MidiPortSpinBox->value()))
222 iErrors++;
223 // MIDI input channel...
224 if (!m_pChannel->setMidiChannel(MidiChannelComboBox->currentItem()))
225 iErrors++;
226 // Engine name...
227 if (!m_pChannel->loadEngine(EngineNameComboBox->currentText()))
228 iErrors++;
229 // Instrument file and index...
230 if (!m_pChannel->loadInstrument(InstrumentFileComboBox->currentText(), InstrumentNrComboBox->currentItem()))
231 iErrors++;
232 // Show error messages?
233 if (iErrors > 0)
234 m_pChannel->appendMessagesError(tr("Some channel settings could not be set.\n\nSorry."));
235 }
236
237 // Save default engine name, instrument directory and history...
238 pOptions->sInstrumentDir = QFileInfo(InstrumentFileComboBox->currentText()).dirPath(true);
239 pOptions->sEngineName = EngineNameComboBox->currentText();
240 pOptions->sAudioDriver = AudioDriverComboBox->currentText();
241 pOptions->sMidiDriver = MidiDriverComboBox->currentText();
242 pOptions->saveComboBoxHistory(InstrumentFileComboBox);
243
244 // Just go with dialog acceptance.
245 QDialog::accept();
246 }
247
248
249 // Reject settings (Cancel button slot).
250 void qsamplerChannelForm::reject (void)
251 {
252 bool bReject = true;
253
254 // Check if there's any pending changes...
255 if (m_iDirtyCount > 0 && OkPushButton->isEnabled()) {
256 switch (QMessageBox::warning(this, tr("Warning"),
257 tr("Some channel settings have been changed.\n\n"
258 "Do you want to apply the changes?"),
259 tr("Apply"), tr("Discard"), tr("Cancel"))) {
260 case 0: // Apply...
261 accept();
262 return;
263 case 1: // Discard
264 break;
265 default: // Cancel.
266 bReject = false;
267 }
268 }
269
270 if (bReject)
271 QDialog::reject();
272 }
273
274
275 // Browse and open an instrument file.
276 void qsamplerChannelForm::openInstrumentFile (void)
277 {
278 qsamplerOptions *pOptions = m_pChannel->options();
279 if (pOptions == NULL)
280 return;
281
282 // FIXME: the instrument file filters should be restricted,
283 // depending on the current engine.
284 QString sInstrumentFile = QFileDialog::getOpenFileName(
285 pOptions->sInstrumentDir, // Start here.
286 tr("Instrument files") + " (*.gig *.dls)", // Filter (GIG and DLS files)
287 this, 0, // Parent and name (none)
288 tr("Instrument files") // Caption.
289 );
290
291 if (sInstrumentFile.isEmpty())
292 return;
293
294 InstrumentFileComboBox->setCurrentText(sInstrumentFile);
295 }
296
297
298 // Refresh the actual instrument name.
299 void qsamplerChannelForm::updateInstrumentName (void)
300 {
301 qsamplerOptions *pOptions = m_pChannel->options();
302 if (pOptions == NULL)
303 return;
304
305 // Finally this better idea would be to use libgig
306 // to retrieve the REAL instrument names.
307 InstrumentNrComboBox->clear();
308 InstrumentNrComboBox->insertStringList(
309 qsamplerChannel::getInstrumentList(
310 InstrumentFileComboBox->currentText(),
311 pOptions->bInstrumentNames)
312 );
313
314 optionsChanged();
315 }
316
317
318 // Refresh MIDI device options.
319 void qsamplerChannelForm::selectMidiDriver ( const QString& sMidiDriver )
320 {
321 const QString sDriverName = sMidiDriver.upper();
322
323 MidiDeviceComboBox->clear();
324 m_audioDevices.clear();
325
326 const QPixmap& midiPixmap = QPixmap::fromMimeSource("midi2.png");
327 int *piDeviceIDs = qsamplerDevice::getDevices(m_pChannel->client(),
328 qsamplerDevice::Midi);
329 for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
330 qsamplerDevice *pDevice = new qsamplerDevice(m_pChannel->client(),
331 qsamplerDevice::Midi, piDeviceIDs[i]);
332 if (pDevice->driverName().upper() == sDriverName) {
333 MidiDeviceComboBox->insertItem(midiPixmap, pDevice->deviceName());
334 m_midiDevices.append(pDevice);
335 } else {
336 delete pDevice;
337 }
338 }
339
340 bool bEnabled = !m_midiDevices.isEmpty();
341 if (!bEnabled)
342 MidiDeviceComboBox->insertItem(tr("(New MIDI device)"));
343 MidiDeviceTextLabel->setEnabled(bEnabled);
344 MidiDeviceComboBox->setEnabled(bEnabled);
345 optionsChanged();
346 }
347
348
349 // Select MIDI device options.
350 void qsamplerChannelForm::selectMidiDevice ( int iMidiItem )
351 {
352 qsamplerDevice *pDevice = m_midiDevices.at(iMidiItem);
353 if (pDevice) {
354 const qsamplerDeviceParamMap& params = pDevice->params();
355 int iPorts = params["PORTS"].value.toInt();
356 MidiPortTextLabel->setEnabled(iPorts > 0);
357 MidiPortSpinBox->setEnabled(iPorts > 0);
358 if (iPorts > 0)
359 MidiPortSpinBox->setMaxValue(iPorts - 1);
360 }
361 optionsChanged();
362 }
363
364
365 // Refresh Audio device options.
366 void qsamplerChannelForm::selectAudioDriver ( const QString& sAudioDriver )
367 {
368 const QString sDriverName = sAudioDriver.upper();
369
370 AudioDeviceComboBox->clear();
371 m_audioDevices.clear();
372
373 const QPixmap& audioPixmap = QPixmap::fromMimeSource("audio2.png");
374 int *piDeviceIDs = qsamplerDevice::getDevices(m_pChannel->client(),
375 qsamplerDevice::Audio);
376 for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
377 qsamplerDevice *pDevice = new qsamplerDevice(m_pChannel->client(),
378 qsamplerDevice::Audio, piDeviceIDs[i]);
379 if (pDevice->driverName().upper() == sDriverName) {
380 AudioDeviceComboBox->insertItem(audioPixmap, pDevice->deviceName());
381 m_audioDevices.append(pDevice);
382 } else {
383 delete pDevice;
384 }
385 }
386
387 bool bEnabled = !m_audioDevices.isEmpty();
388 if (!bEnabled)
389 AudioDeviceComboBox->insertItem(tr("(New Audio device)"));
390 AudioDeviceTextLabel->setEnabled(bEnabled);
391 AudioDeviceComboBox->setEnabled(bEnabled);
392 optionsChanged();
393 }
394
395
396 // Select Audio device options.
397 void qsamplerChannelForm::selectAudioDevice ( int iAudioItem )
398 {
399 qsamplerDevice *pDevice = m_audioDevices.at(iAudioItem);
400 if (pDevice) {
401 // Is there anything to do here?
402 }
403 optionsChanged();
404 }
405
406
407 // Dirty up settings.
408 void qsamplerChannelForm::optionsChanged (void)
409 {
410 if (m_iDirtySetup > 0)
411 return;
412
413 m_iDirtyCount++;
414 stabilizeForm();
415 }
416
417
418 // Stabilize current form state.
419 void qsamplerChannelForm::stabilizeForm (void)
420 {
421 const QString& sFilename = InstrumentFileComboBox->currentText();
422 OkPushButton->setEnabled(m_iDirtyCount > 0 && !sFilename.isEmpty() && QFileInfo(sFilename).exists());
423 }
424
425
426 // end of qsamplerChannelForm.ui.h
427

  ViewVC Help
Powered by ViewVC