Index: /trunk/libffado/src/rme/rme_avdevice.h =================================================================== --- /trunk/libffado/src/rme/rme_avdevice.h (revision 1616) +++ /trunk/libffado/src/rme/rme_avdevice.h (revision 1622) @@ -95,4 +95,10 @@ signed int getPhantom(unsigned int channel); signed int setPhantom(unsigned int channel, unsigned int status); + signed int getInputLevel(void); + signed int setInputLevel(unsigned int level); + signed int getOutputLevel(void); + signed int setOutputLevel(unsigned int level); + signed int getPhonesLevel(void); + signed int setPhonesLevel(unsigned int level); signed int getInputPadOpt(unsigned int channel); signed int setInputPadOpt(unsigned int channel, unsigned int status); Index: /trunk/libffado/src/rme/fireface_hw.cpp =================================================================== --- /trunk/libffado/src/rme/fireface_hw.cpp (revision 1616) +++ /trunk/libffado/src/rme/fireface_hw.cpp (revision 1622) @@ -58,4 +58,5 @@ settings.input_level = FF_SWPARAM_ILEVEL_LOGAIN; settings.output_level = FF_SWPARAM_OLEVEL_HIGAIN; + settings.phones_level = FF_SWPARAM_PHONESLEVEL_HIGAIN; // Set amplifier gains Index: /trunk/libffado/src/rme/rme_avdevice.cpp =================================================================== --- /trunk/libffado/src/rme/rme_avdevice.cpp (revision 1616) +++ /trunk/libffado/src/rme/rme_avdevice.cpp (revision 1622) @@ -130,4 +130,14 @@ new RmeSettingsCtrl(*this, RME_CTRL_PHANTOM_SW, 0, "Phantom", "Phantom switches", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INPUT_LEVEL, 0, + "Input_level", "Input level", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_OUTPUT_LEVEL, 0, + "Output_level", "Output level", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_PHONES_LEVEL, 0, + "Phones_level", "Phones level", "")); + if (m_rme_model == RME_MODEL_FIREFACE400) { // Instrument input options Index: /trunk/libffado/src/rme/rme_avdevice_settings.cpp =================================================================== --- /trunk/libffado/src/rme/rme_avdevice_settings.cpp (revision 1616) +++ /trunk/libffado/src/rme/rme_avdevice_settings.cpp (revision 1622) @@ -48,4 +48,58 @@ settings.mic_phantom[channel] = (status != 0); + set_hardware_params(); + + return 0; +} + +signed int +Device::getInputLevel(void) { + return settings.input_level; +} + +signed int +Device::setInputLevel(unsigned int level) { + + if (levelFF_SWPARAM_ILEVEL_m10dBV) { + debugOutput(DEBUG_LEVEL_WARNING, "Invalid input level ID %d\n", level); + return -1; + } + settings.input_level = level; + set_hardware_params(); + + return 0; +} + +signed int +Device::getOutputLevel(void) { + return settings.output_level; +} + +signed int +Device::setOutputLevel(unsigned int level) { + + if (levelFF_SWPARAM_OLEVEL_m10dBV) { + debugOutput(DEBUG_LEVEL_WARNING, "Invalid output level ID %d\n", level); + return -1; + } + settings.output_level = level; + set_hardware_params(); + + return 0; +} + +signed int +Device::getPhonesLevel(void) { + return settings.phones_level; +} + +signed int +Device::setPhonesLevel(unsigned int level) { + + if (levelFF_SWPARAM_PHONESLEVEL_m10dBV) { + debugOutput(DEBUG_LEVEL_WARNING, "Invalid phones level ID %d\n", level); + return -1; + } + settings.phones_level = level; set_hardware_params(); @@ -108,5 +162,4 @@ signed int Device::setAmpGain(unsigned int index, signed int val) { - quadlet_t regval = 0; if (m_rme_model != RME_MODEL_FIREFACE400) { Index: /trunk/libffado/src/rme/fireface_settings_ctrls.cpp =================================================================== --- /trunk/libffado/src/rme/fireface_settings_ctrls.cpp (revision 1616) +++ /trunk/libffado/src/rme/fireface_settings_ctrls.cpp (revision 1622) @@ -91,4 +91,14 @@ } break; + case RME_CTRL_INPUT_LEVEL: + if (m_parent.setInputLevel(v)) { + m_value = v; + } + break; + case RME_CTRL_OUTPUT_LEVEL: + if (m_parent.setOutputLevel(v)) { + m_value = v; + } + break; case RME_CTRL_FF400_PAD_SW: // Object's "m_info" field is the channel @@ -101,4 +111,9 @@ if (m_parent.setInputInstrOpt(m_info, v)) { m_value = (v != 0); + } + break; + case RME_CTRL_PHONES_LEVEL: + if (m_parent.setPhonesLevel(v)) { + m_value = v; } break; @@ -136,4 +151,10 @@ return val; break; + case RME_CTRL_INPUT_LEVEL: + return m_parent.getInputLevel(); + break; + case RME_CTRL_OUTPUT_LEVEL: + return m_parent.getOutputLevel(); + break; case RME_CTRL_FF400_PAD_SW: return m_parent.getInputPadOpt(m_info); @@ -141,4 +162,7 @@ case RME_CTRL_FF400_INSTR_SW: return m_parent.getInputInstrOpt(m_info); + break; + case RME_CTRL_PHONES_LEVEL: + return m_parent.getPhonesLevel(); break; Index: /trunk/libffado/support/mixer-qt4/mixer_rme.py =================================================================== --- /trunk/libffado/support/mixer-qt4/mixer_rme.py (revision 1616) +++ /trunk/libffado/support/mixer-qt4/mixer_rme.py (revision 1622) @@ -56,4 +56,19 @@ } + self.Radiobuttons={ + self.level_in_lo_gain: ['/Control/Input_level', 1], + self.level_in_p4dBu: ['/Control/Input_level', 2], + self.level_in_m10dBV: ['/Control/Input_level', 3], + + self.level_out_hi_gain: ['/Control/Output_level', 1], + self.level_out_p4dBu: ['/Control/Output_level', 2], + self.level_out_m10dBV: ['/Control/Output_level', 3], + + self.phones_hi_gain: ['/Control/Phones_level', 1], + self.phones_p4dBu: ['/Control/Phones_level', 2], + self.phones_m10dBV: ['/Control/Phones_level', 3], + } + + self.Gains={ self.gain_mic1: ['/Control/Gains', 0], @@ -83,4 +98,12 @@ log.debug("switch %s set to %d" % (self.Switches[sender][0], a0)) self.hw.setDiscrete(self.Switches[sender][0], a0) + + # Public slot: update generic radiobuttons + def updateRadiobutton(self, a0): + sender = self.sender() + if (a0 != 0): + # Only change the control state on a button being "checked" + log.debug("radiobutton group %s set to %d" % (self.Radiobuttons[sender][0], self.Radiobuttons[sender][1])) + self.hw.setDiscrete(self.Radiobuttons[sender][0], self.Radiobuttons[sender][1]) # Public slot: update gains @@ -160,4 +183,21 @@ QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateSwitch) + for ctrl, info in self.Radiobuttons.iteritems(): + if (not(ctrl.isEnabled())): + continue; + # This is a touch wasteful since it means we retrieve the control + # value once per radio button rather than once per radio button + # group. In time we might introduce radiobutton groupings in the + # self.* datastructures to avoid this, but for the moment this is + # easy and it works. + val = self.hw.getDiscrete(info[0]) + if (val == info[1]): + val = 1 + else: + val = 0 + ctrl.setChecked(val) + log.debug("Radiobutton %s[%d] is %d" % (info[0], info[1], val)) + QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateRadiobutton) + for ctrl, info in self.Gains.iteritems(): if (not(ctrl.isEnabled())): Index: /trunk/libffado/support/mixer-qt4/mixer_rme.ui =================================================================== --- /trunk/libffado/support/mixer-qt4/mixer_rme.ui (revision 1616) +++ /trunk/libffado/support/mixer-qt4/mixer_rme.ui (revision 1622) @@ -282,5 +282,5 @@ - + Lo gain @@ -289,5 +289,5 @@ - + +4 dBu @@ -296,5 +296,5 @@ - + -10 dBV @@ -565,5 +565,5 @@ - + Hi gain @@ -572,5 +572,5 @@ - + +4 dBu @@ -579,5 +579,5 @@ - + -10 dBV @@ -611,5 +611,5 @@ - + Hi gain @@ -618,5 +618,5 @@ - + +4 dBU @@ -625,5 +625,5 @@ - + -10 dBV