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

Contents of /qsampler/trunk/src/qsamplerChannel.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1402 - (show annotations) (download)
Fri Oct 12 00:03:27 2007 UTC (16 years, 6 months ago) by schoenebeck
File size: 28207 byte(s)
* added support for escape sequences in LSCP response fields
* bugfix in escaping file names for LSCP: characters with an one digit hex
  code caused a space (i.e. "\x a" instead of "\x0a")

1 // qsamplerChannel.cpp
2 //
3 /****************************************************************************
4 Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 *****************************************************************************/
21
22 #include "qsamplerUtilities.h"
23 #include "qsamplerAbout.h"
24 #include "qsamplerChannel.h"
25
26 #include "qsamplerMainForm.h"
27 #include "qsamplerChannelForm.h"
28
29 #include <qfileinfo.h>
30 #include <qcombobox.h>
31
32 #ifdef CONFIG_LIBGIG
33 #include "gig.h"
34 #endif
35
36 #define QSAMPLER_INSTRUMENT_MAX 100
37
38
39 //-------------------------------------------------------------------------
40 // qsamplerChannel - Sampler channel structure.
41 //
42
43 // Constructor.
44 qsamplerChannel::qsamplerChannel ( int iChannelID )
45 {
46 m_iChannelID = iChannelID;
47
48 // m_sEngineName = noEngineName();
49 // m_sInstrumentName = noInstrumentName();
50 // m_sInstrumentFile = m_sInstrumentName;
51 m_iInstrumentNr = -1;
52 m_iInstrumentStatus = -1;
53 m_sMidiDriver = "ALSA";
54 m_iMidiDevice = -1;
55 m_iMidiPort = -1;
56 m_iMidiChannel = -1;
57 m_iMidiMap = -1;
58 m_sAudioDriver = "ALSA";
59 m_iAudioDevice = -1;
60 m_fVolume = 0.0;
61 m_bMute = false;
62 m_bSolo = false;
63 }
64
65 // Default destructor.
66 qsamplerChannel::~qsamplerChannel (void)
67 {
68 }
69
70
71 // Create a new sampler channel, if not already.
72 bool qsamplerChannel::addChannel (void)
73 {
74 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
75 if (pMainForm == NULL)
76 return false;
77 if (pMainForm->client() == NULL)
78 return false;
79
80 // Are we a new channel?
81 if (m_iChannelID < 0) {
82 m_iChannelID = ::lscp_add_channel(pMainForm->client());
83 if (m_iChannelID < 0) {
84 appendMessagesClient("lscp_add_channel");
85 appendMessagesError(
86 QObject::tr("Could not add channel.\n\nSorry."));
87 } // Otherwise it's created...
88 else appendMessages(QObject::tr("added."));
89 }
90
91 // Return whether we're a valid channel...
92 return (m_iChannelID >= 0);
93 }
94
95
96 // Remove sampler channel.
97 bool qsamplerChannel::removeChannel (void)
98 {
99 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
100 if (pMainForm == NULL)
101 return false;
102 if (pMainForm->client() == NULL)
103 return false;
104
105 // Are we an existing channel?
106 if (m_iChannelID >= 0) {
107 if (::lscp_remove_channel(pMainForm->client(), m_iChannelID) != LSCP_OK) {
108 appendMessagesClient("lscp_remove_channel");
109 appendMessagesError(QObject::tr("Could not remove channel.\n\nSorry."));
110 } else {
111 // Otherwise it's removed.
112 appendMessages(QObject::tr("removed."));
113 m_iChannelID = -1;
114 }
115 }
116
117 // Return whether we've removed the channel...
118 return (m_iChannelID < 0);
119 }
120
121
122 // Channel-ID (aka Sammpler-Channel) accessors.
123 int qsamplerChannel::channelID (void) const
124 {
125 return m_iChannelID;
126 }
127
128 void qsamplerChannel::setChannelID ( int iChannelID )
129 {
130 m_iChannelID = iChannelID;
131 }
132
133
134 // Readable channel name.
135 QString qsamplerChannel::channelName (void) const
136 {
137 return (m_iChannelID < 0 ? QObject::tr("New Channel") : QObject::tr("Channel %1").arg(m_iChannelID));
138 }
139
140
141 // Engine name accessors.
142 const QString& qsamplerChannel::engineName (void) const
143 {
144 return m_sEngineName;
145 }
146
147 bool qsamplerChannel::loadEngine ( const QString& sEngineName )
148 {
149 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
150 if (pMainForm == NULL)
151 return false;
152 if (pMainForm->client() == NULL || m_iChannelID < 0)
153 return false;
154 if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)
155 return true;
156
157 if (::lscp_load_engine(pMainForm->client(), sEngineName.latin1(), m_iChannelID) != LSCP_OK) {
158 appendMessagesClient("lscp_load_engine");
159 return false;
160 }
161
162 appendMessages(QObject::tr("Engine: %1.").arg(sEngineName));
163
164 m_sEngineName = sEngineName;
165 return true;
166 }
167
168
169 // Instrument filename accessor.
170 const QString& qsamplerChannel::instrumentFile (void) const
171 {
172 return m_sInstrumentFile;
173 }
174
175 // Instrument index accessor.
176 int qsamplerChannel::instrumentNr (void) const
177 {
178 return m_iInstrumentNr;
179 }
180
181 // Instrument name accessor.
182 const QString& qsamplerChannel::instrumentName (void) const
183 {
184 return m_sInstrumentName;
185 }
186
187 // Instrument status accessor.
188 int qsamplerChannel::instrumentStatus (void) const
189 {
190 return m_iInstrumentStatus;
191 }
192
193 // Instrument file loader.
194 bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
195 {
196 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
197 if (pMainForm == NULL)
198 return false;
199 if (pMainForm->client() == NULL || m_iChannelID < 0)
200 return false;
201 if (!isInstrumentFile(sInstrumentFile))
202 return false;
203 if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)
204 return true;
205
206 if (
207 ::lscp_load_instrument_non_modal(
208 pMainForm->client(),
209 qsamplerUtilities::lscpEscapePath(sInstrumentFile).latin1(),
210 iInstrumentNr, m_iChannelID
211 ) != LSCP_OK
212 ) {
213 appendMessagesClient("lscp_load_instrument");
214 return false;
215 }
216
217 appendMessages(QObject::tr("Instrument: \"%1\" (%2).")
218 .arg(sInstrumentFile).arg(iInstrumentNr));
219
220 return setInstrument(sInstrumentFile, iInstrumentNr);
221 }
222
223
224 // Special instrument file/name/number settler.
225 bool qsamplerChannel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
226 {
227 m_sInstrumentFile = sInstrumentFile;
228 m_iInstrumentNr = iInstrumentNr;
229 #ifdef CONFIG_INSTRUMENT_NAME
230 m_sInstrumentName = QString::null; // We'll get it, maybe later, on channel_info...
231 #else
232 m_sInstrumentName = getInstrumentName(sInstrumentFile, iInstrumentNr, true);
233 #endif
234 m_iInstrumentStatus = 0;
235
236 return true;
237 }
238
239
240 // MIDI driver type accessors (DEPRECATED).
241 const QString& qsamplerChannel::midiDriver (void) const
242 {
243 return m_sMidiDriver;
244 }
245
246 bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )
247 {
248 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
249 if (pMainForm == NULL)
250 return false;
251 if (pMainForm->client() == NULL || m_iChannelID < 0)
252 return false;
253 if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)
254 return true;
255
256 if (::lscp_set_channel_midi_type(pMainForm->client(), m_iChannelID, sMidiDriver.latin1()) != LSCP_OK) {
257 appendMessagesClient("lscp_set_channel_midi_type");
258 return false;
259 }
260
261 appendMessages(QObject::tr("MIDI driver: %1.").arg(sMidiDriver));
262
263 m_sMidiDriver = sMidiDriver;
264 return true;
265 }
266
267
268 // MIDI device accessors.
269 int qsamplerChannel::midiDevice (void) const
270 {
271 return m_iMidiDevice;
272 }
273
274 bool qsamplerChannel::setMidiDevice ( int iMidiDevice )
275 {
276 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
277 if (pMainForm == NULL)
278 return false;
279 if (pMainForm->client() == NULL || m_iChannelID < 0)
280 return false;
281 if (m_iInstrumentStatus == 100 && m_iMidiDevice == iMidiDevice)
282 return true;
283
284 if (::lscp_set_channel_midi_device(pMainForm->client(), m_iChannelID, iMidiDevice) != LSCP_OK) {
285 appendMessagesClient("lscp_set_channel_midi_device");
286 return false;
287 }
288
289 appendMessages(QObject::tr("MIDI device: %1.").arg(iMidiDevice));
290
291 m_iMidiDevice = iMidiDevice;
292 return true;
293 }
294
295
296 // MIDI port number accessor.
297 int qsamplerChannel::midiPort (void) const
298 {
299 return m_iMidiPort;
300 }
301
302 bool qsamplerChannel::setMidiPort ( int iMidiPort )
303 {
304 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
305 if (pMainForm == NULL)
306 return false;
307 if (pMainForm->client() == NULL || m_iChannelID < 0)
308 return false;
309 if (m_iInstrumentStatus == 100 && m_iMidiPort == iMidiPort)
310 return true;
311
312 if (::lscp_set_channel_midi_port(pMainForm->client(), m_iChannelID, iMidiPort) != LSCP_OK) {
313 appendMessagesClient("lscp_set_channel_midi_port");
314 return false;
315 }
316
317 appendMessages(QObject::tr("MIDI port: %1.").arg(iMidiPort));
318
319 m_iMidiPort = iMidiPort;
320 return true;
321 }
322
323
324 // MIDI channel accessor.
325 int qsamplerChannel::midiChannel (void) const
326 {
327 return m_iMidiChannel;
328 }
329
330 bool qsamplerChannel::setMidiChannel ( int iMidiChannel )
331 {
332 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
333 if (pMainForm == NULL)
334 return false;
335 if (pMainForm->client() == NULL || m_iChannelID < 0)
336 return false;
337 if (m_iInstrumentStatus == 100 && m_iMidiChannel == iMidiChannel)
338 return true;
339
340 if (::lscp_set_channel_midi_channel(pMainForm->client(), m_iChannelID, iMidiChannel) != LSCP_OK) {
341 appendMessagesClient("lscp_set_channel_midi_channel");
342 return false;
343 }
344
345 appendMessages(QObject::tr("MIDI channel: %1.").arg(iMidiChannel));
346
347 m_iMidiChannel = iMidiChannel;
348 return true;
349 }
350
351
352 // MIDI instrument map accessor.
353 int qsamplerChannel::midiMap (void) const
354 {
355 return m_iMidiMap;
356 }
357
358 bool qsamplerChannel::setMidiMap ( int iMidiMap )
359 {
360 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
361 if (pMainForm == NULL)
362 return false;
363 if (pMainForm->client() == NULL || m_iChannelID < 0)
364 return false;
365 if (m_iInstrumentStatus == 100 && m_iMidiMap == iMidiMap)
366 return true;
367 #ifdef CONFIG_MIDI_INSTRUMENT
368 if (::lscp_set_channel_midi_map(pMainForm->client(), m_iChannelID, iMidiMap) != LSCP_OK) {
369 appendMessagesClient("lscp_set_channel_midi_map");
370 return false;
371 }
372 #endif
373 appendMessages(QObject::tr("MIDI map: %1.").arg(iMidiMap));
374
375 m_iMidiMap = iMidiMap;
376 return true;
377 }
378
379
380 // Audio device accessor.
381 int qsamplerChannel::audioDevice (void) const
382 {
383 return m_iAudioDevice;
384 }
385
386 bool qsamplerChannel::setAudioDevice ( int iAudioDevice )
387 {
388 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
389 if (pMainForm == NULL)
390 return false;
391 if (pMainForm->client() == NULL || m_iChannelID < 0)
392 return false;
393 if (m_iInstrumentStatus == 100 && m_iAudioDevice == iAudioDevice)
394 return true;
395
396 if (::lscp_set_channel_audio_device(pMainForm->client(), m_iChannelID, iAudioDevice) != LSCP_OK) {
397 appendMessagesClient("lscp_set_channel_audio_device");
398 return false;
399 }
400
401 appendMessages(QObject::tr("Audio device: %1.").arg(iAudioDevice));
402
403 m_iAudioDevice = iAudioDevice;
404 return true;
405 }
406
407
408 // Audio driver type accessors (DEPRECATED).
409 const QString& qsamplerChannel::audioDriver (void) const
410 {
411 return m_sAudioDriver;
412 }
413
414 bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )
415 {
416 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
417 if (pMainForm == NULL)
418 return false;
419 if (pMainForm->client() == NULL || m_iChannelID < 0)
420 return false;
421 if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)
422 return true;
423
424 if (::lscp_set_channel_audio_type(pMainForm->client(), m_iChannelID, sAudioDriver.latin1()) != LSCP_OK) {
425 appendMessagesClient("lscp_set_channel_audio_type");
426 return false;
427 }
428
429 appendMessages(QObject::tr("Audio driver: %1.").arg(sAudioDriver));
430
431 m_sAudioDriver = sAudioDriver;
432 return true;
433 }
434
435
436 // Channel volume accessors.
437 float qsamplerChannel::volume (void) const
438 {
439 return m_fVolume;
440 }
441
442 bool qsamplerChannel::setVolume ( float fVolume )
443 {
444 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
445 if (pMainForm == NULL)
446 return false;
447 if (pMainForm->client() == NULL || m_iChannelID < 0)
448 return false;
449 if (m_iInstrumentStatus == 100 && m_fVolume == fVolume)
450 return true;
451
452 if (::lscp_set_channel_volume(pMainForm->client(), m_iChannelID, fVolume) != LSCP_OK) {
453 appendMessagesClient("lscp_set_channel_volume");
454 return false;
455 }
456
457 appendMessages(QObject::tr("Volume: %1.").arg(fVolume));
458
459 m_fVolume = fVolume;
460 return true;
461 }
462
463
464 // Sampler channel mute state.
465 bool qsamplerChannel::channelMute (void) const
466 {
467 return m_bMute;
468 }
469
470 bool qsamplerChannel::setChannelMute ( bool bMute )
471 {
472 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
473 if (pMainForm == NULL)
474 return false;
475 if (pMainForm->client() == NULL || m_iChannelID < 0)
476 return false;
477 if (m_iInstrumentStatus == 100 && ((m_bMute && bMute) || (!m_bMute && !bMute)))
478 return true;
479
480 #ifdef CONFIG_MUTE_SOLO
481 if (::lscp_set_channel_mute(pMainForm->client(), m_iChannelID, bMute) != LSCP_OK) {
482 appendMessagesClient("lscp_set_channel_mute");
483 return false;
484 }
485 appendMessages(QObject::tr("Mute: %1.").arg((int) bMute));
486 m_bMute = bMute;
487 return true;
488 #else
489 return false;
490 #endif
491 }
492
493
494 // Sampler channel solo state.
495 bool qsamplerChannel::channelSolo (void) const
496 {
497 return m_bSolo;
498 }
499
500 bool qsamplerChannel::setChannelSolo ( bool bSolo )
501 {
502 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
503 if (pMainForm == NULL)
504 return false;
505 if (pMainForm->client() == NULL || m_iChannelID < 0)
506 return false;
507 if (m_iInstrumentStatus == 100 && ((m_bSolo && bSolo) || (!m_bSolo && !bSolo)))
508 return true;
509
510 #ifdef CONFIG_MUTE_SOLO
511 if (::lscp_set_channel_solo(pMainForm->client(), m_iChannelID, bSolo) != LSCP_OK) {
512 appendMessagesClient("lscp_set_channel_solo");
513 return false;
514 }
515 appendMessages(QObject::tr("Solo: %1.").arg((int) bSolo));
516 m_bSolo = bSolo;
517 return true;
518 #else
519 return false;
520 #endif
521 }
522
523
524 // Audio routing accessors.
525 int qsamplerChannel::audioChannel ( int iAudioOut ) const
526 {
527 return m_audioRouting[iAudioOut];
528 }
529
530 bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )
531 {
532 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
533 if (pMainForm == NULL)
534 return false;
535 if (pMainForm->client() == NULL || m_iChannelID < 0)
536 return false;
537 if (m_iInstrumentStatus == 100 &&
538 m_audioRouting[iAudioOut] == iAudioIn)
539 return true;
540
541 if (::lscp_set_channel_audio_channel(pMainForm->client(),
542 m_iChannelID, iAudioOut, iAudioIn) != LSCP_OK) {
543 appendMessagesClient("lscp_set_channel_audio_channel");
544 return false;
545 }
546
547 appendMessages(QObject::tr("Audio Channel: %1 -> %2.")
548 .arg(iAudioOut).arg(iAudioIn));
549
550 m_audioRouting[iAudioOut] = iAudioIn;
551 return true;
552 }
553
554 // The audio routing map itself.
555 const qsamplerChannelRoutingMap& qsamplerChannel::audioRouting (void) const
556 {
557 return m_audioRouting;
558 }
559
560
561 // Istrument name remapper.
562 void qsamplerChannel::updateInstrumentName (void)
563 {
564 #ifndef CONFIG_INSTRUMENT_NAME
565 m_sInstrumentName = getInstrumentName(m_sInstrumentFile,
566 m_iInstrumentNr, (options() && options()->bInstrumentNames));
567 #endif
568 }
569
570
571 // Update whole channel info state.
572 bool qsamplerChannel::updateChannelInfo (void)
573 {
574 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
575 if (pMainForm == NULL)
576 return false;
577 if (pMainForm->client() == NULL || m_iChannelID < 0)
578 return false;
579
580 // Read channel information.
581 lscp_channel_info_t *pChannelInfo = ::lscp_get_channel_info(pMainForm->client(), m_iChannelID);
582 if (pChannelInfo == NULL) {
583 appendMessagesClient("lscp_get_channel_info");
584 appendMessagesError(QObject::tr("Could not get channel information.\n\nSorry."));
585 return false;
586 }
587
588 #ifdef CONFIG_INSTRUMENT_NAME
589 // We got all actual instrument datum...
590 m_sInstrumentFile =
591 qsamplerUtilities::lscpEscapedPathToPosix(pChannelInfo->instrument_file);
592 m_iInstrumentNr = pChannelInfo->instrument_nr;
593 m_sInstrumentName =
594 qsamplerUtilities::lscpEscapedTextToRaw(pChannelInfo->instrument_name);
595 #else
596 // First, check if intrument name has changed,
597 // taking care that instrument name lookup might be expensive,
598 // so we better make it only once and when really needed...
599 if ((m_sInstrumentFile != pChannelInfo->instrument_file) ||
600 (m_iInstrumentNr != pChannelInfo->instrument_nr)) {
601 m_sInstrumentFile = pChannelInfo->instrument_file;
602 m_iInstrumentNr = pChannelInfo->instrument_nr;
603 updateInstrumentName();
604 }
605 #endif
606 // Cache in other channel information.
607 m_sEngineName = pChannelInfo->engine_name;
608 m_iInstrumentStatus = pChannelInfo->instrument_status;
609 m_iMidiDevice = pChannelInfo->midi_device;
610 m_iMidiPort = pChannelInfo->midi_port;
611 m_iMidiChannel = pChannelInfo->midi_channel;
612 #ifdef CONFIG_MIDI_INSTRUMENT
613 m_iMidiMap = pChannelInfo->midi_map;
614 #endif
615 m_iAudioDevice = pChannelInfo->audio_device;
616 m_fVolume = pChannelInfo->volume;
617 #ifdef CONFIG_MUTE_SOLO
618 m_bMute = pChannelInfo->mute;
619 m_bSolo = pChannelInfo->solo;
620 #endif
621 // Some sanity checks.
622 if (m_sEngineName == "NONE" || m_sEngineName.isEmpty())
623 m_sEngineName = QString::null;
624 if (m_sInstrumentFile == "NONE" || m_sInstrumentFile.isEmpty()) {
625 m_sInstrumentFile = QString::null;
626 m_sInstrumentName = QString::null;
627 }
628
629 // Time for device info grabbing...
630 lscp_device_info_t *pDeviceInfo;
631 const QString sNone = QObject::tr("(none)");
632 // Audio device driver type.
633 pDeviceInfo = ::lscp_get_audio_device_info(pMainForm->client(), m_iAudioDevice);
634 if (pDeviceInfo == NULL) {
635 appendMessagesClient("lscp_get_audio_device_info");
636 m_sAudioDriver = sNone;
637 } else {
638 m_sAudioDriver = pDeviceInfo->driver;
639 }
640 // MIDI device driver type.
641 pDeviceInfo = ::lscp_get_midi_device_info(pMainForm->client(), m_iMidiDevice);
642 if (pDeviceInfo == NULL) {
643 appendMessagesClient("lscp_get_midi_device_info");
644 m_sMidiDriver = sNone;
645 } else {
646 m_sMidiDriver = pDeviceInfo->driver;
647 }
648
649 // Set the audio routing map.
650 m_audioRouting.clear();
651 #ifdef CONFIG_AUDIO_ROUTING
652 int *piAudioRouting = pChannelInfo->audio_routing;
653 for (int i = 0; piAudioRouting && piAudioRouting[i] >= 0; i++)
654 m_audioRouting[i] = piAudioRouting[i];
655 #else
656 char **ppszAudioRouting = pChannelInfo->audio_routing;
657 for (int i = 0; ppszAudioRouting && ppszAudioRouting[i]; i++)
658 m_audioRouting[i] = ::atoi(ppszAudioRouting[i]);
659 #endif
660
661 return true;
662 }
663
664
665 // Reset channel method.
666 bool qsamplerChannel::channelReset (void)
667 {
668 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
669 if (pMainForm == NULL)
670 return false;
671 if (pMainForm->client() == NULL || m_iChannelID < 0)
672 return false;
673
674 if (::lscp_reset_channel(pMainForm->client(), m_iChannelID) != LSCP_OK) {
675 appendMessagesClient("lscp_reset_channel");
676 return false;
677 }
678
679 appendMessages(QObject::tr("reset."));
680
681 return true;
682 }
683
684
685 // Spawn instrument editor method.
686 bool qsamplerChannel::editChannel (void)
687 {
688 #ifdef CONFIG_EDIT_INSTRUMENT
689
690 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
691 if (pMainForm == NULL)
692 return false;
693 if (pMainForm->client() == NULL || m_iChannelID < 0)
694 return false;
695
696 if (::lscp_edit_instrument(pMainForm->client(), m_iChannelID) != LSCP_OK) {
697 appendMessagesClient("lscp_edit_instrument");
698 appendMessagesError(QObject::tr(
699 "Could not launch an appropriate instrument editor "
700 "for the given instrument!\n"
701 "Make sure you have an appropriate "
702 "instrument editor like 'gigedit' installed\n"
703 "and that it placed its mandatory DLL file "
704 "into the sampler's plugin directory.")
705 );
706 return false;
707 }
708
709 appendMessages(QObject::tr("edit instrument."));
710
711 return true;
712
713 #else
714
715 appendMessagesError(QObject::tr(
716 "Sorry, QSampler was compiled for a version of liblscp "
717 "which lacks this feature.\n"
718 "You may want to update liblscp and recompile QSampler afterwards.")
719 );
720
721 return false;
722
723 #endif
724 }
725
726
727 // Channel setup dialog form.
728 bool qsamplerChannel::channelSetup ( QWidget *pParent )
729 {
730 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
731 if (pMainForm == NULL)
732 return false;
733
734 bool bResult = false;
735
736 appendMessages(QObject::tr("setup..."));
737
738 qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(pParent);
739 if (pChannelForm) {
740 pChannelForm->setup(this);
741 bResult = pChannelForm->exec();
742 delete pChannelForm;
743 }
744
745 return bResult;
746 }
747
748
749 // Redirected messages output methods.
750 void qsamplerChannel::appendMessages( const QString& s ) const
751 {
752 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
753 if (pMainForm)
754 pMainForm->appendMessages(channelName() + ' ' + s);
755 }
756
757 void qsamplerChannel::appendMessagesColor( const QString& s,
758 const QString& c ) const
759 {
760 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
761 if (pMainForm)
762 pMainForm->appendMessagesColor(channelName() + ' ' + s, c);
763 }
764
765 void qsamplerChannel::appendMessagesText( const QString& s ) const
766 {
767 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
768 if (pMainForm)
769 pMainForm->appendMessagesText(channelName() + ' ' + s);
770 }
771
772 void qsamplerChannel::appendMessagesError( const QString& s ) const
773 {
774 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
775 if (pMainForm)
776 pMainForm->appendMessagesError(channelName() + "\n\n" + s);
777 }
778
779 void qsamplerChannel::appendMessagesClient( const QString& s ) const
780 {
781 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
782 if (pMainForm)
783 pMainForm->appendMessagesClient(channelName() + ' ' + s);
784 }
785
786
787 // Context menu event handler.
788 void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )
789 {
790 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
791 if (pMainForm)
792 pMainForm->contextMenuEvent(pEvent);
793 }
794
795
796 // FIXME: Check whether a given file is an instrument file.
797 bool qsamplerChannel::isInstrumentFile ( const QString& sInstrumentFile )
798 {
799 bool bResult = false;
800
801 QFile file(sInstrumentFile);
802 if (file.open(IO_ReadOnly)) {
803 char achHeader[16];
804 if (file.readBlock(achHeader, 16)) {
805 bResult = (::memcmp(&achHeader[0], "RIFF", 4) == 0
806 && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);
807 }
808 file.close();
809 }
810
811 return bResult;
812 }
813
814
815 // Retrieve the instrument list of a instrument file (.gig).
816 QStringList qsamplerChannel::getInstrumentList( const QString& sInstrumentFile,
817 bool bInstrumentNames )
818 {
819 QString sInstrumentName = QFileInfo(sInstrumentFile).fileName();
820 QStringList instlist;
821
822 if (isInstrumentFile(sInstrumentFile)) {
823 #ifdef CONFIG_LIBGIG
824 if (bInstrumentNames) {
825 RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());
826 gig::File *pGig = new gig::File(pRiff);
827 gig::Instrument *pInstrument = pGig->GetFirstInstrument();
828 while (pInstrument) {
829 instlist.append((pInstrument->pInfo)->Name.c_str());
830 pInstrument = pGig->GetNextInstrument();
831 }
832 delete pGig;
833 delete pRiff;
834 }
835 else
836 #endif
837 for (int iInstrumentNr = 0; iInstrumentNr < QSAMPLER_INSTRUMENT_MAX; iInstrumentNr++)
838 instlist.append(sInstrumentName + " [" + QString::number(iInstrumentNr) + "]");
839 }
840 else instlist.append(noInstrumentName());
841
842 return instlist;
843 }
844
845
846 // Retrieve the spacific instrument name of a instrument file (.gig), given its index.
847 QString qsamplerChannel::getInstrumentName( const QString& sInstrumentFile,
848 int iInstrumentNr, bool bInstrumentNames )
849 {
850 QString sInstrumentName;
851
852 if (isInstrumentFile(sInstrumentFile)) {
853 sInstrumentName = QFileInfo(sInstrumentFile).fileName();
854 #ifdef CONFIG_LIBGIG
855 if (bInstrumentNames) {
856 RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());
857 gig::File *pGig = new gig::File(pRiff);
858 int iIndex = 0;
859 gig::Instrument *pInstrument = pGig->GetFirstInstrument();
860 while (pInstrument) {
861 if (iIndex == iInstrumentNr) {
862 sInstrumentName = (pInstrument->pInfo)->Name.c_str();
863 break;
864 }
865 iIndex++;
866 pInstrument = pGig->GetNextInstrument();
867 }
868 delete pGig;
869 delete pRiff;
870 }
871 else
872 #endif
873 sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";
874 }
875 else sInstrumentName = noInstrumentName();
876
877 return sInstrumentName;
878 }
879
880
881 // Common invalid name-helpers.
882 QString qsamplerChannel::noEngineName (void)
883 {
884 return QObject::tr("(No engine)");
885 }
886
887 QString qsamplerChannel::noInstrumentName (void)
888 {
889 return QObject::tr("(No instrument)");
890 }
891
892 QString qsamplerChannel::loadingInstrument (void) {
893 return QObject::tr("(Loading instrument...)");
894 }
895
896
897
898 //-------------------------------------------------------------------------
899 // qsamplerChannelRoutingTable - Channel routing table.
900 //
901
902 // Constructor.
903 qsamplerChannelRoutingTable::qsamplerChannelRoutingTable (
904 QWidget *pParent, const char *pszName )
905 : QTable(pParent, pszName)
906 {
907 // Set fixed number of columns.
908 QTable::setNumCols(2);
909 QTable::setShowGrid(false);
910 QTable::setSorting(false);
911 QTable::setFocusStyle(QTable::FollowStyle);
912 QTable::setSelectionMode(QTable::NoSelection);
913 // No vertical header.
914 QTable::verticalHeader()->hide();
915 QTable::setLeftMargin(0);
916 // Initialize the fixed table column headings.
917 QHeader *pHeader = QTable::horizontalHeader();
918 pHeader->setLabel(0, tr("Sampler Channel"));
919 pHeader->setLabel(1, tr("Device Channel"));
920 // Set read-onlyness of each column
921 QTable::setColumnReadOnly(0, true);
922 // QTable::setColumnReadOnly(1, false); -- of course not.
923 QTable::setColumnStretchable(1, true);
924 }
925
926 // Default destructor.
927 qsamplerChannelRoutingTable::~qsamplerChannelRoutingTable (void)
928 {
929 }
930
931
932 // Routing map table renderer.
933 void qsamplerChannelRoutingTable::refresh ( qsamplerDevice *pDevice,
934 const qsamplerChannelRoutingMap& routing )
935 {
936 if (pDevice == NULL)
937 return;
938
939 // Always (re)start it empty.
940 QTable::setUpdatesEnabled(false);
941 QTable::setNumRows(0);
942
943 // The common device port item list.
944 QStringList opts;
945 qsamplerDevicePortList& ports = pDevice->ports();
946 qsamplerDevicePort *pPort;
947 for (pPort = ports.first(); pPort; pPort = ports.next()) {
948 opts.append(pDevice->deviceTypeName()
949 + ' ' + pDevice->driverName()
950 + ' ' + pPort->portName());
951 }
952
953 // Those items shall have a proper pixmap...
954 QPixmap pmChannel = QPixmap::fromMimeSource("qsamplerChannel.png");
955 QPixmap pmDevice;
956 switch (pDevice->deviceType()) {
957 case qsamplerDevice::Audio:
958 pmDevice = QPixmap::fromMimeSource("audio2.png");
959 break;
960 case qsamplerDevice::Midi:
961 pmDevice = QPixmap::fromMimeSource("midi2.png");
962 break;
963 case qsamplerDevice::None:
964 break;
965 }
966
967 // Fill the routing table...
968 QTable::insertRows(0, routing.count());
969 int iRow = 0;
970 qsamplerChannelRoutingMap::ConstIterator iter;
971 for (iter = routing.begin(); iter != routing.end(); ++iter) {
972 QTable::setPixmap(iRow, 0, pmChannel);
973 QTable::setText(iRow, 0, pDevice->deviceTypeName()
974 + ' ' + QString::number(iter.key()));
975 qsamplerChannelRoutingComboBox *pComboItem =
976 new qsamplerChannelRoutingComboBox(this, opts, pmDevice);
977 pComboItem->setCurrentItem(iter.data());
978 QTable::setItem(iRow, 1, pComboItem);
979 ++iRow;
980 }
981
982 // Adjust optimal column widths.
983 QTable::adjustColumn(0);
984 QTable::adjustColumn(1);
985
986 QTable::setUpdatesEnabled(true);
987 QTable::updateContents();
988 }
989
990
991 // Commit any pending editing.
992 void qsamplerChannelRoutingTable::flush (void)
993 {
994 if (QTable::isEditing())
995 QTable::endEdit(QTable::currEditRow(), QTable::currEditCol(), true, true);
996 }
997
998
999 //-------------------------------------------------------------------------
1000 // qsamplerChannelRoutingComboBox - Custom combo box for routing table.
1001 //
1002
1003 // Constructor.
1004 qsamplerChannelRoutingComboBox::qsamplerChannelRoutingComboBox (
1005 QTable *pTable, const QStringList& list, const QPixmap& pixmap )
1006 : QTableItem(pTable, QTableItem::WhenCurrent, QString::null, pixmap),
1007 m_list(list)
1008 {
1009 m_iCurrentItem = 0;
1010 }
1011
1012 // Public accessors.
1013 void qsamplerChannelRoutingComboBox::setCurrentItem ( int iCurrentItem )
1014 {
1015 m_iCurrentItem = iCurrentItem;
1016
1017 QTableItem::setText(m_list[iCurrentItem]);
1018 }
1019
1020 int qsamplerChannelRoutingComboBox::currentItem (void) const
1021 {
1022 return m_iCurrentItem;
1023 }
1024
1025 // Virtual implemetations.
1026 QWidget *qsamplerChannelRoutingComboBox::createEditor (void) const
1027 {
1028 QComboBox *pComboBox = new QComboBox(QTableItem::table()->viewport());
1029 QObject::connect(pComboBox, SIGNAL(activated(int)),
1030 QTableItem::table(), SLOT(doValueChanged()));
1031 for (QStringList::ConstIterator iter = m_list.begin();
1032 iter != m_list.end(); iter++) {
1033 pComboBox->insertItem(QTableItem::pixmap(), *iter);
1034 }
1035 pComboBox->setCurrentItem(m_iCurrentItem);
1036 return pComboBox;
1037 }
1038
1039 void qsamplerChannelRoutingComboBox::setContentFromEditor ( QWidget *pWidget )
1040 {
1041 if (pWidget->inherits("QComboBox")) {
1042 QComboBox *pComboBox = (QComboBox *) pWidget;
1043 m_iCurrentItem = pComboBox->currentItem();
1044 QTableItem::setText(pComboBox->currentText());
1045 }
1046 else QTableItem::setContentFromEditor(pWidget);
1047 }
1048
1049
1050 // end of qsamplerChannel.cpp

  ViewVC Help
Powered by ViewVC