Changeset 662

Show
Ignore:
Timestamp:
10/20/07 12:23:54 (15 years ago)
Author:
ppalmers
Message:

- introduce mixer control for the original saffire

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/bebob/bebob_avdevice.cpp

    r661 r662  
    2828#include "bebob/bebob_mixer.h" 
    2929 
     30#include "bebob/focusrite/focusrite_saffire.h" 
    3031#include "bebob/focusrite/focusrite_saffirepro.h" 
    3132#include "bebob/terratec/terratec_device.h" 
     
    104105                case 0x00000006: 
    105106                    return new Focusrite::SaffireProDevice(ieee1394Service, configRom); 
     107                case 0x00000000: 
     108                    return new Focusrite::SaffireDevice(ieee1394Service, configRom); 
    106109                default: // return a plain BeBoB device 
    107110                    return new AvDevice(ieee1394Service, configRom); 
  • trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp

    r661 r662  
    240240} 
    241241 
     242// low resolution volume control 
     243VolumeControlLowRes::VolumeControlLowRes(FocusriteDevice& parent, int id, int shift) 
     244: Control::Discrete() 
     245, m_Parent(parent) 
     246, m_cmd_id ( id ) 
     247, m_bit_shift( shift ) 
     248{} 
     249VolumeControlLowRes::VolumeControlLowRes(FocusriteDevice& parent, int id, int shift, 
     250                std::string name, std::string label, std::string descr) 
     251: Control::Discrete() 
     252, m_Parent(parent) 
     253, m_cmd_id ( id ) 
     254, m_bit_shift( shift ) 
     255{ 
     256    setName(name); 
     257    setLabel(label); 
     258    setDescription(descr); 
     259} 
     260 
     261 
     262bool 
     263VolumeControlLowRes::setValue(int v) 
     264{ 
     265    uint32_t reg; 
     266    uint32_t old_reg; 
     267     
     268    if (v>0xFF) v=0xFF; 
     269    else if (v<0) v=0; 
     270 
     271    if ( !m_Parent.getSpecificValue(m_cmd_id, &reg) ) { 
     272        debugError( "getSpecificValue failed\n" ); 
     273        return 0; 
     274    } 
     275     
     276    old_reg=reg; 
     277    reg &= ~(0xFF<<m_bit_shift); 
     278    reg |= (v<<m_bit_shift); 
     279 
     280    debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d to %d, shift %d (reg: 0x%08X => 0x%08X)\n",  
     281                                     m_cmd_id, v, m_bit_shift, old_reg, reg); 
     282 
     283    if ( !m_Parent.setSpecificValue(m_cmd_id, reg) ) { 
     284        debugError( "setSpecificValue failed\n" ); 
     285        return false; 
     286    } else return true; 
     287} 
     288 
     289int 
     290VolumeControlLowRes::getValue() 
     291{ 
     292    uint32_t val, reg; 
     293 
     294    if ( !m_Parent.getSpecificValue(m_cmd_id, &reg) ) { 
     295        debugError( "getSpecificValue failed\n" ); 
     296        return 0; 
     297    } else { 
     298        val = (reg & 0xFF)>>m_bit_shift; 
     299        debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for %d: reg: 0x%08X, result=%d\n",  
     300                                         m_cmd_id, reg, val); 
     301        return val; 
     302    } 
     303} 
     304 
     305 
     306// Saffire pro matrix mixer element 
     307 
     308FocusriteMatrixMixer::FocusriteMatrixMixer(FocusriteDevice& p) 
     309: Control::MatrixMixer("MatrixMixer") 
     310, m_Parent(p) 
     311{ 
     312} 
     313 
     314FocusriteMatrixMixer::FocusriteMatrixMixer(FocusriteDevice& p,std::string n) 
     315: Control::MatrixMixer(n) 
     316, m_Parent(p) 
     317{ 
     318} 
     319 
     320void FocusriteMatrixMixer::addSignalInfo(std::vector<struct sSignalInfo> &target, 
     321    std::string name, std::string label, std::string descr) 
     322{ 
     323    struct sSignalInfo s; 
     324    s.name=name; 
     325    s.label=label; 
     326    s.description=descr; 
     327 
     328    target.push_back(s); 
     329} 
     330 
     331void FocusriteMatrixMixer::setCellInfo(int row, int col, int addr, bool valid) 
     332{ 
     333    struct sCellInfo c; 
     334    c.row=row; 
     335    c.col=col; 
     336    c.valid=valid; 
     337    c.address=addr; 
     338 
     339    m_CellInfo[row][col]=c; 
     340} 
     341 
     342void FocusriteMatrixMixer::show() 
     343{ 
     344    debugOutput(DEBUG_LEVEL_NORMAL, "Focusrite Matrix mixer\n"); 
     345} 
     346 
     347std::string FocusriteMatrixMixer::getRowName( const int row ) 
     348{ 
     349    debugOutput(DEBUG_LEVEL_VERBOSE, "name for row %d is %s\n",  
     350                                     row, m_RowInfo.at(row).name.c_str()); 
     351    return m_RowInfo.at(row).name; 
     352} 
     353 
     354std::string FocusriteMatrixMixer::getColName( const int col ) 
     355{ 
     356    debugOutput(DEBUG_LEVEL_VERBOSE, "name for col %d is %s\n",  
     357                                     col, m_ColInfo.at(col).name.c_str()); 
     358    return m_ColInfo.at(col).name; 
     359} 
     360 
     361int FocusriteMatrixMixer::canWrite( const int row, const int col ) 
     362{ 
     363    debugOutput(DEBUG_LEVEL_VERBOSE, "canWrite for row %d col %d is %d\n",  
     364                                     row, col, m_CellInfo.at(row).at(col).valid); 
     365    return m_CellInfo.at(row).at(col).valid; 
     366} 
     367 
     368double FocusriteMatrixMixer::setValue( const int row, const int col, const double val ) 
     369{ 
     370    int32_t v=val; 
     371    struct sCellInfo c=m_CellInfo.at(row).at(col); 
     372     
     373    debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d row %d col %d to %lf (%ld)\n",  
     374                                     c.address, row, col, val, v); 
     375     
     376    if (v>0x07FFF) v=0x07FFF; 
     377    else if (v<0) v=0; 
     378 
     379    if ( !m_Parent.setSpecificValue(c.address, v) ) { 
     380        debugError( "setSpecificValue failed\n" ); 
     381        return false; 
     382    } else return true; 
     383} 
     384 
     385double FocusriteMatrixMixer::getValue( const int row, const int col ) 
     386{ 
     387    struct sCellInfo c=m_CellInfo.at(row).at(col); 
     388    uint32_t val=0; 
     389 
     390    if ( !m_Parent.getSpecificValue(c.address, &val) ) { 
     391        debugError( "getSpecificValue failed\n" ); 
     392        return 0; 
     393    } else { 
     394        debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for id %d row %d col %d = %lu\n",  
     395                                         c.address, row, col, val); 
     396        return val; 
     397    } 
     398} 
     399 
     400int FocusriteMatrixMixer::getRowCount( ) 
     401{ 
     402    return m_RowInfo.size(); 
     403} 
     404 
     405int FocusriteMatrixMixer::getColCount( ) 
     406{ 
     407    return m_ColInfo.size(); 
     408} 
     409 
     410 
    242411} // Focusrite 
    243412} // BeBoB 
  • trunk/libffado/src/bebob/focusrite/focusrite_generic.h

    r661 r662  
    3030 
    3131#include "libcontrol/BasicElements.h" 
     32#include "libcontrol/MatrixMixer.h" 
    3233 
    3334namespace BeBoB { 
     
    4849     
    4950private: 
    50     FocusriteDevice&       m_Parent; 
     51    FocusriteDevice&        m_Parent; 
    5152    unsigned int            m_cmd_id; 
    5253    unsigned int            m_cmd_bit; 
     
    6566     
    6667private: 
    67     FocusriteDevice&       m_Parent; 
     68    FocusriteDevice&        m_Parent; 
    6869    unsigned int            m_cmd_id; 
    6970}; 
    7071 
     72class VolumeControlLowRes 
     73    : public Control::Discrete 
     74{ 
     75public: 
     76    VolumeControlLowRes(FocusriteDevice& parent, int id, int shift); 
     77    VolumeControlLowRes(FocusriteDevice& parent, int id, int shift, 
     78                  std::string name, std::string label, std::string descr); 
     79     
     80    virtual bool setValue(int v); 
     81    virtual int getValue(); 
     82     
     83private: 
     84    FocusriteDevice&        m_Parent; 
     85    unsigned int            m_cmd_id; 
     86    unsigned int            m_bit_shift; 
     87}; 
     88 
     89class FocusriteMatrixMixer : public Control::MatrixMixer 
     90{ 
     91public: 
     92    FocusriteMatrixMixer(FocusriteDevice& parent); 
     93    FocusriteMatrixMixer(FocusriteDevice& parent, std::string n); 
     94    virtual ~FocusriteMatrixMixer() {}; 
     95 
     96    virtual void show(); 
     97 
     98    virtual std::string getRowName( const int ); 
     99    virtual std::string getColName( const int ); 
     100    virtual int canWrite( const int, const int ); 
     101    virtual double setValue( const int, const int, const double ); 
     102    virtual double getValue( const int, const int ); 
     103    virtual int getRowCount( ); 
     104    virtual int getColCount( ); 
     105 
     106protected: 
     107    struct sSignalInfo { 
     108        std::string name; 
     109        std::string label; 
     110        std::string description; 
     111    }; 
     112    struct sCellInfo { 
     113        int row; 
     114        int col; 
     115        // indicates whether a cell can be valid, this 
     116        // doesn't mean that it is writable. Just that it can be. 
     117        bool valid; 
     118        // the address to use when manipulating this cell 
     119        int address; 
     120    }; 
     121     
     122    virtual void init() = 0; 
     123    virtual void addSignalInfo(std::vector<struct sSignalInfo> &target, 
     124                       std::string name, std::string label, std::string descr); 
     125    virtual void setCellInfo(int row, int col, int addr, bool valid); 
     126 
     127    std::vector<struct sSignalInfo> m_RowInfo; 
     128    std::vector<struct sSignalInfo> m_ColInfo; 
     129    std::vector< std::vector<struct sCellInfo> > m_CellInfo; 
     130     
     131    FocusriteDevice&        m_Parent; 
     132}; 
    71133 
    72134class FocusriteDevice : public BeBoB::AvDevice { 
  • trunk/libffado/src/bebob/focusrite/focusrite_saffire.cpp

    r649 r662  
    3535                 getConfigRom().getNodeId() ); 
    3636 
     37    // the saffire pro doesn't seem to like it if the commands are too fast 
     38    if (AVC::AVCCommand::getSleepAfterAVCCommand() < 1000) { 
     39        AVC::AVCCommand::setSleepAfterAVCCommand( 1000 ); 
     40    } 
    3741 
    3842} 
     
    4145{ 
    4246 
     47} 
     48bool 
     49SaffireDevice::buildMixer() 
     50{ 
     51    bool result=true; 
     52    debugOutput(DEBUG_LEVEL_VERBOSE, "Building a Focusrite Saffire mixer...\n"); 
     53     
     54    destroyMixer(); 
     55     
     56    // create the mixer object container 
     57    m_MixerContainer = new Control::Container("Mixer"); 
     58 
     59    if (!m_MixerContainer) { 
     60        debugError("Could not create mixer container...\n"); 
     61        return false; 
     62    } 
     63 
     64    // create control objects for the saffire 
     65    result &= m_MixerContainer->addElement( 
     66        new BinaryControl(*this,  
     67                FR_SAFFIRE_CMD_ID_SPDIF_SWITCH, 0, 
     68                "SpdifSwitch", "S/PDIF Switch", "S/PDIF Switch")); 
     69 
     70    // output mute controls 
     71    result &= m_MixerContainer->addElement( 
     72        new BinaryControl(*this,  
     73                FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 
     74                "Out12Mute", "Out1/2 Mute", "Output 1/2 Mute")); 
     75    result &= m_MixerContainer->addElement( 
     76        new BinaryControl(*this,  
     77                FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 
     78                "Out34Mute", "Out3/4 Mute", "Output 3/4 Mute")); 
     79    result &= m_MixerContainer->addElement( 
     80        new BinaryControl(*this,  
     81                FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 
     82                "Out56Mute", "Out5/6 Mute", "Output 5/6 Mute")); 
     83    result &= m_MixerContainer->addElement( 
     84        new BinaryControl(*this,  
     85                FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 
     86                "Out78Mute", "Out7/8 Mute", "Output 7/8 Mute")); 
     87    result &= m_MixerContainer->addElement( 
     88        new BinaryControl(*this,  
     89                FR_SAFFIRE_CMD_ID_BITFIELD_OUT910, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 
     90                "Out910Mute", "Out9/10 Mute", "Output 9/10 Mute")); 
     91 
     92    // output front panel hw volume control 
     93    result &= m_MixerContainer->addElement( 
     94        new BinaryControl(*this,  
     95                FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 
     96                "Out12HwCtrl", "Out1/2 HwCtrl", "Output 1/2 Front Panel Hardware volume control")); 
     97    result &= m_MixerContainer->addElement( 
     98        new BinaryControl(*this,  
     99                FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 
     100                "Out34HwCtrl", "Out3/4 HwCtrl", "Output 3/4 Front Panel Hardware volume control")); 
     101    result &= m_MixerContainer->addElement( 
     102        new BinaryControl(*this,  
     103                FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 
     104                "Out56HwCtrl", "Out5/6 HwCtrl", "Output 5/6 Front Panel Hardware volume control")); 
     105    result &= m_MixerContainer->addElement( 
     106        new BinaryControl(*this,  
     107                FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 
     108                "Out78HwCtrl", "Out7/8 HwCtrl", "Output 7/8 Front Panel Hardware volume control")); 
     109     
     110    // output level dim 
     111    result &= m_MixerContainer->addElement( 
     112        new BinaryControl(*this,  
     113                FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DIM, 
     114                "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim")); 
     115 
     116    // output level controls 
     117    result &= m_MixerContainer->addElement( 
     118        new VolumeControlLowRes(*this,  
     119                FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, 0, 
     120                "Out12Level", "Out1/2 Level", "Output 1/2 Level")); 
     121    result &= m_MixerContainer->addElement( 
     122        new VolumeControlLowRes(*this,  
     123                FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, 0, 
     124                "Out34Level", "Out3/4 Level", "Output 3/4 Level")); 
     125    result &= m_MixerContainer->addElement( 
     126        new VolumeControlLowRes(*this,  
     127                FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, 0, 
     128                "Out56Level", "Out5/6 Level", "Output 5/6 Level")); 
     129    result &= m_MixerContainer->addElement( 
     130        new VolumeControlLowRes(*this,  
     131                FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, 0, 
     132                "Out78Level", "Out7/8 Level", "Output 7/8 Level")); 
     133     
     134    // matrix mix controls 
     135    result &= m_MixerContainer->addElement( 
     136        new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_InputMix, "InputMix")); 
     137 
     138    result &= m_MixerContainer->addElement( 
     139        new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_PCMix, "PCMix")); 
     140 
     141 
     142    if (!result) { 
     143        debugWarning("One or more control elements could not be created."); 
     144        // clean up those that couldn't be created 
     145        destroyMixer(); 
     146        return false; 
     147    } 
     148 
     149    if (!addElement(m_MixerContainer)) { 
     150        debugWarning("Could not register mixer to device\n"); 
     151        // clean up 
     152        destroyMixer(); 
     153        return false; 
     154    } 
     155 
     156    return true; 
     157} 
     158 
     159bool 
     160SaffireDevice::destroyMixer() 
     161{ 
     162    debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n"); 
     163     
     164    if (m_MixerContainer == NULL) { 
     165        debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n"); 
     166        return true; 
     167    } 
     168     
     169    if (!deleteElement(m_MixerContainer)) { 
     170        debugError("Mixer present but not registered to the avdevice\n"); 
     171        return false; 
     172    } 
     173     
     174    // remove and delete (as in free) child control elements 
     175    m_MixerContainer->clearElements(true); 
     176    delete m_MixerContainer; 
     177    return true; 
    43178} 
    44179 
     
    58193} 
    59194 
     195// Saffire pro matrix mixer element 
     196 
     197SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p,  
     198                                       enum eMatrixMixerType type) 
     199: FocusriteMatrixMixer(p, "MatrixMixer") 
     200, m_type(type) 
     201{ 
     202    init(); 
     203} 
     204 
     205SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p,  
     206                                       enum eMatrixMixerType type, std::string n) 
     207: FocusriteMatrixMixer(p, n) 
     208, m_type(type) 
     209{ 
     210    init(); 
     211} 
     212 
     213void SaffireMatrixMixer::init() 
     214{ 
     215    if (m_type==eMMT_PCMix) { 
     216        addSignalInfo(m_RowInfo, "PC12", "PC 1/2", "PC Channel 1/2"); 
     217        addSignalInfo(m_RowInfo, "PC34", "PC 3/4", "PC Channel 3/4"); 
     218        addSignalInfo(m_RowInfo, "PC56", "PC 5/6", "PC Channel 5/6"); 
     219        addSignalInfo(m_RowInfo, "PC78", "PC 7/8", "PC Channel 7/8"); 
     220        addSignalInfo(m_RowInfo, "PC910", "PC 9/10", "PC Channel 9/10"); 
     221         
     222        addSignalInfo(m_ColInfo, "OUT12", "OUT 1/2", "Output 1/2"); 
     223        addSignalInfo(m_ColInfo, "OUT34", "OUT 3/4", "Output 3/4"); 
     224        addSignalInfo(m_ColInfo, "OUT56", "OUT 5/6", "Output 5/6"); 
     225        addSignalInfo(m_ColInfo, "OUT78", "OUT 7/8", "Output 7/8"); 
     226        addSignalInfo(m_ColInfo, "OUT910", "OUT 9/10", "Output 9/10"); 
     227         
     228        // init the cell matrix 
     229        #define FOCUSRITE_SAFFIRE_PCMIX_NB_COLS 5 
     230        #define FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS 5 
     231         
     232        std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_PCMIX_NB_COLS ); 
     233        std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS, tmp_cols); 
     234        m_CellInfo = tmp_all; 
     235     
     236        struct sCellInfo c; 
     237        c.row=-1; 
     238        c.col=-1; 
     239        c.valid=false; 
     240        c.address=0; 
     241         
     242        for (int i=0;i<FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS;i++) { 
     243            for (int j=0;j<FOCUSRITE_SAFFIRE_PCMIX_NB_COLS;j++) { 
     244                m_CellInfo[i][j]=c; 
     245            } 
     246        } 
     247     
     248        // now set the cells that are valid 
     249        setCellInfo(0,0,FR_SAFFIRE_CMD_ID_PC12_TO_OUT12, true); 
     250        setCellInfo(0,1,FR_SAFFIRE_CMD_ID_PC12_TO_OUT34, true); 
     251        setCellInfo(0,2,FR_SAFFIRE_CMD_ID_PC12_TO_OUT56, true); 
     252        setCellInfo(0,3,FR_SAFFIRE_CMD_ID_PC12_TO_OUT79, true); 
     253        setCellInfo(0,4,FR_SAFFIRE_CMD_ID_PC12_TO_OUT910, true); 
     254        setCellInfo(1,0,FR_SAFFIRE_CMD_ID_PC34_TO_OUT12, true); 
     255        setCellInfo(1,1,FR_SAFFIRE_CMD_ID_PC34_TO_OUT34, true); 
     256        setCellInfo(1,2,FR_SAFFIRE_CMD_ID_PC34_TO_OUT56, true); 
     257        setCellInfo(1,3,FR_SAFFIRE_CMD_ID_PC34_TO_OUT79, true); 
     258        setCellInfo(1,4,FR_SAFFIRE_CMD_ID_PC34_TO_OUT910, true); 
     259        setCellInfo(2,0,FR_SAFFIRE_CMD_ID_PC56_TO_OUT12, true); 
     260        setCellInfo(2,1,FR_SAFFIRE_CMD_ID_PC56_TO_OUT34, true); 
     261        setCellInfo(2,2,FR_SAFFIRE_CMD_ID_PC56_TO_OUT56, true); 
     262        setCellInfo(2,3,FR_SAFFIRE_CMD_ID_PC56_TO_OUT79, true); 
     263        setCellInfo(2,4,FR_SAFFIRE_CMD_ID_PC56_TO_OUT910, true); 
     264        setCellInfo(3,0,FR_SAFFIRE_CMD_ID_PC78_TO_OUT12, true); 
     265        setCellInfo(3,1,FR_SAFFIRE_CMD_ID_PC78_TO_OUT34, true); 
     266        setCellInfo(3,2,FR_SAFFIRE_CMD_ID_PC78_TO_OUT56, true); 
     267        setCellInfo(3,3,FR_SAFFIRE_CMD_ID_PC78_TO_OUT79, true); 
     268        setCellInfo(3,4,FR_SAFFIRE_CMD_ID_PC78_TO_OUT910, true); 
     269        setCellInfo(4,0,FR_SAFFIRE_CMD_ID_PC910_TO_OUT12, true); 
     270        setCellInfo(4,1,FR_SAFFIRE_CMD_ID_PC910_TO_OUT34, true); 
     271        setCellInfo(4,2,FR_SAFFIRE_CMD_ID_PC910_TO_OUT56, true); 
     272        setCellInfo(4,3,FR_SAFFIRE_CMD_ID_PC910_TO_OUT79, true); 
     273        setCellInfo(4,4,FR_SAFFIRE_CMD_ID_PC910_TO_OUT910, true); 
     274 
     275    } else if (m_type==eMMT_InputMix) { 
     276        addSignalInfo(m_RowInfo, "IN1", "Input 1", "Analog Input 1"); 
     277        addSignalInfo(m_RowInfo, "IN2", "Input 2", "Analog Input 2"); 
     278        addSignalInfo(m_RowInfo, "SPDIFL", "SPDIF L", "S/PDIF Left Input"); 
     279        addSignalInfo(m_RowInfo, "SPDIFR", "SPDIF R", "S/PDIF Right Input"); 
     280        addSignalInfo(m_RowInfo, "REV1", "REVERB 1", "Reverb CH1 return"); 
     281        addSignalInfo(m_RowInfo, "REV1", "REVERB 2", "Reverb CH2 return"); 
     282         
     283        addSignalInfo(m_ColInfo, "OUT1", "OUT 1", "Output 1"); 
     284        addSignalInfo(m_ColInfo, "OUT2", "OUT 2", "Output 2"); 
     285        addSignalInfo(m_ColInfo, "OUT3", "OUT 3", "Output 3"); 
     286        addSignalInfo(m_ColInfo, "OUT4", "OUT 4", "Output 4"); 
     287        addSignalInfo(m_ColInfo, "OUT5", "OUT 5", "Output 5"); 
     288        addSignalInfo(m_ColInfo, "OUT6", "OUT 6", "Output 6"); 
     289        addSignalInfo(m_ColInfo, "OUT7", "OUT 7", "Output 7"); 
     290        addSignalInfo(m_ColInfo, "OUT8", "OUT 8", "Output 8"); 
     291        addSignalInfo(m_ColInfo, "OUT9", "OUT 9", "Output 9"); 
     292        addSignalInfo(m_ColInfo, "OUT10", "OUT 10", "Output 10"); 
     293         
     294        // init the cell matrix 
     295        #define FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS 10 
     296        #define FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS 6 
     297         
     298        std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS ); 
     299        std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS,tmp_cols); 
     300        m_CellInfo = tmp_all; 
     301     
     302        struct sCellInfo c; 
     303        c.row=-1; 
     304        c.col=-1; 
     305        c.valid=false; 
     306        c.address=0; 
     307         
     308        for (int i=0;i<FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS;i++) { 
     309            for (int j=0;j<FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS;j++) { 
     310                m_CellInfo[i][j]=c; 
     311            } 
     312        } 
     313 
     314        // now set the cells that are valid 
     315        setCellInfo(0,0,FR_SAFFIRE_CMD_ID_IN1_TO_OUT1, true); 
     316        setCellInfo(0,2,FR_SAFFIRE_CMD_ID_IN1_TO_OUT3, true); 
     317        setCellInfo(0,4,FR_SAFFIRE_CMD_ID_IN1_TO_OUT5, true); 
     318        setCellInfo(0,6,FR_SAFFIRE_CMD_ID_IN1_TO_OUT7, true); 
     319        setCellInfo(0,8,FR_SAFFIRE_CMD_ID_IN1_TO_OUT9, true); 
     320        setCellInfo(1,1,FR_SAFFIRE_CMD_ID_IN2_TO_OUT2, true); 
     321        setCellInfo(1,3,FR_SAFFIRE_CMD_ID_IN2_TO_OUT4, true); 
     322        setCellInfo(1,5,FR_SAFFIRE_CMD_ID_IN2_TO_OUT6, true); 
     323        setCellInfo(1,7,FR_SAFFIRE_CMD_ID_IN2_TO_OUT8, true); 
     324        setCellInfo(1,9,FR_SAFFIRE_CMD_ID_IN2_TO_OUT10, true); 
     325        setCellInfo(2,0,FR_SAFFIRE_CMD_ID_IN3_TO_OUT1, true); 
     326        setCellInfo(2,2,FR_SAFFIRE_CMD_ID_IN3_TO_OUT3, true); 
     327        setCellInfo(2,4,FR_SAFFIRE_CMD_ID_IN3_TO_OUT5, true); 
     328        setCellInfo(2,6,FR_SAFFIRE_CMD_ID_IN3_TO_OUT7, true); 
     329        setCellInfo(2,8,FR_SAFFIRE_CMD_ID_IN3_TO_OUT9, true); 
     330        setCellInfo(3,1,FR_SAFFIRE_CMD_ID_IN4_TO_OUT2, true); 
     331        setCellInfo(3,3,FR_SAFFIRE_CMD_ID_IN4_TO_OUT4, true); 
     332        setCellInfo(3,5,FR_SAFFIRE_CMD_ID_IN4_TO_OUT6, true); 
     333        setCellInfo(3,7,FR_SAFFIRE_CMD_ID_IN4_TO_OUT8, true); 
     334        setCellInfo(3,9,FR_SAFFIRE_CMD_ID_IN4_TO_OUT10, true); 
     335 
     336        setCellInfo(4,0,FR_SAFFIRE_CMD_ID_REV1_TO_OUT1, true); 
     337        setCellInfo(5,1,FR_SAFFIRE_CMD_ID_REV2_TO_OUT2, true); 
     338        setCellInfo(4,2,FR_SAFFIRE_CMD_ID_REV1_TO_OUT3, true); 
     339        setCellInfo(5,3,FR_SAFFIRE_CMD_ID_REV2_TO_OUT4, true); 
     340        setCellInfo(4,4,FR_SAFFIRE_CMD_ID_REV1_TO_OUT5, true); 
     341        setCellInfo(5,5,FR_SAFFIRE_CMD_ID_REV2_TO_OUT6, true); 
     342        setCellInfo(4,6,FR_SAFFIRE_CMD_ID_REV1_TO_OUT7, true); 
     343        setCellInfo(5,7,FR_SAFFIRE_CMD_ID_REV2_TO_OUT8, true); 
     344        setCellInfo(4,8,FR_SAFFIRE_CMD_ID_REV1_TO_OUT9, true); 
     345        setCellInfo(5,9,FR_SAFFIRE_CMD_ID_REV2_TO_OUT10, true); 
     346 
     347    } else { 
     348        debugError("Invalid mixer type\n"); 
     349    } 
     350} 
     351 
     352void SaffireMatrixMixer::show() 
     353{ 
     354    debugOutput(DEBUG_LEVEL_NORMAL, "Saffire Pro Matrix mixer type %d\n"); 
     355} 
     356 
    60357} // Focusrite 
    61358} // BeBoB 
  • trunk/libffado/src/bebob/focusrite/focusrite_saffire.h

    r649 r662  
    2929#include "focusrite_generic.h" 
    3030 
     31#include "libcontrol/BasicElements.h" 
     32#include "libcontrol/MatrixMixer.h" 
     33 
     34// The ID's for the hardware input matrix mixer 
     35#define FR_SAFFIRE_CMD_ID_IN1_TO_OUT1       1 
     36#define FR_SAFFIRE_CMD_ID_IN1_TO_OUT3       2 
     37#define FR_SAFFIRE_CMD_ID_IN1_TO_OUT5       3 
     38#define FR_SAFFIRE_CMD_ID_IN1_TO_OUT7       4 
     39#define FR_SAFFIRE_CMD_ID_IN1_TO_OUT9       0 
     40#define FR_SAFFIRE_CMD_ID_IN2_TO_OUT2       16 
     41#define FR_SAFFIRE_CMD_ID_IN2_TO_OUT4       17 
     42#define FR_SAFFIRE_CMD_ID_IN2_TO_OUT6       18 
     43#define FR_SAFFIRE_CMD_ID_IN2_TO_OUT8       19 
     44#define FR_SAFFIRE_CMD_ID_IN2_TO_OUT10      15 
     45#define FR_SAFFIRE_CMD_ID_IN3_TO_OUT1       6 
     46#define FR_SAFFIRE_CMD_ID_IN3_TO_OUT3       7 
     47#define FR_SAFFIRE_CMD_ID_IN3_TO_OUT5       8 
     48#define FR_SAFFIRE_CMD_ID_IN3_TO_OUT7       9 
     49#define FR_SAFFIRE_CMD_ID_IN3_TO_OUT9       5 
     50#define FR_SAFFIRE_CMD_ID_IN4_TO_OUT2       21 
     51#define FR_SAFFIRE_CMD_ID_IN4_TO_OUT4       22 
     52#define FR_SAFFIRE_CMD_ID_IN4_TO_OUT6       23 
     53#define FR_SAFFIRE_CMD_ID_IN4_TO_OUT8       24 
     54#define FR_SAFFIRE_CMD_ID_IN4_TO_OUT10      20 
     55 
     56// reverb return id's (part of hardware input mixer) 
     57#define FR_SAFFIRE_CMD_ID_REV1_TO_OUT1       11 
     58#define FR_SAFFIRE_CMD_ID_REV2_TO_OUT2       26 
     59#define FR_SAFFIRE_CMD_ID_REV1_TO_OUT3       12 
     60#define FR_SAFFIRE_CMD_ID_REV2_TO_OUT4       27 
     61#define FR_SAFFIRE_CMD_ID_REV1_TO_OUT5       13 
     62#define FR_SAFFIRE_CMD_ID_REV2_TO_OUT6       28 
     63#define FR_SAFFIRE_CMD_ID_REV1_TO_OUT7       14 
     64#define FR_SAFFIRE_CMD_ID_REV2_TO_OUT8       29 
     65#define FR_SAFFIRE_CMD_ID_REV1_TO_OUT9       10 
     66#define FR_SAFFIRE_CMD_ID_REV2_TO_OUT10      25 
     67 
     68// The ID's for the playback matrix mixer 
     69#define FR_SAFFIRE_CMD_ID_PC12_TO_OUT12     36 
     70#define FR_SAFFIRE_CMD_ID_PC12_TO_OUT34     37 
     71#define FR_SAFFIRE_CMD_ID_PC12_TO_OUT56     38 
     72#define FR_SAFFIRE_CMD_ID_PC12_TO_OUT79     39 
     73#define FR_SAFFIRE_CMD_ID_PC12_TO_OUT910    35 
     74#define FR_SAFFIRE_CMD_ID_PC34_TO_OUT12     41 
     75#define FR_SAFFIRE_CMD_ID_PC34_TO_OUT34     42 
     76#define FR_SAFFIRE_CMD_ID_PC34_TO_OUT56     43 
     77#define FR_SAFFIRE_CMD_ID_PC34_TO_OUT79     44 
     78#define FR_SAFFIRE_CMD_ID_PC34_TO_OUT910    40 
     79#define FR_SAFFIRE_CMD_ID_PC56_TO_OUT12     46 
     80#define FR_SAFFIRE_CMD_ID_PC56_TO_OUT34     47 
     81#define FR_SAFFIRE_CMD_ID_PC56_TO_OUT56     48 
     82#define FR_SAFFIRE_CMD_ID_PC56_TO_OUT79     49 
     83#define FR_SAFFIRE_CMD_ID_PC56_TO_OUT910    45 
     84#define FR_SAFFIRE_CMD_ID_PC78_TO_OUT12     51 
     85#define FR_SAFFIRE_CMD_ID_PC78_TO_OUT34     52 
     86#define FR_SAFFIRE_CMD_ID_PC78_TO_OUT56     53 
     87#define FR_SAFFIRE_CMD_ID_PC78_TO_OUT79     54 
     88#define FR_SAFFIRE_CMD_ID_PC78_TO_OUT910    50 
     89#define FR_SAFFIRE_CMD_ID_PC910_TO_OUT12    31 
     90#define FR_SAFFIRE_CMD_ID_PC910_TO_OUT34    32 
     91#define FR_SAFFIRE_CMD_ID_PC910_TO_OUT56    33 
     92#define FR_SAFFIRE_CMD_ID_PC910_TO_OUT79    34 
     93#define FR_SAFFIRE_CMD_ID_PC910_TO_OUT910   30 
     94 
     95// the control ID's 
     96#define FR_SAFFIRE_CMD_ID_BITFIELD_OUT12      55 
     97#define FR_SAFFIRE_CMD_ID_BITFIELD_OUT34      56 
     98#define FR_SAFFIRE_CMD_ID_BITFIELD_OUT56      57 
     99#define FR_SAFFIRE_CMD_ID_BITFIELD_OUT78      58 
     100#define FR_SAFFIRE_CMD_ID_BITFIELD_OUT910     59 
     101 
     102#define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DIM       24 
     103#define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE      25 
     104#define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL    26 
     105 
     106// other stuff 
     107#define FR_SAFFIRE_CMD_ID_MONITOR_DIAL    61 
     108#define FR_SAFFIRE_CMD_ID_SPDIF_SWITCH    62 
     109 
     110#define FR_SAFFIRE_CMD_ID_METERING_IN1      64 
     111#define FR_SAFFIRE_CMD_ID_METERING_IN2      65 
     112#define FR_SAFFIRE_CMD_ID_METERING_IN3      66 
     113#define FR_SAFFIRE_CMD_ID_METERING_IN4      67 
     114 
     115#define FR_SAFFIRE_CMD_ID_SPDIF_DETECT    79 
     116 
    31117namespace BeBoB { 
    32118namespace Focusrite { 
     119 
     120class SaffireDevice; 
     121 
     122class SaffireMatrixMixer : public FocusriteMatrixMixer 
     123{ 
     124public: 
     125    enum eMatrixMixerType { 
     126        eMMT_InputMix, 
     127        eMMT_PCMix 
     128    }; 
     129     
     130public: 
     131    SaffireMatrixMixer(SaffireDevice& parent, enum eMatrixMixerType type); 
     132    SaffireMatrixMixer(SaffireDevice& parent, enum eMatrixMixerType type, std::string n); 
     133    virtual ~SaffireMatrixMixer() {}; 
     134 
     135    virtual void show(); 
     136 
     137protected: 
     138    void init(); 
     139    enum eMatrixMixerType m_type; 
     140}; 
    33141 
    34142class SaffireDevice : public FocusriteDevice { 
     
    41149    virtual void setVerboseLevel(int l); 
    42150 
     151    virtual bool buildMixer(); 
     152    virtual bool destroyMixer(); 
     153 
     154private: 
     155    Control::Container *m_MixerContainer; 
    43156}; 
    44157 
  • trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.cpp

    r661 r662  
    145145    result &= m_MixerContainer->addElement( 
    146146        new BinaryControl(*this,  
    147                 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD
     147                FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM
    148148                "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim")); 
    149149    result &= m_MixerContainer->addElement( 
    150150        new BinaryControl(*this,  
    151                 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD
     151                FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM
    152152                "Out34Dim", "Out3/4 Dim", "Output 3/4 Level Dim")); 
    153153    result &= m_MixerContainer->addElement( 
    154154        new BinaryControl(*this,  
    155                 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD
     155                FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM
    156156                "Out56Dim", "Out5/6 Dim", "Output 5/6 Level Dim")); 
    157157    result &= m_MixerContainer->addElement( 
    158158        new BinaryControl(*this,  
    159                 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_PAD
     159                FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM
    160160                "Out78Dim", "Out7/8 Dim", "Output 7/8 Level Dim")); 
    161161 
     
    357357SaffireProMatrixMixer::SaffireProMatrixMixer(SaffireProDevice& p,  
    358358                                             enum eMatrixMixerType type) 
    359 : Control::MatrixMixer("MatrixMixer") 
    360 , m_Parent(p) 
     359: FocusriteMatrixMixer(p, "MatrixMixer") 
    361360, m_type(type) 
    362361{ 
    363     init(type); 
     362    init(); 
    364363} 
    365364 
    366365SaffireProMatrixMixer::SaffireProMatrixMixer(SaffireProDevice& p,  
    367366                                             enum eMatrixMixerType type, std::string n) 
    368 : Control::MatrixMixer(n) 
    369 , m_Parent(p) 
     367: FocusriteMatrixMixer(p, n) 
    370368, m_type(type) 
    371369{ 
    372     init(type); 
    373 
    374  
    375 void SaffireProMatrixMixer::addSignalInfo(std::vector<struct sSignalInfo> &target, 
    376     std::string name, std::string label, std::string descr) 
    377 
    378     struct sSignalInfo s; 
    379     s.name=name; 
    380     s.label=label; 
    381     s.description=descr; 
    382  
    383     target.push_back(s); 
    384 
    385  
    386 void SaffireProMatrixMixer::setCellInfo(int row, int col, int addr, bool valid) 
    387 
    388     struct sCellInfo c; 
    389     c.row=row; 
    390     c.col=col; 
    391     c.valid=valid; 
    392     c.address=addr; 
    393  
    394     m_CellInfo[row][col]=c; 
    395 
    396  
    397 void SaffireProMatrixMixer::init(enum eMatrixMixerType type) 
    398 
    399     if (type==eMMT_OutputMix) { 
     370    init(); 
     371
     372 
     373void SaffireProMatrixMixer::init() 
     374
     375    if (m_type==eMMT_OutputMix) { 
    400376        addSignalInfo(m_RowInfo, "PC1", "PC 1", "PC Channel 1"); 
    401377        addSignalInfo(m_RowInfo, "PC2", "PC 2", "PC Channel 2"); 
     
    472448        setCellInfo(11,9,FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT10, true); 
    473449 
    474     } else if (type==eMMT_InputMix) { 
     450    } else if (m_type==eMMT_InputMix) { 
    475451        addSignalInfo(m_RowInfo, "AN1", "Analog 1", "Analog Input 1"); 
    476452        addSignalInfo(m_RowInfo, "AN2", "Analog 2", "Analog Input 2"); 
     
    591567} 
    592568 
    593 std::string SaffireProMatrixMixer::getRowName( const int row ) 
    594 { 
    595     debugOutput(DEBUG_LEVEL_VERBOSE, "name for row %d is %s\n",  
    596                                      row, m_RowInfo.at(row).name.c_str()); 
    597     return m_RowInfo.at(row).name; 
    598 } 
    599  
    600 std::string SaffireProMatrixMixer::getColName( const int col ) 
    601 { 
    602     debugOutput(DEBUG_LEVEL_VERBOSE, "name for col %d is %s\n",  
    603                                      col, m_ColInfo.at(col).name.c_str()); 
    604     return m_ColInfo.at(col).name; 
    605 } 
    606  
    607 int SaffireProMatrixMixer::canWrite( const int row, const int col ) 
    608 { 
    609     debugOutput(DEBUG_LEVEL_VERBOSE, "canWrite for row %d col %d is %d\n",  
    610                                      row, col, m_CellInfo.at(row).at(col).valid); 
    611     return m_CellInfo.at(row).at(col).valid; 
    612 } 
    613  
    614 double SaffireProMatrixMixer::setValue( const int row, const int col, const double val ) 
    615 { 
    616     int32_t v=val; 
    617     struct sCellInfo c=m_CellInfo.at(row).at(col); 
    618      
    619     debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d row %d col %d to %lf (%ld)\n",  
    620                                      c.address, row, col, val, v); 
    621      
    622     if (v>0x07FFF) v=0x07FFF; 
    623     else if (v<0) v=0; 
    624  
    625     if ( !m_Parent.setSpecificValue(c.address, v) ) { 
    626         debugError( "setSpecificValue failed\n" ); 
    627         return false; 
    628     } else return true; 
    629 } 
    630  
    631 double SaffireProMatrixMixer::getValue( const int row, const int col ) 
    632 { 
    633     struct sCellInfo c=m_CellInfo.at(row).at(col); 
    634     uint32_t val=0; 
    635  
    636     if ( !m_Parent.getSpecificValue(c.address, &val) ) { 
    637         debugError( "getSpecificValue failed\n" ); 
    638         return 0; 
    639     } else { 
    640         debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for id %d row %d col %d = %lf\n",  
    641                                          c.address, row, col, val); 
    642         return val; 
    643     } 
    644 } 
    645  
    646 int SaffireProMatrixMixer::getRowCount( ) 
    647 { 
    648     return m_RowInfo.size(); 
    649 } 
    650  
    651 int SaffireProMatrixMixer::getColCount( ) 
    652 { 
    653     return m_ColInfo.size(); 
    654 } 
    655  
    656569} // Focusrite 
    657570} // BeBoB 
  • trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h

    r661 r662  
    3030 
    3131#include "libcontrol/BasicElements.h" 
    32 #include "libcontrol/MatrixMixer.h" 
    3332 
    3433#include <vector> 
     
    161160class SaffireProDevice; 
    162161 
    163 class SaffireProMatrixMixer : public Control::MatrixMixer 
     162class SaffireProMatrixMixer : public FocusriteMatrixMixer 
    164163{ 
    165164public: 
     
    176175    virtual void show(); 
    177176 
    178     virtual std::string getRowName( const int ); 
    179     virtual std::string getColName( const int ); 
    180     virtual int canWrite( const int, const int ); 
    181     virtual double setValue( const int, const int, const double ); 
    182     virtual double getValue( const int, const int ); 
    183     virtual int getRowCount( ); 
    184     virtual int getColCount( ); 
    185  
    186 private: 
    187     struct sSignalInfo { 
    188         std::string name; 
    189         std::string label; 
    190         std::string description; 
    191     }; 
    192     struct sCellInfo { 
    193         int row; 
    194         int col; 
    195         // indicates whether a cell can be valid, this 
    196         // doesn't mean that it is writable. Just that it can be. 
    197         bool valid; 
    198         // the address to use when manipulating this cell 
    199         int address; 
    200     }; 
    201      
    202     void init(enum eMatrixMixerType type); 
    203     void addSignalInfo(std::vector<struct sSignalInfo> &target, 
    204                        std::string name, std::string label, std::string descr); 
    205     void setCellInfo(int row, int col, int addr, bool valid); 
    206  
    207     std::vector<struct sSignalInfo> m_RowInfo; 
    208     std::vector<struct sSignalInfo> m_ColInfo; 
    209     std::vector< std::vector<struct sCellInfo> > m_CellInfo; 
    210      
    211     SaffireProDevice&       m_Parent; 
    212     enum eMatrixMixerType   m_type; 
     177protected: 
     178    void init(); 
     179    enum eMatrixMixerType m_type; 
    213180}; 
    214181 
  • trunk/libffado/support/mixer/mixer.py

    r653 r662  
    66from mixer_phase24 import * 
    77from mixer_saffirepro import * 
     8from mixer_saffire import * 
    89import sys 
    910import dbus 
     
    1516    [(0x00130e, 0x00000003),'SaffireProMixer'], 
    1617    [(0x00130e, 0x00000006),'SaffireProMixer'], 
     18    [(0x00130e, 0x00000000),'SaffireMixer'], 
    1719    ] 
    1820 
     
    123125                app.setMainWidget(forms[idx]) 
    124126 
    125     QObject.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()")) 
     127    if forms: 
     128        QObject.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()")) 
    126129 
    127     app.exec_loop() 
     130        app.exec_loop() 
     131    else: 
     132        print "No supported device found..." 
  • trunk/libffado/support/mixer/mixer_saffirepro.py

    r661 r662  
    354354                'ac3pass':    ['/Mixer/AC3pass', self.chkAC3],  
    355355                'midithru':   ['/Mixer/MidiTru', self.chkMidiThru],  
     356                # The following controls are available but have no GUI elements yet 
     357                #'out12mute':      ['/Mixer/Out12Mute', self.chkOut12Mute], 
     358                #'out12hwctrl':    ['/Mixer/Out12HwCtrl', self.chkOut12HwCtrl], 
     359                #'out12pad':       ['/Mixer/Out12Pad', self.chkOut12Pad], 
     360                #'out12dim':       ['/Mixer/Out12Dim', self.chkOut12Dim], 
     361                #'out34mute':      ['/Mixer/Out34Mute', self.chkOut34Mute], 
     362                #'out34hwctrl':    ['/Mixer/Out34HwCtrl', self.chkOut34HwCtrl], 
     363                #'out34pad':       ['/Mixer/Out34Pad', self.chkOut34Pad], 
     364                #'out34dim':       ['/Mixer/Out34Dim', self.chkOut34Dim], 
     365                #'out56mute':      ['/Mixer/Out56Mute', self.chkOut56Mute], 
     366                #'out56hwctrl':    ['/Mixer/Out56HwCtrl', self.chkOut56HwCtrl], 
     367                #'out56pad':       ['/Mixer/Out56Pad', self.chkOut56Pad], 
     368                #'out56dim':       ['/Mixer/Out56Dim', self.chkOut56Dim], 
     369                #'out78mute':      ['/Mixer/Out78Mute', self.chkOut78Mute], 
     370                #'out78hwctrl':    ['/Mixer/Out78HwCtrl', self.chkOut78HwCtrl], 
     371                #'out78pad':       ['/Mixer/Out78Pad', self.chkOut78Pad], 
     372                #'out78dim':       ['/Mixer/Out78Dim', self.chkOut78Dim], 
     373                #'out910mute':      ['/Mixer/Out910Mute', self.chkOut910Mute], 
     374                #'out910hwctrl':    ['/Mixer/Out910HwCtrl', self.chkOut910HwCtrl], 
     375                #'out910pad':       ['/Mixer/Out910Pad', self.chkOut910Pad], 
     376                #'out910dim':       ['/Mixer/Out910Dim', self.chkOut910Dim], 
    356377            } 
    357378 
  • trunk/libffado/support/mixer/SConscript

    r653 r662  
    44 
    55if env.has_key('PYUIC'): 
    6         for app in ["mixer_phase24.ui","mixer_phase88.ui","mixer_saffirepro.ui"]: 
     6        for app in ["mixer_phase24.ui","mixer_phase88.ui","mixer_saffirepro.ui","mixer_saffire.ui"]: 
    77                env.Command( target=app.replace(".","")+".py", source=app, action="$PYUIC $SOURCE > $TARGET" ) 
  • trunk/libffado/tests/test-focusrite.cpp

    r661 r662  
    166166        cmd.setVerbose( DEBUG_LEVEL_NORMAL ); 
    167167     
    168     uint32_t old_vals[129]; 
     168    #define TOTAL_IDS_TO_SCAN 128 
     169    uint32_t old_vals[TOTAL_IDS_TO_SCAN+1]; 
    169170     
    170171    while(1) { 
    171         for (int id=0; id<128;id++) { 
     172        for (int id=0; id<TOTAL_IDS_TO_SCAN;id++) { 
     173            if (id==64) continue; // metering 
     174            if (id==65) continue; // metering 
     175            if (id==66) continue; // metering 
     176            if (id==67) continue; // metering 
    172177            cmd.setCommandType( AVC::AVCCommand::eCT_Status ); 
    173178            cmd.setNodeId( arguments.node  );