Changeset 1616

Show
Ignore:
Timestamp:
08/13/09 07:21:51 (14 years ago)
Author:
jwoithe
Message:

RME: minor documentation corrections
RME: the Fireface-400 input gain mixer controls now drive the hardware. Control of the output gains is also included in this infrastructure but is not connected to any mixer controls yet - they will be controlled by the mixer proper once that's implemented.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/doc/rme_notes/rme_config_register_map.txt

    r1615 r1616  
    22============================================ 
    33 
    4 Version: 0.16 
     4Version: 0.17 
    55Author: Jonathan Woithe 
    6 Date: 10 August 2009 
     6Date: 13 August 2009 
    77 
    88 
     
    667667 
    668668  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
    670670  bits 15-8: unknown (set to 0) 
    671671  bits 7-0: the gain value 
  • trunk/libffado/src/rme/fireface_def.h

    r1615 r1616  
    8585#define RME_FF_TCO_READ_REG          0x801f0000 
    8686#define RME_FF_TCO_WRITE_REG         0x810f0020 
     87 
     88#define RME_FF400_GAIN_REG           0x801c0180 
    8789 
    8890/* Addresses of various blocks in memory-mapped flash */ 
     
    434436    uint32_t phones_level;             // Derived from fields in device flash 
    435437    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 
    436441} FF_software_settings_t; 
    437442 
     
    478483#define FF_SWPARAM_FF800_INPUT_OPT_REAR        FF_SWPARAM_INPUT_OPT_B 
    479484 
     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 
    480510// The general Fireface state 
    481511typedef struct { 
  • trunk/libffado/src/rme/fireface_hw.cpp

    r1615 r1616  
    5959    settings.output_level = FF_SWPARAM_OLEVEL_HIGAIN; 
    6060 
     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 
    6169    // A default sampling rate.  An explicit DDS frequency is not enabled 
    6270    // by default. 
     
    677685} 
    678686 
    679 
     687signed int 
     688Device::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  
    157157} 
    158158 
    159 
     159 
     160RmeSettingsMatrixCtrl::RmeSettingsMatrixCtrl(Device &parent, unsigned int type) 
     161: Control::MatrixMixer(&parent) 
     162, m_parent(parent) 
     163, m_type(type) 
     164
     165
     166 
     167RmeSettingsMatrixCtrl::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 
     176void RmeSettingsMatrixCtrl::show() 
     177
     178    debugOutput(DEBUG_LEVEL_NORMAL, "RME matrix mixer type %d\n", m_type); 
     179
     180 
     181std::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 
     188std::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 
     195int 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 
     207int 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 
     219double 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 
     237double 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  
    2929namespace Rme { 
    3030 
     31/* Control types for an RmeSettingsCtrl object */ 
    3132#define RME_CTRL_NONE                  0x0000 
    3233#define RME_CTRL_PHANTOM_SW            0x0001 
     
    5051#define RME_CTRL_INFO_MODEL            0x0100 
    5152#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 
    5257 
    5358class Device; 
     
    7580}; 
    7681 
     82class RmeSettingsMatrixCtrl 
     83    : public Control::MatrixMixer 
     84{ 
     85public: 
     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 
     101protected: 
     102    Device &m_parent; 
     103    unsigned int m_type; 
     104}; 
     105 
    77106} 
  • trunk/libffado/src/rme/rme_avdevice.cpp

    r1615 r1616  
    131131            "Phantom", "Phantom switches", "")); 
    132132    if (m_rme_model == RME_MODEL_FIREFACE400) { 
     133        // Instrument input options 
    133134        for (i=3; i<=4; i++) { 
    134135            char path[32], desc[64]; 
     
    144145                    path, desc, "")); 
    145146        } 
     147 
     148        // Input/output gains 
     149        result &= m_ControlContainer->addElement( 
     150            new RmeSettingsMatrixCtrl(*this, RME_MATRIXCTRL_GAINS, "Gains")); 
    146151    } 
    147152 
  • trunk/libffado/src/rme/rme_avdevice.h

    r1610 r1616  
    9999    signed int getInputInstrOpt(unsigned int channel); 
    100100    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); 
    101103 
    102104    /* General information functions */ 
     
    161163    signed int hardware_stop_streaming(void); 
    162164 
     165    signed int set_hardware_ampgain(unsigned int index, signed int val); 
     166 
    163167    Control::Container *m_MixerContainer; 
    164168    Control::Container *m_ControlContainer; 
  • trunk/libffado/src/rme/rme_avdevice_settings.cpp

    r1610 r1616  
    9292    return 0; 
    9393} 
    94                  
     94 
     95signed int 
     96Device::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 
     108signed int 
     109Device::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
    95123 
    96124} 
  • trunk/libffado/support/mixer-qt4/mixer_rme.py

    r1615 r1616  
    5656        } 
    5757 
     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 
    5865        # Other mixer variables 
    5966        self.is_streaming = 0 
     
    7683        log.debug("switch %s set to %d" % (self.Switches[sender][0], a0)) 
    7784        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) 
    7891 
    7992    # Hide and disable a control 
     
    146159                ctrl.setChecked(False) 
    147160            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  
    6060             <item row="0" column="1" > 
    6161              <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> 
    6268               <property name="orientation" > 
    6369                <enum>Qt::Horizontal</enum> 
     
    8086             <item row="1" column="1" > 
    8187              <widget class="QSlider" name="gain_mic2" > 
     88               <property name="maximum" > 
     89                <number>65</number> 
     90               </property> 
    8291               <property name="orientation" > 
    8392                <enum>Qt::Horizontal</enum> 
     
    100109             <item row="2" column="1" > 
    101110              <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> 
    102117               <property name="orientation" > 
    103118                <enum>Qt::Horizontal</enum> 
     
    120135             <item row="3" column="1" > 
    121136              <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> 
    122143               <property name="orientation" > 
    123144                <enum>Qt::Horizontal</enum> 
     
    10661087      <zorder>frame_2</zorder> 
    10671088      <zorder>frame_3</zorder> 
    1068       <zorder>verticalSpacer_17</zorder> 
    10691089      <zorder>frame_5</zorder> 
    10701090     </widget> 
     
    10771097   </item> 
    10781098  </layout> 
    1079   <zorder>tabWidget</zorder> 
    10801099 </widget> 
    10811100 <resources/>