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")); |
---|
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; |
---|