Changeset 1834

Show
Ignore:
Timestamp:
05/17/10 07:39:19 (2 years ago)
Author:
jwoithe
Message:

MOTU: rename the ADAT channels on the 828mk3 to be more consistent with the hardware naming convention.
MOTU: if present on the interface, utilise the modes of the two independent ADAT interfaces when configuring such things as audio channels (some "mark 3" devices have 2 ADAT interfaces). Note that getting/setting the optical modes on Mark3/G3 devices is yet to be coded.
MOTU: attempt to be more complete with the 828mk3 channel specification with respect to optical port modes.
MOTU: streaming to/from the 828Mk3 device seems to be working at 1x rates if the device is configured with both ADAT interfaces set for ADAT input/output.
MOTU: document toslink/adat channel assignment within the "mark 3" data stream.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/doc/motu_firewire_protocol-mk3.txt

    r1832 r1834  
    22using an 828 Mk 3. 
    33 
    4 Version: 20100516-1 
     4Version: 20100517-1 
    55Author: Jonathan Woithe 
    66 
     
    9191------------------------------------------------------------------------   
    9292#ch    30         34         22         26         10         14 
     93 
     94When an optical port is configured in Toslink mode, the two Toslink channels 
     95take the place of that port's 8 ADAT channels in the data stream.  That is, 
     96ADAT-x 1-8 are removed and in their place Toslink-A 1-2 are added.  So in 
     97the case of 1x playback, the Toslink channels appear at offset 52, with 
     98ADAT-B's channels commencing at offset 58 (the total packet size in this 
     99case being 0x02c8 bytes). 
     100 
     101Unlike previous MOTU generations, the Toslink outputs in the Mark 3 devices 
     102are present as channels in their own right - they do not mirror the SPDIF 
     103channel. 
    93104 
    94105 
  • trunk/libffado/src/motu/motu_avdevice.cpp

    r1833 r1834  
    287287    {"Return-1", MOTU_PA_IN | MOTU_PA_RATE_ANY|MOTU_PA_MK3_OPT_ANY, 40}, 
    288288    {"Return-2", MOTU_PA_IN | MOTU_PA_RATE_ANY|MOTU_PA_MK3_OPT_ANY, 43}, 
    289     {"SPDIF1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_A_ADAT, 46}, 
    290     {"SPDIF2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_A_ADAT, 49}, 
    291     {"Toslink1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK, 46}, 
    292     {"Toslink2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK, 49}, 
     289    {"SPDIF1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 46}, 
     290    {"SPDIF2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 49}, 
    293291    {"Unknown-1", MOTU_PA_OUT | MOTU_PA_RATE_4x|MOTU_PA_MK3_OPT_ANY, 46}, 
    294292    {"Unknown-2", MOTU_PA_OUT | MOTU_PA_RATE_4x|MOTU_PA_MK3_OPT_ANY, 49}, 
     
    296294    {"Reverb-2", MOTU_PA_IN | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 55}, 
    297295    // 
    298     // FIXME: PortEntry will need to be expanded to allow for an optional 
    299     // exact match on the optical modes.  This is needed because the A and B 
    300     // optical ports can have their mode set independently, so the presence 
    301     // of some ADAT ports depends on the precise mode setting of both ADAT 
    302     // ports.  Currently the match is effectively an "OR". 
     296    // Optical port locations are a bit messy with the Mark 3 devices since 
     297    // there are two optical ports whose modes can be independently set. 
     298    // First take care of the output direction. 
    303299    // 
    304     {"ADAT1", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 52}, 
    305     {"ADAT2", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 55}, 
    306     {"ADAT3", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 58}, 
    307     {"ADAT4", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 61}, 
    308     {"ADAT5", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 64}, 
    309     {"ADAT6", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 67}, 
    310     {"ADAT7", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 70}, 
    311     {"ADAT8", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_ANY, 73}, 
     300    {"Toslink-A1", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 52}, 
     301    {"Toslink-A2", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 55}, 
     302    {"ADAT-A1", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 52}, 
     303    {"ADAT-A2", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 55}, 
     304    {"ADAT-A3", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 58}, 
     305    {"ADAT-A4", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 61}, 
     306    {"ADAT-A5", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 64}, 
     307    {"ADAT-A6", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 67}, 
     308    {"ADAT-A7", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 70}, 
     309    {"ADAT-A8", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ANY, 73}, 
    312310    // 
    313     {"ADAT9", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 76}, 
    314     {"ADAT10", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 79}, 
    315     {"ADAT11", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 82}, 
    316     {"ADAT12", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 85}, 
    317     {"ADAT13", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 88}, 
    318     {"ADAT14", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 91}, 
    319     {"ADAT15", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 94}, 
    320     {"ADAT16", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 97}, 
    321  
     311    {"Toslink-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 52}, 
     312    {"Toslink-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 55}, 
     313    {"Toslink-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 58}, 
     314    {"Toslink-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 61}, 
     315    {"Toslink-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 76}, 
     316    {"Toslink-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 79}, 
     317    {"Toslink-B1", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 64}, 
     318    {"Toslink-B2", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 67}, 
     319    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     320    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     321    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 82}, 
     322    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 85}, 
     323    {"ADAT-B5", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 88}, 
     324    {"ADAT-B6", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 91}, 
     325    {"ADAT-B7", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 94}, 
     326    {"ADAT-B8", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 97}, 
     327    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     328    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     329    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     330    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     331    // 
     332    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 58}, 
     333    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 61}, 
     334    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     335    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     336    {"ADAT-B5", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     337    {"ADAT-B6", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     338    {"ADAT-B7", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     339    {"ADAT-B8", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     340    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 58}, 
     341    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 61}, 
     342    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     343    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     344    // 
     345    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 52}, 
     346    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 55}, 
     347    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 58}, 
     348    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 61}, 
     349    {"ADAT-B5", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     350    {"ADAT-B6", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     351    {"ADAT-B7", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     352    {"ADAT-B8", MOTU_PA_OUT | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     353    {"ADAT-B1", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 52}, 
     354    {"ADAT-B2", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 55}, 
     355    {"ADAT-B3", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 58}, 
     356    {"ADAT-B4", MOTU_PA_OUT | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_ADAT, 61}, 
     357 
     358    // Now deal with the input side of things.  Firstly comes two channels 
     359    // which are yet to be identified at 1x rates. 
    322360    {"Unknown-1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 58}, 
    323361    {"Unknown-2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_ANY, 61}, 
    324     {"ADAT1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 64}, 
    325     {"ADAT2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 67}, 
    326     {"ADAT3", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 70}, 
    327     {"ADAT4", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 73}, 
    328     {"ADAT5", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 76}, 
    329     {"ADAT6", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 79}, 
    330     {"ADAT7", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 82}, 
    331     {"ADAT8", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 85}, 
    332     {"ADAT9", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 88}, 
    333     {"ADAT10", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 91}, 
    334     {"ADAT11", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 94}, 
    335     {"ADAT12", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 97}, 
    336     {"ADAT13", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 100}, 
    337     {"ADAT14", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 103}, 
    338     {"ADAT15", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 106}, 
    339     {"ADAT16", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 109}, 
    340  
    341     {"ADAT1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 58}, 
    342     {"ADAT2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 61}, 
    343     {"ADAT3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 64}, 
    344     {"ADAT4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 67}, 
    345     {"ADAT5", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 70}, 
    346     {"ADAT6", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 73}, 
    347     {"ADAT7", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 76}, 
    348     {"ADAT8", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 79}, 
    349     {"Unknown-3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 82}, 
    350     {"Unknown-4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT, 85}, 
     362 
     363    // Follow up with the optical input port details. 
     364    // 
     365    {"Toslink-A1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 64}, 
     366    {"Toslink-A2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 67}, 
     367    {"Toslink-A1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 58}, 
     368    {"Toslink-A2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_ANY, 61}, 
     369    {"ADAT-A1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 64}, 
     370    {"ADAT-A2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 67}, 
     371    {"ADAT-A3", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 70}, 
     372    {"ADAT-A4", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 73}, 
     373    {"ADAT-A5", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 76}, 
     374    {"ADAT-A6", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 79}, 
     375    {"ADAT-A7", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 82}, 
     376    {"ADAT-A8", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 85}, 
     377    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 88}, 
     378    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 91}, 
     379    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 94}, 
     380    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 97}, 
     381    {"ADAT-B5", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 100}, 
     382    {"ADAT-B6", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 103}, 
     383    {"ADAT-B7", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 106}, 
     384    {"ADAT-B8", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 109}, 
     385    {"ADAT-A1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 58}, 
     386    {"ADAT-A2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 61}, 
     387    {"ADAT-A3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 64}, 
     388    {"ADAT-A4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ANY, 67}, 
     389    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     390    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     391    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     392    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     393    {"Unknown-3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 82}, 
     394    {"Unknown-4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ADAT|MOTU_PA_MK3_OPT_B_ADAT, 85}, 
     395    // 
     396    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 64}, 
     397    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 67}, 
     398    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 58}, 
     399    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_OFF|MOTU_PA_MK3_OPT_B_TOSLINK, 61}, 
     400    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 70}, 
     401    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 73}, 
     402    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 64}, 
     403    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_TOSLINK|MOTU_PA_MK3_OPT_B_TOSLINK, 67}, 
     404    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 88}, 
     405    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 91}, 
     406    {"Toslink-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 70}, 
     407    {"Toslink-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_MK3_OPT_A_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK, 73}, 
     408    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     409    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     410    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     411    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     412    {"ADAT-B5", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     413    {"ADAT-B6", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     414    {"ADAT-B7", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 82}, 
     415    {"ADAT-B8", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 85}, 
     416    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 58}, 
     417    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 61}, 
     418    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     419    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     420    {"Unknown-3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     421    {"Unknown-4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_OFF|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     422    // 
     423    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     424    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     425    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     426    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     427    {"ADAT-B5", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 82}, 
     428    {"ADAT-B6", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 85}, 
     429    {"ADAT-B7", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 88}, 
     430    {"ADAT-B8", MOTU_PA_IN | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 91}, 
     431    {"ADAT-B1", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 64}, 
     432    {"ADAT-B2", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 67}, 
     433    {"ADAT-B3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 70}, 
     434    {"ADAT-B4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 73}, 
     435    {"Unknown-3", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 76}, 
     436    {"Unknown-4", MOTU_PA_IN | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_TOSLINK|MOTU_PA_MK3_OPT_B_ADAT, 79}, 
     437 
    351438}; 
    352439 
     
    785872            case MOTU_CLKSRC_SPDIF_TOSLINK: { 
    786873                unsigned int p0_mode; 
    787                 getOpticalMode(MOTU_DIR_IN, &p0_mode, NULL); 
     874                if (device_gen < MOTU_DEVICE_G3) { 
     875                    getOpticalMode(MOTU_DIR_IN, &p0_mode, NULL); 
     876                } else 
     877                    p0_mode = MOTU_OPTICAL_MODE_OFF; 
    788878                if (p0_mode == MOTU_OPTICAL_MODE_TOSLINK) 
    789879                    src_name = "TOSLink         "; 
     
    815905            case MOTU_CLKSRC_OPTICAL_B: { 
    816906                unsigned int p1_mode; 
    817                 getOpticalMode(MOTU_DIR_IN, &p1_mode, NULL); 
     907                getOpticalMode(MOTU_DIR_IN, NULL, &p1_mode); 
    818908                if (p1_mode == MOTU_OPTICAL_MODE_TOSLINK) 
    819909                    src_name = "Toslink-B       "; 
     
    10141104 
    10151105    int samp_freq = getSamplingFrequency(); 
    1016     unsigned int optical_in_mode, optical_out_mode; 
     1106    unsigned int optical_in_mode_a, optical_out_mode_a; 
     1107    unsigned int optical_in_mode_b, optical_out_mode_b; 
    10171108    unsigned int event_size_in = getEventSize(MOTU_DIR_IN); 
    10181109    unsigned int event_size_out= getEventSize(MOTU_DIR_OUT); 
     
    10201111    debugOutput(DEBUG_LEVEL_NORMAL, "Preparing MotuDevice...\n" ); 
    10211112 
    1022     getOpticalMode(MOTU_DIR_IN, &optical_in_mode, NULL); 
    1023     getOpticalMode(MOTU_DIR_OUT, &optical_out_mode, NULL); 
     1113    getOpticalMode(MOTU_DIR_IN, &optical_in_mode_a, &optical_in_mode_b); 
     1114    getOpticalMode(MOTU_DIR_OUT, &optical_out_mode_a, &optical_out_mode_b); 
    10241115 
    10251116    // Explicitly set the optical mode, primarily to ensure that the 
     
    10281119    // up without this set to anything sensible.  In this case, writes to 
    10291120    // MOTU_REG_ISOCTRL fail more often than not, which is bad. 
    1030     setOpticalMode(MOTU_DIR_IN, optical_in_mode, MOTU_OPTICAL_MODE_KEEP); 
    1031     setOpticalMode(MOTU_DIR_OUT, optical_out_mode, MOTU_OPTICAL_MODE_KEEP); 
     1121    setOpticalMode(MOTU_DIR_IN, optical_in_mode_a, optical_in_mode_b); 
     1122    setOpticalMode(MOTU_DIR_OUT, optical_out_mode_a, optical_out_mode_b); 
    10321123 
    10331124    // Allocate bandwidth if not previously done. 
     
    11231214 
    11241215    // Add audio capture ports 
    1125     if (!addDirPorts(Streaming::Port::E_Capture, samp_freq, optical_in_mode)) { 
     1216    if (!addDirPorts(Streaming::Port::E_Capture, samp_freq, optical_in_mode_a, optical_in_mode_b)) { 
    11261217        return false; 
    11271218    } 
     
    11811272 
    11821273    // Add audio playback ports 
    1183     if (!addDirPorts(Streaming::Port::E_Playback, samp_freq, optical_out_mode)) { 
     1274    if (!addDirPorts(Streaming::Port::E_Playback, samp_freq, optical_out_mode_a, optical_out_mode_b)) { 
    11841275        return false; 
    11851276    } 
     
    13831474 
    13841475    if (getDeviceGeneration() == MOTU_DEVICE_G3) { 
     1476        /* FIXME */ 
    13851477        debugOutput(DEBUG_LEVEL_INFO, "Optical mode control not implemented for Mark3/G3 devices yet"); 
     1478        *port_a_mode = *port_b_mode = MOTU_OPTICAL_MODE_ADAT; 
    13861479        return 0; 
    13871480    } 
     
    14321525 
    14331526    if (getDeviceGeneration() == MOTU_DEVICE_G3) { 
     1527        /* FIXME */ 
    14341528        debugOutput(DEBUG_LEVEL_INFO, "Optical mode control not implemented for Mark3/G3 devices yet"); 
    14351529        return 0; 
     
    15001594// Note that all audio channels are sent using 3 bytes. 
    15011595signed int sample_rate = getSamplingFrequency(); 
    1502 unsigned int optical_mode
     1596unsigned int optical_mode_a, optical_mode_b
    15031597signed int size = 4+6; 
    15041598 
    15051599unsigned int i; 
    15061600unsigned int dir = direction==Streaming::Port::E_Capture?MOTU_PA_IN:MOTU_PA_OUT; 
    1507 unsigned int flags = (1 << ( optical_mode + 4 )); 
    1508  
    1509     getOpticalMode(direction, &optical_mode, NULL); 
     1601unsigned int flags = 0; 
     1602unsigned int port_flags; 
     1603 
     1604    getOpticalMode(direction, &optical_mode_a, &optical_mode_b); 
    15101605 
    15111606    if ( sample_rate > 96000 ) 
     
    15161611        flags |= MOTU_PA_RATE_1x; 
    15171612 
     1613    switch (optical_mode_a) { 
     1614        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_OPTICAL_OFF; break; 
     1615        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_OPTICAL_ADAT; break; 
     1616        case MOTU_OPTICAL_MODE_TOSLINK: flags |= MOTU_PA_OPTICAL_TOSLINK; break; 
     1617    } 
     1618    switch (optical_mode_b) { 
     1619        case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_ANY; break; 
     1620        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 
     1621        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; 
     1622        case MOTU_OPTICAL_MODE_TOSLINK: flags |= MOTU_PA_MK3_OPT_B_TOSLINK; break; 
     1623    } 
     1624 
    15181625    // Don't test for padding port flag here since we need to include such 
    15191626    // pseudo-ports when calculating the event size. 
    15201627    for (i=0; i < DevicesProperty[m_motu_model-1].n_port_entries; i++) { 
    1521         if (( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & dir ) && 
    1522            ( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & MOTU_PA_RATE_MASK & flags ) && 
    1523            ( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & MOTU_PA_OPTICAL_MASK & flags )) { 
     1628        port_flags = DevicesProperty[m_motu_model-1].port_entry[i].port_flags; 
     1629        /* Make sure the "port B" test returns true for devices without 
     1630         * a port B. 
     1631         */ 
     1632        if (optical_mode_b == MOTU_OPTICAL_MODE_NONE) { 
     1633            port_flags |= MOTU_PA_MK3_OPT_ANY; 
     1634        } 
     1635        if (( port_flags & dir ) && 
     1636           ( port_flags & MOTU_PA_RATE_MASK & flags ) && 
     1637           ( port_flags & MOTU_PA_MK3_OPT_B_MASK & flags ) && 
     1638           ( port_flags & MOTU_PA_OPTICAL_MASK & flags )) { 
    15241639            size += 3; 
    15251640        } 
     
    15531668 
    15541669bool MotuDevice::addDirPorts( 
    1555   enum Streaming::Port::E_Direction direction, 
    1556   unsigned int sample_rate, unsigned int optical_mode) { 
     1670  enum Streaming::Port::E_Direction direction, unsigned int sample_rate,  
     1671  unsigned int optical_a_mode, unsigned int optical_b_mode) { 
    15571672/* 
    15581673 * Internal helper method: adds all required ports for the given direction 
     
    15681683char *buff; 
    15691684unsigned int dir = direction==Streaming::Port::E_Capture?MOTU_PA_IN:MOTU_PA_OUT; 
    1570 unsigned int flags = (1 << ( optical_mode + 4 )); 
     1685unsigned int flags = 0; 
     1686unsigned int port_flags; 
     1687 
    15711688 
    15721689    if ( sample_rate > 96000 ) 
     
    15771694        flags |= MOTU_PA_RATE_1x; 
    15781695 
     1696    switch (optical_a_mode) { 
     1697        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_OPTICAL_OFF; break; 
     1698        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_OPTICAL_ADAT; break; 
     1699        case MOTU_OPTICAL_MODE_TOSLINK: flags |= MOTU_PA_OPTICAL_TOSLINK; break; 
     1700    } 
     1701    switch (optical_b_mode) { 
     1702        case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_ANY; break; 
     1703        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 
     1704        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; 
     1705        case MOTU_OPTICAL_MODE_TOSLINK: flags |= MOTU_PA_MK3_OPT_B_TOSLINK; break; 
     1706    } 
     1707 
    15791708    // retrieve the ID 
    15801709    std::string id=std::string("dev?"); 
     
    15901719 
    15911720    for (i=0; i < DevicesProperty[m_motu_model-1].n_port_entries; i++) { 
    1592         if (( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & dir ) && 
    1593            ( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & MOTU_PA_RATE_MASK & flags ) && 
    1594            ( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & MOTU_PA_OPTICAL_MASK & flags ) && 
    1595            !( DevicesProperty[m_motu_model-1].port_entry[i].port_flags & MOTU_PA_PADDING )) { 
     1721        port_flags = DevicesProperty[m_motu_model-1].port_entry[i].port_flags; 
     1722        /* For devices without an optical port B ensure the test on the  
     1723         * optical port B mode always returns "true". 
     1724         */ 
     1725        if (optical_b_mode == MOTU_OPTICAL_MODE_NONE) 
     1726            port_flags |= MOTU_PA_MK3_OPT_ANY; 
     1727 
     1728        if (( port_flags & dir ) && 
     1729           ( port_flags & MOTU_PA_RATE_MASK & flags ) && 
     1730           ( port_flags & MOTU_PA_OPTICAL_MASK & flags ) && 
     1731           ( port_flags & MOTU_PA_MK3_OPT_B_MASK & flags ) && 
     1732           !( port_flags & MOTU_PA_PADDING )) { 
    15961733            asprintf(&buff,"%s_%s_%s" , id.c_str(), mode_str, 
    15971734              DevicesProperty[m_motu_model-1].port_entry[i].port_name); 
  • trunk/libffado/src/motu/motu_avdevice.h

    r1833 r1834  
    199199#define MOTU_PA_MK3_OPT_B_ON      (MOTU_PA_MK3_OPT_B_ADAT|MOTU_PA_MK3_OPT_B_TOSLINK) 
    200200#define MOTU_PA_MK3_OPT_B_ANY     (MOTU_PA_MK3_OPT_B_OFF|MOTU_PA_MK3_OPT_B_ON) 
    201 #define MOTU_PA_MK3_OPT_B_MASK    MOTU_PA_MK3_OPT_B_MASK 
     201#define MOTU_PA_MK3_OPT_B_MASK    MOTU_PA_MK3_OPT_B_ANY 
    202202#define MOTU_PA_MK3_OPT_ANY       (MOTU_PA_MK3_OPT_A_ANY|MOTU_PA_MK3_OPT_B_ANY) 
    203203 
     
    383383        int position, int size); 
    384384    bool addDirPorts( 
    385         enum Streaming::Port::E_Direction direction, 
    386         unsigned int sample_rate, unsigned int optical_mode); 
     385        enum Streaming::Port::E_Direction direction, unsigned int sample_rate,  
     386        unsigned int optical_a_mode, unsigned int optical_b_mode); 
    387387 
    388388public: