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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 758 - (hide annotations) (download)
Sun Aug 28 00:31:34 2005 UTC (18 years, 7 months ago) by capela
File size: 22183 byte(s)
* Audio output channel routing configuration finally hits
  the sampler channel dialog, at last! (EXPERIMENTAL).

1 capela 264 // qsamplerChannel.cpp
2     //
3     /****************************************************************************
4 capela 341 Copyright (C) 2003-2005, rncbc aka Rui Nuno Capela. All rights reserved.
5 capela 264
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
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19    
20     *****************************************************************************/
21    
22 capela 758 #include "qsamplerAbout.h"
23 capela 264 #include "qsamplerChannel.h"
24    
25     #include "qsamplerMainForm.h"
26 capela 303 #include "qsamplerChannelForm.h"
27 capela 264
28 capela 299 #include <qfileinfo.h>
29 capela 264
30 capela 299 #ifdef CONFIG_LIBGIG
31     #include "gig.h"
32     #endif
33    
34 capela 343 #define QSAMPLER_INSTRUMENT_MAX 8
35 capela 299
36 capela 343
37 capela 264 //-------------------------------------------------------------------------
38     // qsamplerChannel - Sampler channel structure.
39     //
40    
41     // Constructor.
42     qsamplerChannel::qsamplerChannel ( qsamplerMainForm *pMainForm, int iChannelID )
43     {
44 capela 467 m_pMainForm = pMainForm;
45     m_iChannelID = iChannelID;
46 capela 264
47 capela 388 // m_sEngineName = noEngineName();
48     // m_sInstrumentName = noInstrumentName();
49 capela 344 // m_sInstrumentFile = m_sInstrumentName;
50 capela 467 m_iInstrumentNr = -1;
51     m_iInstrumentStatus = -1;
52 capela 490 m_sMidiDriver = "ALSA";
53 capela 467 m_iMidiDevice = -1;
54     m_iMidiPort = -1;
55     m_iMidiChannel = -1;
56 capela 490 m_sAudioDriver = "ALSA";
57 capela 467 m_iAudioDevice = -1;
58     m_fVolume = 0.0;
59 capela 751 m_bMute = false;
60     m_bSolo = false;
61 capela 264 }
62    
63     // Default destructor.
64     qsamplerChannel::~qsamplerChannel (void)
65     {
66     }
67    
68    
69 capela 484 // Main application form accessor.
70     qsamplerMainForm *qsamplerChannel::mainForm(void) const
71     {
72     return m_pMainForm;
73     }
74    
75    
76 capela 264 // The global options settings delegated property.
77 capela 484 qsamplerOptions *qsamplerChannel::options (void) const
78 capela 264 {
79 capela 467 if (m_pMainForm == NULL)
80     return NULL;
81 capela 264
82 capela 467 return m_pMainForm->options();
83 capela 264 }
84    
85    
86     // The client descriptor delegated property.
87 capela 484 lscp_client_t *qsamplerChannel::client (void) const
88 capela 264 {
89 capela 467 if (m_pMainForm == NULL)
90     return NULL;
91 capela 264
92 capela 467 return m_pMainForm->client();
93 capela 264 }
94    
95    
96 capela 295 // Create a new sampler channel, if not already.
97     bool qsamplerChannel::addChannel (void)
98     {
99 capela 467 if (client() == NULL)
100     return false;
101 capela 295
102 capela 467 // Are we a new channel?
103     if (m_iChannelID < 0) {
104     m_iChannelID = ::lscp_add_channel(client());
105     if (m_iChannelID < 0) {
106     appendMessagesClient("lscp_add_channel");
107     appendMessagesError(QObject::tr("Could not add channel.\n\nSorry."));
108     } // Otherwise it's created...
109     else appendMessages(QObject::tr("added."));
110     }
111 capela 295
112 capela 467 // Return whether we're a valid channel...
113     return (m_iChannelID >= 0);
114 capela 295 }
115    
116    
117     // Remove sampler channel.
118     bool qsamplerChannel::removeChannel (void)
119     {
120 capela 467 if (client() == NULL)
121     return false;
122 capela 295
123 capela 467 // Are we an existing channel?
124     if (m_iChannelID >= 0) {
125     if (::lscp_remove_channel(client(), m_iChannelID) != LSCP_OK) {
126     appendMessagesClient("lscp_remove_channel");
127     appendMessagesError(QObject::tr("Could not remove channel.\n\nSorry."));
128     } else {
129     // Otherwise it's removed.
130     appendMessages(QObject::tr("removed."));
131     m_iChannelID = -1;
132     }
133     }
134 capela 490
135 capela 467 // Return whether we've removed the channel...
136     return (m_iChannelID < 0);
137 capela 295 }
138    
139    
140 capela 264 // Channel-ID (aka Sammpler-Channel) accessors.
141 capela 484 int qsamplerChannel::channelID (void) const
142 capela 264 {
143 capela 467 return m_iChannelID;
144 capela 264 }
145    
146     void qsamplerChannel::setChannelID ( int iChannelID )
147     {
148 capela 467 m_iChannelID = iChannelID;
149 capela 264 }
150    
151    
152 capela 295 // Readable channel name.
153 capela 484 QString qsamplerChannel::channelName (void) const
154 capela 295 {
155 capela 467 return (m_iChannelID < 0 ? QObject::tr("New Channel") : QObject::tr("Channel %1").arg(m_iChannelID));
156 capela 295 }
157    
158    
159 capela 264 // Engine name accessors.
160 capela 484 const QString& qsamplerChannel::engineName (void) const
161 capela 264 {
162 capela 467 return m_sEngineName;
163 capela 264 }
164    
165     bool qsamplerChannel::loadEngine ( const QString& sEngineName )
166     {
167 capela 467 if (client() == NULL || m_iChannelID < 0)
168     return false;
169 capela 400 if (m_iInstrumentStatus == 100 && m_sEngineName == sEngineName)
170 capela 467 return true;
171 capela 490
172 capela 467 if (::lscp_load_engine(client(), sEngineName.latin1(), m_iChannelID) != LSCP_OK) {
173     appendMessagesClient("lscp_load_engine");
174     return false;
175     }
176     appendMessages(QObject::tr("Engine: %1.").arg(sEngineName));
177 capela 264
178 capela 467 m_sEngineName = sEngineName;
179     return true;
180 capela 264 }
181    
182    
183     // Instrument filename accessor.
184 capela 484 const QString& qsamplerChannel::instrumentFile (void) const
185 capela 264 {
186 capela 467 return m_sInstrumentFile;
187 capela 264 }
188    
189     // Instrument index accessor.
190 capela 484 int qsamplerChannel::instrumentNr (void) const
191 capela 264 {
192 capela 467 return m_iInstrumentNr;
193 capela 264 }
194    
195 capela 382 // Instrument name accessor.
196 capela 484 const QString& qsamplerChannel::instrumentName (void) const
197 capela 382 {
198 capela 467 return m_sInstrumentName;
199 capela 382 }
200    
201 capela 264 // Instrument status accessor.
202 capela 484 int qsamplerChannel::instrumentStatus (void) const
203 capela 264 {
204 capela 467 return m_iInstrumentStatus;
205 capela 264 }
206    
207     // Instrument file loader.
208     bool qsamplerChannel::loadInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
209     {
210 capela 467 if (client() == NULL || m_iChannelID < 0)
211     return false;
212 capela 388 if (!isInstrumentFile(sInstrumentFile))
213 capela 467 return false;
214 capela 400 if (m_iInstrumentStatus == 100 && m_sInstrumentFile == sInstrumentFile && m_iInstrumentNr == iInstrumentNr)
215 capela 467 return true;
216 capela 264
217 capela 467 if (::lscp_load_instrument_non_modal(client(), sInstrumentFile.latin1(), iInstrumentNr, m_iChannelID) != LSCP_OK) {
218     appendMessagesClient("lscp_load_instrument");
219     return false;
220     }
221 capela 264
222 capela 467 appendMessages(QObject::tr("Instrument: \"%1\" (%2).")
223 capela 404 .arg(sInstrumentFile).arg(iInstrumentNr));
224 capela 490
225 capela 467 return setInstrument(sInstrumentFile, iInstrumentNr);
226 capela 388 }
227    
228    
229     // Special instrument file/name/number settler.
230     bool qsamplerChannel::setInstrument ( const QString& sInstrumentFile, int iInstrumentNr )
231     {
232 capela 467 m_sInstrumentFile = sInstrumentFile;
233     m_iInstrumentNr = iInstrumentNr;
234 capela 382 #ifdef CONFIG_INSTRUMENT_NAME
235 capela 467 m_sInstrumentName = QString::null; // We'll get it, maybe later, on channel_info...
236 capela 382 #else
237 capela 467 m_sInstrumentName = getInstrumentName(sInstrumentFile, iInstrumentNr, true);
238 capela 382 #endif
239 capela 467 m_iInstrumentStatus = 0;
240 capela 264
241 capela 388 return true;
242 capela 264 }
243    
244    
245     // MIDI driver type accessors (DEPRECATED).
246 capela 484 const QString& qsamplerChannel::midiDriver (void) const
247 capela 264 {
248 capela 467 return m_sMidiDriver;
249 capela 264 }
250    
251     bool qsamplerChannel::setMidiDriver ( const QString& sMidiDriver )
252     {
253 capela 467 if (client() == NULL || m_iChannelID < 0)
254     return false;
255 capela 400 if (m_iInstrumentStatus == 100 && m_sMidiDriver == sMidiDriver)
256 capela 467 return true;
257 capela 264
258 capela 467 if (::lscp_set_channel_midi_type(client(), m_iChannelID, sMidiDriver.latin1()) != LSCP_OK) {
259     appendMessagesClient("lscp_set_channel_midi_type");
260     return false;
261     }
262 capela 264
263 capela 467 appendMessages(QObject::tr("MIDI driver: %1.").arg(sMidiDriver));
264 capela 404
265 capela 467 m_sMidiDriver = sMidiDriver;
266     return true;
267 capela 264 }
268    
269    
270     // MIDI device accessors.
271 capela 484 int qsamplerChannel::midiDevice (void) const
272 capela 264 {
273 capela 467 return m_iMidiDevice;
274 capela 264 }
275    
276     bool qsamplerChannel::setMidiDevice ( int iMidiDevice )
277     {
278 capela 467 if (client() == NULL || m_iChannelID < 0)
279     return false;
280 capela 400 if (m_iInstrumentStatus == 100 && m_iMidiDevice == iMidiDevice)
281 capela 467 return true;
282 capela 264
283 capela 467 if (::lscp_set_channel_midi_device(client(), m_iChannelID, iMidiDevice) != LSCP_OK) {
284     appendMessagesClient("lscp_set_channel_midi_device");
285     return false;
286     }
287 capela 264
288 capela 467 appendMessages(QObject::tr("MIDI device: %1.").arg(iMidiDevice));
289 capela 404
290 capela 467 m_iMidiDevice = iMidiDevice;
291     return true;
292 capela 264 }
293    
294    
295     // MIDI port number accessor.
296 capela 484 int qsamplerChannel::midiPort (void) const
297 capela 264 {
298 capela 467 return m_iMidiPort;
299 capela 264 }
300    
301     bool qsamplerChannel::setMidiPort ( int iMidiPort )
302     {
303 capela 467 if (client() == NULL || m_iChannelID < 0)
304     return false;
305 capela 400 if (m_iInstrumentStatus == 100 && m_iMidiPort == iMidiPort)
306 capela 467 return true;
307 capela 264
308 capela 467 if (::lscp_set_channel_midi_port(client(), m_iChannelID, iMidiPort) != LSCP_OK) {
309     appendMessagesClient("lscp_set_channel_midi_port");
310     return false;
311     }
312 capela 264
313 capela 467 appendMessages(QObject::tr("MIDI port: %1.").arg(iMidiPort));
314 capela 404
315 capela 467 m_iMidiPort = iMidiPort;
316     return true;
317 capela 264 }
318    
319    
320     // MIDI channel accessor.
321 capela 484 int qsamplerChannel::midiChannel (void) const
322 capela 264 {
323 capela 467 return m_iMidiChannel;
324 capela 264 }
325    
326     bool qsamplerChannel::setMidiChannel ( int iMidiChannel )
327     {
328 capela 467 if (client() == NULL || m_iChannelID < 0)
329     return false;
330 capela 400 if (m_iInstrumentStatus == 100 && m_iMidiChannel == iMidiChannel)
331 capela 467 return true;
332 capela 264
333 capela 467 if (::lscp_set_channel_midi_channel(client(), m_iChannelID, iMidiChannel) != LSCP_OK) {
334     appendMessagesClient("lscp_set_channel_midi_channel");
335     return false;
336     }
337 capela 264
338 capela 467 appendMessages(QObject::tr("MIDI channel: %1.").arg(iMidiChannel));
339 capela 404
340 capela 467 m_iMidiChannel = iMidiChannel;
341     return true;
342 capela 264 }
343    
344    
345     // Audio device accessor.
346 capela 484 int qsamplerChannel::audioDevice (void) const
347 capela 264 {
348 capela 467 return m_iAudioDevice;
349 capela 264 }
350    
351     bool qsamplerChannel::setAudioDevice ( int iAudioDevice )
352     {
353 capela 467 if (client() == NULL || m_iChannelID < 0)
354     return false;
355 capela 400 if (m_iInstrumentStatus == 100 && m_iAudioDevice == iAudioDevice)
356 capela 467 return true;
357 capela 264
358 capela 467 if (::lscp_set_channel_audio_device(client(), m_iChannelID, iAudioDevice) != LSCP_OK) {
359     appendMessagesClient("lscp_set_channel_audio_device");
360     return false;
361     }
362 capela 264
363 capela 467 appendMessages(QObject::tr("Audio device: %1.").arg(iAudioDevice));
364 capela 404
365 capela 467 m_iAudioDevice = iAudioDevice;
366     return true;
367 capela 264 }
368    
369    
370     // Audio driver type accessors (DEPRECATED).
371 capela 484 const QString& qsamplerChannel::audioDriver (void) const
372 capela 264 {
373 capela 467 return m_sAudioDriver;
374 capela 264 }
375    
376     bool qsamplerChannel::setAudioDriver ( const QString& sAudioDriver )
377     {
378 capela 467 if (client() == NULL || m_iChannelID < 0)
379     return false;
380 capela 400 if (m_iInstrumentStatus == 100 && m_sAudioDriver == sAudioDriver)
381 capela 467 return true;
382 capela 264
383 capela 467 if (::lscp_set_channel_audio_type(client(), m_iChannelID, sAudioDriver.latin1()) != LSCP_OK) {
384     appendMessagesClient("lscp_set_channel_audio_type");
385     return false;
386     }
387 capela 264
388 capela 467 appendMessages(QObject::tr("Audio driver: %1.").arg(sAudioDriver));
389 capela 404
390 capela 467 m_sAudioDriver = sAudioDriver;
391     return true;
392 capela 264 }
393    
394    
395     // Channel volume accessors.
396 capela 484 float qsamplerChannel::volume (void) const
397 capela 264 {
398 capela 467 return m_fVolume;
399 capela 264 }
400    
401     bool qsamplerChannel::setVolume ( float fVolume )
402     {
403 capela 467 if (client() == NULL || m_iChannelID < 0)
404     return false;
405 capela 400 if (m_iInstrumentStatus == 100 && m_fVolume == fVolume)
406 capela 467 return true;
407 capela 264
408 capela 467 if (::lscp_set_channel_volume(client(), m_iChannelID, fVolume) != LSCP_OK) {
409     appendMessagesClient("lscp_set_channel_volume");
410     return false;
411     }
412 capela 264
413 capela 467 appendMessages(QObject::tr("Volume: %1.").arg(fVolume));
414 capela 404
415 capela 467 m_fVolume = fVolume;
416     return true;
417 capela 264 }
418    
419    
420 capela 751 // Sampler channel mute state.
421     bool qsamplerChannel::channelMute (void) const
422     {
423     return m_bMute;
424     }
425    
426     bool qsamplerChannel::setChannelMute ( bool bMute )
427     {
428     if (client() == NULL || m_iChannelID < 0)
429     return false;
430     if (m_iInstrumentStatus == 100 && ((m_bMute && bMute) || (!m_bMute && !bMute)))
431     return true;
432    
433     #ifdef CONFIG_MUTE_SOLO
434     if (::lscp_set_channel_mute(client(), m_iChannelID, bMute) != LSCP_OK) {
435     appendMessagesClient("lscp_set_channel_mute");
436     return false;
437     }
438     appendMessages(QObject::tr("Mute: %1.").arg((int) bMute));
439     m_bMute = bMute;
440     return true;
441     #else
442     return false;
443     #endif
444     }
445    
446    
447     // Sampler channel solo state.
448     bool qsamplerChannel::channelSolo (void) const
449     {
450     return m_bSolo;
451     }
452    
453     bool qsamplerChannel::setChannelSolo ( bool bSolo )
454     {
455     if (client() == NULL || m_iChannelID < 0)
456     return false;
457     if (m_iInstrumentStatus == 100 && ((m_bSolo && bSolo) || (!m_bSolo && !bSolo)))
458     return true;
459    
460     #ifdef CONFIG_MUTE_SOLO
461     if (::lscp_set_channel_solo(client(), m_iChannelID, bSolo) != LSCP_OK) {
462     appendMessagesClient("lscp_set_channel_solo");
463     return false;
464     }
465     appendMessages(QObject::tr("Solo: %1.").arg((int) bSolo));
466     m_bSolo = bSolo;
467     return true;
468     #else
469     return false;
470     #endif
471     }
472    
473    
474 capela 758 // Audio routing accessors.
475     int qsamplerChannel::audioChannel ( int iAudioOut ) const
476     {
477     return m_audioRouting[iAudioOut];
478     }
479    
480     bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn )
481     {
482     if (client() == NULL || m_iChannelID < 0)
483     return false;
484     if (m_iInstrumentStatus == 100 &&
485     m_audioRouting[iAudioOut] == iAudioIn)
486     return true;
487    
488     if (::lscp_set_channel_audio_channel(client(),
489     m_iChannelID, iAudioOut, iAudioIn) != LSCP_OK) {
490     appendMessagesClient("lscp_set_channel_audio_channel");
491     return false;
492     }
493    
494     appendMessages(QObject::tr("Audio Channel: %1 -> %2.")
495     .arg(iAudioOut).arg(iAudioIn));
496    
497     m_audioRouting[iAudioOut] = iAudioIn;
498     return true;
499     }
500    
501     // The audio routing map itself.
502     const qsamplerChannelRoutingMap& qsamplerChannel::audioRouting (void) const
503     {
504     return m_audioRouting;
505     }
506    
507    
508 capela 371 // Istrument name remapper.
509     void qsamplerChannel::updateInstrumentName (void)
510     {
511 capela 382 #ifndef CONFIG_INSTRUMENT_NAME
512 capela 371 m_sInstrumentName = getInstrumentName(m_sInstrumentFile,
513     m_iInstrumentNr, (options() && options()->bInstrumentNames));
514 capela 382 #endif
515 capela 371 }
516    
517    
518 capela 264 // Update whole channel info state.
519 capela 295 bool qsamplerChannel::updateChannelInfo (void)
520 capela 264 {
521 capela 467 if (client() == NULL || m_iChannelID < 0)
522     return false;
523 capela 264
524 capela 467 // Read channel information.
525     lscp_channel_info_t *pChannelInfo = ::lscp_get_channel_info(client(), m_iChannelID);
526     if (pChannelInfo == NULL) {
527     appendMessagesClient("lscp_get_channel_info");
528     appendMessagesError(QObject::tr("Could not get channel information.\n\nSorry."));
529     return false;
530     }
531 capela 295
532 capela 382 #ifdef CONFIG_INSTRUMENT_NAME
533     // We got all actual instrument datum...
534     m_sInstrumentFile = pChannelInfo->instrument_file;
535     m_iInstrumentNr = pChannelInfo->instrument_nr;
536     m_sInstrumentName = pChannelInfo->instrument_name;
537     #else
538 capela 371 // First, check if intrument name has changed,
539     // taking care that instrument name lookup might be expensive,
540     // so we better make it only once and when really needed...
541     if ((m_sInstrumentFile != pChannelInfo->instrument_file) ||
542     (m_iInstrumentNr != pChannelInfo->instrument_nr)) {
543     m_sInstrumentFile = pChannelInfo->instrument_file;
544     m_iInstrumentNr = pChannelInfo->instrument_nr;
545     updateInstrumentName();
546 capela 344 }
547 capela 382 #endif
548 capela 467 // Cache in other channel information.
549     m_sEngineName = pChannelInfo->engine_name;
550     m_iInstrumentStatus = pChannelInfo->instrument_status;
551     m_iMidiDevice = pChannelInfo->midi_device;
552     m_iMidiPort = pChannelInfo->midi_port;
553     m_iMidiChannel = pChannelInfo->midi_channel;
554     m_iAudioDevice = pChannelInfo->audio_device;
555     m_fVolume = pChannelInfo->volume;
556 capela 751 #ifdef CONFIG_MUTE_SOLO
557     m_bMute = pChannelInfo->mute;
558     m_bSolo = pChannelInfo->solo;
559     #endif
560 capela 467 // Some sanity checks.
561     if (m_sEngineName == "NONE" || m_sEngineName.isEmpty())
562     m_sEngineName = QString::null;
563     if (m_sInstrumentFile == "NONE" || m_sInstrumentFile.isEmpty()) {
564     m_sInstrumentFile = QString::null;
565     m_sInstrumentName = QString::null;
566 capela 344 }
567 capela 490
568     // Time for device info grabbing...
569 capela 414 lscp_device_info_t *pDeviceInfo;
570     const QString sNone = QObject::tr("(none)");
571     // Audio device driver type.
572     pDeviceInfo = ::lscp_get_audio_device_info(client(), m_iAudioDevice);
573     if (pDeviceInfo == NULL) {
574 capela 467 appendMessagesClient("lscp_get_audio_device_info");
575 capela 414 m_sAudioDriver = sNone;
576     } else {
577     m_sAudioDriver = pDeviceInfo->driver;
578     }
579     // MIDI device driver type.
580     pDeviceInfo = ::lscp_get_midi_device_info(client(), m_iMidiDevice);
581     if (pDeviceInfo == NULL) {
582 capela 467 appendMessagesClient("lscp_get_midi_device_info");
583 capela 414 m_sMidiDriver = sNone;
584     } else {
585     m_sMidiDriver = pDeviceInfo->driver;
586     }
587 capela 295
588 capela 758 // Set the audio routing map.
589     m_audioRouting.clear();
590     char **ppszRouting = pChannelInfo->audio_routing;
591     for (int i = 0; ppszRouting && ppszRouting[i]; i++) {
592     m_audioRouting[i] = ::atoi(ppszRouting[i]);
593     }
594    
595 capela 467 return true;
596 capela 264 }
597    
598    
599     // Reset channel method.
600 capela 400 bool qsamplerChannel::channelReset (void)
601 capela 264 {
602 capela 467 if (client() == NULL || m_iChannelID < 0)
603     return false;
604 capela 264
605 capela 467 if (::lscp_reset_channel(client(), m_iChannelID) != LSCP_OK) {
606     appendMessagesClient("lscp_reset_channel");
607     return false;
608     }
609 capela 295
610 capela 467 appendMessages(QObject::tr("reset."));
611 capela 404
612 capela 467 return true;
613 capela 264 }
614    
615    
616 capela 303 // Channel setup dialog form.
617     bool qsamplerChannel::channelSetup ( QWidget *pParent )
618     {
619 capela 467 bool bResult = false;
620 capela 303
621 capela 467 appendMessages(QObject::tr("setup..."));
622 capela 490
623 capela 467 qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(pParent);
624     if (pChannelForm) {
625     pChannelForm->setup(this);
626     bResult = pChannelForm->exec();
627     delete pChannelForm;
628     }
629 capela 303
630 capela 467 return bResult;
631 capela 303 }
632    
633    
634 capela 264 // Redirected messages output methods.
635 capela 484 void qsamplerChannel::appendMessages( const QString& s ) const
636 capela 264 {
637 capela 467 if (m_pMainForm)
638 capela 404 m_pMainForm->appendMessages(channelName() + ' ' + s);
639 capela 264 }
640    
641 capela 484 void qsamplerChannel::appendMessagesColor( const QString& s,
642     const QString& c ) const
643 capela 264 {
644 capela 467 if (m_pMainForm)
645 capela 404 m_pMainForm->appendMessagesColor(channelName() + ' ' + s, c);
646 capela 264 }
647    
648 capela 484 void qsamplerChannel::appendMessagesText( const QString& s ) const
649 capela 264 {
650 capela 467 if (m_pMainForm)
651 capela 404 m_pMainForm->appendMessagesText(channelName() + ' ' + s);
652 capela 264 }
653    
654 capela 484 void qsamplerChannel::appendMessagesError( const QString& s ) const
655 capela 264 {
656 capela 467 if (m_pMainForm)
657 capela 404 m_pMainForm->appendMessagesError(channelName() + "\n\n" + s);
658 capela 264 }
659    
660 capela 484 void qsamplerChannel::appendMessagesClient( const QString& s ) const
661 capela 264 {
662 capela 467 if (m_pMainForm)
663 capela 404 m_pMainForm->appendMessagesClient(channelName() + ' ' + s);
664 capela 264 }
665    
666    
667 capela 303 // Context menu event handler.
668     void qsamplerChannel::contextMenuEvent( QContextMenuEvent *pEvent )
669     {
670 capela 467 if (m_pMainForm)
671 capela 404 m_pMainForm->contextMenuEvent(pEvent);
672 capela 303 }
673    
674    
675 capela 388 // FIXME: Check whether a given file is an instrument file.
676     bool qsamplerChannel::isInstrumentFile ( const QString& sInstrumentFile )
677     {
678     bool bResult = false;
679    
680     QFile file(sInstrumentFile);
681     if (file.open(IO_ReadOnly)) {
682 capela 409 char achHeader[16];
683     if (file.readBlock(achHeader, 16)) {
684     bResult = (::memcmp(&achHeader[0], "RIFF", 4) == 0
685     && ::memcmp(&achHeader[8], "DLS LIST", 8) == 0);
686 capela 388 }
687     file.close();
688     }
689    
690     return bResult;
691     }
692    
693    
694 capela 299 // Retrieve the instrument list of a instrument file (.gig).
695 capela 344 QStringList qsamplerChannel::getInstrumentList( const QString& sInstrumentFile,
696     bool bInstrumentNames )
697 capela 299 {
698 capela 467 QString sInstrumentName = QFileInfo(sInstrumentFile).fileName();
699     QStringList instlist;
700 capela 299
701 capela 467 if (isInstrumentFile(sInstrumentFile)) {
702 capela 299 #ifdef CONFIG_LIBGIG
703 capela 344 if (bInstrumentNames) {
704 capela 748 RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());
705 capela 467 gig::File *pGig = new gig::File(pRiff);
706     gig::Instrument *pInstrument = pGig->GetFirstInstrument();
707     while (pInstrument) {
708     instlist.append((pInstrument->pInfo)->Name.c_str());
709     pInstrument = pGig->GetNextInstrument();
710     }
711     delete pGig;
712     delete pRiff;
713 capela 341 }
714     else
715 capela 342 #endif
716 capela 467 for (int iInstrumentNr = 0; iInstrumentNr < QSAMPLER_INSTRUMENT_MAX; iInstrumentNr++)
717     instlist.append(sInstrumentName + " [" + QString::number(iInstrumentNr) + "]");
718     }
719     else instlist.append(noInstrumentName());
720 capela 306
721 capela 467 return instlist;
722 capela 299 }
723    
724    
725     // Retrieve the spacific instrument name of a instrument file (.gig), given its index.
726 capela 344 QString qsamplerChannel::getInstrumentName( const QString& sInstrumentFile,
727     int iInstrumentNr, bool bInstrumentNames )
728 capela 299 {
729 capela 467 QString sInstrumentName;
730 capela 299
731 capela 467 if (isInstrumentFile(sInstrumentFile)) {
732 capela 388 sInstrumentName = QFileInfo(sInstrumentFile).fileName();
733 capela 299 #ifdef CONFIG_LIBGIG
734 capela 344 if (bInstrumentNames) {
735 capela 748 RIFF::File *pRiff = new RIFF::File(sInstrumentFile.latin1());
736 capela 467 gig::File *pGig = new gig::File(pRiff);
737     int iIndex = 0;
738     gig::Instrument *pInstrument = pGig->GetFirstInstrument();
739     while (pInstrument) {
740     if (iIndex == iInstrumentNr) {
741     sInstrumentName = (pInstrument->pInfo)->Name.c_str();
742     break;
743     }
744     iIndex++;
745     pInstrument = pGig->GetNextInstrument();
746     }
747     delete pGig;
748     delete pRiff;
749 capela 341 }
750     else
751 capela 342 #endif
752 capela 467 sInstrumentName += " [" + QString::number(iInstrumentNr) + "]";
753     }
754     else sInstrumentName = noInstrumentName();
755 capela 299
756 capela 467 return sInstrumentName;
757 capela 299 }
758    
759    
760 capela 388 // Common invalid name-helpers.
761     QString qsamplerChannel::noEngineName (void)
762     {
763     return QObject::tr("(No engine)");
764     }
765    
766     QString qsamplerChannel::noInstrumentName (void)
767     {
768     return QObject::tr("(No instrument)");
769     }
770    
771 schoenebeck 519 QString qsamplerChannel::loadingInstrument (void) {
772     return QObject::tr("(Loading instrument...)");
773     }
774 capela 388
775 schoenebeck 519
776 capela 758
777     //-------------------------------------------------------------------------
778     // qsamplerChannelRoutingTable - Channel routing table.
779     //
780    
781     // Constructor.
782     qsamplerChannelRoutingTable::qsamplerChannelRoutingTable (
783     QWidget *pParent, const char *pszName )
784     : QTable(pParent, pszName)
785     {
786     // Set fixed number of columns.
787     QTable::setNumCols(2);
788     QTable::setShowGrid(false);
789     QTable::setSorting(false);
790     QTable::setFocusStyle(QTable::FollowStyle);
791     QTable::setSelectionMode(QTable::SingleRow);
792     // No vertical header.
793     QTable::verticalHeader()->hide();
794     QTable::setLeftMargin(0);
795     // Initialize the fixed table column headings.
796     QHeader *pHeader = QTable::horizontalHeader();
797     pHeader->setLabel(0, tr("Sampler Channel"));
798     pHeader->setLabel(1, tr("Device Channel"));
799     // Set read-onlyness of each column
800     QTable::setColumnReadOnly(0, true);
801     // QTable::setColumnReadOnly(1, false); -- of course not.
802     QTable::setColumnStretchable(1, true);
803     }
804    
805     // Default destructor.
806     qsamplerChannelRoutingTable::~qsamplerChannelRoutingTable (void)
807     {
808     }
809    
810    
811     // Routing map table renderer.
812     void qsamplerChannelRoutingTable::refresh ( qsamplerDevice *pDevice,
813     const qsamplerChannelRoutingMap& routing )
814     {
815     if (pDevice == NULL)
816     return;
817    
818     // Always (re)start it empty.
819     QTable::setUpdatesEnabled(false);
820     QTable::setNumRows(0);
821    
822     // The common device port item list.
823     QStringList opts;
824     qsamplerDevicePortList& ports = pDevice->ports();
825     qsamplerDevicePort *pPort;
826     for (pPort = ports.first(); pPort; pPort = ports.next()) {
827     opts.append(pDevice->deviceTypeName()
828     + ' ' + pDevice->driverName()
829     + ' ' + pPort->portName());
830     }
831    
832     // Those items shall have a proper pixmap...
833     QPixmap pmDevice;
834     switch (pDevice->deviceType()) {
835     case qsamplerDevice::Audio:
836     pmDevice = QPixmap::fromMimeSource("audio2.png");
837     break;
838     case qsamplerDevice::Midi:
839     pmDevice = QPixmap::fromMimeSource("midi2.png");
840     break;
841     case qsamplerDevice::None:
842     break;
843     }
844    
845     // Fill the routing table...
846     QTable::insertRows(0, routing.count());
847     int iRow = 0;
848     qsamplerChannelRoutingMap::ConstIterator iter;
849     for (iter = routing.begin(); iter != routing.end(); ++iter) {
850     QTable::setPixmap(iRow, 0, pmDevice);
851     QTable::setText(iRow, 0, pDevice->deviceTypeName()
852     + ' ' + QString::number(iter.key()));
853     QComboTableItem *pComboItem = new QComboTableItem(this, opts);
854     pComboItem->setCurrentItem(iter.data());
855     QTable::setItem(iRow, 1, pComboItem);
856     ++iRow;
857     }
858    
859     // Adjust optimal column widths.
860     QTable::adjustColumn(0);
861     QTable::adjustColumn(1);
862    
863     QTable::setUpdatesEnabled(true);
864     QTable::updateContents();
865     }
866    
867    
868 capela 264 // end of qsamplerChannel.cpp

  ViewVC Help
Powered by ViewVC