root/branches/libffado-2.0/src/bebob/focusrite/focusrite_saffire.cpp

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

fix up saffire mixers (closes #147)

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