Changeset 2054

Show
Ignore:
Timestamp:
03/03/12 07:15:53 (9 years ago)
Author:
jwoithe
Message:

rme: implement new ffado-mixer features needed for the FF800 - all FF800 controls should now be functional (with the same caveats as for the FF400). Fixed various bugs in ffado-mixer's FF800 code. Hopefully this doesn't break anything on the FF400.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/rme/fireface_def.h

    r2016 r2054  
    516516#define FF_SWPARAM_FF800_INPUT_OPT_FRONT       FF_SWPARAM_INPUT_OPT_A 
    517517#define FF_SWPARAM_FF800_INPUT_OPT_REAR        FF_SWPARAM_INPUT_OPT_B 
    518 // 
     518 
     519// Flags for the "status" parameter of setInputInstrOpt() 
     520#define FF400_INSTR_OPT_ACTIVE  0x01 
     521#define FF800_INSTR_OPT_FILTER  0x02 
     522#define FF800_INSTR_OPT_FUZZ    0x04 
     523#define FF800_INSTR_OPT_LIMITER 0x08 
     524 
    519525// Flags for the *_mixerflags fields 
    520526#define FF_SWPARAM_MF_NORMAL    0x00 
  • trunk/libffado/src/rme/fireface_hw.cpp

    r2028 r2054  
    9494        // TODO: store and manipulate channel mute/rec flags 
    9595 
     96        // The FF800 needs the input source set via the input options. 
     97        // Start with the channel 1 limiter disabled too. 
     98        if (m_rme_model == RME_MODEL_FIREFACE800) { 
     99            settings->input_opt[0] = settings->input_opt[1] =  
     100              settings->input_opt[2] = FF_SWPARAM_FF800_INPUT_OPT_FRONT; 
     101            settings->limiter_disable = 1; 
     102        } 
     103 
    96104        // Configure the hardware to match the current software status.  
    97105        // This is only done if the settings valid flag is 0; if it is 1 it 
     
    334342 
    335343    /* Phones level */ 
    336     switch (sw_settings->phones_level) { 
    337         case FF_SWPARAM_PHONESLEVEL_HIGAIN: 
    338             data[0] |= CRO_PHLEVEL_HIGAIN; 
    339             break; 
    340         case FF_SWPARAM_PHONESLEVEL_4dBU: 
    341             data[0] |= CR0_PHLEVEL_4dBU; 
    342             break; 
    343         case FF_SWPARAM_PHONESLEVEL_m10dBV: 
    344             data[0] |= CRO_PHLEVEL_m10dBV; 
    345             break; 
     344    if (m_rme_model == RME_MODEL_FIREFACE400) { 
     345        switch (sw_settings->phones_level) { 
     346            case FF_SWPARAM_PHONESLEVEL_HIGAIN: 
     347                data[0] |= CRO_PHLEVEL_HIGAIN; 
     348                break; 
     349            case FF_SWPARAM_PHONESLEVEL_4dBU: 
     350                data[0] |= CR0_PHLEVEL_4dBU; 
     351                break; 
     352            case FF_SWPARAM_PHONESLEVEL_m10dBV: 
     353                data[0] |= CRO_PHLEVEL_m10dBV; 
     354                break; 
     355        } 
    346356    } 
    347357 
  • trunk/libffado/src/rme/fireface_settings_ctrls.cpp

    r2044 r2054  
    115115            } 
    116116            break; 
     117        case RME_CTRL_INPUT_SOURCE: { 
     118            // m_info is the channel number 
     119            signed int src = 0; 
     120            if (v==0 || v==2)  
     121                src |= FF_SWPARAM_FF800_INPUT_OPT_FRONT; 
     122            if (v==1 || v==2) 
     123                src |= FF_SWPARAM_FF800_INPUT_OPT_REAR; 
     124            if (m_parent.setInputSource(m_info, src) == 0) 
     125                m_value = src; 
     126            break; 
     127        } 
     128        case RME_CTRL_INSTRUMENT_OPTIONS: 
     129            // m_info is the channel number 
     130            if (m_parent.setInputInstrOpt(m_info, v) == 0) 
     131                m_value = v; 
     132            break; 
    117133        case RME_CTRL_SPDIF_INPUT_MODE: 
    118134            if (m_parent.setSpdifInputMode(v==0?FF_SWPARAM_SPDIF_INPUT_COAX:FF_SWPARAM_SPDIF_INPUT_OPTICAL)) { 
     
    235251            return m_parent.getInputInstrOpt(m_info); 
    236252            break; 
     253        case RME_CTRL_INPUT_SOURCE: { 
     254            signed int src; 
     255            src = m_parent.getInputSource(m_info); 
     256            if (src == FF_SWPARAM_FF800_INPUT_OPT_FRONT) 
     257                return 0; 
     258            if (src == FF_SWPARAM_FF800_INPUT_OPT_REAR) 
     259                return 1; 
     260            return 2; 
     261            break; 
     262        } 
     263        case RME_CTRL_INSTRUMENT_OPTIONS:  
     264            return m_parent.getInputInstrOpt(m_info); 
     265            break; 
    237266        case RME_CTRL_SPDIF_INPUT_MODE: 
    238267            i = m_parent.getSpdifInputMode(); 
     
    327356{ 
    328357    char buf[64]; 
    329     if (model == RME_MODEL_FIREFACE400) { 
    330         if (idx >= 10) 
    331             snprintf(buf, sizeof(buf), "ADAT out %d", idx-9); 
    332         else 
    333         if (idx >= 8) 
    334             snprintf(buf, sizeof(buf), "SPDIF out %d", idx-7); 
    335         else 
    336         if (idx >= 6) 
    337             snprintf(buf, sizeof(buf), "Mon out %d", idx+1); 
    338         else 
    339             snprintf(buf, sizeof(buf), "Line out %d", idx+1); 
    340     } else { 
    341         snprintf(buf, sizeof(buf), "out %d", idx); 
     358    switch(model) { 
     359        case RME_MODEL_FIREFACE400: 
     360            if (idx >= 10) 
     361                snprintf(buf, sizeof(buf), "ADAT out %d", idx-9); 
     362            else 
     363            if (idx >= 8) 
     364                snprintf(buf, sizeof(buf), "SPDIF out %d", idx-7); 
     365            else 
     366            if (idx >= 6) 
     367                snprintf(buf, sizeof(buf), "Mon out %d", idx+1); 
     368            else 
     369                snprintf(buf, sizeof(buf), "Line out %d", idx+1); 
     370            break; 
     371        case RME_MODEL_FIREFACE800: 
     372            if (idx >= 20) 
     373                snprintf(buf, sizeof(buf), "ADAT-2 out %d", idx-19); 
     374            else 
     375            if (idx >= 12) 
     376                snprintf(buf, sizeof(buf), "ADAT-1 out %d", idx-11); 
     377            else 
     378            if (idx >= 10) 
     379                snprintf(buf, sizeof(buf), "SPDIF out %d", idx-9); 
     380            else 
     381            if (idx >= 8) 
     382                snprintf(buf, sizeof(buf), "Mon, ch %d", idx+1); 
     383            else 
     384                snprintf(buf, sizeof(buf), "Line out %d", idx+1); 
     385            break; 
     386        default: 
     387            snprintf(buf, sizeof(buf), "out %d", idx); 
    342388    } 
    343389    return buf; 
     
    347393{ 
    348394    char buf[64]; 
    349     if (model == RME_MODEL_FIREFACE400) { 
    350         if (idx >= 10) 
    351             snprintf(buf, sizeof(buf), "ADAT in %d", idx-9); 
    352         else 
    353         if (idx >= 8) 
    354             snprintf(buf, sizeof(buf), "SPDIF in %d", idx-7); 
    355         else 
    356         if (idx >= 4) 
    357             snprintf(buf, sizeof(buf), "Line in %d", idx+1); 
    358         else 
    359         if (idx >= 2) 
    360             snprintf(buf, sizeof(buf), "Inst/line %d", idx+1); 
    361         else 
    362             snprintf(buf, sizeof(buf), "Mic/line %d", idx+1); 
    363     } else { 
    364         snprintf(buf, sizeof(buf), "in %d", idx); 
     395    switch (model) { 
     396        case RME_MODEL_FIREFACE400: 
     397            if (idx >= 10) 
     398                snprintf(buf, sizeof(buf), "ADAT in %d", idx-9); 
     399            else 
     400            if (idx >= 8) 
     401                snprintf(buf, sizeof(buf), "SPDIF in %d", idx-7); 
     402            else 
     403            if (idx >= 4) 
     404                snprintf(buf, sizeof(buf), "Line in %d", idx+1); 
     405            else 
     406            if (idx >= 2) 
     407                snprintf(buf, sizeof(buf), "Inst/line %d", idx+1); 
     408            else 
     409                snprintf(buf, sizeof(buf), "Mic/line %d", idx+1); 
     410            break; 
     411        case RME_MODEL_FIREFACE800: 
     412            if (idx >= 20) 
     413                snprintf(buf, sizeof(buf), "ADAT-2 in %d", idx-19); 
     414            else 
     415            if (idx >= 12) 
     416                snprintf(buf, sizeof(buf), "ADAT-1 in %d", idx-11); 
     417            else 
     418            if (idx >= 10) 
     419                snprintf(buf, sizeof(buf), "SPDIF in %d", idx-9); 
     420            else 
     421            if (idx >= 6) 
     422                snprintf(buf, sizeof(buf), "Mic/line %d", idx+1); 
     423            else 
     424            if (idx >= 1) 
     425                snprintf(buf, sizeof(buf), "Line %d", idx+1); 
     426            else 
     427                snprintf(buf, sizeof(buf), "Instr/line %d", idx+1); 
     428            break; 
     429        default: 
     430            snprintf(buf, sizeof(buf), "in %d", idx); 
    365431    } 
    366432    return buf; 
  • trunk/libffado/src/rme/fireface_settings_ctrls.h

    r2038 r2054  
    4646#define RME_CTRL_WCLK_SINGLE_SPEED     0x000e 
    4747#define RME_CTRL_PHONES_LEVEL          0x000f 
    48 #define RME_CTRL_INPUT0_OPTIONS        0x0010 
    49 #define RME_CTRL_INPUT1_OPTIONS        0x0011 
    50 #define RME_CTRL_INPUT2_OPTIONS        0x0012 
     48#define RME_CTRL_INPUT_SOURCE          0x0010 
    5149#define RME_CTRL_FF400_PAD_SW          0x0013 
    5250#define RME_CTRL_FF400_INSTR_SW        0x0014 
  • trunk/libffado/src/rme/rme_avdevice.cpp

    r2044 r2054  
    207207            "Bandwidth_limit", "Bandwidth limit", "")); 
    208208 
     209    if (m_rme_model == RME_MODEL_FIREFACE800) { 
     210        result &= m_ControlContainer->addElement( 
     211            new RmeSettingsCtrl(*this, RME_CTRL_INPUT_SOURCE, 1, 
     212                "Chan1_source", "Channel 1 source", "")); 
     213        result &= m_ControlContainer->addElement( 
     214            new RmeSettingsCtrl(*this, RME_CTRL_INPUT_SOURCE, 7, 
     215                "Chan7_source", "Channel 7 source", "")); 
     216        result &= m_ControlContainer->addElement( 
     217            new RmeSettingsCtrl(*this, RME_CTRL_INPUT_SOURCE, 8, 
     218                "Chan8_source", "Channel 8 source", "")); 
     219        result &= m_ControlContainer->addElement( 
     220            new RmeSettingsCtrl(*this, RME_CTRL_INSTRUMENT_OPTIONS, 1, 
     221                "Chan1_instr_opts", "Input instrument options channel 1", "")); 
     222    } 
     223 
    209224    if (m_rme_model == RME_MODEL_FIREFACE400) { 
    210225        // Instrument input options 
  • trunk/libffado/src/rme/rme_avdevice.h

    r2044 r2054  
    118118    signed int getInputInstrOpt(unsigned int channel); 
    119119    signed int setInputInstrOpt(unsigned int channel, unsigned int status); 
     120    signed int getInputSource(unsigned int channel); 
     121    signed int setInputSource(unsigned int channel, unsigned int src); 
    120122    signed int getSpdifInputMode(void); 
    121123    signed int setSpdifInputMode(signed int mode); 
  • trunk/libffado/src/rme/rme_avdevice_settings.cpp

    r2045 r2054  
    129129signed int  
    130130Device::getInputInstrOpt(unsigned int channel) { 
    131     if (m_rme_model!=RME_MODEL_FIREFACE400 || channel<3 || channel>4) { 
    132         debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument option not supported for model %d\n", channel, m_rme_model); 
    133         return -1; 
    134     } 
    135     return settings->ff400_instr_input[channel-3] != 0; 
     131    switch (m_rme_model) { 
     132        case RME_MODEL_FIREFACE400: 
     133            if (channel<3 || channel>4) { 
     134                debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument option not supported for model FF400\n", channel); 
     135                return -1; 
     136            } 
     137            return settings->ff400_instr_input[channel-3] != 0; 
     138            break; 
     139        case RME_MODEL_FIREFACE800: 
     140            if (channel != 1) { 
     141                debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument options not supported for FF800\n", channel); 
     142                return -1; 
     143            } 
     144            return (settings->filter?FF800_INSTR_OPT_FILTER:0) | 
     145                   (settings->fuzz?FF800_INSTR_OPT_FUZZ:0) | 
     146                   (settings->limiter_disable?0:FF800_INSTR_OPT_LIMITER); 
     147            break; 
     148        default: 
     149            return -1; 
     150    } 
     151    return -1; 
    136152} 
    137153 
    138154signed int  
    139155Device::setInputInstrOpt(unsigned int channel, unsigned int status) { 
    140     if (m_rme_model!=RME_MODEL_FIREFACE400 || channel<3 || channel>4) { 
    141         debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument option not supported for model %d\n", channel, m_rme_model); 
    142         return -1; 
    143     } 
    144     settings->ff400_instr_input[channel-3] = (status != 0); 
     156    switch (m_rme_model) { 
     157        case RME_MODEL_FIREFACE400: 
     158            if (channel<3 || channel>4) { 
     159                debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument option not supported for FF400\n", channel); 
     160                return -1; 
     161            } 
     162            settings->ff400_instr_input[channel-3] = (status != 0); 
     163            break; 
     164        case RME_MODEL_FIREFACE800: 
     165            if (channel != 1) { 
     166                debugOutput(DEBUG_LEVEL_WARNING, "Channel %d input instrument options not supported for FF800\n", channel); 
     167                return -1; 
     168            } 
     169            settings->filter = (status & FF800_INSTR_OPT_FILTER)!=0; 
     170            settings->fuzz = (status & FF800_INSTR_OPT_FUZZ)!=0; 
     171            settings->limiter_disable = (status & FF800_INSTR_OPT_LIMITER)==0; 
     172            break; 
     173        default: 
     174            return -1; 
     175    } 
     176    set_hardware_params(); 
     177    return 0; 
     178
     179 
     180signed int 
     181Device::getInputSource(unsigned int channel) { 
     182    if (m_rme_model!=RME_MODEL_FIREFACE800 || (channel!=1 && channel!=7 && channel!=8)) { 
     183        debugOutput(DEBUG_LEVEL_WARNING, "Channel %d source is fixed on model %d\n", channel, m_rme_model); 
     184        return -1; 
     185    } 
     186    if (channel == 1) 
     187        return settings->input_opt[0]; 
     188    else 
     189        return settings->input_opt[channel-6]; 
     190
     191 
     192signed int 
     193Device::setInputSource(unsigned int channel, unsigned int src) { 
     194    /* "opt" should be composed only of the FF_SWPARAM_FF800_INPUT_OPT_*  
     195     * defines. 
     196     */ 
     197    signed int index; 
     198    if (m_rme_model!=RME_MODEL_FIREFACE800 || (channel!=1 && channel!=7 && channel!=8)) { 
     199        debugOutput(DEBUG_LEVEL_WARNING, "Channel %d source cannot be set on model %d\n", channel, m_rme_model); 
     200        return -1; 
     201    } 
     202    if (channel == 1) 
     203        index = 0; 
     204    else 
     205        index = channel-6; 
     206    settings->input_opt[index] = src; 
    145207    set_hardware_params(); 
    146208    return 0; 
  • trunk/libffado/support/mixer-qt4/ffado/mixer/rme.py

    r2044 r2054  
    9191        } 
    9292 
     93        self.Checkboxes={ 
     94            self.ch1_instr_fuzz: ['/Control/Chan1_instr_opts', 0x04], 
     95            self.ch1_instr_limiter: ['/Control/Chan1_instr_opts', 0x08], 
     96            self.ch1_instr_filter: ['/Control/Chan1_instr_opts', 0x02], 
     97        } 
    9398 
    9499        self.Gains={ 
     
    99104        } 
    100105 
     106        self.Combos={ 
     107            self.ff800_ch1_src: ['/Control/Chan1_source'], 
     108            self.ff800_ch7_src: ['/Control/Chan7_source'], 
     109            self.ff800_ch8_src: ['/Control/Chan8_source'], 
     110        } 
     111 
    101112        # Other mixer variables 
    102113        self.is_streaming = 0 
     
    127138            log.debug("radiobutton group %s set to %d" % (self.Radiobuttons[sender][0], self.Radiobuttons[sender][1])) 
    128139            self.hw.setDiscrete(self.Radiobuttons[sender][0], self.Radiobuttons[sender][1]) 
     140 
     141    def updateCheckboxes(self, a0): 
     142        sender = self.sender() 
     143        val = self.hw.getDiscrete(self.Checkboxes[sender][0]); 
     144        if (a0 != 0): 
     145            val = val | self.Checkboxes[sender][1] 
     146        else: 
     147            val = val & ~self.Checkboxes[sender][1] 
     148        log.debug("checkbox group %s set to %d" % (self.Checkboxes[sender][0], val)); 
     149        self.hw.setDiscrete(self.Checkboxes[sender][0], val) 
    129150 
    130151    # Public slot: update gains 
     
    141162        # log.debug("limit update: %d" % (a0)); 
    142163        self.hw.setDiscrete('/Control/Bandwidth_limit', a0); 
     164 
     165    def updateCombo(self, a0): 
     166        sender = self.sender() 
     167        log.debug("combo %s set to %d" % (self.Combos[sender][0], a0)) 
     168        self.hw.setDiscrete(self.Combos[sender][0], a0) 
    143169 
    144170    def updateStreamingState(self): 
     
    240266            self.sync_check_adat2_status.setEnabled(False) 
    241267 
     268        for ctrl, info in self.Combos.iteritems(): 
     269            if (not(ctrl.isEnabled())): 
     270                continue; 
     271            val = self.hw.getDiscrete(info[0]) 
     272            log.debug("combo %s is %d" % (info[0], val)); 
     273            ctrl.setCurrentIndex(val); 
     274            QObject.connect(ctrl, SIGNAL('currentIndexChanged(int)'), self.updateCombo) 
     275 
    242276        if (not(self.tco_present)): 
    243277            self.sync_check_tco_label.setEnabled(False) 
     
    304338            QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateRadiobutton) 
    305339 
     340        for ctrl, info in self.Checkboxes.iteritems(): 
     341            if (not(ctrl.isEnabled())): 
     342                continue; 
     343            # This is a touch wasteful since it means we retrieve the control 
     344            # value once per checkbox button rather than once per checkbox 
     345            # group.  In time we might introduce checkbox groupings in the 
     346            # self.* datastructures to avoid this, but for the moment this is 
     347            # easy and it works. 
     348            val = self.hw.getDiscrete(info[0]) 
     349            if (val & info[1]): 
     350                val = 1 
     351            else: 
     352                val = 0 
     353            ctrl.setChecked(val) 
     354            log.debug("Checkbox %s[%d] is %d" % (info[0], info[1], val)) 
     355            QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateCheckboxes) 
     356 
    306357        for ctrl, info in self.Gains.iteritems(): 
    307358            if (not(ctrl.isEnabled())): 
  • trunk/libffado/support/mixer-qt4/ffado/mixer/rme.ui

    r2042 r2054  
    332332              </widget> 
    333333             </item> 
    334              <item row="2" column="0"> 
     334             <item row="1" column="0"> 
    335335              <widget class="QLabel" name="label_21"> 
    336336               <property name="text"> 
     
    339339              </widget> 
    340340             </item> 
    341              <item row="2" column="1" colspan="3"> 
    342               <widget class="QComboBox" name="comboBox_3"> 
     341             <item row="1" column="1" colspan="3"> 
     342              <widget class="QComboBox" name="ff800_ch7_src"> 
    343343               <item> 
    344344                <property name="text"> 
     
    358358              </widget> 
    359359             </item> 
    360              <item row="3" column="0"> 
     360             <item row="2" column="0"> 
    361361              <widget class="QLabel" name="label_22"> 
    362362               <property name="text"> 
     
    365365              </widget> 
    366366             </item> 
    367              <item row="3" column="1" colspan="3"> 
    368               <widget class="QComboBox" name="comboBox_4"> 
     367             <item row="2" column="1" colspan="3"> 
     368              <widget class="QComboBox" name="ff800_ch8_src"> 
    369369               <item> 
    370370                <property name="text"> 
     
    385385             </item> 
    386386             <item row="0" column="1" colspan="3"> 
    387               <widget class="QComboBox" name="comboBox_2"> 
     387              <widget class="QComboBox" name="ff800_ch1_src"> 
    388388               <item> 
    389389                <property name="text"> 
     
    403403              </widget> 
    404404             </item> 
     405             <item row="3" column="0"> 
     406              <spacer name="verticalSpacer_11a"> 
     407               <property name="orientation"> 
     408                <enum>Qt::Vertical</enum> 
     409               </property> 
     410               <property name="sizeHint" stdset="0"> 
     411                <size> 
     412                 <width>20</width> 
     413                 <height>40</height> 
     414                </size> 
     415               </property> 
     416              </spacer> 
     417             </item> 
    405418            </layout> 
    406419           </widget> 
     
    413426            <layout class="QVBoxLayout" name="verticalLayout_11"> 
    414427             <item> 
    415               <widget class="QCheckBox" name="checkBox_6"> 
     428              <widget class="QCheckBox" name="ch1_instr_fuzz"> 
    416429               <property name="text"> 
    417430                <string>Drive</string> 
     
    420433             </item> 
    421434             <item> 
    422               <widget class="QCheckBox" name="checkBox_7"> 
     435              <widget class="QCheckBox" name="ch1_instr_limiter"> 
    423436               <property name="text"> 
    424437                <string>Limiter</string> 
     
    427440             </item> 
    428441             <item> 
    429               <widget class="QCheckBox" name="checkBox_8"> 
     442              <widget class="QCheckBox" name="ch1_instr_filter"> 
    430443               <property name="text"> 
    431444                <string>Speaker emulation</string>