root/trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h

Revision 653, 8.3 kB (checked in by ppalmers, 15 years ago)

- a first pass at Focusrite Saffire Pro mixer support. Note: the mixer only works when streaming.

Line 
1 /*
2  * Copyright (C) 2005-2007 by Daniel Wagner
3  * Copyright (C) 2005-2007 by Pieter Palmers
4  *
5  * This file is part of FFADO
6  * FFADO = Free Firewire (pro-)audio drivers for linux
7  *
8  * FFADO is based upon FreeBoB.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License version 2.1, as published by the Free Software Foundation;
13  *
14  * This library 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 GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22  * MA 02110-1301 USA
23  */
24
25 #ifndef BEBOB_FOCUSRITE_SAFFIRE_PRO_DEVICE_H
26 #define BEBOB_FOCUSRITE_SAFFIRE_PRO_DEVICE_H
27
28 #include "debugmodule/debugmodule.h"
29 #include "focusrite_generic.h"
30
31 #include "libcontrol/MatrixMixer.h"
32
33 #include <vector>
34 #include <string>
35
36 #define FR_SAFFIREPRO_CMD_ID_SAMPLERATE         84
37 #define FR_SAFFIREPRO_CMD_ID_SAMPLERATE_MIRROR  115
38
39 #define FR_SAFFIREPRO_CMD_ID_PHANTOM14          98
40 #define FR_SAFFIREPRO_CMD_ID_PHANTOM58          99
41 #define FR_SAFFIREPRO_CMD_ID_INSERT1            100
42 #define FR_SAFFIREPRO_CMD_ID_INSERT2            101
43 #define FR_SAFFIREPRO_CMD_ID_AC3_PASSTHROUGH    103
44 #define FR_SAFFIREPRO_CMD_ID_MIDI_TRU           104
45
46 #define FOCUSRITE_CMD_SAMPLERATE_44K1   1
47 #define FOCUSRITE_CMD_SAMPLERATE_48K    2
48 #define FOCUSRITE_CMD_SAMPLERATE_88K2   3
49 #define FOCUSRITE_CMD_SAMPLERATE_96K    4
50 #define FOCUSRITE_CMD_SAMPLERATE_176K4  5
51 #define FOCUSRITE_CMD_SAMPLERATE_192K   6
52
53 #define FR_SAFFIREPRO_CMD_ID_AN1_TO_IMIXL        0
54 #define FR_SAFFIREPRO_CMD_ID_AN1_TO_IMIXR        1
55 #define FR_SAFFIREPRO_CMD_ID_AN2_TO_IMIXL        2
56 #define FR_SAFFIREPRO_CMD_ID_AN2_TO_IMIXR        3
57 #define FR_SAFFIREPRO_CMD_ID_AN3_TO_IMIXL        4
58 #define FR_SAFFIREPRO_CMD_ID_AN3_TO_IMIXR        5
59 #define FR_SAFFIREPRO_CMD_ID_AN4_TO_IMIXL        6
60 #define FR_SAFFIREPRO_CMD_ID_AN4_TO_IMIXR        7
61 #define FR_SAFFIREPRO_CMD_ID_AN5_TO_IMIXL        8
62 #define FR_SAFFIREPRO_CMD_ID_AN5_TO_IMIXR        9
63 #define FR_SAFFIREPRO_CMD_ID_AN6_TO_IMIXL       10
64 #define FR_SAFFIREPRO_CMD_ID_AN6_TO_IMIXR       11
65 #define FR_SAFFIREPRO_CMD_ID_AN7_TO_IMIXL       12
66 #define FR_SAFFIREPRO_CMD_ID_AN7_TO_IMIXR       13
67 #define FR_SAFFIREPRO_CMD_ID_AN8_TO_IMIXL       14
68 #define FR_SAFFIREPRO_CMD_ID_AN8_TO_IMIXR       15
69 #define FR_SAFFIREPRO_CMD_ID_SPDIFL_TO_IMIXL    16
70 #define FR_SAFFIREPRO_CMD_ID_SPDIFL_TO_IMIXR    17
71 #define FR_SAFFIREPRO_CMD_ID_SPDIFR_TO_IMIXL    18
72 #define FR_SAFFIREPRO_CMD_ID_SPDIFR_TO_IMIXR    19
73
74 #define FR_SAFFIREPRO_CMD_ID_ADAT11_TO_IMIXL    20
75 #define FR_SAFFIREPRO_CMD_ID_ADAT11_TO_IMIXR    21
76 #define FR_SAFFIREPRO_CMD_ID_ADAT12_TO_IMIXL    22
77 #define FR_SAFFIREPRO_CMD_ID_ADAT12_TO_IMIXR    23
78 #define FR_SAFFIREPRO_CMD_ID_ADAT13_TO_IMIXL    24
79 #define FR_SAFFIREPRO_CMD_ID_ADAT13_TO_IMIXR    25
80 #define FR_SAFFIREPRO_CMD_ID_ADAT14_TO_IMIXL    26
81 #define FR_SAFFIREPRO_CMD_ID_ADAT14_TO_IMIXR    27
82 #define FR_SAFFIREPRO_CMD_ID_ADAT15_TO_IMIXL    28
83 #define FR_SAFFIREPRO_CMD_ID_ADAT15_TO_IMIXR    29
84 #define FR_SAFFIREPRO_CMD_ID_ADAT16_TO_IMIXL    30
85 #define FR_SAFFIREPRO_CMD_ID_ADAT16_TO_IMIXR    31
86 #define FR_SAFFIREPRO_CMD_ID_ADAT17_TO_IMIXL    32
87 #define FR_SAFFIREPRO_CMD_ID_ADAT17_TO_IMIXR    33
88 #define FR_SAFFIREPRO_CMD_ID_ADAT18_TO_IMIXL    34
89 #define FR_SAFFIREPRO_CMD_ID_ADAT18_TO_IMIXR    35
90
91 #define FR_SAFFIREPRO_CMD_ID_ADAT21_TO_IMIXL    36
92 #define FR_SAFFIREPRO_CMD_ID_ADAT21_TO_IMIXR    37
93 #define FR_SAFFIREPRO_CMD_ID_ADAT22_TO_IMIXL    38
94 #define FR_SAFFIREPRO_CMD_ID_ADAT22_TO_IMIXR    39
95 #define FR_SAFFIREPRO_CMD_ID_ADAT23_TO_IMIXL    40
96 #define FR_SAFFIREPRO_CMD_ID_ADAT23_TO_IMIXR    41
97 #define FR_SAFFIREPRO_CMD_ID_ADAT24_TO_IMIXL    42
98 #define FR_SAFFIREPRO_CMD_ID_ADAT24_TO_IMIXR    43
99 #define FR_SAFFIREPRO_CMD_ID_ADAT25_TO_IMIXL    44
100 #define FR_SAFFIREPRO_CMD_ID_ADAT25_TO_IMIXR    45
101 #define FR_SAFFIREPRO_CMD_ID_ADAT26_TO_IMIXL    46
102 #define FR_SAFFIREPRO_CMD_ID_ADAT26_TO_IMIXR    47
103 #define FR_SAFFIREPRO_CMD_ID_ADAT27_TO_IMIXL    48
104 #define FR_SAFFIREPRO_CMD_ID_ADAT27_TO_IMIXR    49
105 #define FR_SAFFIREPRO_CMD_ID_ADAT28_TO_IMIXL    50
106 #define FR_SAFFIREPRO_CMD_ID_ADAT28_TO_IMIXR    51
107
108 #define FR_SAFFIREPRO_CMD_ID_PC1_TO_OUT1    52
109 #define FR_SAFFIREPRO_CMD_ID_PC2_TO_OUT2    54
110 #define FR_SAFFIREPRO_CMD_ID_MIX1_TO_OUT1   53
111 #define FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT2   55
112
113 #define FR_SAFFIREPRO_CMD_ID_PC1_TO_OUT3    56
114 #define FR_SAFFIREPRO_CMD_ID_PC2_TO_OUT4    59
115 #define FR_SAFFIREPRO_CMD_ID_PC3_TO_OUT3    57
116 #define FR_SAFFIREPRO_CMD_ID_PC4_TO_OUT4    60
117 #define FR_SAFFIREPRO_CMD_ID_MIX1_TO_OUT3   58
118 #define FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT4   61
119
120 #define FR_SAFFIREPRO_CMD_ID_PC1_TO_OUT5    62
121 #define FR_SAFFIREPRO_CMD_ID_PC2_TO_OUT6    65
122 #define FR_SAFFIREPRO_CMD_ID_PC5_TO_OUT5    63
123 #define FR_SAFFIREPRO_CMD_ID_PC6_TO_OUT6    66
124 #define FR_SAFFIREPRO_CMD_ID_MIX1_TO_OUT5   64
125 #define FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT6   67
126
127 #define FR_SAFFIREPRO_CMD_ID_PC1_TO_OUT7    68
128 #define FR_SAFFIREPRO_CMD_ID_PC2_TO_OUT8    71
129 #define FR_SAFFIREPRO_CMD_ID_PC7_TO_OUT7    69
130 #define FR_SAFFIREPRO_CMD_ID_PC8_TO_OUT8    72
131 #define FR_SAFFIREPRO_CMD_ID_MIX1_TO_OUT7   70
132 #define FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT8   73
133
134 #define FR_SAFFIREPRO_CMD_ID_PC1_TO_OUT9    74
135 #define FR_SAFFIREPRO_CMD_ID_PC2_TO_OUT10   77
136 #define FR_SAFFIREPRO_CMD_ID_PC9_TO_OUT9    75
137 #define FR_SAFFIREPRO_CMD_ID_PC10_TO_OUT10  78
138 #define FR_SAFFIREPRO_CMD_ID_MIX1_TO_OUT9   76
139 #define FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT10  79
140
141 namespace BeBoB {
142 namespace Focusrite {
143
144 class SaffireProDevice;
145
146 class SaffireProMatrixMixer : public Control::MatrixMixer
147 {
148 public:
149     enum eMatrixMixerType {
150         eMMT_InputMix,
151         eMMT_OutputMix
152     };
153    
154 public:
155     SaffireProMatrixMixer(SaffireProDevice& parent, enum eMatrixMixerType type);
156     SaffireProMatrixMixer(SaffireProDevice& parent, enum eMatrixMixerType type, std::string n);
157     virtual ~SaffireProMatrixMixer() {};
158
159     virtual void show();
160
161     virtual std::string getRowName( const int );
162     virtual std::string getColName( const int );
163     virtual int canWrite( const int, const int );
164     virtual double setValue( const int, const int, const double );
165     virtual double getValue( const int, const int );
166     virtual int getRowCount( );
167     virtual int getColCount( );
168
169 private:
170     struct sSignalInfo {
171         std::string name;
172         std::string label;
173         std::string description;
174     };
175     struct sCellInfo {
176         int row;
177         int col;
178         // indicates whether a cell can be valid, this
179         // doesn't mean that it is writable. Just that it can be.
180         bool valid;
181         // the address to use when manipulating this cell
182         int address;
183     };
184    
185     void init(enum eMatrixMixerType type);
186     void addSignalInfo(std::vector<struct sSignalInfo> &target,
187                        std::string name, std::string label, std::string descr);
188     void setCellInfo(int row, int col, int addr, bool valid);
189
190     std::vector<struct sSignalInfo> m_RowInfo;
191     std::vector<struct sSignalInfo> m_ColInfo;
192     std::vector< std::vector<struct sCellInfo> > m_CellInfo;
193    
194     SaffireProDevice&       m_Parent;
195     enum eMatrixMixerType   m_type;
196 };
197
198
199 class SaffireProDevice : public FocusriteDevice
200 {
201 public:
202     SaffireProDevice( Ieee1394Service& ieee1394Service,
203               std::auto_ptr<ConfigRom>( configRom ));
204     virtual ~SaffireProDevice();
205
206     virtual void showDevice();
207     virtual void setVerboseLevel(int l);
208
209     virtual bool setSamplingFrequency( int );
210     virtual int getSamplingFrequency( );
211
212 private:
213     virtual bool setSamplingFrequencyDo( int );
214     virtual int getSamplingFrequencyMirror( );
215
216     BinaryControl * m_Phantom1;
217     BinaryControl * m_Phantom2;
218    
219     BinaryControl * m_Insert1;
220     BinaryControl * m_Insert2;
221     BinaryControl * m_AC3pass;
222     BinaryControl * m_MidiTru;
223    
224     VolumeControl * m_Output12[4];
225     VolumeControl * m_Output34[6];
226     VolumeControl * m_Output56[6];
227     VolumeControl * m_Output78[6];
228     VolumeControl * m_Output910[6];
229    
230     SaffireProMatrixMixer * m_InputMixer;
231     SaffireProMatrixMixer * m_OutputMixer;
232 };
233
234 } // namespace Focusrite
235 } // namespace BeBoB
236
237 #endif
Note: See TracBrowser for help on using the browser.