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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1486 - (hide annotations) (download)
Sat Nov 17 02:02:28 2007 UTC (16 years, 5 months ago) by schoenebeck
File size: 32169 byte(s)
* Qt4 migration: finished / fixed device management dialog.
* Fixed creation of devices (don't try to set device parameters which the
  user did not touch in the device creation dialog, this bug already
  existed in the Qt3 version of QSampler).

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

  ViewVC Help
Powered by ViewVC