Changeset 661
- Timestamp:
- 10/20/07 08:32:47 (16 years ago)
- Files:
-
- trunk/libffado/src/bebob/bebob_avdevice.cpp (modified) (3 diffs)
- trunk/libffado/src/bebob/bebob_avdevice.h (modified) (1 diff)
- trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp (modified) (4 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_generic.h (modified) (2 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.cpp (modified) (6 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h (modified) (4 diffs)
- trunk/libffado/src/bebob/GenericMixer.cpp (deleted)
- trunk/libffado/src/bebob/GenericMixer.h (deleted)
- trunk/libffado/src/devicemanager.cpp (modified) (1 diff)
- trunk/libffado/src/ffadodevice.cpp (modified) (1 diff)
- trunk/libffado/src/ffadodevice.h (modified) (1 diff)
- trunk/libffado/src/libcontrol/Element.cpp (modified) (3 diffs)
- trunk/libffado/src/libcontrol/Element.h (modified) (2 diffs)
- trunk/libffado/support/mixer/mixer_saffirepro.py (modified) (1 diff)
- trunk/libffado/tests/test-focusrite.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/bebob/bebob_avdevice.cpp
r648 r661 72 72 AvDevice::~AvDevice() 73 73 { 74 de lete m_Mixer;74 destroyMixer(); 75 75 } 76 76 … … 144 144 } 145 145 146 if(!buildMixer()) { 147 debugWarning("Could not build mixer\n"); 148 } 149 return true; 150 } 151 152 bool 153 AvDevice::buildMixer() 154 { 155 debugOutput(DEBUG_LEVEL_VERBOSE, "Building a generic BeBoB mixer...\n"); 146 156 // create a Mixer 147 157 // this removes the mixer if it already exists … … 152 162 if(getAudioSubunit(0) == NULL) { 153 163 debugWarning("Could not find audio subunit, mixer not available.\n"); 154 m_Mixer = 0;164 m_Mixer = NULL; 155 165 } else { 156 166 m_Mixer = new Mixer(*this); 157 167 } 168 return m_Mixer != NULL; 169 } 170 171 bool 172 AvDevice::destroyMixer() 173 { 174 delete m_Mixer; 158 175 return true; 159 176 } trunk/libffado/src/bebob/bebob_avdevice.h
r630 r661 85 85 protected: 86 86 virtual bool propagatePlugInfo(); 87 88 virtual bool buildMixer(); 89 virtual bool destroyMixer(); 87 90 88 91 public: trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp
r653 r661 131 131 // --- element implementation classes 132 132 133 BinaryControl::BinaryControl(FocusriteDevice& parent, int id) 134 : Control::Discrete() 135 , m_Parent(parent) 136 , m_cmd_id ( id ) 133 BinaryControl::BinaryControl(FocusriteDevice& parent, int id, int bit) 134 : Control::Discrete() 135 , m_Parent(parent) 136 , m_cmd_id ( id ) 137 , m_cmd_bit ( bit ) 137 138 {} 138 BinaryControl::BinaryControl(FocusriteDevice& parent, int id, 139 BinaryControl::BinaryControl(FocusriteDevice& parent, int id, int bit, 139 140 std::string name, std::string label, std::string descr) 140 141 : Control::Discrete() 141 142 , m_Parent(parent) 142 143 , m_cmd_id ( id ) 144 , m_cmd_bit ( bit ) 143 145 { 144 146 setName(name); … … 150 152 BinaryControl::setValue(int v) 151 153 { 152 uint32_t val=0; 153 if (v) val=1; 154 uint32_t reg; 155 uint32_t old_reg; 156 157 if ( !m_Parent.getSpecificValue(m_cmd_id, ®) ) { 158 debugError( "getSpecificValue failed\n" ); 159 return 0; 160 } 161 162 old_reg=reg; 163 if (v) { 164 reg |= (1<<m_cmd_bit); 165 } else { 166 reg &= ~(1<<m_cmd_bit); 167 } 168 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d to %d (reg: 0x%08X => 0x%08X)\n", 169 m_cmd_id, v, old_reg, reg); 170 171 if ( !m_Parent.setSpecificValue(m_cmd_id, reg) ) { 172 debugError( "setSpecificValue failed\n" ); 173 return false; 174 } else return true; 175 } 176 177 int 178 BinaryControl::getValue() 179 { 180 uint32_t reg; 181 182 if ( !m_Parent.getSpecificValue(m_cmd_id, ®) ) { 183 debugError( "getSpecificValue failed\n" ); 184 return 0; 185 } else { 186 bool val= (reg & (1<<m_cmd_bit)) != 0; 187 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for %d: reg: 0x%08X, result=%d\n", 188 m_cmd_id, reg, val); 189 return val; 190 } 191 } 192 193 // --- element implementation classes 194 195 VolumeControl::VolumeControl(FocusriteDevice& parent, int id) 196 : Control::Discrete() 197 , m_Parent(parent) 198 , m_cmd_id ( id ) 199 {} 200 VolumeControl::VolumeControl(FocusriteDevice& parent, int id, 201 std::string name, std::string label, std::string descr) 202 : Control::Discrete() 203 , m_Parent(parent) 204 , m_cmd_id ( id ) 205 { 206 setName(name); 207 setLabel(label); 208 setDescription(descr); 209 } 210 211 212 bool 213 VolumeControl::setValue(int v) 214 { 215 if (v>0x07FFF) v=0x07FFF; 216 else if (v<0) v=0; 217 154 218 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d to %d\n", 155 219 m_cmd_id, v); 156 220 157 if ( !m_Parent.setSpecificValue(m_cmd_id, v al) ) {221 if ( !m_Parent.setSpecificValue(m_cmd_id, v) ) { 158 222 debugError( "setSpecificValue failed\n" ); 159 223 return false; … … 162 226 163 227 int 164 BinaryControl::getValue()228 VolumeControl::getValue() 165 229 { 166 230 uint32_t val=0; … … 176 240 } 177 241 178 // --- element implementation classes179 180 VolumeControl::VolumeControl(FocusriteDevice& parent, int id)181 : Control::Discrete()182 , m_Parent(parent)183 , m_cmd_id ( id )184 {}185 VolumeControl::VolumeControl(FocusriteDevice& parent, int id,186 std::string name, std::string label, std::string descr)187 : Control::Discrete()188 , m_Parent(parent)189 , m_cmd_id ( id )190 {191 setName(name);192 setLabel(label);193 setDescription(descr);194 }195 196 197 bool198 VolumeControl::setValue(int v)199 {200 if (v>0x07FFF) v=0x07FFF;201 else if (v<0) v=0;202 203 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d to %d\n",204 m_cmd_id, v);205 206 if ( !m_Parent.setSpecificValue(m_cmd_id, v) ) {207 debugError( "setSpecificValue failed\n" );208 return false;209 } else return true;210 }211 212 int213 VolumeControl::getValue()214 {215 uint32_t val=0;216 217 if ( !m_Parent.getSpecificValue(m_cmd_id, &val) ) {218 debugError( "getSpecificValue failed\n" );219 return 0;220 } else {221 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for %d = %d\n",222 m_cmd_id, val);223 return val;224 }225 }226 227 242 } // Focusrite 228 243 } // BeBoB trunk/libffado/src/bebob/focusrite/focusrite_generic.h
r649 r661 40 40 { 41 41 public: 42 BinaryControl(FocusriteDevice& parent, int id );43 BinaryControl(FocusriteDevice& parent, int id, 42 BinaryControl(FocusriteDevice& parent, int id, int bit); 43 BinaryControl(FocusriteDevice& parent, int id, int bit, 44 44 std::string name, std::string label, std::string descr); 45 45 … … 50 50 FocusriteDevice& m_Parent; 51 51 unsigned int m_cmd_id; 52 unsigned int m_cmd_bit; 52 53 }; 53 54 trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.cpp
r653 r661 31 31 std::auto_ptr<ConfigRom>( configRom )) 32 32 : FocusriteDevice( ieee1394Service, configRom) 33 , m_MixerContainer ( NULL ) 33 34 { 34 35 debugOutput( DEBUG_LEVEL_VERBOSE, "Created BeBoB::Focusrite::SaffireProDevice (NodeID %d)\n", 35 36 getConfigRom().getNodeId() ); 36 37 37 38 // the saffire pro doesn't seem to like it if the commands are too fast 38 if (AVC::AVCCommand::getSleepAfterAVCCommand() < 200) { 39 AVC::AVCCommand::setSleepAfterAVCCommand( 200 ); 39 if (AVC::AVCCommand::getSleepAfterAVCCommand() < 500) { 40 AVC::AVCCommand::setSleepAfterAVCCommand( 500 ); 41 } 42 } 43 44 SaffireProDevice::~SaffireProDevice() 45 { 46 destroyMixer(); 47 } 48 49 bool 50 SaffireProDevice::buildMixer() 51 { 52 bool result=true; 53 debugOutput(DEBUG_LEVEL_VERBOSE, "Building a Focusrite SaffirePro mixer...\n"); 54 55 destroyMixer(); 56 57 // create the mixer object container 58 m_MixerContainer = new Control::Container("Mixer"); 59 60 if (!m_MixerContainer) { 61 debugError("Could not create mixer container...\n"); 62 return false; 40 63 } 41 64 42 65 // create control objects for the saffire pro 43 m_Phantom1 = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_PHANTOM14, 44 "Phantom_1to4", "Phantom 1-4", "Switch Phantom Power on channels 1-4"); 45 if (m_Phantom1) addElement(m_Phantom1); 46 47 m_Phantom2 = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_PHANTOM58, 48 "Phantom_5to8", "Phantom 5-8", "Switch Phantom Power on channels 5-8"); 49 if (m_Phantom2) addElement(m_Phantom2); 50 51 m_Insert1 = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_INSERT1, 52 "Insert1", "Insert 1", "Switch Insert on Channel 1"); 53 if (m_Insert1) addElement(m_Insert1); 54 55 m_Insert2 = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_INSERT2, 56 "Insert2", "Insert 2", "Switch Insert on Channel 2"); 57 if (m_Insert2) addElement(m_Insert2); 58 59 m_AC3pass = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_AC3_PASSTHROUGH, 60 "AC3pass", "AC3 Passtrough", "Enable AC3 Passthrough"); 61 if (m_AC3pass) addElement(m_AC3pass); 62 63 m_MidiTru = new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_MIDI_TRU, 64 "MidiTru", "Midi Tru", "Enable Midi Tru"); 65 if (m_MidiTru) addElement(m_MidiTru); 66 result &= m_MixerContainer->addElement( 67 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_PHANTOM14, 0, 68 "Phantom_1to4", "Phantom 1-4", "Switch Phantom Power on channels 1-4")); 69 70 result &= m_MixerContainer->addElement( 71 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_PHANTOM58, 0, 72 "Phantom_5to8", "Phantom 5-8", "Switch Phantom Power on channels 5-8")); 73 74 result &= m_MixerContainer->addElement( 75 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_INSERT1, 0, 76 "Insert1", "Insert 1", "Switch Insert on Channel 1")); 77 78 result &= m_MixerContainer->addElement( 79 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_INSERT2, 0, 80 "Insert2", "Insert 2", "Switch Insert on Channel 2")); 81 82 result &= m_MixerContainer->addElement( 83 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_AC3_PASSTHROUGH, 0, 84 "AC3pass", "AC3 Passtrough", "Enable AC3 Passthrough")); 85 86 result &= m_MixerContainer->addElement( 87 new BinaryControl(*this, FR_SAFFIREPRO_CMD_ID_MIDI_TRU, 0, 88 "MidiTru", "Midi Tru", "Enable Midi Tru")); 89 90 // output mute controls 91 result &= m_MixerContainer->addElement( 92 new BinaryControl(*this, 93 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_MUTE, 94 "Out12Mute", "Out1/2 Mute", "Output 1/2 Mute")); 95 result &= m_MixerContainer->addElement( 96 new BinaryControl(*this, 97 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_MUTE, 98 "Out34Mute", "Out3/4 Mute", "Output 3/4 Mute")); 99 result &= m_MixerContainer->addElement( 100 new BinaryControl(*this, 101 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_MUTE, 102 "Out56Mute", "Out5/6 Mute", "Output 5/6 Mute")); 103 result &= m_MixerContainer->addElement( 104 new BinaryControl(*this, 105 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_MUTE, 106 "Out78Mute", "Out7/8 Mute", "Output 7/8 Mute")); 107 108 // output front panel hw volume control 109 result &= m_MixerContainer->addElement( 110 new BinaryControl(*this, 111 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_HWCTRL, 112 "Out12HwCtrl", "Out1/2 HwCtrl", "Output 1/2 Front Panel Hardware volume control")); 113 result &= m_MixerContainer->addElement( 114 new BinaryControl(*this, 115 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_HWCTRL, 116 "Out34HwCtrl", "Out3/4 HwCtrl", "Output 3/4 Front Panel Hardware volume control")); 117 result &= m_MixerContainer->addElement( 118 new BinaryControl(*this, 119 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_HWCTRL, 120 "Out56HwCtrl", "Out5/6 HwCtrl", "Output 5/6 Front Panel Hardware volume control")); 121 result &= m_MixerContainer->addElement( 122 new BinaryControl(*this, 123 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_HWCTRL, 124 "Out78HwCtrl", "Out7/8 HwCtrl", "Output 7/8 Front Panel Hardware volume control")); 125 126 // output active monitor padding 127 result &= m_MixerContainer->addElement( 128 new BinaryControl(*this, 129 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 130 "Out12Pad", "Out1/2 Pad", "Output 1/2 Active Monitor Pad")); 131 result &= m_MixerContainer->addElement( 132 new BinaryControl(*this, 133 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 134 "Out34Pad", "Out3/4 Pad", "Output 3/4 Active Monitor Pad")); 135 result &= m_MixerContainer->addElement( 136 new BinaryControl(*this, 137 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 138 "Out56Pad", "Out5/6 Pad", "Output 5/6 Active Monitor Pad")); 139 result &= m_MixerContainer->addElement( 140 new BinaryControl(*this, 141 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 142 "Out78Pad", "Out7/8 Pad", "Output 7/8 Active Monitor Pad")); 143 144 // output level dim 145 result &= m_MixerContainer->addElement( 146 new BinaryControl(*this, 147 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 148 "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim")); 149 result &= m_MixerContainer->addElement( 150 new BinaryControl(*this, 151 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 152 "Out34Dim", "Out3/4 Dim", "Output 3/4 Level Dim")); 153 result &= m_MixerContainer->addElement( 154 new BinaryControl(*this, 155 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 156 "Out56Dim", "Out5/6 Dim", "Output 5/6 Level Dim")); 157 result &= m_MixerContainer->addElement( 158 new BinaryControl(*this, 159 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD, 160 "Out78Dim", "Out7/8 Dim", "Output 7/8 Level Dim")); 161 162 // indicators 163 result &= m_MixerContainer->addElement( 164 new BinaryControl(*this, 165 FR_SAFFIREPRO_CMD_ID_MUTE_INDICATOR, 0, 166 "Out12MuteInd", "Out1/2 Mute Ind", "Output 1/2 Mute Indicator")); 167 168 result &= m_MixerContainer->addElement( 169 new BinaryControl(*this, 170 FR_SAFFIREPRO_CMD_ID_DIM_INDICATOR, 0, 171 "Out12DimInd", "Out1/2 Dim Ind", "Output 1/2 Level Dim Indicator")); 66 172 67 173 // matrix mix controls 68 m_InputMixer=new SaffireProMatrixMixer(*this, SaffireProMatrixMixer::eMMT_InputMix, "InputMix"); 69 if (m_InputMixer) addElement(m_InputMixer); 70 71 m_OutputMixer=new SaffireProMatrixMixer(*this, SaffireProMatrixMixer::eMMT_OutputMix, "OutputMix"); 72 if (m_OutputMixer) addElement(m_OutputMixer); 73 } 74 75 SaffireProDevice::~SaffireProDevice() 76 { 77 // remove and delete control elements 78 deleteElement(m_Phantom1); 79 if (m_Phantom1) delete m_Phantom1; 80 81 deleteElement(m_Phantom2); 82 if (m_Phantom2) delete m_Phantom2; 83 84 deleteElement(m_Insert1); 85 if (m_Insert1) delete m_Insert1; 86 87 deleteElement(m_Insert2); 88 if (m_Insert2) delete m_Insert2; 89 90 deleteElement(m_AC3pass); 91 if (m_AC3pass) delete m_AC3pass; 92 93 deleteElement(m_MidiTru); 94 if (m_MidiTru) delete m_MidiTru; 95 96 deleteElement(m_InputMixer); 97 if (m_InputMixer) delete m_InputMixer; 98 99 deleteElement(m_OutputMixer); 100 if (m_OutputMixer) delete m_OutputMixer; 174 result &= m_MixerContainer->addElement( 175 new SaffireProMatrixMixer(*this, SaffireProMatrixMixer::eMMT_InputMix, "InputMix")); 176 177 result &= m_MixerContainer->addElement( 178 new SaffireProMatrixMixer(*this, SaffireProMatrixMixer::eMMT_OutputMix, "OutputMix")); 179 180 if (!result) { 181 debugWarning("One or more control elements could not be created."); 182 // clean up those that couldn't be created 183 destroyMixer(); 184 return false; 185 } 186 187 if (!addElement(m_MixerContainer)) { 188 debugWarning("Could not register mixer to device\n"); 189 // clean up 190 destroyMixer(); 191 return false; 192 } 193 194 return true; 195 } 196 197 bool 198 SaffireProDevice::destroyMixer() 199 { 200 debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n"); 201 202 if (m_MixerContainer == NULL) { 203 debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n"); 204 return true; 205 } 206 207 if (!deleteElement(m_MixerContainer)) { 208 debugError("Mixer present but not registered to the avdevice\n"); 209 return false; 210 } 211 212 // remove and delete (as in free) child control elements 213 m_MixerContainer->clearElements(true); 214 delete m_MixerContainer; 215 return true; 101 216 } 102 217 … … 113 228 debugOutput( DEBUG_LEVEL_VERBOSE, "Setting verbose level to %d...\n", l ); 114 229 115 if (m_Phantom1) m_Phantom2->setVerboseLevel(l); 116 if (m_Phantom2) m_Phantom2->setVerboseLevel(l); 117 if (m_Insert1) m_Insert1->setVerboseLevel(l); 118 if (m_Insert2) m_Insert2->setVerboseLevel(l); 119 if (m_MidiTru) m_MidiTru->setVerboseLevel(l); 120 if (m_AC3pass) m_AC3pass->setVerboseLevel(l); 121 if (m_InputMixer) m_InputMixer->setVerboseLevel(l); 122 if (m_OutputMixer) m_OutputMixer->setVerboseLevel(l); 230 if (m_MixerContainer) m_MixerContainer->setVerboseLevel(l); 123 231 124 232 // FIXME: add the other elements here too … … 192 300 193 301 int timeout=10; // multiples of 1s 194 //while(timeout--) {195 //// wait for a while196 //usleep(1000 * 1000);197 //198 //// we should figure out how long to wait before the device199 //// becomes available again200 //201 // // rediscover the device 302 while(timeout--) { 303 // wait for a while 304 usleep(1000 * 1000); 305 306 // we should figure out how long to wait before the device 307 // becomes available again 308 309 // check device status 202 310 // if (discover()) break; 203 // 204 //}311 if (timeout==5) break; 312 } 205 313 206 314 if(timeout) { … … 210 318 "setSampleRate (try %d): requested samplerate %d, device now has %d\n", 211 319 max_tries-ntries, s, verify ); 212 213 if (s == verify) break; 320 321 if (s == verify) { 322 break; 323 } 214 324 } 215 325 } … … 220 330 } 221 331 332 // rediscover the device 333 // return discover(); 222 334 return true; 223 335 } … … 225 337 return false; 226 338 339 } 340 341 bool 342 SaffireProDevice::isStreaming() { 343 uint32_t ready; 344 if ( !getSpecificValue(FR_SAFFIREPRO_CMD_ID_STREAMING, &ready ) ) { 345 debugError( "getSpecificValue failed\n" ); 346 return false; 347 } 348 349 debugOutput( DEBUG_LEVEL_NORMAL, 350 "isDeviceReady: %d\n", ready!=0 ); 351 return ready != 0; 227 352 } 228 353 trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h
r653 r661 29 29 #include "focusrite_generic.h" 30 30 31 #include "libcontrol/BasicElements.h" 31 32 #include "libcontrol/MatrixMixer.h" 32 33 … … 36 37 #define FR_SAFFIREPRO_CMD_ID_SAMPLERATE 84 37 38 #define FR_SAFFIREPRO_CMD_ID_SAMPLERATE_MIRROR 115 39 40 #define FOCUSRITE_CMD_SAMPLERATE_44K1 1 41 #define FOCUSRITE_CMD_SAMPLERATE_48K 2 42 #define FOCUSRITE_CMD_SAMPLERATE_88K2 3 43 #define FOCUSRITE_CMD_SAMPLERATE_96K 4 44 #define FOCUSRITE_CMD_SAMPLERATE_176K4 5 45 #define FOCUSRITE_CMD_SAMPLERATE_192K 6 46 47 #define FR_SAFFIREPRO_CMD_ID_STREAMING 90 38 48 39 49 #define FR_SAFFIREPRO_CMD_ID_PHANTOM14 98 … … 44 54 #define FR_SAFFIREPRO_CMD_ID_MIDI_TRU 104 45 55 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 56 #define FR_SAFFIREPRO_CMD_ID_DIM_INDICATOR 88 57 #define FR_SAFFIREPRO_CMD_ID_MUTE_INDICATOR 88 58 59 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12 80 60 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34 81 61 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56 82 62 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78 83 63 64 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_MUTE 24 65 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_HWCTRL 26 66 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD 27 67 #define FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM 28 68 52 69 53 70 #define FR_SAFFIREPRO_CMD_ID_AN1_TO_IMIXL 0 … … 210 227 virtual int getSamplingFrequency( ); 211 228 229 virtual bool buildMixer(); 230 virtual bool destroyMixer(); 231 212 232 private: 213 233 virtual bool setSamplingFrequencyDo( int ); 214 234 virtual int getSamplingFrequencyMirror( ); 215 235 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; 236 bool isStreaming(); 237 238 Control::Container *m_MixerContainer; 232 239 }; 233 240 trunk/libffado/src/devicemanager.cpp
r639 r661 92 92 ++it ) 93 93 { 94 if (!deleteElement(*it)) { 95 debugWarning("failed to remove AvDevice from Control::Container\n"); 96 } 94 97 delete *it; 95 98 } trunk/libffado/src/ffadodevice.cpp
r644 r661 48 48 if (!addElement(&getConfigRom())) { 49 49 debugWarning("failed to add ConfigRom to Control::Container\n"); 50 } 51 } 52 53 FFADODevice::~FFADODevice() 54 { 55 if (!deleteElement(&getConfigRom())) { 56 debugWarning("failed to remove ConfigRom from Control::Container\n"); 50 57 } 51 58 } trunk/libffado/src/ffadodevice.h
r639 r661 56 56 std::auto_ptr< ConfigRom >( configRom ) ); 57 57 58 virtual ~FFADODevice() {};58 virtual ~FFADODevice(); 59 59 60 60 trunk/libffado/src/libcontrol/Element.cpp
r581 r661 81 81 Container::addElement(Element *e) 82 82 { 83 assert(e); 83 if (e==NULL) { 84 debugWarning("Cannot add NULL element\n"); 85 return false; 86 } 84 87 85 88 debugOutput( DEBUG_LEVEL_VERBOSE, "Adding Element %s to %s\n", … … 123 126 } 124 127 128 bool 129 Container::clearElements(bool delete_pointers) 130 { 131 while(m_Children.size()) { 132 Element *e=m_Children[0]; 133 deleteElement(e); 134 if (delete_pointers) delete e; 135 } 136 return true; 137 } 138 125 139 void 126 140 Container::show() … … 137 151 } 138 152 153 void 154 Container::setVerboseLevel(int l) 155 { 156 debugOutput( DEBUG_LEVEL_VERBOSE, "Setting verbose level to %d...\n", l ); 157 for ( ElementVectorIterator it = m_Children.begin(); 158 it != m_Children.end(); 159 ++it ) 160 { 161 (*it)->setVerboseLevel(l); 162 } 163 } 164 139 165 } // namespace Control trunk/libffado/src/libcontrol/Element.h
r581 r661 101 101 virtual bool deleteElement(Element *e); 102 102 virtual bool clearElements() 103 {m_Children.clear(); return true;}; 103 {return clearElements(false);}; 104 virtual bool clearElements(bool delete_pointers); 104 105 105 106 unsigned int countElements() … … 110 111 111 112 virtual void show(); 113 virtual void setVerboseLevel(int l); 114 112 115 protected: 113 116 ElementVector m_Children; trunk/libffado/support/mixer/mixer_saffirepro.py
r653 r661 261 261 262 262 self.VolumeControls={ 263 'IMixAnalog1L': ['/ InputMix', 0, 0, self.sldIMixAnalog1L],264 'IMixAnalog1R': ['/ InputMix', 0, 1, self.sldIMixAnalog1R],265 'IMixAnalog2L': ['/ InputMix', 1, 0, self.sldIMixAnalog2L],266 'IMixAnalog2R': ['/ InputMix', 1, 1, self.sldIMixAnalog2R],267 'IMixAnalog3L': ['/ InputMix', 2, 0, self.sldIMixAnalog3L],268 'IMixAnalog3R': ['/ InputMix', 2, 1, self.sldIMixAnalog3R],269 'IMixAnalog4L': ['/ InputMix', 3, 0, self.sldIMixAnalog4L],270 'IMixAnalog4R': ['/ InputMix', 3, 1, self.sldIMixAnalog4R],271 'IMixAnalog5L': ['/ InputMix', 4, 0, self.sldIMixAnalog5L],272 'IMixAnalog5R': ['/ InputMix', 4, 1, self.sldIMixAnalog5R],273 'IMixAnalog6L': ['/ InputMix', 5, 0, self.sldIMixAnalog6L],274 'IMixAnalog6R': ['/ InputMix', 5, 1, self.sldIMixAnalog6R],275 'IMixAnalog7L': ['/ InputMix', 6, 0, self.sldIMixAnalog7L],276 'IMixAnalog7R': ['/ InputMix', 6, 1, self.sldIMixAnalog7R],277 'IMixAnalog8L': ['/ InputMix', 7, 0, self.sldIMixAnalog8L],278 'IMixAnalog8R': ['/ InputMix', 7, 1, self.sldIMixAnalog8R],279 'IMixAnalog9L': ['/ InputMix', 8, 0, self.sldIMixAnalog9L],280 'IMixAnalog9R': ['/ InputMix', 8, 1, self.sldIMixAnalog9R],281 'IMixAnalog10L': ['/ InputMix', 9, 0, self.sldIMixAnalog10L],282 'IMixAnalog10R': ['/ InputMix', 9, 1, self.sldIMixAnalog10R],283 'IMixADAT11L': ['/ InputMix', 10, 0, self.sldIMixADAT11L],284 'IMixADAT11R': ['/ InputMix', 10, 1, self.sldIMixADAT11R],285 'IMixADAT12L': ['/ InputMix', 11, 0, self.sldIMixADAT12L],286 'IMixADAT12R': ['/ InputMix', 11, 1, self.sldIMixADAT12R],287 'IMixADAT13L': ['/ InputMix', 12, 0, self.sldIMixADAT13L],288 'IMixADAT13R': ['/ InputMix', 12, 1, self.sldIMixADAT13R],289 'IMixADAT14L': ['/ InputMix', 13, 0, self.sldIMixADAT14L],290 'IMixADAT14R': ['/ InputMix', 13, 1, self.sldIMixADAT14R],291 'IMixADAT15L': ['/ InputMix', 14, 0, self.sldIMixADAT15L],292 'IMixADAT15R': ['/ InputMix', 14, 1, self.sldIMixADAT15R],293 'IMixADAT16L': ['/ InputMix', 15, 0, self.sldIMixADAT16L],294 'IMixADAT16R': ['/ InputMix', 15, 1, self.sldIMixADAT16R],295 'IMixADAT17L': ['/ InputMix', 16, 0, self.sldIMixADAT17L],296 'IMixADAT17R': ['/ InputMix', 16, 1, self.sldIMixADAT17R],297 'IMixADAT18L': ['/ InputMix', 17, 0, self.sldIMixADAT18L],298 'IMixADAT18R': ['/ InputMix', 17, 1, self.sldIMixADAT18R],299 'IMixADAT21L': ['/ InputMix', 18, 0, self.sldIMixADAT21L],300 'IMixADAT21R': ['/ InputMix', 18, 1, self.sldIMixADAT21R],301 'IMixADAT22L': ['/ InputMix', 19, 0, self.sldIMixADAT22L],302 'IMixADAT22R': ['/ InputMix', 19, 1, self.sldIMixADAT22R],303 'IMixADAT23L': ['/ InputMix', 20, 0, self.sldIMixADAT23L],304 'IMixADAT23R': ['/ InputMix', 20, 1, self.sldIMixADAT23R],305 'IMixADAT24L': ['/ InputMix', 21, 0, self.sldIMixADAT24L],306 'IMixADAT24R': ['/ InputMix', 21, 1, self.sldIMixADAT24R],307 'IMixADAT25L': ['/ InputMix', 22, 0, self.sldIMixADAT25L],308 'IMixADAT25R': ['/ InputMix', 22, 1, self.sldIMixADAT25R],309 'IMixADAT26L': ['/ InputMix', 23, 0, self.sldIMixADAT26L],310 'IMixADAT26R': ['/ InputMix', 23, 1, self.sldIMixADAT26R],311 'IMixADAT27L': ['/ InputMix', 24, 0, self.sldIMixADAT27L],312 'IMixADAT27R': ['/ InputMix', 24, 1, self.sldIMixADAT27R],313 'IMixADAT28L': ['/ InputMix', 25, 0, self.sldIMixADAT28L],314 'IMixADAT28R': ['/ InputMix', 25, 1, self.sldIMixADAT28R],315 316 'OMixPC1O1': ['/ OutputMix', 0, 0, self.sldOMixPC1O1],317 'OMixPC2O2': ['/ OutputMix', 1, 1, self.sldOMixPC2O2],318 'OMixPC3O3': ['/ OutputMix', 2, 2, self.sldOMixPC3O3],319 'OMixPC4O4': ['/ OutputMix', 3, 3, self.sldOMixPC4O4],320 'OMixPC5O5': ['/ OutputMix', 4, 4, self.sldOMixPC5O5],321 'OMixPC6O6': ['/ OutputMix', 5, 5, self.sldOMixPC6O6],322 'OMixPC7O7': ['/ OutputMix', 6, 6, self.sldOMixPC7O7],323 'OMixPC8O8': ['/ OutputMix', 7, 7, self.sldOMixPC8O8],324 'OMixPC9O9': ['/ OutputMix', 8, 8, self.sldOMixPC9O9],325 'OMixPC10O10': ['/ OutputMix', 9, 9, self.sldOMixPC10O10],326 327 'OMixPC1O3': ['/ OutputMix', 0, 2, self.sldOMixPC1O3],328 'OMixPC2O4': ['/ OutputMix', 1, 3, self.sldOMixPC2O4],329 'OMixPC1O5': ['/ OutputMix', 0, 4, self.sldOMixPC1O5],330 'OMixPC2O6': ['/ OutputMix', 1, 5, self.sldOMixPC2O6],331 'OMixPC1O7': ['/ OutputMix', 0, 6, self.sldOMixPC1O7],332 'OMixPC2O8': ['/ OutputMix', 1, 7, self.sldOMixPC2O8],333 'OMixPC1O9': ['/ OutputMix', 0, 8, self.sldOMixPC1O9],334 'OMixPC2O10': ['/ OutputMix', 1, 9, self.sldOMixPC2O10],335 336 'OMixIMixO1': ['/ OutputMix', 10, 0, self.sldOMixIMixO1],337 'OMixIMixO2': ['/ OutputMix', 11, 1, self.sldOMixIMixO2],338 'OMixIMixO3': ['/ OutputMix', 10, 2, self.sldOMixIMixO3],339 'OMixIMixO4': ['/ OutputMix', 11, 3, self.sldOMixIMixO4],340 'OMixIMixO5': ['/ OutputMix', 10, 4, self.sldOMixIMixO5],341 'OMixIMixO6': ['/ OutputMix', 11, 5, self.sldOMixIMixO6],342 'OMixIMixO7': ['/ OutputMix', 10, 6, self.sldOMixIMixO7],343 'OMixIMixO8': ['/ OutputMix', 11, 7, self.sldOMixIMixO8],344 'OMixIMixO9': ['/ OutputMix', 10, 8, self.sldOMixIMixO9],345 'OMixIMixO10': ['/ OutputMix', 11, 9, self.sldOMixIMixO10],263 'IMixAnalog1L': ['/Mixer/InputMix', 0, 0, self.sldIMixAnalog1L], 264 'IMixAnalog1R': ['/Mixer/InputMix', 0, 1, self.sldIMixAnalog1R], 265 'IMixAnalog2L': ['/Mixer/InputMix', 1, 0, self.sldIMixAnalog2L], 266 'IMixAnalog2R': ['/Mixer/InputMix', 1, 1, self.sldIMixAnalog2R], 267 'IMixAnalog3L': ['/Mixer/InputMix', 2, 0, self.sldIMixAnalog3L], 268 'IMixAnalog3R': ['/Mixer/InputMix', 2, 1, self.sldIMixAnalog3R], 269 'IMixAnalog4L': ['/Mixer/InputMix', 3, 0, self.sldIMixAnalog4L], 270 'IMixAnalog4R': ['/Mixer/InputMix', 3, 1, self.sldIMixAnalog4R], 271 'IMixAnalog5L': ['/Mixer/InputMix', 4, 0, self.sldIMixAnalog5L], 272 'IMixAnalog5R': ['/Mixer/InputMix', 4, 1, self.sldIMixAnalog5R], 273 'IMixAnalog6L': ['/Mixer/InputMix', 5, 0, self.sldIMixAnalog6L], 274 'IMixAnalog6R': ['/Mixer/InputMix', 5, 1, self.sldIMixAnalog6R], 275 'IMixAnalog7L': ['/Mixer/InputMix', 6, 0, self.sldIMixAnalog7L], 276 'IMixAnalog7R': ['/Mixer/InputMix', 6, 1, self.sldIMixAnalog7R], 277 'IMixAnalog8L': ['/Mixer/InputMix', 7, 0, self.sldIMixAnalog8L], 278 'IMixAnalog8R': ['/Mixer/InputMix', 7, 1, self.sldIMixAnalog8R], 279 'IMixAnalog9L': ['/Mixer/InputMix', 8, 0, self.sldIMixAnalog9L], 280 'IMixAnalog9R': ['/Mixer/InputMix', 8, 1, self.sldIMixAnalog9R], 281 'IMixAnalog10L': ['/Mixer/InputMix', 9, 0, self.sldIMixAnalog10L], 282 'IMixAnalog10R': ['/Mixer/InputMix', 9, 1, self.sldIMixAnalog10R], 283 'IMixADAT11L': ['/Mixer/InputMix', 10, 0, self.sldIMixADAT11L], 284 'IMixADAT11R': ['/Mixer/InputMix', 10, 1, self.sldIMixADAT11R], 285 'IMixADAT12L': ['/Mixer/InputMix', 11, 0, self.sldIMixADAT12L], 286 'IMixADAT12R': ['/Mixer/InputMix', 11, 1, self.sldIMixADAT12R], 287 'IMixADAT13L': ['/Mixer/InputMix', 12, 0, self.sldIMixADAT13L], 288 'IMixADAT13R': ['/Mixer/InputMix', 12, 1, self.sldIMixADAT13R], 289 'IMixADAT14L': ['/Mixer/InputMix', 13, 0, self.sldIMixADAT14L], 290 'IMixADAT14R': ['/Mixer/InputMix', 13, 1, self.sldIMixADAT14R], 291 'IMixADAT15L': ['/Mixer/InputMix', 14, 0, self.sldIMixADAT15L], 292 'IMixADAT15R': ['/Mixer/InputMix', 14, 1, self.sldIMixADAT15R], 293 'IMixADAT16L': ['/Mixer/InputMix', 15, 0, self.sldIMixADAT16L], 294 'IMixADAT16R': ['/Mixer/InputMix', 15, 1, self.sldIMixADAT16R], 295 'IMixADAT17L': ['/Mixer/InputMix', 16, 0, self.sldIMixADAT17L], 296 'IMixADAT17R': ['/Mixer/InputMix', 16, 1, self.sldIMixADAT17R], 297 'IMixADAT18L': ['/Mixer/InputMix', 17, 0, self.sldIMixADAT18L], 298 'IMixADAT18R': ['/Mixer/InputMix', 17, 1, self.sldIMixADAT18R], 299 'IMixADAT21L': ['/Mixer/InputMix', 18, 0, self.sldIMixADAT21L], 300 'IMixADAT21R': ['/Mixer/InputMix', 18, 1, self.sldIMixADAT21R], 301 'IMixADAT22L': ['/Mixer/InputMix', 19, 0, self.sldIMixADAT22L], 302 'IMixADAT22R': ['/Mixer/InputMix', 19, 1, self.sldIMixADAT22R], 303 'IMixADAT23L': ['/Mixer/InputMix', 20, 0, self.sldIMixADAT23L], 304 'IMixADAT23R': ['/Mixer/InputMix', 20, 1, self.sldIMixADAT23R], 305 'IMixADAT24L': ['/Mixer/InputMix', 21, 0, self.sldIMixADAT24L], 306 'IMixADAT24R': ['/Mixer/InputMix', 21, 1, self.sldIMixADAT24R], 307 'IMixADAT25L': ['/Mixer/InputMix', 22, 0, self.sldIMixADAT25L], 308 'IMixADAT25R': ['/Mixer/InputMix', 22, 1, self.sldIMixADAT25R], 309 'IMixADAT26L': ['/Mixer/InputMix', 23, 0, self.sldIMixADAT26L], 310 'IMixADAT26R': ['/Mixer/InputMix', 23, 1, self.sldIMixADAT26R], 311 'IMixADAT27L': ['/Mixer/InputMix', 24, 0, self.sldIMixADAT27L], 312 'IMixADAT27R': ['/Mixer/InputMix', 24, 1, self.sldIMixADAT27R], 313 'IMixADAT28L': ['/Mixer/InputMix', 25, 0, self.sldIMixADAT28L], 314 'IMixADAT28R': ['/Mixer/InputMix', 25, 1, self.sldIMixADAT28R], 315 316 'OMixPC1O1': ['/Mixer/OutputMix', 0, 0, self.sldOMixPC1O1], 317 'OMixPC2O2': ['/Mixer/OutputMix', 1, 1, self.sldOMixPC2O2], 318 'OMixPC3O3': ['/Mixer/OutputMix', 2, 2, self.sldOMixPC3O3], 319 'OMixPC4O4': ['/Mixer/OutputMix', 3, 3, self.sldOMixPC4O4], 320 'OMixPC5O5': ['/Mixer/OutputMix', 4, 4, self.sldOMixPC5O5], 321 'OMixPC6O6': ['/Mixer/OutputMix', 5, 5, self.sldOMixPC6O6], 322 'OMixPC7O7': ['/Mixer/OutputMix', 6, 6, self.sldOMixPC7O7], 323 'OMixPC8O8': ['/Mixer/OutputMix', 7, 7, self.sldOMixPC8O8], 324 'OMixPC9O9': ['/Mixer/OutputMix', 8, 8, self.sldOMixPC9O9], 325 'OMixPC10O10': ['/Mixer/OutputMix', 9, 9, self.sldOMixPC10O10], 326 327 'OMixPC1O3': ['/Mixer/OutputMix', 0, 2, self.sldOMixPC1O3], 328 'OMixPC2O4': ['/Mixer/OutputMix', 1, 3, self.sldOMixPC2O4], 329 'OMixPC1O5': ['/Mixer/OutputMix', 0, 4, self.sldOMixPC1O5], 330 'OMixPC2O6': ['/Mixer/OutputMix', 1, 5, self.sldOMixPC2O6], 331 'OMixPC1O7': ['/Mixer/OutputMix', 0, 6, self.sldOMixPC1O7], 332 'OMixPC2O8': ['/Mixer/OutputMix', 1, 7, self.sldOMixPC2O8], 333 'OMixPC1O9': ['/Mixer/OutputMix', 0, 8, self.sldOMixPC1O9], 334 'OMixPC2O10': ['/Mixer/OutputMix', 1, 9, self.sldOMixPC2O10], 335 336 'OMixIMixO1': ['/Mixer/OutputMix', 10, 0, self.sldOMixIMixO1], 337 'OMixIMixO2': ['/Mixer/OutputMix', 11, 1, self.sldOMixIMixO2], 338 'OMixIMixO3': ['/Mixer/OutputMix', 10, 2, self.sldOMixIMixO3], 339 'OMixIMixO4': ['/Mixer/OutputMix', 11, 3, self.sldOMixIMixO4], 340 'OMixIMixO5': ['/Mixer/OutputMix', 10, 4, self.sldOMixIMixO5], 341 'OMixIMixO6': ['/Mixer/OutputMix', 11, 5, self.sldOMixIMixO6], 342 'OMixIMixO7': ['/Mixer/OutputMix', 10, 6, self.sldOMixIMixO7], 343 'OMixIMixO8': ['/Mixer/OutputMix', 11, 7, self.sldOMixIMixO8], 344 'OMixIMixO9': ['/Mixer/OutputMix', 10, 8, self.sldOMixIMixO9], 345 'OMixIMixO10': ['/Mixer/OutputMix', 11, 9, self.sldOMixIMixO10], 346 346 } 347 347 348 348 349 349 self.SelectorControls={ 350 'insert1': ['/ Insert1', self.chkInsert1],351 'insert2': ['/ Insert2', self.chkInsert2],352 'phantom14': ['/ Phantom_1to4', self.chkPhantom14],353 'phantom58': ['/ Phantom_5to8', self.chkPhantom58],354 'ac3pass': ['/ AC3pass', self.chkAC3],355 'midithru': ['/Mi diTru', self.chkMidiThru],350 'insert1': ['/Mixer/Insert1', self.chkInsert1], 351 'insert2': ['/Mixer/Insert2', self.chkInsert2], 352 'phantom14': ['/Mixer/Phantom_1to4', self.chkPhantom14], 353 'phantom58': ['/Mixer/Phantom_5to8', self.chkPhantom58], 354 'ac3pass': ['/Mixer/AC3pass', self.chkAC3], 355 'midithru': ['/Mixer/MidiTru', self.chkMidiThru], 356 356 } 357 357 trunk/libffado/tests/test-focusrite.cpp
r627 r661 166 166 cmd.setVerbose( DEBUG_LEVEL_NORMAL ); 167 167 168 for (int id=0; id<128;id++) { 169 cmd.setCommandType( AVC::AVCCommand::eCT_Status ); 170 cmd.setNodeId( arguments.node ); 171 cmd.setSubunitType( AVC::eST_Unit ); 172 cmd.setSubunitId( 0xff ); 173 cmd.m_id=id; 174 cmd.m_value=0; 175 176 if ( !cmd.fire() ) { 177 debugError( "FocusriteVendorDependentCmd info command failed\n" ); 178 // shouldn't this be an error situation? 179 // return false; 168 uint32_t old_vals[129]; 169 170 while(1) { 171 for (int id=0; id<128;id++) { 172 cmd.setCommandType( AVC::AVCCommand::eCT_Status ); 173 cmd.setNodeId( arguments.node ); 174 cmd.setSubunitType( AVC::eST_Unit ); 175 cmd.setSubunitId( 0xff ); 176 cmd.m_id=id; 177 cmd.m_value=0; 178 179 if ( !cmd.fire() ) { 180 debugError( "FocusriteVendorDependentCmd info command failed\n" ); 181 // shouldn't this be an error situation? 182 // return false; 183 } 184 if (old_vals[id] != cmd.m_value) { 185 printf("%04d changed from %08X to %08X\n", cmd.m_id, old_vals[id], cmd.m_value); 186 old_vals[id] = cmd.m_value; 187 } 180 188 } 181 printf("%04d: %08X\n", cmd.m_id, cmd.m_value);189 usleep(1000000); 182 190 } 183 191