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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 980 - (hide annotations) (download)
Sun Dec 17 22:29:29 2006 UTC (17 years, 4 months ago) by capela
File size: 30294 byte(s)
* Revised and extended MIDI instrument mapping feature; this time
  two (2) MIDI maps are being implicitly created, ones designated
  as 'Chromatic' (0) and another as 'Drum Kits' (1), which can be
  assigned to each sampler channel. (ATTN: this commit elevates the
  requirements for liblscp >= 0.5.0, also on todays CVS and pending
  proper release very soon).

1 capela 426 // qsamplerDevice.cpp
2     //
3     /****************************************************************************
4 capela 920 Copyright (C) 2004-2006, rncbc aka Rui Nuno Capela. All rights reserved.
5 capela 426
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 capela 920 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 capela 426
20     *****************************************************************************/
21    
22 capela 759 #include "qsamplerAbout.h"
23 capela 426 #include "qsamplerDevice.h"
24    
25     #include "qsamplerMainForm.h"
26     #include "qsamplerDeviceForm.h"
27    
28 capela 759 #include <qspinbox.h>
29     #include <qlineedit.h>
30 capela 426
31    
32     //-------------------------------------------------------------------------
33 capela 429 // qsamplerDeviceParam - MIDI/Audio Device parameter structure.
34 capela 426 //
35    
36 capela 429 // Constructors.
37     qsamplerDeviceParam::qsamplerDeviceParam ( lscp_param_info_t *pParamInfo,
38     const char *pszValue )
39     {
40     setParam(pParamInfo, pszValue);
41     }
42    
43    
44     // Default destructor.
45     qsamplerDeviceParam::~qsamplerDeviceParam (void)
46     {
47     }
48    
49    
50     // Initializer.
51     void qsamplerDeviceParam::setParam ( lscp_param_info_t *pParamInfo,
52     const char *pszValue )
53     {
54     if (pParamInfo == NULL)
55 capela 431 return;
56 capela 490
57 capela 431 // Info structure field members.
58 capela 490
59 capela 429 type = pParamInfo->type;
60 capela 490
61 capela 429 if (pParamInfo->description)
62     description = pParamInfo->description;
63     else
64     description = QString::null;
65 capela 490
66 capela 482 mandatory = (bool) pParamInfo->mandatory;
67 capela 431 fix = (bool) pParamInfo->fix;
68     multiplicity = (bool) pParamInfo->multiplicity;
69 capela 490
70 capela 431 depends.clear();
71     for (int i = 0; pParamInfo->depends && pParamInfo->depends[i]; i++)
72     depends.append(pParamInfo->depends[i]);
73 capela 490
74 capela 429 if (pParamInfo->defaultv)
75     defaultv = pParamInfo->defaultv;
76     else
77     defaultv = QString::null;
78 capela 490
79 capela 429 if (pParamInfo->range_min)
80 capela 431 range_min = pParamInfo->range_min;
81 capela 429 else
82     range_min = QString::null;
83 capela 490
84 capela 429 if (pParamInfo->range_max)
85 capela 431 range_max = pParamInfo->range_max;
86 capela 429 else
87     range_max = QString::null;
88 capela 490
89 capela 429 possibilities.clear();
90 capela 431 for (int i = 0; pParamInfo->possibilities && pParamInfo->possibilities[i]; i++)
91     possibilities.append(pParamInfo->possibilities[i]);
92 capela 490
93 capela 431 // The current parameter value.
94 capela 429 if (pszValue)
95 capela 431 value = pszValue;
96 capela 429 else
97     value = QString::null;
98     }
99    
100    
101     //-------------------------------------------------------------------------
102     // qsamplerDevice - MIDI/Audio Device structure.
103     //
104    
105 capela 426 // Constructor.
106 capela 961 qsamplerDevice::qsamplerDevice ( qsamplerDeviceType deviceType, int iDeviceID )
107 capela 429 {
108 capela 463 m_ports.setAutoDelete(true);
109 capela 490
110 capela 484 setDevice(deviceType, iDeviceID);
111 capela 429 }
112    
113     // Default destructor.
114     qsamplerDevice::~qsamplerDevice (void)
115     {
116     }
117    
118 capela 484 // Copy constructor.
119     qsamplerDevice::qsamplerDevice ( const qsamplerDevice& device )
120     : m_params(device.m_params), m_ports(m_ports)
121     {
122     m_iDeviceID = device.m_iDeviceID;
123     m_deviceType = device.m_deviceType;
124     m_sDeviceType = device.m_sDeviceType;
125     m_sDriverName = device.m_sDriverName;
126     m_sDeviceName = device.m_sDeviceName;
127     }
128 capela 429
129 capela 484
130 capela 429 // Initializer.
131 capela 484 void qsamplerDevice::setDevice ( qsamplerDeviceType deviceType, int iDeviceID )
132 capela 429 {
133 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
134     if (pMainForm == NULL)
135     return;
136     if (pMainForm->client() == NULL)
137     return;
138    
139 capela 430 // Device id and type should be always set.
140 capela 462 m_iDeviceID = iDeviceID;
141     m_deviceType = deviceType;
142 capela 490
143 capela 463 // Reset device parameters and ports anyway.
144 capela 467 m_params.clear();
145     m_ports.clear();
146 capela 430
147     // Retrieve device info, if any.
148 capela 429 lscp_device_info_t *pDeviceInfo = NULL;
149     switch (deviceType) {
150 capela 431 case qsamplerDevice::Audio:
151 capela 433 m_sDeviceType = QObject::tr("Audio");
152 capela 484 if (m_iDeviceID >= 0 && (pDeviceInfo = ::lscp_get_audio_device_info(
153 capela 961 pMainForm->client(), m_iDeviceID)) == NULL)
154 capela 484 appendMessagesClient("lscp_get_audio_device_info");
155 capela 431 break;
156     case qsamplerDevice::Midi:
157 capela 433 m_sDeviceType = QObject::tr("MIDI");
158 capela 484 if (m_iDeviceID >= 0 && (pDeviceInfo = ::lscp_get_midi_device_info(
159 capela 961 pMainForm->client(), m_iDeviceID)) == NULL)
160 capela 484 appendMessagesClient("lscp_get_midi_device_info");
161 capela 429 break;
162 capela 436 case qsamplerDevice::None:
163 capela 433 m_sDeviceType = QString::null;
164     break;
165 capela 429 }
166 capela 430 // If we're bogus, bail out...
167     if (pDeviceInfo == NULL) {
168     m_sDriverName = QString::null;
169 capela 452 m_sDeviceName = QObject::tr("New %1 device").arg(m_sDeviceType);
170 capela 431 return;
171 capela 430 }
172 capela 431
173 capela 430 // Other device properties...
174 capela 429 m_sDriverName = pDeviceInfo->driver;
175 capela 430 m_sDeviceName = m_sDriverName + ' '
176     + QObject::tr("Device %1").arg(m_iDeviceID);
177 capela 429
178 capela 431 // Grab device parameters...
179 capela 429 for (int i = 0; pDeviceInfo->params && pDeviceInfo->params[i].key; i++) {
180 capela 463 const QString sParam = pDeviceInfo->params[i].key;
181 capela 429 lscp_param_info_t *pParamInfo = NULL;
182     switch (deviceType) {
183 capela 431 case qsamplerDevice::Audio:
184 capela 961 if ((pParamInfo = ::lscp_get_audio_driver_param_info(pMainForm->client(),
185 capela 484 m_sDriverName.latin1(), sParam.latin1(), NULL)) == NULL)
186     appendMessagesClient("lscp_get_audio_driver_param_info");
187 capela 431 break;
188     case qsamplerDevice::Midi:
189 capela 961 if ((pParamInfo = ::lscp_get_midi_driver_param_info(pMainForm->client(),
190 capela 484 m_sDriverName.latin1(), sParam.latin1(), NULL)) == NULL)
191     appendMessagesClient("lscp_get_midi_driver_param_info");
192 capela 429 break;
193 capela 436 case qsamplerDevice::None:
194     break;
195 capela 429 }
196 capela 436 if (pParamInfo) {
197 capela 463 m_params[sParam.upper()] = qsamplerDeviceParam(pParamInfo,
198 capela 433 pDeviceInfo->params[i].value);
199 capela 436 }
200 capela 429 }
201 capela 463
202 capela 467 // Refresh parameter dependencies...
203 capela 484 refreshParams();
204 capela 467 // Set port/channel list...
205 capela 484 refreshPorts();
206 capela 429 }
207    
208    
209 capela 462 // Driver name initializer/settler.
210 capela 484 void qsamplerDevice::setDriver ( const QString& sDriverName )
211 capela 431 {
212 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
213     if (pMainForm == NULL)
214     return;
215     if (pMainForm->client() == NULL)
216     return;
217    
218 capela 431 // Valid only for scratch devices.
219     if (m_sDriverName == sDriverName)
220     return;
221    
222 capela 463 // Reset device parameters and ports anyway.
223 capela 467 m_params.clear();
224     m_ports.clear();
225 capela 463
226 capela 431 // Retrieve driver info, if any.
227     lscp_driver_info_t *pDriverInfo = NULL;
228     switch (m_deviceType) {
229     case qsamplerDevice::Audio:
230 capela 961 if ((pDriverInfo = ::lscp_get_audio_driver_info(pMainForm->client(),
231 capela 484 sDriverName.latin1())) == NULL)
232     appendMessagesClient("lscp_get_audio_driver_info");
233 capela 431 break;
234     case qsamplerDevice::Midi:
235 capela 961 if ((pDriverInfo = ::lscp_get_midi_driver_info(pMainForm->client(),
236 capela 484 sDriverName.latin1())) == NULL)
237     appendMessagesClient("lscp_get_midi_driver_info");
238 capela 431 break;
239 capela 436 case qsamplerDevice::None:
240     break;
241 capela 431 }
242    
243     // If we're bogus, bail out...
244     if (pDriverInfo == NULL)
245     return;
246    
247     // Remember device parameters...
248     m_sDriverName = sDriverName;
249    
250     // Grab driver parameters...
251     for (int i = 0; pDriverInfo->parameters && pDriverInfo->parameters[i]; i++) {
252 capela 463 const QString sParam = pDriverInfo->parameters[i];
253 capela 431 lscp_param_info_t *pParamInfo = NULL;
254     switch (m_deviceType) {
255     case qsamplerDevice::Audio:
256 capela 961 if ((pParamInfo = ::lscp_get_audio_driver_param_info(pMainForm->client(),
257 capela 484 sDriverName.latin1(), sParam.latin1(), NULL)) == NULL)
258     appendMessagesClient("lscp_get_audio_driver_param_info");
259 capela 431 break;
260     case qsamplerDevice::Midi:
261 capela 961 if ((pParamInfo = ::lscp_get_midi_driver_param_info(pMainForm->client(),
262 capela 484 sDriverName.latin1(), sParam.latin1(), NULL)) == NULL)
263     appendMessagesClient("lscp_get_midi_driver_param_info");
264 capela 431 break;
265 capela 436 case qsamplerDevice::None:
266     break;
267 capela 431 }
268 capela 463 if (pParamInfo) {
269     m_params[sParam.upper()] = qsamplerDeviceParam(pParamInfo,
270     pParamInfo->defaultv);
271     }
272 capela 431 }
273 capela 467
274     // Refresh parameter dependencies...
275 capela 484 refreshParams();
276 capela 467 // Set port/channel list...
277 capela 484 refreshPorts();
278 capela 431 }
279    
280    
281 capela 429 // Device property accessors.
282     int qsamplerDevice::deviceID (void) const
283     {
284     return m_iDeviceID;
285     }
286    
287     qsamplerDevice::qsamplerDeviceType qsamplerDevice::deviceType (void) const
288     {
289     return m_deviceType;
290     }
291    
292 capela 433 const QString& qsamplerDevice::deviceTypeName (void) const
293     {
294     return m_sDeviceType;
295     }
296    
297 capela 429 const QString& qsamplerDevice::driverName (void) const
298     {
299     return m_sDriverName;
300     }
301    
302 capela 484 // Special device name formatter.
303     QString qsamplerDevice::deviceName (void) const
304 capela 429 {
305 capela 484 QString sPrefix;
306     if (m_iDeviceID >= 0)
307     sPrefix += m_sDeviceType + ' ';
308     return sPrefix + m_sDeviceName;
309 capela 429 }
310    
311 capela 463
312     // Set the proper device parameter value.
313 capela 484 bool qsamplerDevice::setParam ( const QString& sParam,
314 capela 463 const QString& sValue )
315     {
316 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
317     if (pMainForm == NULL)
318     return false;
319     if (pMainForm->client() == NULL)
320     return false;
321    
322 capela 484 // Set proper device parameter.
323 capela 463 m_params[sParam.upper()].value = sValue;
324 capela 490
325 capela 484 // If the device already exists, things get immediate...
326     int iRefresh = 0;
327     if (m_iDeviceID >= 0) {
328     // Prepare parameter struct.
329     lscp_param_t param;
330     param.key = (char *) sParam.latin1();
331     param.value = (char *) sValue.latin1();
332     // Now it depends on the device type...
333     lscp_status_t ret = LSCP_FAILED;
334     switch (m_deviceType) {
335     case qsamplerDevice::Audio:
336     if (sParam == "CHANNELS") iRefresh++;
337 capela 961 if ((ret = ::lscp_set_audio_device_param(pMainForm->client(),
338 capela 484 m_iDeviceID, &param)) != LSCP_OK)
339     appendMessagesClient("lscp_set_audio_device_param");
340     break;
341     case qsamplerDevice::Midi:
342     if (sParam == "PORTS") iRefresh++;
343 capela 961 if ((ret = ::lscp_set_midi_device_param(pMainForm->client(),
344 capela 484 m_iDeviceID, &param)) != LSCP_OK)
345     appendMessagesClient("lscp_set_midi_device_param");
346     break;
347     case qsamplerDevice::None:
348     break;
349     }
350     // Show result.
351     if (ret == LSCP_OK) {
352     appendMessages(QString("%1: %2.").arg(sParam).arg(sValue));
353     // Special care for specific parameter changes...
354     if (iRefresh > 0)
355     iRefresh += refreshPorts();
356     iRefresh += refreshDepends(sParam);
357     } else {
358     // Oops...
359     appendMessagesError(
360     QObject::tr("Could not set device parameter value.\n\nSorry."));
361     }
362     }
363 capela 490
364 capela 484 // Return whether we're need a view refresh.
365     return (iRefresh > 0);
366 capela 463 }
367    
368    
369 capela 429 // Device parameter accessor.
370 capela 462 const qsamplerDeviceParamMap& qsamplerDevice::params (void) const
371 capela 429 {
372     return m_params;
373     }
374    
375    
376 capela 463 // Device port/channel list accessor.
377     qsamplerDevicePortList& qsamplerDevice::ports (void)
378 capela 429 {
379 capela 463 return m_ports;
380 capela 429 }
381    
382 capela 462
383 capela 484 // Create a new device, as a copy of this current one.
384     bool qsamplerDevice::createDevice (void)
385     {
386 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
387     if (pMainForm == NULL)
388 capela 484 return false;
389 capela 961 if (pMainForm->client() == NULL)
390     return false;
391 capela 484
392     // Build the parameter list...
393     lscp_param_t *pParams = new lscp_param_t [m_params.count() + 1];
394     int iParam = 0;
395     qsamplerDeviceParamMap::ConstIterator iter;
396     for (iter = m_params.begin(); iter != m_params.end(); ++iter) {
397     pParams[iParam].key = (char *) iter.key().latin1();
398     pParams[iParam].value = (char *) iter.data().value.latin1();
399     ++iParam;
400     }
401     // Null terminated.
402     pParams[iParam].key = NULL;
403     pParams[iParam].value = NULL;
404    
405     // Now it depends on the device type...
406     switch (m_deviceType) {
407     case qsamplerDevice::Audio:
408 capela 961 if ((m_iDeviceID = ::lscp_create_audio_device(pMainForm->client(),
409 capela 484 m_sDriverName.latin1(), pParams)) < 0)
410     appendMessagesClient("lscp_create_audio_device");
411     break;
412     case qsamplerDevice::Midi:
413 capela 961 if ((m_iDeviceID = ::lscp_create_midi_device(pMainForm->client(),
414 capela 484 m_sDriverName.latin1(), pParams)) < 0)
415     appendMessagesClient("lscp_create_midi_device");
416     break;
417     case qsamplerDevice::None:
418     break;
419     }
420    
421     // Free used parameter array.
422     delete pParams;
423    
424     // Show result.
425     if (m_iDeviceID >= 0) {
426 capela 490 // Refresh our own stuff...
427     setDevice(m_deviceType, m_iDeviceID);
428 capela 484 appendMessages(QObject::tr("created."));
429     } else {
430     appendMessagesError(QObject::tr("Could not create device.\n\nSorry."));
431     }
432 capela 490
433 capela 484 // Return whether we're a valid device...
434     return (m_iDeviceID >= 0);
435     }
436    
437    
438     // Destroy existing device.
439     bool qsamplerDevice::deleteDevice (void)
440     {
441 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
442     if (pMainForm == NULL)
443     return false;
444     if (pMainForm->client() == NULL)
445     return false;
446    
447 capela 484 // Now it depends on the device type...
448     lscp_status_t ret = LSCP_FAILED;
449     switch (m_deviceType) {
450     case qsamplerDevice::Audio:
451 capela 961 if ((ret = ::lscp_destroy_audio_device(pMainForm->client(),
452 capela 484 m_iDeviceID)) != LSCP_OK)
453     appendMessagesClient("lscp_destroy_audio_device");
454     break;
455     case qsamplerDevice::Midi:
456 capela 961 if ((ret = ::lscp_destroy_midi_device(pMainForm->client(),
457 capela 484 m_iDeviceID)) != LSCP_OK)
458     appendMessagesClient("lscp_destroy_midi_device");
459     break;
460     case qsamplerDevice::None:
461     break;
462     }
463    
464     // Show result.
465     if (ret == LSCP_OK) {
466     appendMessages(QObject::tr("deleted."));
467     m_iDeviceID = -1;
468     } else {
469     appendMessagesError(QObject::tr("Could not delete device.\n\nSorry."));
470     }
471 capela 490
472 capela 484 // Return whether we've done it..
473     return (ret == LSCP_OK);
474     }
475    
476    
477 capela 467 // Device parameter dependencies refreshner.
478 capela 484 int qsamplerDevice::refreshParams (void)
479 capela 467 {
480 capela 468 // This should only make sense for scratch devices...
481     if (m_iDeviceID >= 0)
482     return 0;
483 capela 467 // Refresh all parameters that have dependencies...
484     int iParams = 0;
485     qsamplerDeviceParamMap::ConstIterator iter;
486     for (iter = m_params.begin(); iter != m_params.end(); ++iter)
487 capela 484 iParams += refreshParam(iter.key());
488 capela 467 // Return how many parameters have been refreshed...
489     return iParams;
490     }
491    
492    
493 capela 463 // Device port/channel list refreshner.
494 capela 484 int qsamplerDevice::refreshPorts (void)
495 capela 463 {
496 capela 468 // This should only make sense for actual devices...
497     if (m_iDeviceID < 0)
498     return 0;
499 capela 463 // Port/channel count determination...
500     int iPorts = 0;
501     switch (m_deviceType) {
502     case qsamplerDevice::Audio:
503     iPorts = m_params["CHANNELS"].value.toInt();
504     break;
505     case qsamplerDevice::Midi:
506     iPorts = m_params["PORTS"].value.toInt();
507     break;
508     case qsamplerDevice::None:
509     break;
510     }
511     // Retrieve port/channel information...
512     m_ports.clear();
513     for (int iPort = 0; iPort < iPorts; iPort++)
514 capela 484 m_ports.append(new qsamplerDevicePort(*this, iPort));
515 capela 467 // Return how many ports have been refreshed...
516     return iPorts;
517 capela 463 }
518    
519    
520 capela 467 // Refresh/set dependencies given that some parameter has changed.
521 capela 484 int qsamplerDevice::refreshDepends ( const QString& sParam )
522 capela 467 {
523 capela 468 // This should only make sense for scratch devices...
524     if (m_iDeviceID >= 0)
525     return 0;
526 capela 467 // Refresh all parameters that depend on this one...
527     int iDepends = 0;
528     qsamplerDeviceParamMap::ConstIterator iter;
529     for (iter = m_params.begin(); iter != m_params.end(); ++iter) {
530     const QStringList& depends = iter.data().depends;
531     if (depends.find(sParam) != depends.end())
532 capela 484 iDepends += refreshParam(iter.key());
533 capela 467 }
534     // Return how many dependencies have been refreshed...
535     return iDepends;
536     }
537    
538    
539     // Refresh/set given parameter based on driver supplied dependencies.
540 capela 484 int qsamplerDevice::refreshParam ( const QString& sParam )
541 capela 467 {
542 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
543     if (pMainForm == NULL)
544     return 0;
545     if (pMainForm->client() == NULL)
546     return 0;
547    
548 capela 467 // Check if we have dependencies...
549     qsamplerDeviceParam& param = m_params[sParam.upper()];
550     if (param.depends.isEmpty())
551     return 0;
552    
553     int iRefresh = 0;
554    
555     // Build dependency list...
556     lscp_param_t *pDepends = new lscp_param_t [param.depends.count() + 1];
557     int iDepend = 0;
558     QStringList::ConstIterator iter;
559     for (iter = param.depends.begin(); iter != param.depends.end(); ++iter) {
560     const QString& sDepend = *iter;
561     pDepends[iDepend].key = (char *) sDepend.latin1();
562     pDepends[iDepend].value = (char *) m_params[sDepend.upper()].value.latin1();
563     ++iDepend;
564     }
565     // Null terminated.
566     pDepends[iDepend].key = NULL;
567     pDepends[iDepend].value = NULL;
568    
569     // FIXME: Some parameter dependencies (e.g.ALSA CARD)
570 capela 468 // are blocking for no reason, causing potential timeout-crashes.
571     // hopefully this gets mitigated if this dependency hell is only
572     // carried out for scratch devices...
573 capela 467
574     // Retrieve some modern parameters...
575     lscp_param_info_t *pParamInfo = NULL;
576     switch (m_deviceType) {
577     case qsamplerDevice::Audio:
578 capela 961 if ((pParamInfo = ::lscp_get_audio_driver_param_info(pMainForm->client(),
579 capela 484 m_sDriverName.latin1(), sParam.latin1(), pDepends)) == NULL)
580     appendMessagesClient("lscp_get_audio_driver_param_info");
581 capela 467 break;
582     case qsamplerDevice::Midi:
583 capela 961 if ((pParamInfo = ::lscp_get_midi_driver_param_info(pMainForm->client(),
584 capela 484 m_sDriverName.latin1(), sParam.latin1(), pDepends)) == NULL)
585     appendMessagesClient("lscp_get_midi_driver_param_info");
586 capela 467 break;
587     case qsamplerDevice::None:
588     break;
589     }
590     if (pParamInfo) {
591     param = qsamplerDeviceParam(pParamInfo, QString(param.value));
592     iRefresh++;
593     }
594 capela 468
595 capela 467 // Free used parameter array.
596     delete pDepends;
597    
598     // Return whether the parameters has been changed...
599     return iRefresh;
600     }
601    
602    
603 capela 484 // Redirected messages output methods.
604     void qsamplerDevice::appendMessages( const QString& s ) const
605     {
606 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
607     if (pMainForm)
608     pMainForm->appendMessages(deviceName() + ' ' + s);
609 capela 484 }
610    
611     void qsamplerDevice::appendMessagesColor( const QString& s,
612     const QString& c ) const
613     {
614 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
615     if (pMainForm)
616     pMainForm->appendMessagesColor(deviceName() + ' ' + s, c);
617 capela 484 }
618    
619     void qsamplerDevice::appendMessagesText( const QString& s ) const
620     {
621 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
622     if (pMainForm)
623     pMainForm->appendMessagesText(deviceName() + ' ' + s);
624 capela 484 }
625    
626     void qsamplerDevice::appendMessagesError( const QString& s ) const
627     {
628 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
629     if (pMainForm)
630     pMainForm->appendMessagesError(deviceName() + "\n\n" + s);
631 capela 484 }
632    
633     void qsamplerDevice::appendMessagesClient( const QString& s ) const
634     {
635 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
636     if (pMainForm)
637     pMainForm->appendMessagesClient(deviceName() + ' ' + s);
638 capela 484 }
639    
640    
641 capela 430 // Device ids enumerator.
642 capela 429 int *qsamplerDevice::getDevices ( lscp_client_t *pClient,
643     qsamplerDeviceType deviceType )
644     {
645     int *piDeviceIDs = NULL;
646     switch (deviceType) {
647 capela 431 case qsamplerDevice::Audio:
648     piDeviceIDs = ::lscp_list_audio_devices(pClient);
649 capela 429 break;
650 capela 431 case qsamplerDevice::Midi:
651     piDeviceIDs = ::lscp_list_midi_devices(pClient);
652     break;
653 capela 436 case qsamplerDevice::None:
654     break;
655 capela 429 }
656     return piDeviceIDs;
657     }
658    
659 capela 430
660     // Driver names enumerator.
661     QStringList qsamplerDevice::getDrivers ( lscp_client_t *pClient,
662     qsamplerDeviceType deviceType )
663     {
664     QStringList drivers;
665 capela 490
666 capela 430 const char **ppszDrivers = NULL;
667     switch (deviceType) {
668 capela 431 case qsamplerDevice::Audio:
669 capela 525 ppszDrivers = ::lscp_list_available_audio_drivers(pClient);
670 capela 430 break;
671 capela 431 case qsamplerDevice::Midi:
672 capela 525 ppszDrivers = ::lscp_list_available_midi_drivers(pClient);
673 capela 431 break;
674 capela 436 case qsamplerDevice::None:
675     break;
676 capela 430 }
677 capela 490
678 capela 980 for (int iDriver = 0; ppszDrivers && ppszDrivers[iDriver]; iDriver++)
679 capela 431 drivers.append(ppszDrivers[iDriver]);
680 capela 430
681     return drivers;
682     }
683    
684    
685 capela 429 //-------------------------------------------------------------------------
686 capela 462 // qsamplerDevicePort - MIDI/Audio Device port/channel structure.
687     //
688    
689     // Constructor.
690 capela 484 qsamplerDevicePort::qsamplerDevicePort ( qsamplerDevice& device,
691     int iPortID ) : m_device(device)
692 capela 462 {
693 capela 484 setDevicePort(iPortID);
694 capela 462 }
695    
696     // Default destructor.
697     qsamplerDevicePort::~qsamplerDevicePort (void)
698     {
699     }
700    
701    
702     // Initializer.
703 capela 484 void qsamplerDevicePort::setDevicePort ( int iPortID )
704 capela 462 {
705 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
706     if (pMainForm == NULL)
707     return;
708     if (pMainForm->client() == NULL)
709     return;
710    
711 capela 462 // Device port id should be always set.
712     m_iPortID = iPortID;
713    
714 capela 463 // Reset port parameters anyway.
715 capela 467 m_params.clear();
716 capela 463
717 capela 462 // Retrieve device port/channel info, if any.
718     lscp_device_port_info_t *pPortInfo = NULL;
719 capela 484 switch (m_device.deviceType()) {
720 capela 462 case qsamplerDevice::Audio:
721 capela 961 if ((pPortInfo = ::lscp_get_audio_channel_info(pMainForm->client(),
722 capela 484 m_device.deviceID(), m_iPortID)) == NULL)
723     m_device.appendMessagesClient("lscp_get_audio_channel_info");
724 capela 462 break;
725     case qsamplerDevice::Midi:
726 capela 961 if ((pPortInfo = ::lscp_get_midi_port_info(pMainForm->client(),
727 capela 484 m_device.deviceID(), m_iPortID)) == NULL)
728     m_device.appendMessagesClient("lscp_get_midi_port_info");
729 capela 462 break;
730     case qsamplerDevice::None:
731     break;
732     }
733    
734     // If we're bogus, bail out...
735     if (pPortInfo == NULL) {
736     m_sPortName = QString::null;
737     return;
738     }
739    
740     // Set device port/channel properties...
741 capela 484 m_sPortName = pPortInfo->name;
742 capela 462
743     // Grab device port/channel parameters...
744     m_params.clear();
745     for (int i = 0; pPortInfo->params && pPortInfo->params[i].key; i++) {
746 capela 463 const QString sParam = pPortInfo->params[i].key;
747 capela 462 lscp_param_info_t *pParamInfo = NULL;
748 capela 484 switch (m_device.deviceType()) {
749 capela 462 case qsamplerDevice::Audio:
750 capela 484 if ((pParamInfo = ::lscp_get_audio_channel_param_info(
751 capela 961 pMainForm->client(), m_device.deviceID(),
752 capela 484 m_iPortID, sParam.latin1())) == NULL)
753     m_device.appendMessagesClient("lscp_get_audio_channel_param_info");
754 capela 462 break;
755     case qsamplerDevice::Midi:
756 capela 484 if ((pParamInfo = ::lscp_get_midi_port_param_info(
757 capela 961 pMainForm->client(), m_device.deviceID(),
758 capela 484 m_iPortID, sParam.latin1())) == NULL)
759     m_device.appendMessagesClient("lscp_get_midi_port_param_info");
760 capela 462 break;
761     case qsamplerDevice::None:
762     break;
763     }
764     if (pParamInfo) {
765 capela 463 m_params[sParam.upper()] = qsamplerDeviceParam(pParamInfo,
766 capela 462 pPortInfo->params[i].value);
767     }
768     }
769     }
770    
771    
772     // Device port/channel property accessors.
773     int qsamplerDevicePort::portID (void) const
774     {
775     return m_iPortID;
776     }
777    
778     const QString& qsamplerDevicePort::portName (void) const
779     {
780     return m_sPortName;
781     }
782    
783     // Device port/channel parameter accessor.
784     const qsamplerDeviceParamMap& qsamplerDevicePort::params (void) const
785     {
786     return m_params;
787     }
788    
789    
790     // Set the proper device port/channel parameter value.
791 capela 484 bool qsamplerDevicePort::setParam ( const QString& sParam,
792 capela 462 const QString& sValue )
793     {
794 capela 961 qsamplerMainForm *pMainForm = qsamplerMainForm::getInstance();
795     if (pMainForm == NULL)
796     return false;
797     if (pMainForm->client() == NULL)
798     return false;
799    
800 capela 484 // Set proper port/channel parameter.
801 capela 463 m_params[sParam.upper()].value = sValue;
802 capela 484
803     // If the device already exists, things get immediate...
804     int iRefresh = 0;
805     if (m_device.deviceID() >= 0 && m_iPortID >= 0) {
806     // Prepare parameter struct.
807     lscp_param_t param;
808     param.key = (char *) sParam.latin1();
809     param.value = (char *) sValue.latin1();
810     // Now it depends on the device type...
811     lscp_status_t ret = LSCP_FAILED;
812     switch (m_device.deviceType()) {
813     case qsamplerDevice::Audio:
814 capela 961 if ((ret = ::lscp_set_audio_channel_param(pMainForm->client(),
815 capela 484 m_device.deviceID(), m_iPortID, &param)) != LSCP_OK)
816     m_device.appendMessagesClient("lscp_set_audio_channel_param");
817     break;
818     case qsamplerDevice::Midi:
819 capela 961 if ((ret = ::lscp_set_midi_port_param(pMainForm->client(),
820 capela 484 m_device.deviceID(), m_iPortID, &param)) != LSCP_OK)
821     m_device.appendMessagesClient("lscp_set_midi_port_param");
822     break;
823     case qsamplerDevice::None:
824     break;
825     }
826     // Show result.
827     if (ret == LSCP_OK) {
828     m_device.appendMessages(m_sPortName
829     + ' ' + QString("%1: %2.").arg(sParam).arg(sValue));
830     iRefresh++;
831     } else {
832     m_device.appendMessagesError(
833     QObject::tr("Could not set %1 parameter value.\n\n"
834     "Sorry.").arg(m_sPortName));
835     }
836     }
837    
838     // Return whether we're need a view refresh.
839     return (iRefresh > 0);
840 capela 462 }
841    
842    
843     //-------------------------------------------------------------------------
844 capela 429 // qsamplerDeviceItem - QListView device item.
845     //
846    
847     // Constructors.
848 capela 433 qsamplerDeviceItem::qsamplerDeviceItem ( QListView *pListView,
849 capela 961 qsamplerDevice::qsamplerDeviceType deviceType )
850     : QListViewItem(pListView), m_device(deviceType)
851 capela 429 {
852     switch(m_device.deviceType()) {
853 capela 431 case qsamplerDevice::Audio:
854 capela 429 QListViewItem::setPixmap(0, QPixmap::fromMimeSource("audio1.png"));
855 capela 471 QListViewItem::setText(0, QObject::tr("Audio Devices"));
856 capela 429 break;
857 capela 431 case qsamplerDevice::Midi:
858 capela 429 QListViewItem::setPixmap(0, QPixmap::fromMimeSource("midi1.png"));
859 capela 471 QListViewItem::setText(0, QObject::tr("MIDI Devices"));
860 capela 429 break;
861 capela 436 case qsamplerDevice::None:
862     break;
863 capela 429 }
864     }
865    
866 capela 433 qsamplerDeviceItem::qsamplerDeviceItem ( QListViewItem *pItem,
867 capela 961 qsamplerDevice::qsamplerDeviceType deviceType,
868 capela 433 int iDeviceID )
869 capela 961 : QListViewItem(pItem), m_device(deviceType, iDeviceID)
870 capela 429 {
871     switch(m_device.deviceType()) {
872 capela 431 case qsamplerDevice::Audio:
873 capela 429 QListViewItem::setPixmap(0, QPixmap::fromMimeSource("audio2.png"));
874     break;
875 capela 431 case qsamplerDevice::Midi:
876 capela 429 QListViewItem::setPixmap(0, QPixmap::fromMimeSource("midi2.png"));
877     break;
878 capela 436 case qsamplerDevice::None:
879     break;
880 capela 429 }
881    
882     QListViewItem::setText(0, m_device.deviceName());
883     }
884    
885     // Default destructor.
886     qsamplerDeviceItem::~qsamplerDeviceItem (void)
887     {
888     }
889    
890     // Instance accessors.
891 capela 431 qsamplerDevice& qsamplerDeviceItem::device (void)
892 capela 429 {
893     return m_device;
894     }
895    
896     // To virtually distinguish between list view items.
897     int qsamplerDeviceItem::rtti() const
898     {
899     return QSAMPLER_DEVICE_ITEM;
900     }
901    
902    
903    
904     //-------------------------------------------------------------------------
905     // qsamplerDeviceParamTable - Device parameter view table.
906     //
907    
908     // Constructor.
909 capela 433 qsamplerDeviceParamTable::qsamplerDeviceParamTable ( QWidget *pParent,
910     const char *pszName )
911 capela 426 : QTable(pParent, pszName)
912     {
913 capela 428 // Set fixed number of columns.
914 capela 429 QTable::setNumCols(3);
915 capela 428 QTable::setShowGrid(false);
916     QTable::setSorting(false);
917     QTable::setFocusStyle(QTable::FollowStyle);
918     QTable::setSelectionMode(QTable::NoSelection);
919     // No vertical header.
920     QTable::verticalHeader()->hide();
921     QTable::setLeftMargin(0);
922     // Initialize the fixed table column headings.
923     QHeader *pHeader = QTable::horizontalHeader();
924 capela 436 pHeader->setLabel(0, tr("Parameter"));
925     pHeader->setLabel(1, tr("Description"));
926     pHeader->setLabel(2, tr("Value"));
927 capela 428 // Set read-onlyness of each column
928     QTable::setColumnReadOnly(0, true);
929 capela 436 QTable::setColumnReadOnly(1, true);
930 capela 468 // QTable::setColumnReadOnly(2, false); -- of course not.
931 capela 436 QTable::setColumnStretchable(1, true);
932 capela 426 }
933    
934     // Default destructor.
935 capela 429 qsamplerDeviceParamTable::~qsamplerDeviceParamTable (void)
936 capela 426 {
937     }
938    
939    
940 capela 462 // Common parameter table renderer.
941     void qsamplerDeviceParamTable::refresh ( const qsamplerDeviceParamMap& params,
942     bool bEditable )
943 capela 429 {
944     // Always (re)start it empty.
945 capela 433 QTable::setUpdatesEnabled(false);
946 capela 429 QTable::setNumRows(0);
947    
948 capela 462 // Fill the parameter table...
949 capela 429 QTable::insertRows(0, params.count());
950     int iRow = 0;
951 capela 431 qsamplerDeviceParamMap::ConstIterator iter;
952 capela 429 for (iter = params.begin(); iter != params.end(); ++iter) {
953 capela 432 const qsamplerDeviceParam& param = iter.data();
954 capela 462 bool bEnabled = (bEditable || !param.fix);
955 capela 436 QTable::setText(iRow, 0, iter.key());
956     QTable::setText(iRow, 1, param.description);
957 capela 462 if (param.type == LSCP_TYPE_BOOL) {
958 capela 432 QStringList opts;
959 capela 463 opts.append(tr("false"));
960     opts.append(tr("true"));
961 capela 432 QComboTableItem *pComboItem = new QComboTableItem(this, opts);
962 capela 448 pComboItem->setCurrentItem(param.value.lower() == "true" ? 1 : 0);
963     pComboItem->setEnabled(bEnabled);
964 capela 436 QTable::setItem(iRow, 2, pComboItem);
965 capela 451 } else if (param.possibilities.count() > 0 && bEnabled) {
966 capela 492 QStringList opts = param.possibilities;
967     if (param.multiplicity)
968     opts.prepend(tr("(none)"));
969     QComboTableItem *pComboItem = new QComboTableItem(this, opts);
970     if (param.value.isEmpty())
971     pComboItem->setCurrentItem(0);
972     else
973     pComboItem->setCurrentItem(param.value);
974 capela 448 pComboItem->setEnabled(bEnabled);
975 capela 436 QTable::setItem(iRow, 2, pComboItem);
976 capela 451 } else if (param.type == LSCP_TYPE_INT && bEnabled
977 capela 448 && !param.range_min.isEmpty()
978     && !param.range_max.isEmpty()) {
979     qsamplerDeviceParamTableSpinBox *pSpinItem =
980 capela 442 new qsamplerDeviceParamTableSpinBox(this,
981 capela 448 bEnabled ? QTableItem::OnTyping : QTableItem::Never,
982 capela 447 param.value);
983 capela 448 pSpinItem->setMinValue(param.range_min.toInt());
984     pSpinItem->setMaxValue(param.range_max.toInt());
985 capela 442 QTable::setItem(iRow, 2, pSpinItem);
986 capela 432 } else {
987 capela 448 qsamplerDeviceParamTableEditBox *pEditItem =
988 capela 442 new qsamplerDeviceParamTableEditBox(this,
989 capela 448 bEnabled ? QTableItem::OnTyping : QTableItem::Never,
990 capela 442 param.value);
991     QTable::setItem(iRow, 2, pEditItem);
992 capela 432 }
993 capela 431 ++iRow;
994 capela 429 }
995    
996 capela 433 // Adjust optimal column widths.
997 capela 436 QTable::adjustColumn(0);
998 capela 433 QTable::adjustColumn(2);
999 capela 436
1000 capela 433 QTable::setUpdatesEnabled(true);
1001     QTable::updateContents();
1002 capela 429 }
1003    
1004    
1005 capela 442 //-------------------------------------------------------------------------
1006     // qsamplerDeviceParamTableSpinBox - Custom spin box for parameter table.
1007     //
1008    
1009     // Constructor.
1010     qsamplerDeviceParamTableSpinBox::qsamplerDeviceParamTableSpinBox (
1011 capela 447 QTable *pTable, EditType editType, const QString& sText )
1012     : QTableItem(pTable, editType, sText)
1013 capela 442 {
1014 capela 448 m_iValue = sText.toInt();
1015     m_iMinValue = m_iMaxValue = 0;
1016 capela 442 }
1017    
1018     // Public accessors.
1019     void qsamplerDeviceParamTableSpinBox::setValue ( int iValue )
1020     {
1021     m_iValue = iValue;
1022     QTableItem::setText(QString::number(m_iValue));
1023     }
1024    
1025     void qsamplerDeviceParamTableSpinBox::setMinValue ( int iMinValue )
1026     {
1027     m_iMinValue = iMinValue;
1028     }
1029    
1030     void qsamplerDeviceParamTableSpinBox::setMaxValue ( int iMaxValue )
1031     {
1032     m_iMaxValue = iMaxValue;
1033     }
1034    
1035     // Virtual implemetations.
1036     QWidget *qsamplerDeviceParamTableSpinBox::createEditor (void) const
1037     {
1038     QSpinBox *pSpinBox = new QSpinBox(QTableItem::table()->viewport());
1039     QObject::connect(pSpinBox, SIGNAL(valueChanged(int)),
1040     QTableItem::table(), SLOT(doValueChanged()));
1041     if (m_iValue >= m_iMinValue && m_iMaxValue >= m_iValue) {
1042     pSpinBox->setMinValue(m_iMinValue);
1043     pSpinBox->setMaxValue(m_iMaxValue);
1044     }
1045     pSpinBox->setValue(m_iValue);
1046     return pSpinBox;
1047     }
1048    
1049     void qsamplerDeviceParamTableSpinBox::setContentFromEditor ( QWidget *pWidget )
1050     {
1051     if (pWidget->inherits("QSpinBox"))
1052 capela 448 QTableItem::setText(QString::number(((QSpinBox *) pWidget)->value()));
1053 capela 442 else
1054 capela 448 QTableItem::setContentFromEditor(pWidget);
1055 capela 442 }
1056    
1057    
1058     //-------------------------------------------------------------------------
1059     // qsamplerDeviceParamTableEditBox - Custom edit box for parameter table.
1060     //
1061    
1062     // Constructor.
1063     qsamplerDeviceParamTableEditBox::qsamplerDeviceParamTableEditBox (
1064     QTable *pTable, EditType editType, const QString& sText )
1065     : QTableItem(pTable, editType, sText)
1066     {
1067     }
1068    
1069     // Virtual implemetations.
1070     QWidget *qsamplerDeviceParamTableEditBox::createEditor (void) const
1071     {
1072     QLineEdit *pEditBox = new QLineEdit(QTableItem::table()->viewport());
1073     QObject::connect(pEditBox, SIGNAL(returnPressed()),
1074     QTableItem::table(), SLOT(doValueChanged()));
1075     pEditBox->setText(QTableItem::text());
1076     return pEditBox;
1077     }
1078    
1079     void qsamplerDeviceParamTableEditBox::setContentFromEditor ( QWidget *pWidget )
1080     {
1081     if (pWidget->inherits("QLineEdit"))
1082 capela 448 QTableItem::setText(((QLineEdit *) pWidget)->text());
1083 capela 442 else
1084 capela 448 QTableItem::setContentFromEditor(pWidget);
1085 capela 442 }
1086    
1087    
1088 capela 426 // end of qsamplerDevice.cpp
1089 capela 492

  ViewVC Help
Powered by ViewVC