Changeset 1831

Show
Ignore:
Timestamp:
05/11/10 06:38:27 (14 years ago)
Author:
jwoithe
Message:

MOTU: make optical mode control API easier to use when support for devices with multiple optical ports is added.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/motu/motu_avdevice.cpp

    r1828 r1831  
    657657        // port if the sample rate is set to a 1x or 2x rate later. 
    658658        if (cancel_adat) { 
    659             setOpticalMode(0, MOTU_CTRL_DIR_INOUT, MOTU_OPTICAL_MODE_OFF); 
     659            setOpticalMode(MOTU_CTRL_DIR_INOUT, MOTU_OPTICAL_MODE_OFF, MOTU_OPTICAL_MODE_OFF); 
    660660        } 
    661661 
     
    713713                src_name = "ADAT Optical    "; 
    714714                break; 
    715             case MOTU_CLKSRC_SPDIF_TOSLINK: 
    716                 if (getOpticalMode(0, MOTU_DIR_IN) == MOTU_OPTICAL_MODE_TOSLINK) 
     715            case MOTU_CLKSRC_SPDIF_TOSLINK: { 
     716                unsigned int p0_mode; 
     717                getOpticalMode(MOTU_DIR_IN, &p0_mode, NULL); 
     718                if (p0_mode == MOTU_OPTICAL_MODE_TOSLINK) 
    717719                    src_name = "TOSLink         "; 
    718720                else 
    719721                    src_name = "SPDIF           "; 
    720722                break; 
     723            } 
    721724            case MOTU_CLKSRC_SMPTE: 
    722725                src_name = "SMPTE           "; 
     
    895898 
    896899    int samp_freq = getSamplingFrequency(); 
    897     unsigned int optical_in_mode = getOpticalMode(0, MOTU_DIR_IN); 
    898     unsigned int optical_out_mode = getOpticalMode(0, MOTU_DIR_OUT); 
     900    unsigned int optical_in_mode, optical_out_mode; 
    899901    unsigned int event_size_in = getEventSize(MOTU_DIR_IN); 
    900902    unsigned int event_size_out= getEventSize(MOTU_DIR_OUT); 
    901903 
    902904    debugOutput(DEBUG_LEVEL_NORMAL, "Preparing MotuDevice...\n" ); 
     905 
     906    getOpticalMode(MOTU_DIR_IN, &optical_in_mode, NULL); 
     907    getOpticalMode(MOTU_DIR_OUT, &optical_out_mode, NULL); 
    903908 
    904909    // Explicitly set the optical mode, primarily to ensure that the 
     
    907912    // up without this set to anything sensible.  In this case, writes to 
    908913    // MOTU_REG_ISOCTRL fail more often than not, which is bad. 
    909     setOpticalMode(0, MOTU_DIR_IN, optical_in_mode); 
    910     setOpticalMode(0, MOTU_DIR_OUT, optical_out_mode); 
     914    setOpticalMode(MOTU_DIR_IN, optical_in_mode, MOTU_OPTICAL_MODE_KEEP); 
     915    setOpticalMode(MOTU_DIR_OUT, optical_out_mode, MOTU_OPTICAL_MODE_KEEP); 
    911916 
    912917    // Allocate bandwidth if not previously done. 
     
    12301235} 
    12311236 
    1232 unsigned int MotuDevice::getOpticalMode(unsigned int port, unsigned int dir) { 
    1233     // Only the "Mark 3" (aka G3) MOTU devices had more than one optical port. 
    1234     // Therefore the "port" parameter is ignored for all devices other than 
    1235     // the Mark 3 devices. 
     1237unsigned int MotuDevice::getOpticalMode(unsigned int dir, 
     1238  unsigned int *port_a_mode, unsigned int *port_b_mode) { 
     1239    // Only the "Mark 3" (aka G3) MOTU devices had more than one optical 
     1240    // port.  Therefore the "port_b_mode" parameter is unused by all 
     1241    // devices other than the Mark 3 devices. 
     1242    // 
     1243    // If a mode parameter pointer is NULL it will not be returned. 
    12361244    unsigned int reg; 
    12371245    unsigned int mask, shift; 
     1246 
     1247    if (port_b_mode != NULL) 
     1248        *port_b_mode = MOTU_OPTICAL_MODE_OFF; 
     1249    if (getDeviceGeneration()!=MOTU_DEVICE_G3 && port_a_mode==NULL) 
     1250        return 0; 
    12381251 
    12391252    if (m_motu_model == MOTU_MODEL_828MkI) { 
     
    12431256        shift = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_BIT0:MOTU_G1_OPT_OUT_MODE_BIT0; 
    12441257        switch ((reg & mask) >> shift) { 
    1245             case MOTU_G1_OPTICAL_OFF: return MOTU_OPTICAL_MODE_OFF
    1246             case MOTU_G1_OPTICAL_TOSLINK: return MOTU_OPTICAL_MODE_TOSLINK
     1258            case MOTU_G1_OPTICAL_OFF: *port_a_mode = MOTU_OPTICAL_MODE_OFF; break
     1259            case MOTU_G1_OPTICAL_TOSLINK: *port_a_mode = MOTU_OPTICAL_MODE_TOSLINK; break
    12471260            // MOTU_G1_OPTICAL_OFF and MOTU_G1_OPTICAL_ADAT seem to be 
    12481261            // identical, so currently we don't know how to differentiate 
     
    12611274    mask = (dir==MOTU_DIR_IN)?MOTU_G2_OPTICAL_IN_MODE_MASK:MOTU_G2_OPTICAL_OUT_MODE_MASK; 
    12621275    shift = (dir==MOTU_DIR_IN)?MOTU_G2_OPTICAL_IN_MODE_BIT0:MOTU_G2_OPTICAL_OUT_MODE_BIT0; 
    1263  
    12641276    switch ((reg & mask) >> shift) { 
    1265         case MOTU_G2_OPTICAL_MODE_OFF: return MOTU_OPTICAL_MODE_OFF; 
    1266         case MOTU_G2_OPTICAL_MODE_ADAT: return MOTU_OPTICAL_MODE_ADAT; 
    1267         case MOTU_G2_OPTICAL_MODE_TOSLINK: return MOTU_OPTICAL_MODE_TOSLINK; 
    1268     } 
    1269  
     1277        case MOTU_G2_OPTICAL_MODE_OFF: *port_a_mode = MOTU_OPTICAL_MODE_OFF; break; 
     1278        case MOTU_G2_OPTICAL_MODE_ADAT: *port_a_mode = MOTU_OPTICAL_MODE_ADAT; break; 
     1279        case MOTU_G2_OPTICAL_MODE_TOSLINK: *port_a_mode = MOTU_OPTICAL_MODE_TOSLINK; break; 
     1280    } 
    12701281    return 0; 
    12711282} 
    12721283 
    1273 signed int MotuDevice::setOpticalMode(unsigned int port, unsigned int dir,  
    1274   unsigned int mode) { 
     1284signed int MotuDevice::setOpticalMode(unsigned int dir,  
     1285  unsigned int port_a_mode, unsigned int port_b_mode) { 
    12751286    // Only the "Mark 3" (aka G3) MOTU devices had more than one optical port. 
    1276     // Therefore the "port" parameter is ignored for all devices other than 
     1287    // Therefore the "port B" mode is ignored for all devices other than 
    12771288    // the Mark 3 devices. 
    12781289    unsigned int reg, g2mode; 
     
    12821293     * set it 
    12831294     */ 
    1284     if (m_motu_model==MOTU_MODEL_896HD && mode==MOTU_OPTICAL_MODE_TOSLINK) 
     1295    if (m_motu_model==MOTU_MODEL_896HD && port_a_mode==MOTU_OPTICAL_MODE_TOSLINK) 
    12851296        return -1; 
     1297 
     1298    if (getDeviceGeneration()!=MOTU_DEVICE_G3 && port_a_mode==MOTU_OPTICAL_MODE_KEEP) 
     1299        return 0; 
    12861300 
    12871301    if (m_motu_model == MOTU_MODEL_828MkI) { 
     
    12911305        mask = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_MASK:MOTU_G1_OPT_OUT_MODE_MASK; 
    12921306        shift = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_BIT0:MOTU_G1_OPT_OUT_MODE_BIT0; 
    1293         switch (mode) { 
     1307        switch (port_a_mode) { 
    12941308            case MOTU_OPTICAL_MODE_OFF: g1mode = MOTU_G1_OPTICAL_OFF; break; 
    12951309            case MOTU_OPTICAL_MODE_ADAT: g1mode = MOTU_G1_OPTICAL_ADAT; break; 
     
    13101324    // Map from user mode to values sent to the device registers. 
    13111325    g2mode = 0; 
    1312     switch (mode) { 
     1326    switch (port_a_mode) { 
    13131327        case MOTU_OPTICAL_MODE_OFF: g2mode = MOTU_G2_OPTICAL_MODE_OFF; break; 
    13141328        case MOTU_OPTICAL_MODE_ADAT: g2mode = MOTU_G2_OPTICAL_MODE_ADAT; break; 
     
    13351349    if (dir & MOTU_DIR_OUT) { 
    13361350        reg &= ~MOTU_G2_OPTICAL_OUT_MODE_MASK; 
    1337         reg |= (mode << MOTU_G2_OPTICAL_OUT_MODE_BIT0) & MOTU_G2_OPTICAL_OUT_MODE_MASK; 
     1351        reg |= (g2mode << MOTU_G2_OPTICAL_OUT_MODE_BIT0) & MOTU_G2_OPTICAL_OUT_MODE_MASK; 
    13381352        if (g2mode != MOTU_G2_OPTICAL_MODE_ADAT) 
    13391353            opt_ctrl |= 0x00000040; 
     
    13701384// Note that all audio channels are sent using 3 bytes. 
    13711385signed int sample_rate = getSamplingFrequency(); 
    1372 signed int optical_mode = getOpticalMode(0, direction)
     1386unsigned int optical_mode
    13731387signed int size = 4+6; 
    13741388 
     
    13761390unsigned int dir = direction==Streaming::Port::E_Capture?MOTU_PA_IN:MOTU_PA_OUT; 
    13771391unsigned int flags = (1 << ( optical_mode + 4 )); 
     1392 
     1393    getOpticalMode(direction, &optical_mode, NULL); 
    13781394 
    13791395    if ( sample_rate > 96000 ) 
  • trunk/libffado/src/motu/motu_avdevice.h

    r1828 r1831  
    208208#define MOTU_OPTICAL_MODE_ADAT    0x0001 
    209209#define MOTU_OPTICAL_MODE_TOSLINK 0x0002 
    210 #define MOTU_OPTICAL_PORT_A       0x0001 
    211 #define MOTU_OPTICAL_PORT_B       0x0002 
    212 #define MOTU_OPTICAL_PORT_ALL     (MOTU_OPTICAL_PORT_A|MOTU_OPTICAL_PORT_B) 
    213  
     210#define MOTU_OPTICAL_MODE_KEEP    0xffff 
    214211/* Device generation identifiers */ 
    215212#define MOTU_DEVICE_G1            0x0001 
     
    342339    signed int getIsoRecvChannel(void); 
    343340    signed int getIsoSendChannel(void); 
    344     unsigned int getOpticalMode(unsigned int port, unsigned int dir); 
    345     signed int setOpticalMode(unsigned int port, unsigned int dir, unsigned int mode); 
     341    unsigned int getOpticalMode(unsigned int dir, unsigned int *port_a_mode,  
     342        unsigned int *port_b_mode); 
     343    signed int setOpticalMode(unsigned int dir,  
     344        unsigned int port_a_mode, unsigned int port_b_mode); 
    346345 
    347346    signed int getEventSize(unsigned int dir); 
  • trunk/libffado/src/motu/motu_controls.cpp

    r1828 r1831  
    696696    } 
    697697    dir = (m_register==MOTU_CTRL_DIR_IN)?MOTU_DIR_IN:MOTU_DIR_OUT; 
    698     m_parent.setOpticalMode(0, dir, val); 
     698    m_parent.setOpticalMode(dir, val, MOTU_OPTICAL_MODE_KEEP); 
    699699    return true; 
    700700} 
     
    703703OpticalMode::getValue() 
    704704{ 
    705     unsigned int dir
     705    unsigned int dir, omode_a
    706706    debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for optical mode %d\n", m_register); 
    707707 
     
    709709    // receive stream processor once we work out an efficient way to do this. 
    710710    dir = (m_register==MOTU_CTRL_DIR_IN)?MOTU_DIR_IN:MOTU_DIR_OUT; 
    711     switch (m_parent.getOpticalMode(0, dir)) { 
     711    m_parent.getOpticalMode(dir, &omode_a, NULL); 
     712    switch (omode_a) { 
    712713        case MOTU_OPTICAL_MODE_OFF: return 0; 
    713714        case MOTU_OPTICAL_MODE_ADAT: return 1;