root/trunk/libffado/src/bebob/focusrite/focusrite_saffire.cpp

Revision 1498, 32.3 kB (checked in by ppalmers, 15 years ago)

Merge all changes from 2.0 branch into trunk (since r1361). This _should_ contain all forward merges done in the mean time. At this moment in time both branches should be in sync.

Line 
1 /*
2  * Copyright (C) 2005-2008 by Pieter Palmers
3  *
4  * This file is part of FFADO
5  * FFADO = Free Firewire (pro-)audio drivers for linux
6  *
7  * FFADO is based upon FreeBoB.
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) version 3 of the License.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  */
23
24 #include "focusrite_saffire.h"
25 #include "focusrite_cmd.h"
26
27 namespace BeBoB {
28 namespace Focusrite {
29
30 SaffireDevice::SaffireDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom ))
31     : FocusriteDevice( d, configRom)
32     , m_MixerContainer( NULL )
33 {
34     debugOutput( DEBUG_LEVEL_VERBOSE, "Created BeBoB::Focusrite::SaffireDevice (NodeID %d)\n",
35                  getConfigRom().getNodeId() );
36
37     if(getConfigRom().getGuid() < 0x130e0100040000LL) {
38         m_isSaffireLE = false;
39     } else {
40         m_isSaffireLE = true;
41     }
42 }
43
44 bool
45 SaffireDevice::buildMixer()
46 {
47     bool result=true;
48     debugOutput(DEBUG_LEVEL_VERBOSE, "Building a Focusrite Saffire mixer...\n");
49
50     destroyMixer();
51
52     // create the mixer object container
53     m_MixerContainer = new Control::Container(this, "Mixer");
54
55     if (!m_MixerContainer) {
56         debugError("Could not create mixer container...\n");
57         return false;
58     }
59    
60     if(m_isSaffireLE) {
61         // create control objects for the saffire LE
62         result &= m_MixerContainer->addElement(
63             new BinaryControl(*this,
64                     FR_SAFFIRELE_CMD_ID_SPDIF_TRANSPARENT, 0,
65                     "SpdifTransparent", "S/PDIF Transparent", "S/PDIF Transparent"));
66         result &= m_MixerContainer->addElement(
67             new BinaryControl(*this,
68                     FR_SAFFIRELE_CMD_ID_MIDITHRU, 0,
69                     "MidiThru", "MIDI Thru", "MIDI Thru"));
70         result &= m_MixerContainer->addElement(
71             new BinaryControl(*this,
72                     FR_SAFFIRELE_CMD_ID_SAVE_SETTINGS, 0,
73                     "SaveSettings", "Save Settings", "Save Settings"));
74         result &= m_MixerContainer->addElement(
75             new BinaryControl(*this,
76                     FR_SAFFIRELE_CMD_ID_HIGH_GAIN_LINE3, 0,
77                     "HighGainLine3", "High Gain Line-in 3", "High Gain Line-in 3"));
78         result &= m_MixerContainer->addElement(
79             new BinaryControl(*this,
80                     FR_SAFFIRELE_CMD_ID_HIGH_GAIN_LINE4, 0,
81                     "HighGainLine4", "High Gain Line-in 4", "High Gain Line-in 4"));
82
83         // output mute controls
84         result &= m_MixerContainer->addElement(
85             new BinaryControl(*this,
86                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_MUTE,
87                     "Out12Mute", "Out1/2 Mute", "Output 1/2 Mute"));
88         result &= m_MixerContainer->addElement(
89             new BinaryControl(*this,
90                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_MUTE,
91                     "Out34Mute", "Out3/4 Mute", "Output 3/4 Mute"));
92         result &= m_MixerContainer->addElement(
93             new BinaryControl(*this,
94                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_MUTE,
95                     "Out56Mute", "Out5/6 Mute", "Output 5/6 Mute"));
96
97         // output front panel hw volume control
98         result &= m_MixerContainer->addElement(
99             new BinaryControl(*this,
100                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_HWCTRL,
101                     "Out12HwCtrl", "Out1/2 HwCtrl", "Output 1/2 Front Panel Hardware volume control"));
102         result &= m_MixerContainer->addElement(
103             new BinaryControl(*this,
104                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_HWCTRL,
105                     "Out34HwCtrl", "Out3/4 HwCtrl", "Output 3/4 Front Panel Hardware volume control"));
106         result &= m_MixerContainer->addElement(
107             new BinaryControl(*this,
108                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_HWCTRL,
109                     "Out56HwCtrl", "Out5/6 HwCtrl", "Output 5/6 Front Panel Hardware volume control"));
110
111         // dac ignore
112         result &= m_MixerContainer->addElement(
113             new BinaryControl(*this,
114                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DACIGNORE,
115                     "Out12DacIgnore", "Out1/2 Dac Ignore", "Output 1/2 Dac Ignore"));
116         result &= m_MixerContainer->addElement(
117             new BinaryControl(*this,
118                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DACIGNORE,
119                     "Out34DacIgnore", "Out3/4 Dac Ignore", "Output 3/4 Dac Ignore"));
120         result &= m_MixerContainer->addElement(
121             new BinaryControl(*this,
122                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DACIGNORE,
123                     "Out56DacIgnore", "Out5/6 Dac Ignore", "Output 5/6 Dac Ignore"));
124
125         // output level controls
126         result &= m_MixerContainer->addElement(
127             new VolumeControlLowRes(*this,
128                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DAC,
129                     "Out12Level", "Out1/2 Level", "Output 1/2 Level"));
130         result &= m_MixerContainer->addElement(
131             new VolumeControlLowRes(*this,
132                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DAC,
133                     "Out34Level", "Out3/4 Level", "Output 3/4 Level"));
134         result &= m_MixerContainer->addElement(
135             new VolumeControlLowRes(*this,
136                     FR_SAFFIRELE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRELE_CMD_ID_BITFIELD_BIT_DAC,
137                     "Out56Level", "Out5/6 Level", "Output 5/6 Level"));
138
139     } else {
140         // create control objects for the saffire
141         result &= m_MixerContainer->addElement(
142             new BinaryControl(*this,
143                     FR_SAFFIRE_CMD_ID_INPUT_SOURCE, 0,
144                     "SpdifSwitch", "S/PDIF Switch", "S/PDIF Switch"));
145         result &= m_MixerContainer->addElement(
146             new BinaryControl(*this,
147                     FR_SAFFIRE_CMD_ID_MONO_MODE, 0,
148                     "MonoMode", "Mono Mode", "Toggle Mono Mode"));
149         result &= m_MixerContainer->addElement(
150             new BinaryControl(*this,
151                     FR_SAFFIRE_CMD_ID_DEVICE_MODE, 0,
152                     "DeviceMode", "Device Mode", "Toggle Device Mode"));
153         result &= m_MixerContainer->addElement(
154             new BinaryControl(*this,
155                     FR_SAFFIRE_CMD_ID_EXTERNAL_LOCK, 0,
156                     "ExternalLock", "External Lock", "Has external lock?"));
157         result &= m_MixerContainer->addElement(
158             new BinaryControl(*this,
159                     FR_SAFFIRE_CMD_ID_AUDIO_ON_STATUS, 0,
160                     "AudioOnStatus", "Audio On Status", "Audio On Status"));
161         result &= m_MixerContainer->addElement(
162             new BinaryControl(*this,
163                     FR_SAFFIRE_CMD_ID_SAVE_SETTINGS, 0,
164                     "SaveSettings", "Save Settings", "Save Settings"));
165
166         // output mute controls
167         result &= m_MixerContainer->addElement(
168             new BinaryControl(*this,
169                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE,
170                     "Out12Mute", "Out1/2 Mute", "Output 1/2 Mute"));
171         result &= m_MixerContainer->addElement(
172             new BinaryControl(*this,
173                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE,
174                     "Out34Mute", "Out3/4 Mute", "Output 3/4 Mute"));
175         result &= m_MixerContainer->addElement(
176             new BinaryControl(*this,
177                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE,
178                     "Out56Mute", "Out5/6 Mute", "Output 5/6 Mute"));
179         result &= m_MixerContainer->addElement(
180             new BinaryControl(*this,
181                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE,
182                     "Out78Mute", "Out7/8 Mute", "Output 7/8 Mute"));
183         result &= m_MixerContainer->addElement(
184             new BinaryControl(*this,
185                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT910, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE,
186                     "Out910Mute", "Out9/10 Mute", "Output 9/10 Mute"));
187
188         // output front panel hw volume control
189         result &= m_MixerContainer->addElement(
190             new BinaryControl(*this,
191                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL,
192                     "Out12HwCtrl", "Out1/2 HwCtrl", "Output 1/2 Front Panel Hardware volume control"));
193         result &= m_MixerContainer->addElement(
194             new BinaryControl(*this,
195                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL,
196                     "Out34HwCtrl", "Out3/4 HwCtrl", "Output 3/4 Front Panel Hardware volume control"));
197         result &= m_MixerContainer->addElement(
198             new BinaryControl(*this,
199                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL,
200                     "Out56HwCtrl", "Out5/6 HwCtrl", "Output 5/6 Front Panel Hardware volume control"));
201         result &= m_MixerContainer->addElement(
202             new BinaryControl(*this,
203                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL,
204                     "Out78HwCtrl", "Out7/8 HwCtrl", "Output 7/8 Front Panel Hardware volume control"));
205
206         // output level dim
207         result &= m_MixerContainer->addElement(
208             new BinaryControl(*this,
209                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DIM,
210                     "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim"));
211
212         // dac ignore
213         result &= m_MixerContainer->addElement(
214             new BinaryControl(*this,
215                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DACIGNORE,
216                     "Out12DacIgnore", "Out1/2 Dac Ignore", "Output 1/2 Dac Ignore"));
217         result &= m_MixerContainer->addElement(
218             new BinaryControl(*this,
219                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DACIGNORE,
220                     "Out34DacIgnore", "Out3/4 Dac Ignore", "Output 3/4 Dac Ignore"));
221         result &= m_MixerContainer->addElement(
222             new BinaryControl(*this,
223                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DACIGNORE,
224                     "Out56DacIgnore", "Out5/6 Dac Ignore", "Output 5/6 Dac Ignore"));
225         result &= m_MixerContainer->addElement(
226             new BinaryControl(*this,
227                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DACIGNORE,
228                     "Out78DacIgnore", "Out7/8 Dac Ignore", "Output 7/8 Dac Ignore"));
229
230         // output level controls
231         result &= m_MixerContainer->addElement(
232             new VolumeControlLowRes(*this,
233                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DAC,
234                     "Out12Level", "Out1/2 Level", "Output 1/2 Level"));
235         result &= m_MixerContainer->addElement(
236             new VolumeControlLowRes(*this,
237                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DAC,
238                     "Out34Level", "Out3/4 Level", "Output 3/4 Level"));
239         result &= m_MixerContainer->addElement(
240             new VolumeControlLowRes(*this,
241                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DAC,
242                     "Out56Level", "Out5/6 Level", "Output 5/6 Level"));
243         result &= m_MixerContainer->addElement(
244             new VolumeControlLowRes(*this,
245                     FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DAC,
246                     "Out78Level", "Out7/8 Level", "Output 7/8 Level"));
247
248         result &= m_MixerContainer->addElement(
249             new DialPositionControl(*this,
250                     FR_SAFFIRE_CMD_ID_MONITOR_DIAL, 0,
251                     "MonitorDial", "Monitor Dial", "Monitor Dial Value"));
252
253         // metering
254         result &= m_MixerContainer->addElement(
255             new MeteringControl(*this,
256                     FR_SAFFIRE_CMD_ID_METERING_IN1,
257                     "MeteringIn1", "Metering Input 1", "Metering on Input 1"));
258         result &= m_MixerContainer->addElement(
259             new MeteringControl(*this,
260                     FR_SAFFIRE_CMD_ID_METERING_IN2,
261                     "MeteringIn2", "Metering Input 2", "Metering on Input 2"));
262         result &= m_MixerContainer->addElement(
263             new MeteringControl(*this,
264                     FR_SAFFIRE_CMD_ID_METERING_IN3,
265                     "MeteringIn3", "Metering Input 3", "Metering on Input 3"));
266         result &= m_MixerContainer->addElement(
267             new MeteringControl(*this,
268                     FR_SAFFIRE_CMD_ID_METERING_IN4,
269                     "MeteringIn4", "Metering Input 4", "Metering on Input 4"));
270
271         result &= m_MixerContainer->addElement(
272             new MeteringControl(*this,
273                     FR_SAFFIRE_CMD_ID_METERING_PC1,
274                     "MeteringPc1", "Metering PC 1", "Metering on PC Channel 1"));
275         result &= m_MixerContainer->addElement(
276             new MeteringControl(*this,
277                     FR_SAFFIRE_CMD_ID_METERING_PC2,
278                     "MeteringPc2", "Metering PC 2", "Metering on PC Channel 2"));
279         result &= m_MixerContainer->addElement(
280             new MeteringControl(*this,
281                     FR_SAFFIRE_CMD_ID_METERING_PC3,
282                     "MeteringPc3", "Metering PC 3", "Metering on PC Channel 3"));
283         result &= m_MixerContainer->addElement(
284             new MeteringControl(*this,
285                     FR_SAFFIRE_CMD_ID_METERING_PC4,
286                     "MeteringPc4", "Metering PC 4", "Metering on PC Channel 4"));
287         result &= m_MixerContainer->addElement(
288             new MeteringControl(*this,
289                     FR_SAFFIRE_CMD_ID_METERING_PC5,
290                     "MeteringPc5", "Metering PC 5", "Metering on PC Channel 5"));
291         result &= m_MixerContainer->addElement(
292             new MeteringControl(*this,
293                     FR_SAFFIRE_CMD_ID_METERING_PC6,
294                     "MeteringPc6", "Metering PC 6", "Metering on PC Channel 6"));
295         result &= m_MixerContainer->addElement(
296             new MeteringControl(*this,
297                     FR_SAFFIRE_CMD_ID_METERING_PC7,
298                     "MeteringPc7", "Metering PC 7", "Metering on PC Channel 7"));
299         result &= m_MixerContainer->addElement(
300             new MeteringControl(*this,
301                     FR_SAFFIRE_CMD_ID_METERING_PC8,
302                     "MeteringPc8", "Metering PC 8", "Metering on PC Channel 8"));
303         result &= m_MixerContainer->addElement(
304             new MeteringControl(*this,
305                     FR_SAFFIRE_CMD_ID_METERING_PC9,
306                     "MeteringPc9", "Metering PC 9", "Metering on PC Channel 9"));
307         result &= m_MixerContainer->addElement(
308             new MeteringControl(*this,
309                     FR_SAFFIRE_CMD_ID_METERING_PC10,
310                     "MeteringPc10", "Metering PC 10", "Metering on PC Channel 10"));
311
312     }
313    
314     // matrix mix controls
315     if(m_isSaffireLE) {
316         result &= m_MixerContainer->addElement(
317             new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_LEMix48, "LEMix48"));
318    
319         result &= m_MixerContainer->addElement(
320             new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_LEMix96, "LEMix96"));
321
322         result &= m_MixerContainer->addElement(
323             new BinaryControl(*this,
324                     FR_SAFFIRELE_CMD_ID_SWAP_OUT4_OUT1_48K, 0,
325                     "Swap41_48", "Swap41_48", "Swap41_48"));
326         result &= m_MixerContainer->addElement(
327             new BinaryControl(*this,
328                     FR_SAFFIRELE_CMD_ID_SWAP_OUT4_OUT1_96K, 0,
329                     "Swap41_96", "Swap41_96", "Swap41_96"));
330     } else {
331         result &= m_MixerContainer->addElement(
332             new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_SaffireStereoMatrixMix, "MatrixMixerStereo"));
333         result &= m_MixerContainer->addElement(
334             new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_SaffireMonoMatrixMix, "MatrixMixerMono"));
335     }
336
337     if (!result) {
338         debugWarning("One or more control elements could not be created.");
339         // clean up those that were created
340         destroyMixer();
341         return false;
342     }
343
344     if (!addElement(m_MixerContainer)) {
345         debugWarning("Could not register mixer to device\n");
346         // clean up
347         destroyMixer();
348         return false;
349     }
350
351     // add a direct register access element
352     if (!addElement(new RegisterControl(*this, "Register", "Register Access", "Direct register access"))) {
353         debugWarning("Could not create register control element.");
354         // clean up those that were created
355         destroyMixer();
356         return false;
357     }
358
359     return true;
360 }
361
362 bool
363 SaffireDevice::destroyMixer()
364 {
365     debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n");
366    
367     if (m_MixerContainer == NULL) {
368         debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n");
369         return true;
370     }
371    
372     if (!deleteElement(m_MixerContainer)) {
373         debugError("Mixer present but not registered to the avdevice\n");
374         return false;
375     }
376    
377     // remove and delete (as in free) child control elements
378     m_MixerContainer->clearElements(true);
379     delete m_MixerContainer;
380     return true;
381 }
382
383 std::vector<int>
384 SaffireDevice::getSupportedSamplingFrequencies()
385 {
386     std::vector<int> frequencies;
387     frequencies.push_back(44100);
388     frequencies.push_back(48000);
389     frequencies.push_back(88200);
390     frequencies.push_back(96000);
391     return frequencies;
392 }
393
394 void
395 SaffireDevice::showDevice()
396 {
397     if(m_isSaffireLE) {
398         debugOutput(DEBUG_LEVEL_NORMAL, "This is a BeBoB::Focusrite::SaffireDevice (Saffire LE)\n");
399     } else {
400         debugOutput(DEBUG_LEVEL_NORMAL, "This is a BeBoB::Focusrite::SaffireDevice (Saffire)\n");
401     }
402     FocusriteDevice::showDevice();
403 }
404
405 void
406 SaffireDevice::setVerboseLevel(int l)
407 {
408     debugOutput( DEBUG_LEVEL_VERBOSE, "Setting verbose level to %d...\n", l );
409
410     FocusriteDevice::setVerboseLevel(l);
411 }
412
413 // Saffire pro matrix mixer element
414
415 SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p,
416                                        enum eMatrixMixerType type)
417 : FocusriteMatrixMixer(p, "MatrixMixer")
418 , m_type(type)
419 {
420     init();
421 }
422
423 SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p,
424                                        enum eMatrixMixerType type, std::string n)
425 : FocusriteMatrixMixer(p, n)
426 , m_type(type)
427 {
428     init();
429 }
430
431 void SaffireMatrixMixer::init()
432 {
433     if (m_type==eMMT_SaffireStereoMatrixMix) {
434         m_RowInfo.clear();
435         addSignalInfo(m_RowInfo, "PC910", "PC 9/10", "PC Channel 9/10");
436         addSignalInfo(m_RowInfo, "PC12", "PC 1/2", "PC Channel 1/2");
437         addSignalInfo(m_RowInfo, "PC34", "PC 3/4", "PC Channel 3/4");
438         addSignalInfo(m_RowInfo, "PC56", "PC 5/6", "PC Channel 5/6");
439         addSignalInfo(m_RowInfo, "PC78", "PC 7/8", "PC Channel 7/8");
440         addSignalInfo(m_RowInfo, "IN12", "Input 1/2", "Hardware Inputs 1/2");
441         addSignalInfo(m_RowInfo, "IN34", "Input 3/4", "Hardware Inputs 3/4 (dry / S/PDIF)");
442         addSignalInfo(m_RowInfo, "FX", "Effect return", "Effect return");
443
444         m_ColInfo.clear();
445         addSignalInfo(m_ColInfo, "OUT910", "OUT 9/10", "Output 9/10");
446         addSignalInfo(m_ColInfo, "OUT12", "OUT 1/2", "Output 1/2");
447         addSignalInfo(m_ColInfo, "OUT34", "OUT 3/4", "Output 3/4");
448         addSignalInfo(m_ColInfo, "OUT56", "OUT 5/6", "Output 5/6 (HP1)");
449         addSignalInfo(m_ColInfo, "OUT78", "OUT 7/8", "Output 7/8 (HP2)");
450        
451         // init the cell matrix
452         #define FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_COLS 5
453         #define FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_ROWS 8
454         #define FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_OFFSET 0
455
456         std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_COLS );
457         std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_ROWS, tmp_cols);
458         m_CellInfo = tmp_all;
459    
460         struct sCellInfo c;
461         c.row=-1;
462         c.col=-1;
463         c.valid=false;
464         c.address=0;
465        
466         // all cells are valid
467         for (int i=0; i < FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_ROWS; i++) {
468             for (int j=0; j < FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_COLS; j++) {
469                 c.row = i;
470                 c.col = j;
471                 c.valid = true;
472                 c.address = FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_OFFSET + c.row * FOCUSRITE_SAFFIRE_STEREO_MATRIXMIX_NB_COLS + c.col;
473                 m_CellInfo.at(i).at(j) =  c;
474             }
475         }
476     } else if (m_type==eMMT_SaffireMonoMatrixMix) {
477         m_RowInfo.clear();
478         addSignalInfo(m_RowInfo, "IN1", "Input 1", "Hardware Inputs 1");
479         addSignalInfo(m_RowInfo, "IN3", "Input 3", "Hardware Inputs 3");
480         addSignalInfo(m_RowInfo, "FX1", "Effect return 1", "Effect return 1");
481         addSignalInfo(m_RowInfo, "IN2", "Input 2", "Hardware Inputs 2");
482         addSignalInfo(m_RowInfo, "IN4", "Input 4", "Hardware Inputs 4");
483         addSignalInfo(m_RowInfo, "FX2", "Effect return 2", "Effect return 2");
484         addSignalInfo(m_RowInfo, "PC910", "PC 9/10", "PC Channel 9/10");
485         addSignalInfo(m_RowInfo, "PC12", "PC 1/2", "PC Channel 1/2");
486         addSignalInfo(m_RowInfo, "PC34", "PC 3/4", "PC Channel 3/4");
487         addSignalInfo(m_RowInfo, "PC56", "PC 5/6", "PC Channel 5/6");
488         addSignalInfo(m_RowInfo, "PC78", "PC 7/8", "PC Channel 7/8");
489
490         m_ColInfo.clear();
491         addSignalInfo(m_ColInfo, "OUT910", "OUT 9/10", "Output 9/10");
492         addSignalInfo(m_ColInfo, "OUT12", "OUT 1/2", "Output 1/2");
493         addSignalInfo(m_ColInfo, "OUT34", "OUT 3/4", "Output 3/4");
494         addSignalInfo(m_ColInfo, "OUT56", "OUT 5/6", "Output 5/6 (HP1)");
495         addSignalInfo(m_ColInfo, "OUT78", "OUT 7/8", "Output 7/8 (HP2)");
496        
497         // init the cell matrix
498         #define FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_COLS 5
499         #define FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_ROWS 11
500         #define FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_OFFSET 0
501
502         std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_COLS );
503         std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_ROWS, tmp_cols);
504         m_CellInfo = tmp_all;
505    
506         struct sCellInfo c;
507         c.row=-1;
508         c.col=-1;
509         c.valid=false;
510         c.address=0;
511        
512         // all cells are valid
513         for (int i=0; i < FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_ROWS; i++) {
514             for (int j=0; j < FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_COLS; j++) {
515                 c.row = i;
516                 c.col = j;
517                 c.valid = true;
518                 c.address = FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_OFFSET + c.row * FOCUSRITE_SAFFIRE_MONO_MATRIXMIX_NB_COLS + c.col;
519                 m_CellInfo.at(i).at(j) =  c;
520             }
521         }
522     } else if (m_type == eMMT_LEMix48) {
523         addSignalInfo(m_RowInfo, "IN1", "Input 1", "Analog Input 1");
524         addSignalInfo(m_RowInfo, "IN2", "Input 2", "Analog Input 2");
525         addSignalInfo(m_RowInfo, "IN3", "Input 3", "Analog Input 3");
526         addSignalInfo(m_RowInfo, "IN4", "Input 4", "Analog Input 4");
527         addSignalInfo(m_RowInfo, "SPDIFL", "SPDIF L", "S/PDIF Left Input");
528         addSignalInfo(m_RowInfo, "SPDIFR", "SPDIF R", "S/PDIF Right Input");
529
530         addSignalInfo(m_RowInfo, "PC1", "PC 1", "PC Channel 1");
531         addSignalInfo(m_RowInfo, "PC2", "PC 2", "PC Channel 2");
532         addSignalInfo(m_RowInfo, "PC3", "PC 3", "PC Channel 3");
533         addSignalInfo(m_RowInfo, "PC4", "PC 4", "PC Channel 4");
534         addSignalInfo(m_RowInfo, "PC5", "PC 5", "PC Channel 5");
535         addSignalInfo(m_RowInfo, "PC6", "PC 6", "PC Channel 6");
536         addSignalInfo(m_RowInfo, "PC7", "PC 7", "PC Channel 7");
537         addSignalInfo(m_RowInfo, "PC8", "PC 8", "PC Channel 8");
538
539         addSignalInfo(m_ColInfo, "OUT1", "OUT 1", "Output 1");
540         addSignalInfo(m_ColInfo, "OUT2", "OUT 2", "Output 2");
541         addSignalInfo(m_ColInfo, "OUT3", "OUT 3", "Output 3");
542         addSignalInfo(m_ColInfo, "OUT4", "OUT 4", "Output 4");
543
544         // init the cell matrix
545         #define FOCUSRITE_SAFFIRELE_48KMIX_NB_COLS 4
546         #define FOCUSRITE_SAFFIRELE_48KMIX_NB_ROWS 14
547        
548         std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRELE_48KMIX_NB_COLS );
549         std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRELE_48KMIX_NB_ROWS,tmp_cols);
550         m_CellInfo = tmp_all;
551    
552         struct sCellInfo c;
553         c.row=-1;
554         c.col=-1;
555         c.valid=false;
556         c.address=0;
557        
558         for (int i=0;i<FOCUSRITE_SAFFIRELE_48KMIX_NB_ROWS;i++) {
559             for (int j=0;j<FOCUSRITE_SAFFIRELE_48KMIX_NB_COLS;j++) {
560                 m_CellInfo.at(i).at(j) = c;
561             }
562         }
563
564         // now set the cells that are valid
565         setCellInfo(0,0,FR_SAFFIRELE_CMD_ID_IN1_TO_OUT1, true);
566         setCellInfo(0,1,FR_SAFFIRELE_CMD_ID_IN1_TO_OUT2, true);
567         setCellInfo(0,2,FR_SAFFIRELE_CMD_ID_IN1_TO_OUT3, true);
568         setCellInfo(0,3,FR_SAFFIRELE_CMD_ID_IN1_TO_OUT4, true);
569         setCellInfo(1,0,FR_SAFFIRELE_CMD_ID_IN2_TO_OUT1, true);
570         setCellInfo(1,1,FR_SAFFIRELE_CMD_ID_IN2_TO_OUT2, true);
571         setCellInfo(1,2,FR_SAFFIRELE_CMD_ID_IN2_TO_OUT3, true);
572         setCellInfo(1,3,FR_SAFFIRELE_CMD_ID_IN2_TO_OUT4, true);
573         setCellInfo(2,0,FR_SAFFIRELE_CMD_ID_IN3_TO_OUT1, true);
574         setCellInfo(2,1,FR_SAFFIRELE_CMD_ID_IN3_TO_OUT2, true);
575         setCellInfo(2,2,FR_SAFFIRELE_CMD_ID_IN3_TO_OUT3, true);
576         setCellInfo(2,3,FR_SAFFIRELE_CMD_ID_IN3_TO_OUT4, true);
577         setCellInfo(3,0,FR_SAFFIRELE_CMD_ID_IN4_TO_OUT1, true);
578         setCellInfo(3,1,FR_SAFFIRELE_CMD_ID_IN4_TO_OUT2, true);
579         setCellInfo(3,2,FR_SAFFIRELE_CMD_ID_IN4_TO_OUT3, true);
580         setCellInfo(3,3,FR_SAFFIRELE_CMD_ID_IN4_TO_OUT4, true);
581        
582         setCellInfo(4,0,FR_SAFFIRELE_CMD_ID_SPDIF1_TO_OUT1, true);
583         setCellInfo(4,1,FR_SAFFIRELE_CMD_ID_SPDIF1_TO_OUT2, true);
584         setCellInfo(4,2,FR_SAFFIRELE_CMD_ID_SPDIF1_TO_OUT3, true);
585         setCellInfo(4,3,FR_SAFFIRELE_CMD_ID_SPDIF1_TO_OUT4, true);
586         setCellInfo(5,0,FR_SAFFIRELE_CMD_ID_SPDIF2_TO_OUT1, true);
587         setCellInfo(5,1,FR_SAFFIRELE_CMD_ID_SPDIF2_TO_OUT2, true);
588         setCellInfo(5,2,FR_SAFFIRELE_CMD_ID_SPDIF2_TO_OUT3, true);
589         setCellInfo(5,3,FR_SAFFIRELE_CMD_ID_SPDIF2_TO_OUT4, true);
590         setCellInfo(6,0,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT1, true);
591         setCellInfo(6,1,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT2, true);
592         setCellInfo(6,2,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT3, true);
593         setCellInfo(6,3,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT4, true);
594         setCellInfo(7,0,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT1, true);
595         setCellInfo(7,1,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT2, true);
596         setCellInfo(7,2,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT3, true);
597         setCellInfo(7,3,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT4, true);
598         setCellInfo(8,0,FR_SAFFIRELE_CMD_ID_PC3_TO_OUT1, true);
599         setCellInfo(8,1,FR_SAFFIRELE_CMD_ID_PC3_TO_OUT2, true);
600         setCellInfo(8,2,FR_SAFFIRELE_CMD_ID_PC3_TO_OUT3, true);
601         setCellInfo(8,3,FR_SAFFIRELE_CMD_ID_PC3_TO_OUT4, true);
602         setCellInfo(9,0,FR_SAFFIRELE_CMD_ID_PC4_TO_OUT1, true);
603         setCellInfo(9,1,FR_SAFFIRELE_CMD_ID_PC4_TO_OUT2, true);
604         setCellInfo(9,2,FR_SAFFIRELE_CMD_ID_PC4_TO_OUT3, true);
605         setCellInfo(9,3,FR_SAFFIRELE_CMD_ID_PC4_TO_OUT4, true);
606         setCellInfo(10,0,FR_SAFFIRELE_CMD_ID_PC5_TO_OUT1, true);
607         setCellInfo(10,1,FR_SAFFIRELE_CMD_ID_PC5_TO_OUT2, true);
608         setCellInfo(10,2,FR_SAFFIRELE_CMD_ID_PC5_TO_OUT3, true);
609         setCellInfo(10,3,FR_SAFFIRELE_CMD_ID_PC5_TO_OUT4, true);
610         setCellInfo(11,0,FR_SAFFIRELE_CMD_ID_PC6_TO_OUT1, true);
611         setCellInfo(11,1,FR_SAFFIRELE_CMD_ID_PC6_TO_OUT2, true);
612         setCellInfo(11,2,FR_SAFFIRELE_CMD_ID_PC6_TO_OUT3, true);
613         setCellInfo(11,3,FR_SAFFIRELE_CMD_ID_PC6_TO_OUT4, true);
614         setCellInfo(12,0,FR_SAFFIRELE_CMD_ID_PC7_TO_OUT1, true);
615         setCellInfo(12,1,FR_SAFFIRELE_CMD_ID_PC7_TO_OUT2, true);
616         setCellInfo(12,2,FR_SAFFIRELE_CMD_ID_PC7_TO_OUT3, true);
617         setCellInfo(12,3,FR_SAFFIRELE_CMD_ID_PC7_TO_OUT4, true);
618         setCellInfo(13,0,FR_SAFFIRELE_CMD_ID_PC8_TO_OUT1, true);
619         setCellInfo(13,1,FR_SAFFIRELE_CMD_ID_PC8_TO_OUT2, true);
620         setCellInfo(13,2,FR_SAFFIRELE_CMD_ID_PC8_TO_OUT3, true);
621         setCellInfo(13,3,FR_SAFFIRELE_CMD_ID_PC8_TO_OUT4, true);
622
623     } else if (m_type == eMMT_LEMix96) {
624         addSignalInfo(m_RowInfo, "IN1", "Input 1", "Analog Input 1");
625         addSignalInfo(m_RowInfo, "IN2", "Input 2", "Analog Input 2");
626         addSignalInfo(m_RowInfo, "IN3", "Input 3", "Analog Input 3");
627         addSignalInfo(m_RowInfo, "IN4", "Input 4", "Analog Input 4");
628         addSignalInfo(m_RowInfo, "SPDIFL", "SPDIF L", "S/PDIF Left Input");
629         addSignalInfo(m_RowInfo, "SPDIFR", "SPDIF R", "S/PDIF Right Input");
630
631         addSignalInfo(m_RowInfo, "PC1", "PC 1", "PC Channel 1");
632         addSignalInfo(m_RowInfo, "PC2", "PC 2", "PC Channel 2");
633         addSignalInfo(m_RowInfo, "PC3", "PC 3", "PC Channel 3");
634         addSignalInfo(m_RowInfo, "PC4", "PC 4", "PC Channel 4");
635         addSignalInfo(m_RowInfo, "PC5", "PC 5", "PC Channel 5");
636         addSignalInfo(m_RowInfo, "PC6", "PC 6", "PC Channel 6");
637         addSignalInfo(m_RowInfo, "PC7", "PC 7", "PC Channel 7");
638         addSignalInfo(m_RowInfo, "PC8", "PC 8", "PC Channel 8");
639         addSignalInfo(m_RowInfo, "RECMIXRETURN", "RECMIXRETURN", "Record mix (mono) return");
640
641         addSignalInfo(m_ColInfo, "OUT1", "OUT 1", "Output 1");
642         addSignalInfo(m_ColInfo, "OUT2", "OUT 2", "Output 2");
643         addSignalInfo(m_ColInfo, "OUT3", "OUT 3", "Output 3");
644         addSignalInfo(m_ColInfo, "OUT4", "OUT 4", "Output 4");
645         addSignalInfo(m_ColInfo, "RECMIX", "RECMIX", "Record mix (mono)");
646
647         // init the cell matrix
648         #define FOCUSRITE_SAFFIRELE_96KMIX_NB_COLS 5
649         #define FOCUSRITE_SAFFIRELE_96KMIX_NB_ROWS 15
650        
651         std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRELE_96KMIX_NB_COLS );
652         std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRELE_96KMIX_NB_ROWS,tmp_cols);
653         m_CellInfo = tmp_all;
654    
655         struct sCellInfo c;
656         c.row=-1;
657         c.col=-1;
658         c.valid=false;
659         c.address=0;
660        
661         for (int i=0;i<FOCUSRITE_SAFFIRELE_96KMIX_NB_ROWS;i++) {
662             for (int j=0;j<FOCUSRITE_SAFFIRELE_96KMIX_NB_COLS;j++) {
663                 m_CellInfo.at(i).at(j) = c;
664             }
665         }
666
667         // now set the cells that are valid
668         setCellInfo(0,4,FR_SAFFIRELE_CMD_ID_IN1_TO_RECMIX_96K, true);
669         setCellInfo(1,4,FR_SAFFIRELE_CMD_ID_IN2_TO_RECMIX_96K, true);
670         setCellInfo(2,4,FR_SAFFIRELE_CMD_ID_IN3_TO_RECMIX_96K, true);
671         setCellInfo(3,4,FR_SAFFIRELE_CMD_ID_IN4_TO_RECMIX_96K, true);
672         setCellInfo(4,4,FR_SAFFIRELE_CMD_ID_SPDIF1_TO_RECMIX_96K, true);
673         setCellInfo(5,4,FR_SAFFIRELE_CMD_ID_SPDIF2_TO_RECMIX_96K, true);
674
675         setCellInfo(14,0,FR_SAFFIRELE_CMD_ID_RECMIX_TO_OUT1_96K, true);
676         setCellInfo(14,1,FR_SAFFIRELE_CMD_ID_RECMIX_TO_OUT2_96K, true);
677         setCellInfo(14,2,FR_SAFFIRELE_CMD_ID_RECMIX_TO_OUT3_96K, true);
678         setCellInfo(14,3,FR_SAFFIRELE_CMD_ID_RECMIX_TO_OUT4_96K, true);
679
680         setCellInfo(7,0,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT1_96K, true);
681         setCellInfo(7,1,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT2_96K, true);
682         setCellInfo(7,2,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT3_96K, true);
683         setCellInfo(7,3,FR_SAFFIRELE_CMD_ID_PC1_TO_OUT4_96K, true);
684         setCellInfo(8,0,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT1_96K, true);
685         setCellInfo(8,1,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT2_96K, true);
686         setCellInfo(8,2,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT3_96K, true);
687         setCellInfo(8,3,FR_SAFFIRELE_CMD_ID_PC2_TO_OUT4_96K, true);
688     } else {
689         debugError("Invalid mixer type\n");
690     }
691 }
692
693 void SaffireMatrixMixer::show()
694 {
695     debugOutput(DEBUG_LEVEL_NORMAL, "Saffire Matrix mixer type %d\n");
696 }
697
698 } // Focusrite
699 } // BeBoB
Note: See TracBrowser for help on using the browser.