Changeset 1616
- Timestamp:
- 08/13/09 07:21:51 (14 years ago)
- Files:
-
- trunk/libffado/doc/rme_notes/rme_config_register_map.txt (modified) (2 diffs)
- trunk/libffado/src/rme/fireface_def.h (modified) (3 diffs)
- trunk/libffado/src/rme/fireface_hw.cpp (modified) (2 diffs)
- trunk/libffado/src/rme/fireface_settings_ctrls.cpp (modified) (1 diff)
- trunk/libffado/src/rme/fireface_settings_ctrls.h (modified) (3 diffs)
- trunk/libffado/src/rme/rme_avdevice.cpp (modified) (2 diffs)
- trunk/libffado/src/rme/rme_avdevice.h (modified) (2 diffs)
- trunk/libffado/src/rme/rme_avdevice_settings.cpp (modified) (1 diff)
- trunk/libffado/support/mixer-qt4/mixer_rme.py (modified) (3 diffs)
- trunk/libffado/support/mixer-qt4/mixer_rme.ui (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/doc/rme_notes/rme_config_register_map.txt
r1615 r1616 2 2 ============================================ 3 3 4 Version: 0.1 64 Version: 0.17 5 5 Author: Jonathan Woithe 6 Date: 1 0August 20096 Date: 13 August 2009 7 7 8 8 … … 667 667 668 668 bits 31-24: unknown (set to 0) 669 bits 23-16: channel being set ( 0=mic1, 1=mic2, 2=inst3, 4=inst4)669 bits 23-16: channel being set (see below) 670 670 bits 15-8: unknown (set to 0) 671 671 bits 7-0: the gain value trunk/libffado/src/rme/fireface_def.h
r1615 r1616 85 85 #define RME_FF_TCO_READ_REG 0x801f0000 86 86 #define RME_FF_TCO_WRITE_REG 0x810f0020 87 88 #define RME_FF400_GAIN_REG 0x801c0180 87 89 88 90 /* Addresses of various blocks in memory-mapped flash */ … … 434 436 uint32_t phones_level; // Derived from fields in device flash 435 437 uint32_t input_opt[3]; // Derived from fields in device flash 438 439 // Other "settings" fields which are not necessarily stored in device flash 440 int32_t amp_gains[22]; // FF400: gains of input/output amps 436 441 } FF_software_settings_t; 437 442 … … 478 483 #define FF_SWPARAM_FF800_INPUT_OPT_REAR FF_SWPARAM_INPUT_OPT_B 479 484 485 // Indices into the amp_gains array 486 #define FF400_AMPGAIN_MIC1 0 487 #define FF400_AMPGAIN_MIC2 1 488 #define FF400_AMPGAIN_INPUT3 2 489 #define FF400_AMPGAIN_INPUT4 3 490 #define FF400_AMPGAIN_OUTPUT1 4 491 #define FF400_AMPGAIN_OUTPUT2 5 492 #define FF400_AMPGAIN_OUTPUT3 6 493 #define FF400_AMPGAIN_OUTPUT4 7 494 #define FF400_AMPGAIN_OUTPUT5 8 495 #define FF400_AMPGAIN_OUTPUT6 9 496 #define FF400_AMPGAIN_PHONES_L 10 497 #define FF400_AMPGAIN_PHONES_R 11 498 #define FF400_AMPGAIN_SPDIF1 12 499 #define FF400_AMPGAIN_SPDIF2 13 500 #define FF400_AMPGAIN_ADAT1_1 14 501 #define FF400_AMPGAIN_ADAT1_2 15 502 #define FF400_AMPGAIN_ADAT1_3 16 503 #define FF400_AMPGAIN_ADAT1_4 17 504 #define FF400_AMPGAIN_ADAT1_5 18 505 #define FF400_AMPGAIN_ADAT1_6 19 506 #define FF400_AMPGAIN_ADAT1_7 20 507 #define FF400_AMPGAIN_ADAT1_8 21 508 #define FF400_AMPGAIN_NUM 22 509 480 510 // The general Fireface state 481 511 typedef struct { trunk/libffado/src/rme/fireface_hw.cpp
r1615 r1616 59 59 settings.output_level = FF_SWPARAM_OLEVEL_HIGAIN; 60 60 61 // Set amplifier gains 62 if (m_rme_model == RME_MODEL_FIREFACE400) { 63 signed int i; 64 for (i=0; i<FF400_AMPGAIN_NUM; i++) { 65 set_hardware_ampgain(i, settings.amp_gains[i]); 66 } 67 } 68 61 69 // A default sampling rate. An explicit DDS frequency is not enabled 62 70 // by default. … … 677 685 } 678 686 679 } 687 signed int 688 Device::set_hardware_ampgain(unsigned int index, signed int val) { 689 // "val" is in dB except for inputs 3/4 where it's in units of 0.5 dB. This 690 // function is responsible for converting to/from the scale used by the 691 // device. 692 quadlet_t regval = 0; 693 signed int devval = 0; 694 if (index <= FF400_AMPGAIN_MIC2) { 695 if (val >= 10) 696 devval = val; 697 else 698 devval = 0; 699 } else 700 if (index <= FF400_AMPGAIN_INPUT4) { 701 devval = val; 702 } else { 703 devval = 6 - val; 704 if (devval > 53) 705 devval = 0x3f; // Mute 706 } 707 regval |= devval; 708 regval |= (index << 16); 709 return writeRegister(RME_FF400_GAIN_REG, regval); 710 } 711 712 } trunk/libffado/src/rme/fireface_settings_ctrls.cpp
r1610 r1616 157 157 } 158 158 159 } 159 160 RmeSettingsMatrixCtrl::RmeSettingsMatrixCtrl(Device &parent, unsigned int type) 161 : Control::MatrixMixer(&parent) 162 , m_parent(parent) 163 , m_type(type) 164 { 165 } 166 167 RmeSettingsMatrixCtrl::RmeSettingsMatrixCtrl(Device &parent, unsigned int type, 168 std::string name) 169 : Control::MatrixMixer(&parent) 170 , m_parent(parent) 171 , m_type(type) 172 { 173 setName(name); 174 } 175 176 void RmeSettingsMatrixCtrl::show() 177 { 178 debugOutput(DEBUG_LEVEL_NORMAL, "RME matrix mixer type %d\n", m_type); 179 } 180 181 std::string RmeSettingsMatrixCtrl::getRowName(const int row) 182 { 183 char buf[64]; 184 snprintf(buf, sizeof(buf), "RmeSettingsMatrixCtrl type %d, row %d", m_type, row); 185 return buf; 186 } 187 188 std::string RmeSettingsMatrixCtrl::getColName(const int col) 189 { 190 char buf[64]; 191 snprintf(buf, sizeof(buf), "RmeSettingsMatrixCtrl type %d, column %d", m_type, col); 192 return buf; 193 } 194 195 int RmeSettingsMatrixCtrl::getRowCount() 196 { 197 switch (m_type) { 198 case RME_MATRIXCTRL_GAINS: 199 if (m_parent.getRmeModel() == RME_MODEL_FIREFACE400) 200 return 1; 201 break; 202 } 203 204 return 0; 205 } 206 207 int RmeSettingsMatrixCtrl::getColCount() 208 { 209 switch (m_type) { 210 case RME_MATRIXCTRL_GAINS: 211 if (m_parent.getRmeModel() == RME_MODEL_FIREFACE400) 212 return 22; 213 break; 214 } 215 216 return 0; 217 } 218 219 double RmeSettingsMatrixCtrl::setValue(const int row, const int col, const double val) 220 { 221 signed int ret = true; 222 signed int i; 223 224 switch (m_type) { 225 case RME_MATRIXCTRL_GAINS: 226 i = val; 227 if (i >= 0) 228 ret = m_parent.setAmpGain(col, val); 229 else 230 ret = -1; 231 break; 232 } 233 234 return ret; 235 } 236 237 double RmeSettingsMatrixCtrl::getValue(const int row, const int col) 238 { 239 double val = 0.0; 240 switch (m_type) { 241 case RME_MATRIXCTRL_GAINS: 242 val = m_parent.getAmpGain(col); 243 break; 244 } 245 246 return val; 247 } 248 249 250 } trunk/libffado/src/rme/fireface_settings_ctrls.h
r1610 r1616 29 29 namespace Rme { 30 30 31 /* Control types for an RmeSettingsCtrl object */ 31 32 #define RME_CTRL_NONE 0x0000 32 33 #define RME_CTRL_PHANTOM_SW 0x0001 … … 50 51 #define RME_CTRL_INFO_MODEL 0x0100 51 52 #define RME_CTRL_INFO_TCO_PRESENT 0x0200 53 54 /* Control types for an RmeSettingsMatrixCtrl object */ 55 #define RME_MATRIXCTRL_NONE 0x0000 56 #define RME_MATRIXCTRL_GAINS 0x0001 52 57 53 58 class Device; … … 75 80 }; 76 81 82 class RmeSettingsMatrixCtrl 83 : public Control::MatrixMixer 84 { 85 public: 86 RmeSettingsMatrixCtrl(Device &parent, unsigned int type); 87 RmeSettingsMatrixCtrl(Device &parent, unsigned int type, 88 std::string name); 89 90 virtual void show(); 91 92 virtual std::string getRowName(const int row); 93 virtual std::string getColName(const int col); 94 virtual int canWrite( const int, const int ) { return true; } 95 virtual int getRowCount(); 96 virtual int getColCount(); 97 98 virtual double setValue(const int row, const int col, const double val); 99 virtual double getValue(const int row, const int col); 100 101 protected: 102 Device &m_parent; 103 unsigned int m_type; 104 }; 105 77 106 } trunk/libffado/src/rme/rme_avdevice.cpp
r1615 r1616 131 131 "Phantom", "Phantom switches", "")); 132 132 if (m_rme_model == RME_MODEL_FIREFACE400) { 133 // Instrument input options 133 134 for (i=3; i<=4; i++) { 134 135 char path[32], desc[64]; … … 144 145 path, desc, "")); 145 146 } 147 148 // Input/output gains 149 result &= m_ControlContainer->addElement( 150 new RmeSettingsMatrixCtrl(*this, RME_MATRIXCTRL_GAINS, "Gains")); 146 151 } 147 152 trunk/libffado/src/rme/rme_avdevice.h
r1610 r1616 99 99 signed int getInputInstrOpt(unsigned int channel); 100 100 signed int setInputInstrOpt(unsigned int channel, unsigned int status); 101 signed int getAmpGain(unsigned int index); 102 signed int setAmpGain(unsigned int index, signed int val); 101 103 102 104 /* General information functions */ … … 161 163 signed int hardware_stop_streaming(void); 162 164 165 signed int set_hardware_ampgain(unsigned int index, signed int val); 166 163 167 Control::Container *m_MixerContainer; 164 168 Control::Container *m_ControlContainer; trunk/libffado/src/rme/rme_avdevice_settings.cpp
r1610 r1616 92 92 return 0; 93 93 } 94 94 95 signed int 96 Device::getAmpGain(unsigned int index) { 97 if (m_rme_model != RME_MODEL_FIREFACE400) { 98 debugOutput(DEBUG_LEVEL_WARNING, "Amp gains only supported on FF400\n"); 99 return -1; 100 } 101 if (index > 21) { 102 debugOutput(DEBUG_LEVEL_WARNING, "Amp gain index %d invalid\n", index); 103 return -1; 104 } 105 return settings.amp_gains[index]; 106 } 107 108 signed int 109 Device::setAmpGain(unsigned int index, signed int val) { 110 quadlet_t regval = 0; 111 112 if (m_rme_model != RME_MODEL_FIREFACE400) { 113 debugOutput(DEBUG_LEVEL_WARNING, "Amp gains only supported on FF400\n"); 114 return -1; 115 } 116 if (index > 21) { 117 debugOutput(DEBUG_LEVEL_WARNING, "Amp gain index %d invalid\n", index); 118 return -1; 119 } 120 settings.amp_gains[index] = val & 0xff; 121 return set_hardware_ampgain(index, val); 122 } 95 123 96 124 } trunk/libffado/support/mixer-qt4/mixer_rme.py
r1615 r1616 56 56 } 57 57 58 self.Gains={ 59 self.gain_mic1: ['/Control/Gains', 0], 60 self.gain_mic2: ['/Control/Gains', 1], 61 self.gain_input3: ['/Control/Gains', 2], 62 self.gain_input4: ['/Control/Gains', 3], 63 } 64 58 65 # Other mixer variables 59 66 self.is_streaming = 0 … … 76 83 log.debug("switch %s set to %d" % (self.Switches[sender][0], a0)) 77 84 self.hw.setDiscrete(self.Switches[sender][0], a0) 85 86 # Public slot: update gains 87 def updateGain(self, a0): 88 sender = self.sender() 89 log.debug("gain %s[%d] set to %d" % (self.Gains[sender][0], self.Gains[sender][1], a0)) 90 self.hw.setMatrixMixerValue(self.Gains[sender][0], 0, self.Gains[sender][1], a0) 78 91 79 92 # Hide and disable a control … … 146 159 ctrl.setChecked(False) 147 160 QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateSwitch) 161 162 for ctrl, info in self.Gains.iteritems(): 163 if (not(ctrl.isEnabled())): 164 continue 165 val = self.hw.getMatrixMixerValue(info[0], 0, info[1]) 166 log.debug("gain %s[%d] is %d" % (info[0], info[1], val)) 167 ctrl.setValue(val); 168 QObject.connect(ctrl, SIGNAL('valueChanged(int)'), self.updateGain) trunk/libffado/support/mixer-qt4/mixer_rme.ui
r1615 r1616 60 60 <item row="0" column="1" > 61 61 <widget class="QSlider" name="gain_mic1" > 62 <property name="maximum" > 63 <number>65</number> 64 </property> 65 <property name="singleStep" > 66 <number>1</number> 67 </property> 62 68 <property name="orientation" > 63 69 <enum>Qt::Horizontal</enum> … … 80 86 <item row="1" column="1" > 81 87 <widget class="QSlider" name="gain_mic2" > 88 <property name="maximum" > 89 <number>65</number> 90 </property> 82 91 <property name="orientation" > 83 92 <enum>Qt::Horizontal</enum> … … 100 109 <item row="2" column="1" > 101 110 <widget class="QSlider" name="gain_input3" > 111 <property name="minimum" > 112 <number>0</number> 113 </property> 114 <property name="maximum" > 115 <number>36</number> 116 </property> 102 117 <property name="orientation" > 103 118 <enum>Qt::Horizontal</enum> … … 120 135 <item row="3" column="1" > 121 136 <widget class="QSlider" name="gain_input4" > 137 <property name="minimum" > 138 <number>0</number> 139 </property> 140 <property name="maximum" > 141 <number>36</number> 142 </property> 122 143 <property name="orientation" > 123 144 <enum>Qt::Horizontal</enum> … … 1066 1087 <zorder>frame_2</zorder> 1067 1088 <zorder>frame_3</zorder> 1068 <zorder>verticalSpacer_17</zorder>1069 1089 <zorder>frame_5</zorder> 1070 1090 </widget> … … 1077 1097 </item> 1078 1098 </layout> 1079 <zorder>tabWidget</zorder>1080 1099 </widget> 1081 1100 <resources/>