Changeset 1531

Show
Ignore:
Timestamp:
03/29/09 13:59:09 (12 years ago)
Author:
ppalmers
Message:

svn merge -r 1506:HEAD svn+ssh://ffadosvn@ffado.org/ffado/branches/libffado-2.0

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/config.h.in

    r1498 r1531  
    4343#define IEEE1394SERVICE_USE_CYCLETIMER_DLL                         1 
    4444#define IEEE1394SERVICE_CYCLETIMER_DLL_UPDATE_INTERVAL_USEC   200000 
     45#define IEEE1394SERVICE_CYCLETIMER_DLL_BANDWIDTH_HZ              0.5 
    4546#define IEEE1394SERVICE_MAX_FIREWIRE_PORTS                         4 
    4647#define IEEE1394SERVICE_MIN_SPLIT_TIMEOUT_USECS              1000000 
     
    140141#define STREAMPROCESSORMANAGER_DYNAMIC_SYNC_DELAY           0 
    141142 
    142 // FIXME: note that it will probably be better to use a DLL bandwidth that is  
    143 //        dependant on the sample rate 
    144 #define TIMESTAMPEDBUFFER_DLL_BANDWIDTH                     (0.01) 
     143// the default bandwidth of the stream processor timestamp DLL when synchronizing (should be fast) 
     144#define STREAMPROCESSOR_DLL_FAST_BW_HZ                      5.0 
     145// the default bandwidth of the stream processor timestamp DLL when streaming 
     146#define STREAMPROCESSOR_DLL_BW_HZ                           0.1 
    145147 
    146148// -- AMDTP options -- // 
  • trunk/libffado/configuration

    r1498 r1531  
    66    modelname   = "Onyx Firewire"; 
    77    driver      = 1; # BeBoB 
     8    xmit_max_cycles_early_transmit = 4; 
    89}, 
    910{ # Added by arnonym from ffado-mixers list 
     
    1415    driver      = 1; # BeBoB 
    1516    mixer       = "MackieOnyxMixer"; 
     17    xmit_max_cycles_early_transmit = 4; 
    1618}, 
    1719{ 
     
    2123    modelname   = "Rosetta 200"; 
    2224    driver      = 1; # BeBoB 
     25    xmit_max_cycles_early_transmit = 4; 
    2326}, 
    2427{ 
     
    2831    modelname   = "RD Audio1"; 
    2932    driver      = 1; # BeBoB 
     33    xmit_max_cycles_early_transmit = 4; 
    3034}, 
    3135{ 
     
    3640    driver      = 1; # BeBoB 
    3741    mixer       = "BCoAudio5Control"; 
     42    xmit_max_cycles_early_transmit = 4; 
    3843}, 
    3944{ 
     
    4348    modelname   = "FIREBOX"; 
    4449    driver      = 1; # BeBoB 
     50    xmit_max_cycles_early_transmit = 4; 
    4551}, 
    4652{ 
     
    5056    modelname   = "FirePOD"; 
    5157    driver      = 1; # BeBoB 
     58    xmit_max_cycles_early_transmit = 4; 
    5259}, 
    5360{ 
     
    5865    driver      = 1; # BeBoB 
    5966    mixer       = "Phase88Control"; 
     67    xmit_max_cycles_early_transmit = 4; 
    6068}, 
    6169{ 
     
    6674    driver      = 1; # BeBoB 
    6775    mixer       = "Phase24Control"; 
     76    xmit_max_cycles_early_transmit = 4; 
    6877}, 
    6978{ 
     
    7483    driver      = 1; # BeBoB 
    7584    mixer       = "Phase24Control"; 
     85    xmit_max_cycles_early_transmit = 4; 
    7686}, 
    7787{ 
     
    8292    driver      = 1; # BeBoB 
    8393    mixer       = "QuataFireMixer"; 
     94    xmit_max_cycles_early_transmit = 4; 
    8495}, 
    8596{ 
     
    90101    driver      = 1; # BeBoB 
    91102    mixer       = "SaffireProMixer"; 
     103    xmit_max_cycles_early_transmit = 4; 
    92104}, 
    93105{ 
     
    98110    driver      = 1; # BeBoB 
    99111    mixer       = "SaffireProMixer"; 
     112    xmit_max_cycles_early_transmit = 4; 
    100113}, 
    101114{ 
     
    106119    driver      = 1; # BeBoB 
    107120    mixer       = "SaffireMixer"; 
     121    cmd_interval_time = 10000; 
     122    xmit_max_cycles_early_transmit = 4; 
    108123}, 
    109124{ 
     
    114129    driver      = 1; # BeBoB 
    115130    mixer       = "EdirolFa66Control"; 
     131    xmit_max_cycles_early_transmit = 4; 
    116132}, 
    117133{ 
     
    122138    driver      = 1; # BeBoB 
    123139    mixer       = "EdirolFa101Control"; 
     140    xmit_max_cycles_early_transmit = 4; 
    124141}, 
    125142{ 
     
    129146    modelname   = "FW Solo"; 
    130147    driver      = 1; # BeBoB 
     148    xmit_max_cycles_early_transmit = 4; 
    131149}, 
    132150{ 
     
    136154    modelname   = "NRV10"; 
    137155    driver      = 1; # BeBoB 
     156    xmit_max_cycles_early_transmit = 4; 
    138157}, 
    139158{ 
     
    143162    modelname   = "FW Audiophile"; 
    144163    driver      = 1; # BeBoB 
     164    xmit_max_cycles_early_transmit = 4; 
    145165}, 
    146166{ 
     
    150170    modelname   = "ProFire Lightbridge"; 
    151171    driver      = 1; # BeBoB 
     172    xmit_max_cycles_early_transmit = 4; 
    152173}, 
    153174{ 
     
    157178    modelname   = "eAR Master One"; 
    158179    driver      = 1; # BeBoB 
    159 }, 
    160  { 
    161    vendorid = 0x0000000A; 
    162    modelid = 0x00030000; 
    163    vendorname = "CME"; 
    164    modelname = "Matrix K FW"; 
    165    driver = 1; # BeBoB 
    166  },  
    167  { 
     180    xmit_max_cycles_early_transmit = 4; 
     181}, 
     182
     183    vendorid = 0x0000000A; 
     184    modelid = 0x00030000; 
     185    vendorname = "CME"; 
     186    modelname = "Matrix K FW"; 
     187    driver = 1; # BeBoB 
     188    xmit_max_cycles_early_transmit = 4; 
     189},  
     190
    168191    vendorid = 0x1486; 
    169192    modelid = 0xAF2; 
     
    172195    driver = 2; 
    173196    mixer = "AudioFireMixer"; 
    174   },  
    175   { 
     197    xmit_max_cycles_early_transmit = 2; 
     198},  
     199
    176200    vendorid = 0x1486; 
    177201    modelid = 0xAF4; 
     
    180204    driver = 2; 
    181205    mixer = "AudioFireMixer"; 
    182   },  
    183   { 
     206    xmit_max_cycles_early_transmit = 2; 
     207},  
     208
    184209    vendorid = 0x1486; 
    185210    modelid = 0xAF8; 
     
    188213    driver = 2; 
    189214    mixer = "AudioFireMixer"; 
    190   },  
    191   { 
     215    xmit_max_cycles_early_transmit = 2; 
     216},  
     217
    192218    vendorid = 0x1486; 
    193219    modelid = 0xAF12; 
     
    196222    driver = 2; 
    197223    mixer = "AudioFireMixer"; 
    198   },  
    199   { 
     224    xmit_max_cycles_early_transmit = 2; 
     225},  
     226
    200227    vendorid = 0x1486; 
    201228    modelid = 0xAF12D; 
     
    203230    modelname = "AudioFire12HD"; 
    204231    driver = 2; 
    205   },  
    206   { 
     232    xmit_max_cycles_early_transmit = 2; 
     233},  
     234
    207235    vendorid = 0x1486; 
    208236    modelid = 0xF8; 
     
    210238    modelname = "Fireworks 8"; 
    211239    driver = 2; 
    212   },  
    213   { 
     240    xmit_max_cycles_early_transmit = 2; 
     241},  
     242
    214243    vendorid = 0x1486; 
    215244    modelid = 0xAFD1; 
     
    217246    modelname = "FW HDMI"; 
    218247    driver = 2; 
    219   },  
    220   { 
     248    xmit_max_cycles_early_transmit = 2; 
     249},  
     250
    221251    vendorid = 0xFF2; 
    222252    modelid = 0x400F; 
     
    224254    modelname = "Onyx 400F"; 
    225255    driver = 2; 
    226   },  
    227   { 
     256    xmit_max_cycles_early_transmit = 2; 
     257},  
     258
    228259    vendorid = 0xFF2; 
    229260    modelid = 0x1200F; 
     
    231262    modelname = "Onyx 1200F"; 
    232263    driver = 2; 
    233   }, 
    234   { # added by arnonym from ffado-mixers list 
     264    xmit_max_cycles_early_transmit = 2; 
     265}, 
     266
     267    vendorid = 0x00001260; 
     268    modelid = 0x00001000; 
     269    vendorname = "Stanton DJ"; 
     270    modelname = "SCS.1m"; 
     271    driver = 3; 
     272    xmit_max_cycles_early_transmit = 4; 
     273    xmit_sp_dll_bw = 1.0; 
     274    recv_sp_dll_bw = 1.0; 
     275}, 
     276{ # added by arnonym from ffado-mixers list 
    235277    vendorid = 0x0001f2; 
    236278    modelid = 0x00000000; 
     
    239281    driver = 10; 
    240282    mixer = "MotuMixer"; 
    241  
     283
    242284); 
  • trunk/libffado/SConstruct

    r1512 r1531  
    5353        BoolOption( "DEBUG", """\ 
    5454Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use 
    55   \"-O2\" to optimise.""", True ), 
     55  \"-O2\" to optimize.""", True ), 
    5656        BoolOption( "PROFILE", "Build with symbols and other profiling info", False ), 
    5757        PathOption( "PREFIX", "The prefix where ffado will be installed to.", "/usr/local", PathOption.PathAccept ), 
  • trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp

    r1498 r1531  
    3232FocusriteDevice::FocusriteDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )) 
    3333    : BeBoB::AvDevice( d, configRom) 
     34    , m_cmd_time_interval( 0 ) 
     35    , m_earliest_next_cmd_time( 0 ) 
    3436{ 
    3537    debugOutput( DEBUG_LEVEL_VERBOSE, "Created BeBoB::Focusrite::FocusriteDevice (NodeID %d)\n", 
     
    6062    bool use_avc = false; 
    6163    if(!getOption("useAvcForParameters", use_avc)) { 
    62         debugWarning("Could not retrieve useAvcForParameters parameter, defauling to false\n"); 
    63     } 
     64        debugWarning("Could not retrieve useAvcForParameters parameter, defaulting to false\n"); 
     65    } 
     66 
     67    // rate control 
     68    ffado_microsecs_t now = Util::SystemTimeSource::getCurrentTimeAsUsecs(); 
     69    if(m_cmd_time_interval && (m_earliest_next_cmd_time > now)) { 
     70        ffado_microsecs_t wait = m_earliest_next_cmd_time - now; 
     71        debugOutput( DEBUG_LEVEL_VERBOSE, "Rate control... %llu\n", wait ); 
     72        Util::SystemTimeSource::SleepUsecRelative(wait); 
     73    } 
     74    m_earliest_next_cmd_time = now + m_cmd_time_interval; 
     75 
    6476    if (use_avc) { 
    6577        return setSpecificValueAvc(id, v); 
     
    7587    bool use_avc = false; 
    7688    if(!getOption("useAvcForParameters", use_avc)) { 
    77         debugWarning("Could not retrieve useAvcForParameters parameter, defauling to false\n"); 
    78     } 
     89        debugWarning("Could not retrieve useAvcForParameters parameter, defaulting to false\n"); 
     90    } 
     91 
     92    // rate control 
     93    ffado_microsecs_t now = Util::SystemTimeSource::getCurrentTimeAsUsecs(); 
     94    if(m_cmd_time_interval && (m_earliest_next_cmd_time > now)) { 
     95        ffado_microsecs_t wait = m_earliest_next_cmd_time - now; 
     96        debugOutput( DEBUG_LEVEL_VERBOSE, "Rate control... %llu\n", wait ); 
     97        Util::SystemTimeSource::SleepUsecRelative(wait); 
     98    } 
     99    m_earliest_next_cmd_time = now + m_cmd_time_interval; 
     100 
     101    // execute 
    79102    if (use_avc) { 
    80103        retval = getSpecificValueAvc(id, v); 
  • trunk/libffado/src/bebob/focusrite/focusrite_generic.h

    r1498 r1531  
    3131#include "libcontrol/BasicElements.h" 
    3232#include "libcontrol/MatrixMixer.h" 
     33 
     34#include "libutil/SystemTimeSource.h" 
    3335 
    3436#define FR_PARAM_SPACE_START 0x000100000000LL 
     
    236238    bool setSpecificValueARM(uint32_t id, uint32_t v); 
    237239    bool getSpecificValueARM(uint32_t id, uint32_t *v); 
     240 
     241protected: 
     242    ffado_microsecs_t m_cmd_time_interval; 
     243    ffado_microsecs_t m_earliest_next_cmd_time; 
    238244}; 
    239245 
  • trunk/libffado/src/bebob/focusrite/focusrite_saffire.cpp

    r1498 r1531  
    2525#include "focusrite_cmd.h" 
    2626 
     27#include "devicemanager.h" 
     28 
    2729namespace BeBoB { 
    2830namespace Focusrite { 
     
    3941    } else { 
    4042        m_isSaffireLE = true; 
     43    } 
     44 
     45    // find the configured delay time for this device 
     46    Util::Configuration &config = d.getConfiguration(); 
     47    int delaytime = 0; 
     48    if(config.getValueForDeviceSetting(getConfigRom().getNodeVendorId(), getConfigRom().getModelId(), "cmd_interval_time", delaytime)) { 
     49        m_cmd_time_interval = delaytime; 
     50        debugOutput( DEBUG_LEVEL_VERBOSE, "Setting command interval time to %llu\n", 
     51                     m_cmd_time_interval ); 
     52    } else { 
     53        m_cmd_time_interval = 10000; 
     54        debugOutput( DEBUG_LEVEL_VERBOSE, "No command interval time setting found, defaulting to %llu\n", 
     55                     m_cmd_time_interval ); 
    4156    } 
    4257} 
  • trunk/libffado/src/devicemanager.cpp

    r1498 r1531  
    995995    if(dev) { 
    996996        debugOutput( DEBUG_LEVEL_VERBOSE, " found supported device...\n" ); 
     997        dev->setVerboseLevel(getDebugLevel()); 
    997998        return dev; 
    998999    } 
     
    10021003    if(dev) { 
    10031004        debugOutput( DEBUG_LEVEL_VERBOSE, " found generic support for device...\n" ); 
     1005        dev->setVerboseLevel(getDebugLevel()); 
    10041006        return dev; 
    10051007    } 
    10061008    debugOutput( DEBUG_LEVEL_VERBOSE, " device not supported...\n" ); 
    1007     return 0
     1009    return NULL
    10081010} 
    10091011 
     
    10111013DeviceManager::getSlaveDriver( std::auto_ptr<ConfigRom>( configRom ) ) 
    10121014{ 
    1013  
    10141015#ifdef ENABLE_BOUNCE 
    10151016    if ( Bounce::BounceSlaveDevice::probe( *configRom.get() ) ) { 
     
    10171018    } 
    10181019#endif 
    1019  
    1020     return 0; 
     1020    return NULL; 
    10211021} 
    10221022 
  • trunk/libffado/src/genericavc/avc_avdevice.cpp

    r1498 r1531  
    530530    } 
    531531 
     532    // get the device specific and/or global SP configuration 
     533    Util::Configuration &config = getDeviceManager().getConfiguration(); 
     534    // base value is the config.h value 
     535    float recv_sp_dll_bw = STREAMPROCESSOR_DLL_BW_HZ; 
     536    float xmit_sp_dll_bw = STREAMPROCESSOR_DLL_BW_HZ; 
     537 
     538    int xmit_max_cycles_early_transmit = AMDTP_MAX_CYCLES_TO_TRANSMIT_EARLY; 
     539    int xmit_transfer_delay = AMDTP_TRANSMIT_TRANSFER_DELAY; 
     540    int xmit_min_cycles_before_presentation = AMDTP_MIN_CYCLES_BEFORE_PRESENTATION; 
     541 
     542    // we can override that globally 
     543    config.getValueForSetting("streaming.common.recv_sp_dll_bw", recv_sp_dll_bw); 
     544    config.getValueForSetting("streaming.common.xmit_sp_dll_bw", xmit_sp_dll_bw); 
     545    config.getValueForSetting("streaming.amdtp.xmit_max_cycles_early_transmit", xmit_max_cycles_early_transmit); 
     546    config.getValueForSetting("streaming.amdtp.xmit_transfer_delay", xmit_transfer_delay); 
     547    config.getValueForSetting("streaming.amdtp.xmit_min_cycles_before_presentation", xmit_min_cycles_before_presentation); 
     548 
     549    // or override in the device section 
     550    uint32_t vendorid = getConfigRom().getNodeVendorId(); 
     551    uint32_t modelid = getConfigRom().getModelId(); 
     552    config.getValueForDeviceSetting(vendorid, modelid, "recv_sp_dll_bw", recv_sp_dll_bw); 
     553    config.getValueForDeviceSetting(vendorid, modelid, "xmit_sp_dll_bw", xmit_sp_dll_bw); 
     554    config.getValueForDeviceSetting(vendorid, modelid, "xmit_max_cycles_early_transmit", xmit_max_cycles_early_transmit); 
     555    config.getValueForDeviceSetting(vendorid, modelid, "xmit_transfer_delay", xmit_transfer_delay); 
     556    config.getValueForDeviceSetting(vendorid, modelid, "xmit_min_cycles_before_presentation", xmit_min_cycles_before_presentation); 
     557 
     558    // initialize the SP's 
    532559    debugOutput( DEBUG_LEVEL_VERBOSE, "Initializing receive processor...\n"); 
    533560    // create & add streamprocessors 
     
    550577        Streaming::Port::E_Capture)) { 
    551578        debugFatal("Could not add plug to processor!\n"); 
     579        delete p; 
     580        return false; 
     581    } 
     582 
     583    if(!p->setDllBandwidth(recv_sp_dll_bw)) { 
     584        debugFatal("Could not set DLL bandwidth\n"); 
    552585        delete p; 
    553586        return false; 
     
    569602        #if AMDTP_ALLOW_PAYLOAD_IN_NODATA_XMIT 
    570603            // FIXME: it seems that some BeBoB devices can't handle NO-DATA without payload 
     604            // FIXME: make this a config value too 
    571605            t->sendPayloadForNoDataPackets(true); 
    572606        #endif 
     607 
     608        // transmit control parameters 
     609        t->setMaxCyclesToTransmitEarly(xmit_max_cycles_early_transmit); 
     610        t->setTransferDelay(xmit_transfer_delay); 
     611        t->setMinCyclesBeforePresentation(xmit_min_cycles_before_presentation); 
     612 
    573613        p=t; 
    574614    } 
     
    587627            return false; 
    588628        } 
     629        if(!p->setDllBandwidth(recv_sp_dll_bw)) { 
     630            debugFatal("Could not set DLL bandwidth\n"); 
     631            delete p; 
     632            return false; 
     633        } 
    589634    } else { 
    590635        if (!addPlugToProcessor(*inputPlug, p, 
    591636            Streaming::Port::E_Playback)) { 
    592637            debugFatal("Could not add plug to processor!\n"); 
     638            return false; 
     639        } 
     640        if(!p->setDllBandwidth(xmit_sp_dll_bw)) { 
     641            debugFatal("Could not set DLL bandwidth\n"); 
     642            delete p; 
    593643            return false; 
    594644        } 
  • trunk/libffado/src/libieee1394/cycletimer.h

    r1246 r1531  
    119119        if (x < 0) { 
    120120            debugWarning("insufficient wrapping: %lld\n",x); 
    121  
    122             debugWarning("correcting...\n"); 
    123             while (x < 0) { 
    124                 x += TICKS_PER_SECOND * 128L; 
    125  
    126                 if (x < 0) { 
    127                     debugWarning(" insufficient wrapping: %lld\n",x); 
    128                 } 
    129             } 
    130         } 
    131  
     121        } 
    132122#endif 
    133123 
  • trunk/libffado/src/libieee1394/CycleTimerHelper.cpp

    r1498 r1531  
    3232 
    3333#define DLL_PI        (3.141592653589793238) 
     34#define DLL_2PI       (2 * DLL_PI) 
    3435#define DLL_SQRT2     (1.414213562373095049) 
    35  
    36 // the high-bandwidth coefficients are used 
    37 // to speed up inital tracking 
    38 #define DLL_BANDWIDTH_HIGH (0.1) 
    39 #define DLL_OMEGA_HIGH     (2.0*DLL_PI*DLL_BANDWIDTH_HIGH) 
    40 #define DLL_COEFF_B_HIGH   (DLL_SQRT2 * DLL_OMEGA_HIGH) 
    41 #define DLL_COEFF_C_HIGH   (DLL_OMEGA_HIGH * DLL_OMEGA_HIGH) 
    42  
    43 // the low-bandwidth coefficients are used once we have a 
    44 // good estimate of the internal parameters 
    45 #define DLL_BANDWIDTH (0.1) 
    46 #define DLL_OMEGA     (2.0*DLL_PI*DLL_BANDWIDTH) 
    47 #define DLL_COEFF_B   (DLL_SQRT2 * DLL_OMEGA) 
    48 #define DLL_COEFF_C   (DLL_OMEGA * DLL_OMEGA) 
    49  
    50 // is 1 sec 
    51 #define UPDATES_WITH_HIGH_BANDWIDTH \ 
    52          (1000000 / IEEE1394SERVICE_CYCLETIMER_DLL_UPDATE_INTERVAL_USEC) 
    5336 
    5437IMPL_DEBUG_MODULE( CycleTimerHelper, CycleTimerHelper, DEBUG_LEVEL_NORMAL ); 
     
    6851    , m_cycle_timer_prev ( 0 ) 
    6952    , m_cycle_timer_ticks_prev ( 0 ) 
    70     , m_high_bw_updates ( UPDATES_WITH_HIGH_BANDWIDTH ) 
    7153    , m_current_shadow_idx ( 0 ) 
    7254    , m_Thread ( NULL ) 
     
    7860{ 
    7961    debugOutput( DEBUG_LEVEL_VERBOSE, "Create %p...\n", this); 
     62 
     63    double bw_rel = IEEE1394SERVICE_CYCLETIMER_DLL_BANDWIDTH_HZ*((double)update_period_us)/1e6; 
     64    m_dll_coeff_b = bw_rel * (DLL_SQRT2 * DLL_2PI); 
     65    m_dll_coeff_c = bw_rel * bw_rel * DLL_2PI * DLL_2PI; 
     66 
    8067} 
    8168 
     
    9481    , m_cycle_timer_prev ( 0 ) 
    9582    , m_cycle_timer_ticks_prev ( 0 ) 
    96     , m_high_bw_updates ( UPDATES_WITH_HIGH_BANDWIDTH ) 
    9783    , m_current_shadow_idx ( 0 ) 
    9884    , m_Thread ( NULL ) 
     
    10490{ 
    10591    debugOutput( DEBUG_LEVEL_VERBOSE, "Create %p...\n", this); 
     92 
     93    double bw_rel = IEEE1394SERVICE_CYCLETIMER_DLL_BANDWIDTH_HZ*((double)update_period_us)/1e6; 
     94    m_dll_coeff_b = bw_rel * (DLL_SQRT2 * DLL_2PI); 
     95    m_dll_coeff_c = bw_rel * bw_rel * DLL_2PI * DLL_2PI; 
    10696} 
    10797 
     
    189179    debugOutput( DEBUG_LEVEL_VERBOSE, "requesting DLL re-init...\n" ); 
    190180    Util::SystemTimeSource::SleepUsecRelative(1000); // some time to settle 
    191     m_high_bw_updates = UPDATES_WITH_HIGH_BANDWIDTH; 
    192181    if(!initDLL()) { 
    193182        debugError("(%p) Could not init DLL\n", this); 
     
    283272    uint64_t cycle_timer_ticks; 
    284273 
     274    double bw_rel = m_dll_coeff_b / (DLL_SQRT2 * DLL_2PI); 
     275    double bw_abs = bw_rel / (m_usecs_per_update / 1e6); 
     276    if (bw_rel > 0.5) { 
     277        double bw_max = 0.5 / (m_usecs_per_update / 1e6); 
     278        debugWarning("Specified DLL bandwidth too high (%f > %f), reducing to max." 
     279                     " Increase the DLL update rate to increase the max DLL bandwidth\n", bw_abs, bw_max); 
     280 
     281        bw_rel = 0.49; 
     282        bw_abs = bw_rel / (m_usecs_per_update / 1e6); 
     283        m_dll_coeff_b = bw_rel * (DLL_SQRT2 * DLL_2PI); 
     284        m_dll_coeff_c = bw_rel * bw_rel * DLL_2PI * DLL_2PI; 
     285    } 
     286 
    285287    if(!readCycleTimerWithRetry(&cycle_timer, &local_time, 10)) { 
    286288        debugError("Could not read cycle timer register\n"); 
     
    305307    m_next_time_ticks = addTicks( (uint64_t)m_current_time_ticks, (uint64_t)m_dll_e2); 
    306308    debugOutput(DEBUG_LEVEL_VERBOSE, " (%p) First run\n", this); 
     309    debugOutput(DEBUG_LEVEL_VERBOSE, "  DLL bandwidth: %f Hz (rel: %f)\n",  
     310                bw_abs, bw_rel); 
    307311    debugOutput(DEBUG_LEVEL_VERBOSE, 
    308312                "  usecs/update: %lu, ticks/update: %lu, m_dll_e2: %f\n", 
     
    383387 
    384388        // check for unrealistic CTR reads (NEC controller does that sometimes) 
    385         not_good = (-err_ticks > 1*TICKS_PER_HALFCYCLE || err_ticks > 1*TICKS_PER_HALFCYCLE); 
     389        not_good = (-err_ticks > 1*TICKS_PER_CYCLE || err_ticks > 1*TICKS_PER_CYCLE); 
    386390        if(not_good) { 
    387391            debugOutput(DEBUG_LEVEL_VERBOSE,  
     
    389393                        this, err_ticks, 1*TICKS_PER_CYCLE, ntries, expected_ticks); 
    390394            // sleep half a cycle to make sure the hardware moved on 
    391             Util::SystemTimeSource::SleepUsecRelative(USECS_PER_CYCLE/2); 
     395            Util::SystemTimeSource::SleepUsecRelative(USECS_PER_CYCLE); 
    392396        } 
    393397 
     
    455459        // i.e. DLL error signal 
    456460        int64_t diff_ticks_corr; 
    457         if (ticks_late > 0) { 
     461        if (ticks_late >= 0) { 
    458462            diff_ticks_corr = diff_ticks - ticks_late; 
    459463            debugOutputExtreme(DEBUG_LEVEL_ULTRA_VERBOSE, 
     
    477481 
    478482        // decide what coefficients to use 
    479         double coeff_b, coeff_c; 
    480         if (m_high_bw_updates > 0) { 
    481             coeff_b = DLL_COEFF_B_HIGH; 
    482             coeff_c = DLL_COEFF_C_HIGH; 
    483             m_high_bw_updates--; 
    484             if (m_high_bw_updates == 0) { 
    485                 debugOutput(DEBUG_LEVEL_VERBOSE, 
    486                             "Switching to low-bandwidth coefficients\n"); 
    487             } 
    488         } else { 
    489             coeff_b = DLL_COEFF_B; 
    490             coeff_c = DLL_COEFF_C; 
    491         } 
    492483 
    493484        // it should be ok to not do this in tick space  
     
    500491 
    501492        double diff_ticks_corr_d =  (double)diff_ticks_corr; 
    502         double step_ticks = (coeff_b * diff_ticks_corr_d); 
     493        double step_ticks = (m_dll_coeff_b * diff_ticks_corr_d); 
    503494        debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
    504495                           "diff_ticks_corr=%f, step_ticks=%f\n", 
     
    528519 
    529520        // update the DLL state 
    530         m_dll_e2 += coeff_c * diff_ticks_corr_d; 
     521        m_dll_e2 += m_dll_coeff_c * diff_ticks_corr_d; 
    531522 
    532523        // update the y-axis values 
  • trunk/libffado/src/libieee1394/CycleTimerHelper.h

    r1348 r1531  
    147147    uint32_t m_cycle_timer_prev; 
    148148    uint64_t m_cycle_timer_ticks_prev; 
    149     int m_high_bw_updates; 
     149 
     150    double m_dll_coeff_b; 
     151    double m_dll_coeff_c; 
    150152 
    151153    // cached vars used for computation 
  • trunk/libffado/src/libieee1394/IsoHandler.cpp

    r1498 r1531  
    7474   : m_manager( manager ) 
    7575   , m_type ( t ) 
    76    , m_handle( 0
     76   , m_handle( NULL
    7777   , m_buf_packets( 400 ) 
    7878   , m_max_packet_size( 1024 ) 
     
    8686   , m_prebuffers( 0 ) 
    8787   , m_dont_exit_iterate_loop( true ) 
    88    , m_State( E_Created ) 
     88   , m_State( eHS_Stopped ) 
     89   , m_NextState( eHS_Stopped ) 
     90   , m_switch_on_cycle(0) 
    8991#ifdef DEBUG 
    9092   , m_packets ( 0 ) 
     
    100102   : m_manager( manager ) 
    101103   , m_type ( t ) 
    102    , m_handle( 0
     104   , m_handle( NULL
    103105   , m_buf_packets( buf_packets ) 
    104106   , m_max_packet_size( max_packet_size ) 
     
    111113   , m_speed( RAW1394_ISO_SPEED_400 ) 
    112114   , m_prebuffers( 0 ) 
    113    , m_State( E_Created ) 
     115   , m_State( eHS_Stopped ) 
     116   , m_NextState( eHS_Stopped ) 
     117   , m_switch_on_cycle(0) 
    114118#ifdef DEBUG 
    115119   , m_packets ( 0 ) 
     
    126130   : m_manager( manager ) 
    127131   , m_type ( t ) 
    128    , m_handle( 0
     132   , m_handle( NULL
    129133   , m_buf_packets( buf_packets ) 
    130134   , m_max_packet_size( max_packet_size ) 
     
    137141   , m_speed( speed ) 
    138142   , m_prebuffers( 0 ) 
    139    , m_State( E_Created ) 
     143   , m_State( eHS_Stopped ) 
     144   , m_NextState( eHS_Stopped ) 
     145   , m_switch_on_cycle(0) 
    140146#ifdef DEBUG 
    141147   , m_packets( 0 ) 
     
    154160//     raw1394_iso_shutdown(m_handle); 
    155161    if(m_handle) { 
    156         if (m_State == E_Running) { 
     162        if (m_State == eHS_Running) { 
     163            debugError("BUG: Handler still running!\n"); 
    157164            disable(); 
    158165        } 
    159         raw1394_destroy_handle(m_handle); 
    160166    } 
    161167} 
     
    174180        } 
    175181        debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, " returns %d\n", result); 
    176         return result && (m_State != E_Error); 
     182        return result && (m_State != eHS_Error); 
    177183    } else { 
    178184        debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, " no client\n"); 
     
    191197                       this, getTypeString(), cycle_timer_now); 
    192198    m_last_now = cycle_timer_now; 
    193     if(m_State == E_Running) { 
    194 #if ISOHANDLER_FLUSH_BEFORE_ITERATE 
    195         flush(); 
    196 #endif 
     199    if(m_State == eHS_Running) { 
     200        assert(m_handle); 
     201 
     202        #if ISOHANDLER_FLUSH_BEFORE_ITERATE 
     203        // this flushes all packets received since the poll() returned 
     204        // from kernel to userspace such that they are processed by this 
     205        // iterate. Doing so might result in lower latency capability 
     206        // and/or better reliability 
     207        if(m_type == eHT_Receive) { 
     208            raw1394_iso_recv_flush(m_handle); 
     209        } 
     210        #endif 
     211 
    197212        if(raw1394_loop_iterate(m_handle)) { 
    198213            debugError( "IsoHandler (%p): Failed to iterate handler: %s\n", 
     
    210225} 
    211226 
    212 bool 
    213 IsoHandler::init() 
    214 { 
    215     debugOutput( DEBUG_LEVEL_VERBOSE, "IsoHandler (%p) enter...\n",this); 
    216     // check the state 
    217     if(m_State != E_Created) { 
    218         debugError("Incorrect state, expected E_Created, got %d\n",(int)m_State); 
    219         return false; 
    220     } 
    221  
    222     // the main handle for the ISO traffic 
    223     m_handle = raw1394_new_handle_on_port( m_manager.get1394Service().getPort() ); 
    224     if ( !m_handle ) { 
    225         if ( !errno ) { 
    226             debugError("libraw1394 not compatible\n"); 
    227         } else { 
    228             debugError("Could not get 1394 handle: %s\n", strerror(errno) ); 
    229             debugError("Are ieee1394 and raw1394 drivers loaded?\n"); 
    230         } 
    231         return false; 
    232     } 
    233     raw1394_set_userdata(m_handle, static_cast<void *>(this)); 
    234  
    235     // update the internal state 
    236     m_State=E_Initialized; 
    237     return true; 
    238 } 
    239  
    240 bool IsoHandler::disable() 
    241 { 
    242     debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) enter...\n",  
    243                  this, (m_type==eHT_Receive?"Receive":"Transmit")); 
    244  
    245     // check state 
    246     if(m_State == E_Prepared) return true; 
    247     if(m_State != E_Running) { 
    248         debugError("Incorrect state, expected E_Running, got %d\n",(int)m_State); 
    249         return false; 
    250     } 
    251  
    252     debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) wake up handle...\n",  
    253                  this, (m_type==eHT_Receive?"Receive":"Transmit")); 
    254  
    255     // wake up any waiting reads/polls 
    256     raw1394_wake_up(m_handle); 
    257  
    258     // this is put here to try and avoid the 
    259     // Runaway context problem 
    260     // don't know if it will help though. 
    261 /*    if(m_State != E_Error) { // if the handler is dead, this might block forever 
    262         raw1394_iso_xmit_sync(m_handle); 
    263     }*/ 
    264     debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) stop...\n",  
    265                  this, (m_type==eHT_Receive?"Receive":"Transmit")); 
    266     raw1394_iso_stop(m_handle); 
    267     m_State = E_Prepared; 
    268     return true; 
    269 } 
    270  
    271227/** 
    272228 * Bus reset handler 
     
    299255IsoHandler::notifyOfDeath() 
    300256{ 
    301     m_State = E_Error; 
     257    m_State = eHS_Error; 
     258    m_NextState = eHS_Error; 
    302259 
    303260    // notify the client of the fact that we have died 
     
    363320    m_Client=0; 
    364321    return true; 
    365 } 
    366  
    367 void IsoHandler::flush() 
    368 { 
    369     if(m_type == eHT_Receive) { 
    370         raw1394_iso_recv_flush(m_handle); 
    371     } else { 
    372         // do nothing 
    373     } 
    374322} 
    375323 
     
    540488        pkt_ctr_ref |= (now_secs_ref & 0x7F) << 25; 
    541489 
    542         if((pkt_ctr & ~0x0FFFL) != pkt_ctr_ref) { 
     490        if(((pkt_ctr & ~0x0FFFL) != pkt_ctr_ref) && (m_packets > m_buf_packets)) { 
    543491            debugWarning("reconstructed CTR counter discrepancy\n"); 
    544492            debugWarning(" ingredients: %X, %lX, %lX, %lX, %lX, %ld, %ld, %ld, %lld\n", 
     
    575523        #ifdef DEBUG 
    576524        if(skipped) { 
    577             debugOutput(DEBUG_LEVEL_VERBOSE, 
     525            debugOutput(DEBUG_LEVEL_VERY_VERBOSE, 
    578526                        "(%p) skipped %d cycles, cycle: %d, last_cycle: %d, dropped: %d\n",  
    579527                        this, skipped, cycle, m_last_cycle, dropped); 
     
    640588} 
    641589 
    642 bool IsoHandler::prepare() 
    643 
     590bool 
     591IsoHandler::enable(int cycle) 
     592
     593    debugOutput( DEBUG_LEVEL_VERBOSE, "start on cycle %d\n", cycle); 
     594 
    644595    // check the state 
    645     if(m_State != E_Initialized) { 
    646         debugError("Incorrect state, expected E_Initialized, got %d\n",(int)m_State); 
     596    if(m_State != eHS_Stopped) { 
     597        debugError("Incorrect state, expected eHS_Stopped, got %d\n",(int)m_State); 
    647598        return false; 
    648599    } 
    649600 
    650     // Don't call until libraw1394's raw1394_new_handle() function has been 
    651     // fixed to correctly initialise the iso_packet_infos field.  Bug is 
    652     // confirmed present in libraw1394 1.2.1. 
    653     //     raw1394_iso_shutdown(m_handle); 
    654     m_State = E_Prepared; 
    655  
     601    assert(m_handle == NULL); 
     602 
     603    // create a handle for the ISO traffic 
     604    m_handle = raw1394_new_handle_on_port( m_manager.get1394Service().getPort() ); 
     605    if ( !m_handle ) { 
     606        if ( !errno ) { 
     607            debugError("libraw1394 not compatible\n"); 
     608        } else { 
     609            debugError("Could not get 1394 handle: %s\n", strerror(errno) ); 
     610            debugError("Are ieee1394 and raw1394 drivers loaded?\n"); 
     611        } 
     612        return false; 
     613    } 
     614    raw1394_set_userdata(m_handle, static_cast<void *>(this)); 
     615 
     616    // prepare the handler, allocate the resources 
    656617    debugOutput( DEBUG_LEVEL_VERBOSE, "Preparing iso handler (%p, client=%p)\n", this, m_Client); 
    657618    dumpInfo(); 
     
    668629            return false; 
    669630        } 
    670         return true; 
     631 
     632        if(raw1394_iso_recv_start(m_handle, cycle, -1, 0)) { 
     633            debugFatal("Could not start receive handler (%s)\n",strerror(errno)); 
     634            dumpInfo(); 
     635            return false; 
     636        } 
    671637    } else { 
    672638        if(raw1394_iso_xmit_init(m_handle, 
     
    680646            return false; 
    681647        } 
    682         return true; 
    683     } 
    684 
    685  
    686 bool IsoHandler::enable(int cycle) 
    687 
    688     debugOutput( DEBUG_LEVEL_VERBOSE, "start on cycle %d\n", cycle); 
    689     // check the state 
    690     if(m_State != E_Prepared) { 
    691         if(!prepare()) { 
    692             debugFatal("Could not prepare handler\n"); 
    693             return false; 
    694         } 
    695     } 
    696  
    697     if (getType() == eHT_Receive) { 
    698         if(raw1394_iso_recv_start(m_handle, cycle, -1, 0)) { 
    699             debugFatal("Could not start receive handler (%s)\n",strerror(errno)); 
    700             dumpInfo(); 
    701             return false; 
    702         } 
    703     } else { 
     648 
    704649        if(raw1394_iso_xmit_start(m_handle, cycle, m_prebuffers)) { 
    705650            debugFatal("Could not start xmit handler (%s)\n",strerror(errno)); 
     
    713658#endif 
    714659 
     660    m_packets = 0; 
     661 
    715662    // indicate that the first iterate() still has to occur. 
    716663    m_last_now = 0xFFFFFFFF; 
    717664    m_last_packet_handled_at = 0xFFFFFFFF; 
    718665 
    719     m_State = E_Running; 
     666    m_State = eHS_Running; 
     667    m_NextState = eHS_Running; 
    720668    return true; 
     669} 
     670 
     671bool 
     672IsoHandler::disable() 
     673{ 
     674    debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) enter...\n",  
     675                 this, (m_type==eHT_Receive?"Receive":"Transmit")); 
     676 
     677    // check state 
     678    if(m_State != eHS_Running) { 
     679        debugError("Incorrect state, expected eHS_Running, got %d\n",(int)m_State); 
     680        return false; 
     681    } 
     682 
     683    assert(m_handle != NULL); 
     684 
     685    debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) wake up handle...\n",  
     686                 this, (m_type==eHT_Receive?"Receive":"Transmit")); 
     687 
     688    // wake up any waiting reads/polls 
     689    raw1394_wake_up(m_handle); 
     690 
     691    // this is put here to try and avoid the 
     692    // Runaway context problem 
     693    // don't know if it will help though. 
     694/*    if(m_State != eHS_Error) { // if the handler is dead, this might block forever 
     695        raw1394_iso_xmit_sync(m_handle); 
     696    }*/ 
     697    debugOutput( DEBUG_LEVEL_VERBOSE, "(%p, %s) stop...\n",  
     698                 this, (m_type==eHT_Receive?"Receive":"Transmit")); 
     699    // stop iso traffic 
     700    raw1394_iso_stop(m_handle); 
     701    // deallocate resources 
     702 
     703    // Don't call until libraw1394's raw1394_new_handle() function has been 
     704    // fixed to correctly initialise the iso_packet_infos field.  Bug is 
     705    // confirmed present in libraw1394 1.2.1. 
     706    raw1394_iso_shutdown(m_handle); 
     707 
     708    raw1394_destroy_handle(m_handle); 
     709    m_handle = NULL; 
     710 
     711    m_State = eHS_Stopped; 
     712    m_NextState = eHS_Stopped; 
     713    return true; 
     714} 
     715 
     716// functions to request enable or disable at the next opportunity 
     717bool 
     718IsoHandler::requestEnable(int cycle) 
     719{ 
     720    if (m_State == eHS_Running) { 
     721        debugError("Enable requested on enabled stream\n"); 
     722        return false; 
     723    } 
     724    if (m_State != eHS_Stopped) { 
     725        debugError("Enable requested on stream with state: %d\n", m_State); 
     726        return false; 
     727    } 
     728    m_NextState = eHS_Running; 
     729    return true; 
     730} 
     731 
     732bool 
     733IsoHandler::requestDisable() 
     734{ 
     735    if (m_State == eHS_Stopped) { 
     736        debugError("Disable requested on disabled stream\n"); 
     737        return false; 
     738    } 
     739    if (m_State != eHS_Running) { 
     740        debugError("Disable requested on stream with state=%d\n", m_State); 
     741        return false; 
     742    } 
     743    m_NextState = eHS_Stopped; 
     744    return true; 
     745} 
     746 
     747void 
     748IsoHandler::updateState() 
     749{ 
     750    // execute state changes requested 
     751    if(m_State != m_NextState) { 
     752        debugOutput(DEBUG_LEVEL_VERBOSE, "(%p) handler needs state update from %d => %d\n", this, m_State, m_NextState); 
     753        if(m_State == eHS_Stopped && m_NextState == eHS_Running) { 
     754            debugOutput(DEBUG_LEVEL_VERBOSE, "handler has to be enabled\n"); 
     755            enable(m_switch_on_cycle); 
     756        } else if(m_State == eHS_Running && m_NextState == eHS_Stopped) { 
     757            debugOutput(DEBUG_LEVEL_VERBOSE, "handler has to be disabled\n"); 
     758            disable(); 
     759        } else { 
     760            debugError("Unknown state transition\n"); 
     761        } 
     762    } 
    721763} 
    722764 
  • trunk/libffado/src/libieee1394/IsoHandler.h

    r1498 r1531  
    9898 
    9999    bool init(); 
    100     bool prepare(); 
    101  
    102100    void setVerboseLevel(int l); 
    103101 
     102    // the enable/disable functions should only be used from within the loop that iterates() 
     103    // but not from within the iterate callback. use the requestEnable / requestDisable functions 
     104    // for that 
    104105    bool enable() {return enable(-1);}; 
    105106    bool enable(int cycle); 
    106107    bool disable(); 
    107108 
    108     void flush(); 
     109    // functions to request enable or disable at the next opportunity 
     110    bool requestEnable(int cycle = -1); 
     111    bool requestDisable(); 
     112 
     113    /** 
     114     * updates the internal state if required 
     115     */ 
     116    void updateState(); 
     117 
    109118    enum EHandlerType getType() {return m_type;}; 
    110119    const char *getTypeString() {return eHTToString(m_type); }; 
     
    114123 
    115124    bool isEnabled() 
    116         {return m_State == E_Running;}; 
     125        {return m_State == eHS_Running;}; 
    117126 
    118127    // no setter functions, because those would require a re-init 
     
    198207    // the state machine 
    199208    enum EHandlerStates { 
    200         E_Created, 
    201         E_Initialized, 
    202         E_Prepared, 
    203         E_Running, 
    204         E_Error, 
     209        eHS_Stopped, 
     210        eHS_Running, 
     211        eHS_Error, 
    205212    }; 
    206213    enum EHandlerStates m_State; 
     214    enum EHandlerStates m_NextState; 
     215    int m_switch_on_cycle; 
    207216 
    208217public: 
  • trunk/libffado/src/libieee1394/IsoHandlerManager.cpp

    r1498 r1531  
    8282} 
    8383 
    84 bool 
     84void 
    8585IsoTask::requestShadowMapUpdate() 
    8686{ 
     
    9090    // get the thread going again 
    9191    signalActivity(); 
    92  
    93     if (m_running) { 
    94         int timeout = 1000; 
    95         while(request_update && timeout--) { 
    96             Util::SystemTimeSource::SleepUsecRelative(1000); 
    97         } 
    98         if(timeout == 0) { 
    99             debugError("timeout waiting for shadow map update\n"); 
    100         } 
    101     } 
    10292    debugOutput(DEBUG_LEVEL_VERBOSE, "(%p) exit\n", this); 
    103     return true; 
    10493} 
    10594 
     
    162151        if(h->getType() != m_handlerType) continue; 
    163152 
     153        // update the state of the handler 
     154        // FIXME: maybe this is not the best place to do this 
     155        // it might be better to eliminate the 'requestShadowMapUpdate' 
     156        // entirely and replace it with a mechanism that implements all 
     157        // actions on the m_manager.m_IsoHandlers in the loop 
     158        h->updateState(); 
     159 
     160        // rebuild the map 
    164161        if (h->isEnabled()) { 
    165162            m_IsoHandler_map_shadow[cnt] = h; 
     
    657654} 
    658655 
    659 bool 
    660 IsoHandlerManager::disable(IsoHandler *h) { 
    661     bool result; 
    662     int i=0; 
    663     debugOutput(DEBUG_LEVEL_VERBOSE, "Disable on IsoHandler %p\n", h); 
    664     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    665         it != m_IsoHandlers.end(); 
    666         ++it ) 
    667     { 
    668         if ((*it) == h) { 
    669             result = h->disable(); 
    670             if(h->getType() == IsoHandler::eHT_Transmit) { 
    671                 result &= m_IsoTaskTransmit->requestShadowMapUpdate(); 
    672             } else { 
    673                 result &= m_IsoTaskReceive->requestShadowMapUpdate(); 
    674             } 
    675             debugOutput(DEBUG_LEVEL_VERY_VERBOSE, " disabled\n"); 
    676             return result; 
    677         } 
    678         i++; 
    679     } 
    680     debugError("Handler not found\n"); 
    681     return false; 
    682 } 
    683  
    684 bool 
    685 IsoHandlerManager::enable(IsoHandler *h) { 
    686     bool result; 
    687     int i=0; 
    688     debugOutput(DEBUG_LEVEL_VERBOSE, "Enable on IsoHandler %p\n", h); 
    689     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    690         it != m_IsoHandlers.end(); 
    691         ++it ) 
    692     { 
    693         if ((*it) == h) { 
    694             result = h->enable(); 
    695             if(h->getType() == IsoHandler::eHT_Transmit) { 
    696                 result &= m_IsoTaskTransmit->requestShadowMapUpdate(); 
    697             } else { 
    698                 result &= m_IsoTaskReceive->requestShadowMapUpdate(); 
    699             } 
    700             debugOutput(DEBUG_LEVEL_VERY_VERBOSE, " enabled\n"); 
    701             return result; 
    702         } 
    703         i++; 
    704     } 
    705     debugError("Handler not found\n"); 
    706     return false; 
    707 } 
    708  
    709656void 
    710657IsoHandlerManager::signalActivityTransmit() 
     
    928875    h->setVerboseLevel(getDebugLevel()); 
    929876 
    930     // init the handler 
    931     if(!h->init()) { 
    932         debugFatal("Could not initialize receive handler\n"); 
    933         return false; 
    934     } 
    935  
    936877    // register the stream with the handler 
    937878    if(!h->registerStream(stream)) { 
     
    1028969} 
    1029970 
     971int 
     972IsoHandlerManager::getPacketLatencyForStream(Streaming::StreamProcessor *stream) { 
     973    for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
     974      it != m_IsoHandlers.end(); 
     975      ++it ) 
     976    { 
     977        if((*it)->isStreamRegistered(stream)) { 
     978            return (*it)->getIrqInterval(); 
     979        } 
     980    } 
     981    debugError("Stream %p has no attached handler\n", stream); 
     982    return 0; 
     983} 
     984 
     985IsoHandler * 
     986IsoHandlerManager::getHandlerForStream(Streaming::StreamProcessor *stream) { 
     987    for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
     988      it != m_IsoHandlers.end(); 
     989      ++it ) 
     990    { 
     991        if((*it)->isStreamRegistered(stream)) { 
     992            return (*it); 
     993        } 
     994    } 
     995    debugError("Stream %p has no attached handler\n", stream); 
     996    return NULL; 
     997} 
     998 
     999bool 
     1000IsoHandlerManager::startHandlerForStream(Streaming::StreamProcessor *stream) { 
     1001    return startHandlerForStream(stream, -1); 
     1002} 
     1003 
     1004bool 
     1005IsoHandlerManager::startHandlerForStream(Streaming::StreamProcessor *stream, int cycle) { 
     1006    // check state 
     1007    if(m_State != E_Running) { 
     1008        debugError("Incorrect state, expected E_Running, got %s\n", eHSToString(m_State)); 
     1009        return false; 
     1010    } 
     1011    for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
     1012      it != m_IsoHandlers.end(); 
     1013      ++it ) 
     1014    { 
     1015        if((*it)->isStreamRegistered(stream)) { 
     1016            debugOutput( DEBUG_LEVEL_VERBOSE, " starting handler %p for stream %p\n", *it, stream); 
     1017            if(!(*it)->requestEnable(cycle)) { 
     1018                debugOutput( DEBUG_LEVEL_VERBOSE, " could not request enable for handler %p)\n",*it); 
     1019                return false; 
     1020            } 
     1021 
     1022            if((*it)->getType() == IsoHandler::eHT_Transmit) { 
     1023                m_IsoTaskTransmit->requestShadowMapUpdate(); 
     1024            } else { 
     1025                m_IsoTaskReceive->requestShadowMapUpdate(); 
     1026            } 
     1027 
     1028            debugOutput(DEBUG_LEVEL_VERY_VERBOSE, " requested enable for handler %p\n", *it); 
     1029            return true; 
     1030        } 
     1031    } 
     1032    debugError("Stream %p has no attached handler\n", stream); 
     1033    return false; 
     1034} 
     1035 
    10301036bool 
    10311037IsoHandlerManager::stopHandlerForStream(Streaming::StreamProcessor *stream) { 
     
    10411047        if((*it)->isStreamRegistered(stream)) { 
    10421048            debugOutput( DEBUG_LEVEL_VERBOSE, " stopping handler %p for stream %p\n", *it, stream); 
    1043             if(!(*it)->disable()) { 
    1044                 debugOutput( DEBUG_LEVEL_VERBOSE, " could not disable handler (%p)\n",*it); 
     1049            if(!(*it)->requestDisable()) { 
     1050                debugOutput( DEBUG_LEVEL_VERBOSE, " could not request disable for handler %p\n",*it); 
    10451051                return false; 
    10461052            } 
    1047             bool result; 
     1053 
    10481054            if((*it)->getType() == IsoHandler::eHT_Transmit) { 
    1049                 result = m_IsoTaskTransmit->requestShadowMapUpdate(); 
     1055                m_IsoTaskTransmit->requestShadowMapUpdate(); 
    10501056            } else { 
    1051                 result = m_IsoTaskReceive->requestShadowMapUpdate(); 
     1057                m_IsoTaskReceive->requestShadowMapUpdate(); 
    10521058            } 
    1053             if(!result) { 
    1054                 debugOutput( DEBUG_LEVEL_VERBOSE, " could not update shadow map for handler (%p)\n",*it); 
    1055                 return false; 
    1056             } 
     1059 
     1060            debugOutput(DEBUG_LEVEL_VERBOSE, " requested disable for handler %p\n", *it); 
    10571061            return true; 
    10581062        } 
     
    10621066} 
    10631067 
    1064 int 
    1065 IsoHandlerManager::getPacketLatencyForStream(Streaming::StreamProcessor *stream) { 
    1066     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    1067       it != m_IsoHandlers.end(); 
    1068       ++it ) 
    1069     { 
    1070         if((*it)->isStreamRegistered(stream)) { 
    1071             return (*it)->getIrqInterval(); 
    1072         } 
    1073     } 
    1074     debugError("Stream %p has no attached handler\n", stream); 
    1075     return 0; 
    1076 
    1077  
    1078 void 
    1079 IsoHandlerManager::flushHandlerForStream(Streaming::StreamProcessor *stream) { 
    1080     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    1081       it != m_IsoHandlers.end(); 
    1082       ++it ) 
    1083     { 
    1084         if((*it)->isStreamRegistered(stream)) { 
    1085             (*it)->flush(); 
    1086         } 
    1087     } 
    1088     debugError("Stream %p has no attached handler\n", stream); 
    1089     return; 
    1090 
    1091  
    1092 IsoHandler * 
    1093 IsoHandlerManager::getHandlerForStream(Streaming::StreamProcessor *stream) { 
    1094     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    1095       it != m_IsoHandlers.end(); 
    1096       ++it ) 
    1097     { 
    1098         if((*it)->isStreamRegistered(stream)) { 
    1099             return (*it); 
    1100         } 
    1101     } 
    1102     debugError("Stream %p has no attached handler\n", stream); 
    1103     return NULL; 
    1104 
    1105  
    1106 bool 
    1107 IsoHandlerManager::startHandlerForStream(Streaming::StreamProcessor *stream) { 
    1108     return startHandlerForStream(stream, -1); 
    1109 
    1110  
    1111 bool 
    1112 IsoHandlerManager::startHandlerForStream(Streaming::StreamProcessor *stream, int cycle) { 
     1068bool IsoHandlerManager::stopHandlers() { 
     1069    debugOutput( DEBUG_LEVEL_VERBOSE, "enter...\n"); 
     1070 
    11131071    // check state 
    11141072    if(m_State != E_Running) { 
     
    11161074        return false; 
    11171075    } 
    1118     for ( IsoHandlerVectorIterator it = m_IsoHandlers.begin(); 
    1119       it != m_IsoHandlers.end(); 
    1120       ++it ) 
    1121     { 
    1122         if((*it)->isStreamRegistered(stream)) { 
    1123             debugOutput( DEBUG_LEVEL_VERBOSE, " starting handler %p for stream %p\n", *it, stream); 
    1124             if(!(*it)->enable(cycle)) { 
    1125                 debugOutput( DEBUG_LEVEL_VERBOSE, " could not enable handler (%p)\n",*it); 
    1126                 return false; 
    1127             } 
    1128             bool result; 
    1129             if((*it)->getType() == IsoHandler::eHT_Transmit) { 
    1130                 result = m_IsoTaskTransmit->requestShadowMapUpdate(); 
    1131             } else { 
    1132                 result = m_IsoTaskReceive->requestShadowMapUpdate(); 
    1133             } 
    1134             if(!result) { 
    1135                 debugOutput( DEBUG_LEVEL_VERBOSE, " could not update shadow map for handler (%p)\n",*it); 
    1136                 return false; 
    1137             } 
    1138             return true; 
    1139         } 
    1140     } 
    1141     debugError("Stream %p has no attached handler\n", stream); 
    1142     return false; 
    1143 } 
    1144  
    1145 bool IsoHandlerManager::stopHandlers() { 
    1146     debugOutput( DEBUG_LEVEL_VERBOSE, "enter...\n"); 
    1147  
    1148     // check state 
    1149     if(m_State != E_Running) { 
    1150         debugError("Incorrect state, expected E_Running, got %s\n", eHSToString(m_State)); 
    1151         return false; 
    1152     } 
    11531076 
    11541077    bool retval=true; 
     
    11591082    { 
    11601083        debugOutput( DEBUG_LEVEL_VERBOSE, "Stopping handler (%p)\n",*it); 
    1161         if(!(*it)->disable()){ 
    1162             debugOutput( DEBUG_LEVEL_VERBOSE, " could not stop handler (%p)\n",*it); 
    1163             retval=false; 
    1164         } 
    1165         bool result; 
     1084 
     1085        if(!(*it)->requestDisable()) { 
     1086            debugOutput( DEBUG_LEVEL_VERBOSE, " could not request disable for handler %p\n",*it); 
     1087            return false; 
     1088        } 
     1089 
    11661090        if((*it)->getType() == IsoHandler::eHT_Transmit) { 
    1167             result = m_IsoTaskTransmit->requestShadowMapUpdate(); 
     1091            m_IsoTaskTransmit->requestShadowMapUpdate(); 
    11681092        } else { 
    1169             result = m_IsoTaskReceive->requestShadowMapUpdate(); 
    1170         } 
    1171         if(!result) { 
    1172             debugOutput( DEBUG_LEVEL_VERBOSE, " could not update shadow map for handler (%p)\n",*it); 
    1173             return false; 
    1174         } 
     1093            m_IsoTaskReceive->requestShadowMapUpdate(); 
     1094        } 
     1095 
     1096        debugOutput(DEBUG_LEVEL_VERBOSE, " requested disable for handler %p\n", *it); 
    11751097    } 
    11761098 
  • trunk/libffado/src/libieee1394/IsoHandlerManager.h

    r1498 r1531  
    7070         * @brief requests the thread to sync it's stream map with the manager 
    7171         */ 
    72         bool requestShadowMapUpdate(); 
     72        void requestShadowMapUpdate(); 
    7373        enum eActivityResult { 
    7474            eAR_Activity, 
     
    165165        bool init(); 
    166166 
    167         bool disable(IsoHandler *); ///< disables a handler 
    168         bool enable(IsoHandler *); ///< enables a handler 
    169  
    170167        /** 
    171168         * @brief signals that something happened in one of the clients 
     
    189186        int getPacketLatencyForStream(Streaming::StreamProcessor *); 
    190187 
    191         void flushHandlerForStream(Streaming::StreamProcessor *stream); 
    192188        IsoHandler * getHandlerForStream(Streaming::StreamProcessor *stream); 
    193189 
  • trunk/libffado/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.cpp

    r1498 r1531  
    4545    , m_nb_audio_ports( 0 ) 
    4646    , m_nb_midi_ports( 0 ) 
    47  
    4847{} 
    4948 
     
    181180    debugOutputExtreme( DEBUG_LEVEL_VERY_VERBOSE,  
    182181                        "(%p)->processReadBlock(%u, %u)\n", 
    183                         this,nevents,offset); 
     182                        this, nevents, offset); 
    184183 
    185184    // update the variable parts of the cache 
     
    366365    for (i = 0; i < m_nb_midi_ports; i++) { 
    367366        struct _MIDI_port_cache &p = m_midi_ports.at(i); 
    368         if (p.buffer && p.enabled) { 
     367        if (p.buffer && p.enabled) {  
    369368            uint32_t *buffer = (quadlet_t *)(p.buffer); 
    370369            buffer += offset; 
    371  
    372370            for (j = p.location;j < nevents; j += 8) { 
    373371                target_event = (quadlet_t *) (data + ((j * m_dimension) + p.position)); 
    374                 sample_int=CondSwapFromBus32(*target_event); 
     372                sample_int = CondSwapFromBus32(*target_event); 
     373 
    375374                // FIXME: this assumes that 2X and 3X speed isn't used, 
    376375                // because only the 1X slot is put into the ringbuffer 
    377                 if(IEC61883_AM824_GET_LABEL(sample_int) != IEC61883_AM824_LABEL_MIDI_NO_DATA) { 
     376                if(IEC61883_AM824_HAS_LABEL(sample_int, IEC61883_AM824_LABEL_MIDI_1X)) { 
    378377                    sample_int=(sample_int >> 16) & 0x000000FF; 
    379378                    sample_int |= 0x01000000; // flag that there is a midi event present 
    380379                    *buffer = sample_int; 
    381                     debugOutput(DEBUG_LEVEL_VERY_VERBOSE, "Received midi byte %08X on port %p index %d\n", sample_int, p, j-p.location); 
     380                } else if(IEC61883_AM824_HAS_LABEL(sample_int, IEC61883_AM824_LABEL_MIDI_2X) 
     381                       || IEC61883_AM824_HAS_LABEL(sample_int, IEC61883_AM824_LABEL_MIDI_3X) ) { 
     382                    debugOutput(DEBUG_LEVEL_VERBOSE, "Midi mode %X not supported.\n", IEC61883_AM824_GET_LABEL(sample_int)); 
    382383                } else { 
    383384                    // make sure no event is received 
  • trunk/libffado/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.h

    r1498 r1531  
    5151#define IEC61883_AM824_LABEL_MIDI_2X          0x82 
    5252#define IEC61883_AM824_LABEL_MIDI_3X          0x83 
     53 
     54#define IEC61883_AM824_HAS_LABEL(x, lbl)         (((x) & 0xFF000000) == (((quadlet_t)(lbl))<<24)) 
    5355 
    5456namespace Streaming { 
  • trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp

    r1498 r1531  
    5555        , m_send_nodata_payload ( AMDTP_SEND_PAYLOAD_IN_NODATA_XMIT_BY_DEFAULT ) 
    5656#endif 
     57        , m_max_cycles_to_transmit_early ( AMDTP_MAX_CYCLES_TO_TRANSMIT_EARLY ) 
     58        , m_transmit_transfer_delay ( AMDTP_TRANSMIT_TRANSFER_DELAY ) 
     59        , m_min_cycles_before_presentation ( AMDTP_MIN_CYCLES_BEFORE_PRESENTATION ) 
    5760        , m_nb_audio_ports( 0 ) 
    5861        , m_nb_midi_ports( 0 ) 
     
    104107 
    105108    // now we calculate the time when we have to transmit the sample block 
    106     transmit_at_time = substractTicks( presentation_time, AMDTP_TRANSMIT_TRANSFER_DELAY ); 
     109    transmit_at_time = substractTicks( presentation_time, m_transmit_transfer_delay ); 
    107110 
    108111    // calculate the cycle this block should be presented in 
     
    136139        // we can still postpone the queueing of the packets 
    137140        // if we are far enough ahead of the presentation time 
    138         if ( cycles_until_presentation <= AMDTP_MIN_CYCLES_BEFORE_PRESENTATION
     141        if ( cycles_until_presentation <= m_min_cycles_before_presentation
    139142        { 
    140143            debugOutput( DEBUG_LEVEL_NORMAL, 
     
    207210            // NOTE: dangerous since the device has no way of reporting that it didn't get 
    208211            //       this packet on time. 
    209             if(cycles_until_presentation >= AMDTP_MIN_CYCLES_BEFORE_PRESENTATION
     212            if(cycles_until_presentation >= m_min_cycles_before_presentation
    210213            { 
    211214                // we are not that late and can still try to transmit the packet 
     
    219222            } 
    220223        } 
    221         else if(cycles_until_transmit <= AMDTP_MAX_CYCLES_TO_TRANSMIT_EARLY
     224        else if(cycles_until_transmit <= m_max_cycles_to_transmit_early
    222225        { 
    223226            // it's time send the packet 
     
    243246                               presentation_time, (unsigned int)TICKS_TO_CYCLES(presentation_time)); 
    244247#ifdef DEBUG 
    245             if ( cycles_until_transmit > AMDTP_MAX_CYCLES_TO_TRANSMIT_EARLY + 1 ) 
     248            if ( cycles_until_transmit > m_max_cycles_to_transmit_early + 1 ) 
    246249            { 
    247250                debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
     
    430433    m_syt_interval = getSytInterval(); 
    431434    m_fdf = getFDF(); 
     435 
     436    debugOutput ( DEBUG_LEVEL_VERBOSE, " SYT interval / FDF             : %d / %d\n", m_syt_interval, m_fdf ); 
     437#if AMDTP_ALLOW_PAYLOAD_IN_NODATA_XMIT 
     438    debugOutput ( DEBUG_LEVEL_VERBOSE, " Send payload in No-Data packets: %s \n", m_send_nodata_payload?"Yes":"No" ); 
     439#endif 
     440    debugOutput ( DEBUG_LEVEL_VERBOSE, " Max early transmit cycles      : %d\n", m_max_cycles_to_transmit_early ); 
     441    debugOutput ( DEBUG_LEVEL_VERBOSE, " Transfer delay                 : %d\n", m_transmit_transfer_delay ); 
     442    debugOutput ( DEBUG_LEVEL_VERBOSE, " Min cycles before presentation : %d\n", m_min_cycles_before_presentation ); 
    432443 
    433444    iec61883_cip_init ( 
  • trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.h

    r1498 r1531  
    5252#define IEC61883_AM824_LABEL_MIDI_2X          0x82 
    5353#define IEC61883_AM824_LABEL_MIDI_3X          0x83 
     54 
     55#define IEC61883_AM824_HAS_LABEL(x, lbl)         (((x) & 0xFF000000) == (((quadlet_t)(lbl))<<24)) 
    5456 
    5557namespace Streaming { 
     
    109111    virtual unsigned int getNominalFramesPerPacket() 
    110112                    {return getSytInterval();}; 
     113    // transmit control parameters 
     114    virtual int getMaxCyclesToTransmitEarly() 
     115                    {return m_max_cycles_to_transmit_early;}; 
     116    virtual void setMaxCyclesToTransmitEarly(int x) 
     117                    {m_max_cycles_to_transmit_early = x;}; 
     118    virtual unsigned int getTransferDelay() 
     119                    {return m_transmit_transfer_delay;}; 
     120    virtual void setTransferDelay(unsigned int x) 
     121                    {m_transmit_transfer_delay = x;}; 
     122    virtual int getMinCyclesBeforePresentation() 
     123                    {return m_min_cycles_before_presentation;}; 
     124    virtual void setMinCyclesBeforePresentation(int x) 
     125                    {m_min_cycles_before_presentation = x;}; 
    111126 
    112127protected: 
     
    140155    bool m_send_nodata_payload; 
    141156#endif 
     157    int m_max_cycles_to_transmit_early; 
     158    unsigned int m_transmit_transfer_delay; 
     159    int m_min_cycles_before_presentation; 
    142160 
    143161private: // local port caching for performance 
  • trunk/libffado/src/libstreaming/generic/StreamProcessor.cpp

    r1498 r1531  
    7676    , m_scratch_buffer_size_bytes( 0 ) 
    7777    , m_ticks_per_frame( 0 ) 
    78     , m_sync_delay( 0 ) 
     78    , m_dll_bandwidth_hz ( STREAMPROCESSOR_DLL_BW_HZ ) 
     79    , m_sync_delay_frames( 0 ) 
    7980    , m_in_xrun( false ) 
    8081{ 
     
    136137 
    137138int StreamProcessor::getMaxFrameLatency() { 
    138     if (getType() == ePT_Receive) { 
    139         return (int)(m_IsoHandlerManager.getPacketLatencyForStream( this ) * TICKS_PER_CYCLE); 
    140     } else { 
    141         return (int)(m_IsoHandlerManager.getPacketLatencyForStream( this ) * TICKS_PER_CYCLE); 
    142     } 
     139    return (int)(m_IsoHandlerManager.getPacketLatencyForStream( this ) * TICKS_PER_CYCLE); 
    143140} 
    144141 
     
    175172 * Buffer management and manipulation          * 
    176173 ***********************************************/ 
    177 void StreamProcessor::flush() { 
    178     m_IsoHandlerManager.flushHandlerForStream(this); 
    179 } 
    180174 
    181175int StreamProcessor::getBufferFill() { 
     
    215209 
    216210void 
    217 StreamProcessor::setSyncDelay(unsigned int d) { 
     211StreamProcessor::setSyncDelay(unsigned int ticks) { 
     212 
     213    // round the sync delay to an integer number of packets now we know the frame rate 
     214    int frames = (int)((float)ticks / getTicksPerFrame()); 
     215    frames = (frames / getNominalFramesPerPacket()) + 1; 
     216    frames *= getNominalFramesPerPacket(); 
     217     
    218218    #ifdef DEBUG 
    219     unsigned int frames = (unsigned int)((float)d / getTicksPerFrame()); 
    220     debugOutput(DEBUG_LEVEL_VERBOSE, "Setting SP %p SyncDelay to %u ticks, %u frames\n", this, d, frames); 
     219    float ticks2 = frames * getTicksPerFrame(); 
     220    debugOutput(DEBUG_LEVEL_VERBOSE, "Setting SP %p SyncDelay to %u ticks => rounded to %u frames, %f ticks\n", 
     221                this, ticks, frames, ticks2); 
    221222    #endif 
    222     m_sync_delay = d
     223    m_sync_delay_frames = frames
    223224} 
    224225 
    225226unsigned int 
    226227StreamProcessor::getSyncDelayFrames() { 
    227     unsigned int frames = (unsigned int)((float)m_sync_delay / getTicksPerFrame()); 
    228     return frames; 
     228    return m_sync_delay_frames; 
     229
     230 
     231unsigned int 
     232StreamProcessor::getSyncDelay() { 
     233    return (unsigned int)(m_sync_delay_frames * getTicksPerFrame()); 
    229234} 
    230235 
     
    282287 
    283288bool 
     289StreamProcessor::setDllBandwidth(float bw) 
     290{ 
     291    m_dll_bandwidth_hz = bw; 
     292    return true; 
     293} 
     294 
     295bool 
    284296StreamProcessor::canClientTransferFrames(unsigned int nbframes) 
    285297{ 
     
    397409 
    398410    if (result == eCRV_OK) { 
    399 //         #ifdef DEBUG 
    400         int ticks_per_packet = (int)(getTicksPerFrame() * getNominalFramesPerPacket()); 
    401         int diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
    402         // display message if the difference between two successive tick 
    403         // values is more than 50 ticks. 1 sample at 48k is 512 ticks 
    404         // so 50 ticks = 10%, which is a rather large jitter value. 
    405         if(diff-ticks_per_packet > 50 || diff-ticks_per_packet < -50) { 
    406             debugOutput(DEBUG_LEVEL_VERBOSE, 
    407                         "cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
    408                         CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
    409                         m_last_timestamp, diff, ticks_per_packet); 
    410             // !!!HACK!!! FIXME: this is the result of a failure in wrapping/unwrapping somewhere 
    411             // it's definitely a bug. 
    412             // try to fix up the timestamp 
    413             int64_t last_timestamp_fixed; 
    414             // first try to add one second 
    415             last_timestamp_fixed = addTicks(m_last_timestamp, TICKS_PER_SECOND); 
    416             diff = diffTicks(last_timestamp_fixed, m_last_timestamp2); 
    417             if(diff-ticks_per_packet < 50 && diff-ticks_per_packet > -50) { 
    418                 debugWarning("cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
    419                              CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
    420                              m_last_timestamp, diff, ticks_per_packet); 
    421                 debugWarning("HACK: fixed by adding one second of ticks. This is a bug being run-time fixed.\n"); 
    422                 m_last_timestamp = last_timestamp_fixed; 
    423             } else { 
    424                 // if that didn't work, try to subtract one second 
    425                 last_timestamp_fixed = substractTicks(m_last_timestamp, TICKS_PER_SECOND); 
    426                 diff = diffTicks(last_timestamp_fixed, m_last_timestamp2); 
    427                 if(diff-ticks_per_packet < 50 && diff-ticks_per_packet > -50) { 
    428                     debugWarning("cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
     411        #ifdef DEBUG 
     412        if (m_last_timestamp > 0 && m_last_timestamp2 > 0) { 
     413            int64_t tsp_diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
     414            debugOutputExtreme(DEBUG_LEVEL_VERBOSE, "TSP diff: %lld\n", tsp_diff); 
     415            double tsp_diff_d = tsp_diff; 
     416            double fs_syt = 1.0/tsp_diff_d; 
     417            fs_syt *= (double)getNominalFramesPerPacket() * (double)TICKS_PER_USEC * 1e6; 
     418            double fs_nom = (double)m_StreamProcessorManager.getNominalRate(); 
     419            double fs_diff = fs_nom - fs_syt; 
     420            double fs_diff_norm = fs_diff/fs_nom; 
     421            debugOutputExtreme(DEBUG_LEVEL_VERBOSE, "Nom fs: %12f, Instantanous fs: %12f, diff: %12f (%12f)\n", 
     422                        fs_nom, fs_syt, fs_diff, fs_diff_norm); 
     423            if (fs_diff_norm > 0.01 || fs_diff_norm < -0.01) { 
     424                debugWarning( "Instantanous samplerate more than 1%% off nominal. [Nom fs: %12f, Instantanous fs: %12f, diff: %12f (%12f)]\n", 
     425                        fs_nom, fs_syt, fs_diff, fs_diff_norm); 
     426            } 
     427 
     428            int ticks_per_packet = (int)(getTicksPerFrame() * getNominalFramesPerPacket()); 
     429            int diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
     430                // display message if the difference between two successive tick 
     431                // values is more than 50 ticks. 1 sample at 48k is 512 ticks 
     432                // so 50 ticks = 10%, which is a rather large jitter value. 
     433                if(diff-ticks_per_packet > 50 || diff-ticks_per_packet < -50) { 
     434                    debugOutput(DEBUG_LEVEL_VERBOSE, 
     435                                "cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
    429436                                CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
    430437                                m_last_timestamp, diff, ticks_per_packet); 
    431                     debugWarning("HACK: fixed by subtracing one second of ticks. This is a bug being run-time fixed.\n"); 
    432                     m_last_timestamp = last_timestamp_fixed; 
     438                    // !!!HACK!!! FIXME: this is the result of a failure in wrapping/unwrapping somewhere 
     439                    // it's definitely a bug. 
     440                    // try to fix up the timestamp 
     441                    int64_t last_timestamp_fixed; 
     442                    // first try to add one second 
     443                    last_timestamp_fixed = addTicks(m_last_timestamp, TICKS_PER_SECOND); 
     444                    diff = diffTicks(last_timestamp_fixed, m_last_timestamp2); 
     445                    if(diff-ticks_per_packet < 50 && diff-ticks_per_packet > -50) { 
     446                        debugWarning("cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
     447                                    CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
     448                                    m_last_timestamp, diff, ticks_per_packet); 
     449                        debugWarning("HACK: fixed by adding one second of ticks. This is a bug being run-time fixed.\n"); 
     450                        m_last_timestamp = last_timestamp_fixed; 
     451                    } else { 
     452                        // if that didn't work, try to subtract one second 
     453                        last_timestamp_fixed = substractTicks(m_last_timestamp, TICKS_PER_SECOND); 
     454                        diff = diffTicks(last_timestamp_fixed, m_last_timestamp2); 
     455                        if(diff-ticks_per_packet < 50 && diff-ticks_per_packet > -50) { 
     456                            debugWarning("cy %04u rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
     457                                        CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
     458                                        m_last_timestamp, diff, ticks_per_packet); 
     459                            debugWarning("HACK: fixed by subtracing one second of ticks. This is a bug being run-time fixed.\n"); 
     460                            m_last_timestamp = last_timestamp_fixed; 
     461                        } 
     462                    } 
    433463                } 
    434             } 
    435         } 
    436         debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
    437                            "%04u %011llu %011llu %d %d\n", 
    438                            CYCLE_TIMER_GET_CYCLES(pkt_ctr), 
    439                            m_last_timestamp2, m_last_timestamp,  
    440                            diff, ticks_per_packet); 
    441 //         #endif 
     464                debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
     465                                "%04u %011llu %011llu %d %d\n", 
     466                                CYCLE_TIMER_GET_CYCLES(pkt_ctr), 
     467                                m_last_timestamp2, m_last_timestamp,  
     468                                diff, ticks_per_packet); 
     469        } 
     470        #endif 
    442471 
    443472        debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
     
    509538            return RAW1394_ISO_DEFER; 
    510539        } else if(result2 == eCRV_OK) { 
    511             // no problem here 
    512             // FIXME: cache the period size? 
    513             unsigned int periodsize = m_StreamProcessorManager.getPeriodSize(); 
    514             unsigned int bufferfill = m_data_buffer->getBufferFill(); 
    515             if(bufferfill >= periodsize) { 
    516                 debugOutputExtreme(DEBUG_LEVEL_VERBOSE, "signal activity, %d>%d\n",  
    517                                                         bufferfill, periodsize); 
    518                 //SIGNAL_ACTIVITY_SPM; 
    519                 return RAW1394_ISO_DEFER; // FIXME: might not be needed 
    520             } 
    521540            return RAW1394_ISO_OK; 
    522541        } else { 
     
    702721            } 
    703722            #ifdef DEBUG 
    704             int ticks_per_packet = (int)(getTicksPerFrame() * getNominalFramesPerPacket()); 
    705             int diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
    706             // display message if the difference between two successive tick 
    707             // values is more than 50 ticks. 1 sample at 48k is 512 ticks 
    708             // so 50 ticks = 10%, which is a rather large jitter value. 
    709             if(diff-ticks_per_packet > 50 || diff-ticks_per_packet < -50) { 
    710                 debugOutput(DEBUG_LEVEL_VERBOSE, 
    711                             "cy %04d, rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
    712                             CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
    713                             m_last_timestamp, diff, ticks_per_packet); 
    714             } 
    715             debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
    716                                "%04d %011llu %011llu %d %d\n", 
    717                                CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
    718                                m_last_timestamp, diff, ticks_per_packet); 
     723            if (m_last_timestamp > 0 && m_last_timestamp2 > 0) { 
     724                int64_t tsp_diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
     725                debugOutputExtreme(DEBUG_LEVEL_VERBOSE, "TSP diff: %lld\n", tsp_diff); 
     726                double tsp_diff_d = tsp_diff; 
     727                double fs_syt = 1.0/tsp_diff_d; 
     728                fs_syt *= (double)getNominalFramesPerPacket() * (double)TICKS_PER_USEC * 1e6; 
     729                double fs_nom = (double)m_StreamProcessorManager.getNominalRate(); 
     730                double fs_diff = fs_nom - fs_syt; 
     731                double fs_diff_norm = fs_diff/fs_nom; 
     732                debugOutputExtreme(DEBUG_LEVEL_VERBOSE, "Nom fs: %12f, Instantanous fs: %12f, diff: %12f (%12f)\n", 
     733                           fs_nom, fs_syt, fs_diff, fs_diff_norm); 
     734//                 debugOutput(DEBUG_LEVEL_VERBOSE, "Diff fs: %12f, m_last_timestamp: %011llu, m_last_timestamp2: %011llu\n", 
     735//                            fs_diff, m_last_timestamp, m_last_timestamp2); 
     736                if (fs_diff_norm > 0.01 || fs_diff_norm < -0.01) { 
     737                    debugWarning( "Instantanous samplerate more than 1%% off nominal. [Nom fs: %12f, Instantanous fs: %12f, diff: %12f (%12f)]\n", 
     738                           fs_nom, fs_syt, fs_diff, fs_diff_norm); 
     739                } 
     740                int ticks_per_packet = (int)(getTicksPerFrame() * getNominalFramesPerPacket()); 
     741                int diff = diffTicks(m_last_timestamp, m_last_timestamp2); 
     742                // display message if the difference between two successive tick 
     743                // values is more than 50 ticks. 1 sample at 48k is 512 ticks 
     744                // so 50 ticks = 10%, which is a rather large jitter value. 
     745                if(diff-ticks_per_packet > 50 || diff-ticks_per_packet < -50) { 
     746                    debugOutput(DEBUG_LEVEL_VERBOSE, 
     747                                "cy %04d, rather large TSP difference TS=%011llu => TS=%011llu (%d, nom %d)\n", 
     748                                CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
     749                                m_last_timestamp, diff, ticks_per_packet); 
     750                } 
     751                debugOutputExtreme(DEBUG_LEVEL_VERY_VERBOSE, 
     752                                "%04d %011llu %011llu %d %d\n", 
     753                                CYCLE_TIMER_GET_CYCLES(pkt_ctr), m_last_timestamp2, 
     754                                m_last_timestamp, diff, ticks_per_packet); 
     755            } 
    719756            #endif 
    720757 
     
    10971134 
    10981135    debugOutput( DEBUG_LEVEL_VERBOSE, "Prepared for:\n"); 
    1099     debugOutput( DEBUG_LEVEL_VERBOSE, " Samplerate: %d\n", 
    1100              m_StreamProcessorManager.getNominalRate()); 
     1136    debugOutput( DEBUG_LEVEL_VERBOSE, " Samplerate: %d  [DLL Bandwidth: %f Hz]\n", 
     1137             m_StreamProcessorManager.getNominalRate(), m_dll_bandwidth_hz); 
    11011138    debugOutput( DEBUG_LEVEL_VERBOSE, " PeriodSize: %d, NbBuffers: %d\n", 
    11021139             m_StreamProcessorManager.getPeriodSize(), m_StreamProcessorManager.getNbBuffers()); 
     
    13581395            m_correct_last_timestamp = false; 
    13591396 
    1360             debugOutput(DEBUG_LEVEL_VERBOSE,"Initializing remote ticks/frame to %f\n", ticks_per_frame); 
     1397            debugOutput(DEBUG_LEVEL_VERBOSE, "Initializing remote ticks/frame to %f\n", ticks_per_frame); 
    13611398 
    13621399            // initialize internal buffer 
     
    13721409            result &= m_data_buffer->setNominalRate(ticks_per_frame); 
    13731410            result &= m_data_buffer->setWrapValue(128L*TICKS_PER_SECOND); 
     1411            result &= m_data_buffer->setBandwidth(STREAMPROCESSOR_DLL_FAST_BW_HZ / (double)TICKS_PER_SECOND); 
    13741412            result &= m_data_buffer->prepare(); // FIXME: the name 
     1413 
     1414            debugOutput(DEBUG_LEVEL_VERBOSE, "DLL info: nominal tpf: %f, update period: %d, bandwidth: %e 1/ticks (%e Hz)\n",  
     1415                        m_data_buffer->getNominalRate(), m_data_buffer->getUpdatePeriod(), m_data_buffer->getBandwidth(), m_data_buffer->getBandwidth() * TICKS_PER_SECOND); 
    13751416 
    13761417            break; 
     
    15211562                ringbuffer_size_frames += syncdelay_in_frames; 
    15221563 
    1523                 debugOutput(DEBUG_LEVEL_VERBOSE, "Prefill transmit SP %p with %u frames\n", this, ringbuffer_size_frames); 
     1564                debugOutput(DEBUG_LEVEL_VERBOSE, "Prefill transmit SP %p with %u frames (sync_delay_frames = %d)\n", 
     1565                            this, ringbuffer_size_frames, syncdelay_in_frames); 
    15241566                // prefill the buffer 
    15251567                if(!transferSilence(ringbuffer_size_frames)) { 
     
    15651607            m_in_xrun = false; 
    15661608            m_local_node_id = m_1394service.getLocalNodeId() & 0x3f; 
     1609            // reduce the DLL bandwidth to what we require 
     1610            result &= m_data_buffer->setBandwidth(m_dll_bandwidth_hz / (double)TICKS_PER_SECOND); 
     1611            // enable the data buffer 
    15671612            m_data_buffer->setTransparent(false); 
     1613            m_last_timestamp2 = 0; // NOTE: no use in checking if we just started running 
    15681614            break; 
    15691615        default: 
  • trunk/libffado/src/libstreaming/generic/StreamProcessor.h

    r1498 r1531  
    215215    bool shiftStream(int nframes); 
    216216 
    217     /** 
    218      * @brief tries to fill/sink the stream as far as possible 
    219      */ 
    220     void flush(); 
    221  
    222217protected: // the helper receive/transmit functions 
    223218    enum eChildReturnValue { 
     
    378373         * @return the sync delay (in ticks) 
    379374         */ 
    380         unsigned int getSyncDelay() {return m_sync_delay;}
     375        unsigned int getSyncDelay()
    381376        unsigned int getSyncDelayFrames(); 
    382377        /** 
    383378         * sets the sync delay 
     379         *  
     380         * note: will be rounded to an integer number of packets 
     381         *  
    384382         * @param d sync delay 
    385383         */ 
    386         void setSyncDelay(unsigned int d); 
     384        void setSyncDelay(unsigned int ticks); 
    387385 
    388386        /** 
     
    405403        float getTicksPerFrame(); 
    406404        void setTicksPerFrame(float tpf); 
     405 
     406        bool setDllBandwidth(float bw); 
    407407 
    408408        int getBufferFill(); 
     
    452452    protected: 
    453453        float m_ticks_per_frame; 
    454         unsigned int m_sync_delay; 
     454        float m_dll_bandwidth_hz; 
     455        unsigned int m_sync_delay_frames; 
    455456    private: 
    456457        bool m_in_xrun; 
  • trunk/libffado/src/libstreaming/StreamProcessorManager.cpp

    r1511 r1531  
    4242 
    4343StreamProcessorManager::StreamProcessorManager(DeviceManager &p) 
    44     : m_is_slave( false ) 
     44    : m_time_of_transfer ( 0 ) 
     45    #ifdef DEBUG 
     46    , m_time_of_transfer2 ( 0 ) 
     47    #endif 
     48    , m_is_slave( false ) 
    4549    , m_SyncSource(NULL) 
    4650    , m_parent( p ) 
     
    6266StreamProcessorManager::StreamProcessorManager(DeviceManager &p, unsigned int period, 
    6367                                               unsigned int framerate, unsigned int nb_buffers) 
    64     : m_is_slave( false ) 
     68    : m_time_of_transfer ( 0 ) 
     69    #ifdef DEBUG 
     70    , m_time_of_transfer2 ( 0 ) 
     71    #endif 
     72    , m_is_slave( false ) 
    6573    , m_SyncSource(NULL) 
    6674    , m_parent( p ) 
     
    484492    int max_of_min_delay = 0; 
    485493    int min_delay = 0; 
     494    int packet_size_frames = 0; 
     495    int max_packet_size_frames = 0; 
     496 
    486497    for ( StreamProcessorVectorIterator it = m_ReceiveProcessors.begin(); 
    487498            it != m_ReceiveProcessors.end(); 
     
    489500        min_delay = (*it)->getMaxFrameLatency(); 
    490501        if(min_delay > max_of_min_delay) max_of_min_delay = min_delay; 
    491     } 
     502        packet_size_frames = (*it)->getNominalFramesPerPacket(); 
     503        if(packet_size_frames > max_packet_size_frames) max_packet_size_frames = packet_size_frames; 
     504    } 
     505    for ( StreamProcessorVectorIterator it = m_TransmitProcessors.begin(); 
     506            it != m_TransmitProcessors.end(); 
     507            ++it ) { 
     508        packet_size_frames = (*it)->getNominalFramesPerPacket(); 
     509        if(packet_size_frames > max_packet_size_frames) max_packet_size_frames = packet_size_frames; 
     510    } 
     511    debugOutput( DEBUG_LEVEL_VERBOSE, " max_of_min_delay = %d, max_packet_size_frames = %d...\n", max_of_min_delay, max_packet_size_frames); 
    492512 
    493513    // add some processing margin. This only shifts the time 
    494514    // at which the buffer is transfer()'ed. This makes things somewhat 
    495     // more robust. It should be noted though that shifting the transfer 
    496     // time to a later time instant also causes the xmit buffer fill to be 
    497     // lower on average. 
     515    // more robust. 
    498516    max_of_min_delay += signal_delay_ticks; 
    499517 
     518    // Note that the equivalent number of frames is added to the  
     519    // transmit buffer to ensure that it keeps a good buffer fill, no matter 
     520    // what the sync delay is. 
    500521    m_SyncSource->setSyncDelay(max_of_min_delay); 
    501522    unsigned int syncdelay = m_SyncSource->getSyncDelay(); 
     
    523544        // check if we were woken up too soon 
    524545        time_till_next_period = m_SyncSource->getTimeUntilNextPeriodSignalUsecs(); 
    525         debugOutput( DEBUG_LEVEL_VERY_VERBOSE, "waiting for %d usecs...\n", time_till_next_period); 
     546        debugOutput( DEBUG_LEVEL_VERBOSE, "waiting for %d usecs...\n", time_till_next_period); 
    526547        if(time_till_next_period > 0) { 
    527548            // wait for the period 
     
    533554    // FIXME: in the SPM it would be nice to have system time instead of 
    534555    //        1394 time 
     556 
     557    float syncrate = 0.0; 
     558    float tpf = m_SyncSource->getTicksPerFrame(); 
     559    if (tpf > 0.0) { 
     560        syncrate = 24576000.0/tpf; 
     561    } else { 
     562        debugWarning("tpf <= 0? %f\n", tpf); 
     563    } 
     564    debugOutput( DEBUG_LEVEL_VERBOSE, " sync source frame rate: %f fps (%f tpf)\n", syncrate, tpf); 
     565 
     566    m_SyncSource->setSyncDelay(max_of_min_delay); 
     567    syncdelay = m_SyncSource->getSyncDelay(); 
     568    debugOutput( DEBUG_LEVEL_VERBOSE, " updated sync delay = %d => %d ticks (%f frames) (%03us %04uc %04ut)...\n",  
     569        max_of_min_delay, syncdelay, syncdelay/tpf, 
     570        (unsigned int)TICKS_TO_SECS(syncdelay), 
     571        (unsigned int)TICKS_TO_CYCLES(syncdelay), 
     572        (unsigned int)TICKS_TO_OFFSET(syncdelay)); 
    535573 
    536574    // we now should have decent sync info on the sync source 
     
    547585    // this is the time window we have to setup all SP's such that they  
    548586    // can start wet-running correctly. 
     587    // we have to round this time to an integer number of audio packets 
     588    double time_for_startup_abs = (double)(cycles_for_startup * TICKS_PER_CYCLE); 
     589    int time_for_startup_frames = (int)(time_for_startup_abs / tpf); 
     590    time_for_startup_frames = ((time_for_startup_frames / max_packet_size_frames) + 1) * max_packet_size_frames; 
     591    uint64_t time_for_startup_ticks = (uint64_t)((float)time_for_startup_frames * tpf); 
     592 
    549593    time_of_first_sample = addTicks(time_of_first_sample, 
    550                                     cycles_for_startup * TICKS_PER_CYCLE); 
     594                                    time_for_startup_ticks); 
     595    debugOutput( DEBUG_LEVEL_VERBOSE, "  add %d frames (%011llu ticks)...\n",  
     596        time_for_startup_frames, time_for_startup_ticks); 
    551597 
    552598    debugOutput( DEBUG_LEVEL_VERBOSE, "  => first sample at TS=%011llu (%03us %04uc %04ut)...\n",  
     
    558604    // we should start wet-running the transmit SP's some cycles in advance 
    559605    // such that we know it is wet-running when it should output its first sample 
    560     uint64_t time_to_start_xmit = substractTicks(time_of_first_sample,  
     606    uint64_t time_to_start_xmit = substractTicks(time_of_first_sample, 
    561607                                                 prestart_cycles_for_xmit * TICKS_PER_CYCLE); 
    562608 
     
    580626          ++it ) { 
    581627        (*it)->setBufferHeadTimestamp(time_of_first_sample); 
     628        ffado_timestamp_t ts; 
     629        signed int fc; 
     630        (*it)->getBufferHeadTimestamp ( &ts, &fc ); 
     631        debugOutput( DEBUG_LEVEL_VERBOSE, " transmit buffer tail %010lld => head TS %010lld, fc=%d...\n", 
     632                    time_of_first_sample, (uint64_t)ts, fc); 
    582633    } 
    583634 
     
    621672    // note: the SP's are scheduled to start in STREAMPROCESSORMANAGER_CYCLES_FOR_STARTUP cycles, 
    622673    // so a 20 times this value should be a good timeout 
    623     int cnt = cycles_for_startup * 20; // by then it should have started 
     674    //int cnt = cycles_for_startup * 20; // by then it should have started 
     675    // or maybe we just have to use 1 second, as this wraps the cycle counter 
     676    int cnt = 8000; 
    624677    while (!m_SyncSource->isRunning() && cnt) { 
    625678        SleepRelativeUsec(125); 
     
    634687    m_time_of_transfer = m_SyncSource->getTimeAtPeriod(); 
    635688 
    636     // and a (still very rough) approximation of the rate 
     689    // and a (rough) approximation of the rate 
    637690    float rate = m_SyncSource->getTicksPerFrame(); 
    638     int64_t delay_in_ticks=(int64_t)(((float)((m_nb_buffers-1) * m_period)) * rate); 
    639     // also add the sync delay 
    640     delay_in_ticks += m_SyncSource->getSyncDelay(); 
     691 
     692    #ifdef DEBUG 
     693    // the time at which the previous period would have passed 
     694    m_time_of_transfer2 = m_time_of_transfer; 
     695    m_time_of_transfer2 = substractTicks(m_time_of_transfer2, (uint64_t)(m_period * rate)); 
     696    #endif 
     697 
    641698    debugOutput( DEBUG_LEVEL_VERBOSE, "  initial time of transfer %010lld, rate %f...\n", 
    642699                m_time_of_transfer, rate); 
     700 
     701    int64_t delay_in_ticks = (int64_t)(((float)((m_nb_buffers-1) * m_period)) * rate); 
     702    // also add the sync delay 
     703    delay_in_ticks = addTicks(delay_in_ticks, m_SyncSource->getSyncDelay()); 
     704 
    643705 
    644706    // then use this information to initialize the xmit handlers 
     
    653715 
    654716    int64_t transmit_tail_timestamp = addTicks(m_time_of_transfer, delay_in_ticks); 
    655  
    656717    debugOutput( DEBUG_LEVEL_VERBOSE, "  preset transmit tail TS %010lld, rate %f...\n", 
    657718                transmit_tail_timestamp, rate); 
     
    660721        it != m_TransmitProcessors.end(); 
    661722        ++it ) { 
     723        (*it)->setTicksPerFrame(rate); 
    662724        (*it)->setBufferTailTimestamp(transmit_tail_timestamp); 
    663         (*it)->setTicksPerFrame(rate); 
     725        ffado_timestamp_t ts; 
     726        signed int fc; 
     727        (*it)->getBufferHeadTimestamp ( &ts, &fc ); 
     728        debugOutput( DEBUG_LEVEL_VERBOSE, "   => transmit head TS %010lld, fc=%d...\n", 
     729                    (uint64_t)ts, fc); 
    664730    } 
    665731 
     
    11211187     
    11221188    #ifdef DEBUG 
    1123     static uint64_t m_time_of_transfer2 = m_time_of_transfer
     1189    int ticks_per_period = (int)(m_SyncSource->getTicksPerFrame() * m_period)
    11241190     
    1125     int ticks_per_period = (int)(m_SyncSource->getTicksPerFrame() * m_period); 
    1126     int diff=diffTicks(m_time_of_transfer, m_time_of_transfer2); 
     1191    int diff = diffTicks(m_time_of_transfer, m_time_of_transfer2); 
    11271192    // display message if the difference between two successive tick 
    11281193    // values is more than 50 ticks. 1 sample at 48k is 512 ticks 
  • trunk/libffado/src/libstreaming/StreamProcessorManager.h

    r1498 r1531  
    141141    // for the transmit SP's 
    142142    uint64_t m_time_of_transfer; 
     143    #ifdef DEBUG 
     144    uint64_t m_time_of_transfer2; 
     145    #endif 
    143146 
    144147public: 
  • trunk/libffado/src/libutil/Configuration.cpp

    r1498 r1531  
    6464                return false; 
    6565            } catch (ParseException& e) { 
    66                 debugOutput(DEBUG_LEVEL_VERBOSE, "Could not parse file: %s\n", filename.c_str()); 
     66                debugWarning("Could not parse file: %s\n", filename.c_str()); 
    6767                delete c; 
    6868                return false; 
    6969            } catch (...) { 
    70                 debugOutput(DEBUG_LEVEL_VERBOSE, "Unknown exception when opening file: %s\n", filename.c_str()); 
     70                debugWarning("Unknown exception when opening file: %s\n", filename.c_str()); 
    7171                delete c; 
    7272                return false; 
     
    270270} 
    271271 
     272bool 
     273Configuration::getValueForSetting(std::string path, float &ref) 
     274{ 
     275    libconfig::Setting *s = getSetting( path ); 
     276    if(s) { 
     277        // FIXME: this can be done using the libconfig methods 
     278        Setting::Type t = s->getType(); 
     279        if(t == Setting::TypeFloat) { 
     280            ref = *s; 
     281            debugOutput(DEBUG_LEVEL_VERBOSE, "path '%s' has value %f\n", path.c_str(), ref); 
     282            return true; 
     283        } else { 
     284            debugOutput(DEBUG_LEVEL_VERBOSE, "path '%s' has wrong type\n", path.c_str()); 
     285            return false; 
     286        } 
     287    } else { 
     288        debugOutput(DEBUG_LEVEL_VERBOSE, "path '%s' not found\n", path.c_str()); 
     289        return false; 
     290    } 
     291} 
     292 
    272293libconfig::Setting * 
    273294Configuration::getSetting( std::string path ) 
     
    289310} 
    290311 
    291  
    292 Configuration::VendorModelEntry 
    293 Configuration::findDeviceVME( unsigned int vendor_id, unsigned model_id ) 
     312bool 
     313Configuration::getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, int32_t &ref) 
     314
     315    libconfig::Setting *s = getDeviceSetting( vendor_id, model_id ); 
     316    if(s) { 
     317        try { 
     318            return s->lookupValue(setting, ref); 
     319        } catch (...) { 
     320            debugOutput(DEBUG_LEVEL_VERBOSE, "Setting %s not found\n", setting.c_str()); 
     321            return false; 
     322        } 
     323    } else { 
     324        debugOutput(DEBUG_LEVEL_VERBOSE, "device %X/%X not found\n", vendor_id, model_id); 
     325        return false; 
     326    } 
     327
     328 
     329bool 
     330Configuration::getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, int64_t &ref) 
     331
     332    libconfig::Setting *s = getDeviceSetting( vendor_id, model_id ); 
     333    if(s) { 
     334        try { 
     335            return s->lookupValue(setting, ref); 
     336        } catch (...) { 
     337            debugOutput(DEBUG_LEVEL_VERBOSE, "Setting %s not found\n", setting.c_str()); 
     338            return false; 
     339        } 
     340    } else { 
     341        debugOutput(DEBUG_LEVEL_VERBOSE, "device %X/%X not found\n", vendor_id, model_id); 
     342        return false; 
     343    } 
     344
     345 
     346bool 
     347Configuration::getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, float &ref) 
     348
     349    libconfig::Setting *s = getDeviceSetting( vendor_id, model_id ); 
     350    if(s) { 
     351        try { 
     352            return s->lookupValue(setting, ref); 
     353        } catch (...) { 
     354            debugOutput(DEBUG_LEVEL_VERBOSE, "Setting %s not found\n", setting.c_str()); 
     355            return false; 
     356        } 
     357    } else { 
     358        debugOutput(DEBUG_LEVEL_VERBOSE, "device %X/%X not found\n", vendor_id, model_id); 
     359        return false; 
     360    } 
     361
     362 
     363libconfig::Setting * 
     364Configuration::getDeviceSetting( unsigned int vendor_id, unsigned model_id ) 
    294365{ 
    295366    for ( std::vector<ConfigFile *>::iterator it = m_ConfigFiles.begin(); 
     
    309380                    uint32_t mid = modelid; 
    310381                    if (vendor_id == vid && model_id == mid) { 
    311                         struct VendorModelEntry vme; 
    312                         vme.vendor_id = vendorid; 
    313                         vme.model_id = modelid; 
    314  
    315                         const char *tmp = s["vendorname"]; 
    316                         vme.vendor_name = tmp; 
    317                         tmp = s["modelname"]; 
    318                         vme.model_name = tmp; 
    319                         vme.driver = s["driver"]; 
    320382                        debugOutput(DEBUG_LEVEL_VERBOSE, 
    321383                                    "  device VME for %X:%x found in %s\n", 
    322384                                    vendor_id, model_id, c->getName().c_str()); 
    323385                        c->showSetting(s); 
    324                         return vme
     386                        return &s
    325387                    } 
    326388                } catch (...) { 
     
    330392        } catch (...) { 
    331393            debugOutput(DEBUG_LEVEL_VERBOSE, "  %s has no device definitions\n", c->getName().c_str()); 
     394        } 
     395    } 
     396    return NULL; 
     397} 
     398 
     399 
     400 
     401Configuration::VendorModelEntry 
     402Configuration::findDeviceVME( unsigned int vendor_id, unsigned model_id ) 
     403{ 
     404 
     405    // FIXME: clean this pointer/reference mess please 
     406    Setting *ps = getDeviceSetting(vendor_id, model_id); 
     407 
     408    if(ps) { 
     409        Setting &s = *ps; 
     410        try { 
     411            Setting &vendorid = s["vendorid"]; 
     412            Setting &modelid = s["modelid"]; 
     413            uint32_t vid = vendorid; 
     414            uint32_t mid = modelid; 
     415            if (vendor_id == vid && model_id == mid) { 
     416                struct VendorModelEntry vme; 
     417                vme.vendor_id = vendorid; 
     418                vme.model_id = modelid; 
     419 
     420                const char *tmp = s["vendorname"]; 
     421                vme.vendor_name = tmp; 
     422                tmp = s["modelname"]; 
     423                vme.model_name = tmp; 
     424                vme.driver = s["driver"]; 
     425                return vme; 
     426            } else { 
     427                debugError("BUG: vendor/model found but not found?\n"); 
     428            } 
     429        } catch (...) { 
     430            debugWarning("Bogus format\n"); 
    332431        } 
    333432    } 
  • trunk/libffado/src/libutil/Configuration.h

    r1498 r1531  
    126126    bool getValueForSetting(std::string path, int32_t &ref); 
    127127    bool getValueForSetting(std::string path, int64_t &ref); 
     128    bool getValueForSetting(std::string path, float &ref); 
     129 
     130    /** 
     131     * @brief retrieves a setting for a given device 
     132     *  
     133     * the value in the ref parameter is not changed if 
     134     * the function returns false. 
     135     *  
     136     * @param vendor_id vendor id for the device 
     137     * @param model_id  model id for the device 
     138     * @param setting name of the setting 
     139     * @param ref reference to the integer that will hold the value. 
     140     * @return true if successful, false if not 
     141     */ 
     142    bool getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, int32_t &ref); 
     143    bool getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, int64_t &ref); 
     144    bool getValueForDeviceSetting(unsigned int vendor_id, unsigned model_id, std::string setting, float &ref); 
    128145 
    129146    virtual void setVerboseLevel(int l) {setDebugLevel(l);}; 
     
    132149private: 
    133150    libconfig::Setting *getSetting( std::string path ); 
     151    libconfig::Setting *getDeviceSetting( unsigned int vendor_id, unsigned model_id ); 
    134152 
    135153    int findFileName(std::string s); 
  • trunk/libffado/src/libutil/TimestampedBuffer.cpp

    r1498 r1531  
    3636#define DLL_PI        (3.141592653589793238) 
    3737#define DLL_SQRT2     (1.414213562373095049) 
    38 #define DLL_OMEGA     (2.0*DLL_PI*TIMESTAMPEDBUFFER_DLL_BANDWIDTH) 
     38#define DLL_2PI       (2.0 * DLL_PI) 
     39 
     40// these are the defaults 
     41#define DLL_OMEGA     (DLL_2PI * 0.01) 
    3942#define DLL_COEFF_B   (DLL_SQRT2 * DLL_OMEGA) 
    4043#define DLL_COEFF_C   (DLL_OMEGA * DLL_OMEGA) 
     
    5558    pthread_mutex_unlock(&m_framecounter_lock); \ 
    5659    } 
     60 
    5761 
    5862namespace Util { 
     
    6872      m_wrap_at(0xFFFFFFFFFFFFFFFFLLU), 
    6973      m_Client(c), m_framecounter(0), 
    70       m_buffer_tail_timestamp(0.0), 
    71       m_buffer_next_tail_timestamp(0.0), 
     74      m_buffer_tail_timestamp(TIMESTAMP_MAX + 1.0), 
     75      m_buffer_next_tail_timestamp(TIMESTAMP_MAX + 1.0), 
    7276      m_dll_e2(0.0), m_dll_b(DLL_COEFF_B), m_dll_c(DLL_COEFF_C), 
    7377      m_nominal_rate(0.0), m_current_rate(0.0), m_update_period(0) 
     
    8488 
    8589/** 
    86  * \brief Set the nominal rate in frames/timeunit 
    87  * 
    88  * Sets the nominal rate in frames per time unit. This rate is used 
     90 * \brief Set the bandwidth of the DLL 
     91 * 
     92 * Sets the bandwith of the DLL in absolute frequency 
     93 * 
     94 * @param bw bandwidth in absolute frequency 
     95 * @return true if successful 
     96 */ 
     97bool TimestampedBuffer::setBandwidth(double bw) { 
     98    double curr_bw = getBandwidth(); 
     99    debugOutput(DEBUG_LEVEL_VERBOSE," bandwidth %e => %e\n", 
     100                                    curr_bw, bw); 
     101    double tupdate = m_nominal_rate * (float)m_update_period; 
     102    double bw_rel = bw * tupdate; 
     103    if(bw_rel >= 0.5) { 
     104        debugError("Requested bandwidth out of range: %f > %f\n", bw, 0.5 / tupdate); 
     105        return false; 
     106    } 
     107    ENTER_CRITICAL_SECTION; 
     108    m_dll_b = bw_rel * (DLL_SQRT2 * DLL_2PI); 
     109    m_dll_c = bw_rel * bw_rel * DLL_2PI * DLL_2PI; 
     110    EXIT_CRITICAL_SECTION; 
     111    return true; 
     112
     113 
     114/** 
     115 * \brief Returns the current bandwidth of the DLL 
     116 * 
     117 * Returns the current bandwith of the DLL in absolute frequency 
     118 * 
     119 * @return bandwidth in absolute frequency 
     120 */ 
     121double TimestampedBuffer::getBandwidth() { 
     122    double tupdate = m_nominal_rate * (float)m_update_period; 
     123    double curr_bw = m_dll_b / (DLL_SQRT2 * DLL_2PI * tupdate); 
     124    return curr_bw; 
     125
     126 
     127 
     128/** 
     129 * \brief Set the nominal rate in timeunits/frame 
     130 * 
     131 * Sets the nominal rate in time units per frame. This rate is used 
    89132 * to initialize the DLL that will extract the effective rate based 
    90133 * upon the timestamps it gets fed. 
     
    94137 */ 
    95138bool TimestampedBuffer::setNominalRate(float r) { 
     139    debugOutput(DEBUG_LEVEL_VERBOSE," nominal rate %e => %e\n", 
     140                                    m_nominal_rate, r); 
    96141    m_nominal_rate=r; 
    97     debugOutput(DEBUG_LEVEL_VERBOSE," nominal rate=%e set to %e\n", 
    98                                     m_nominal_rate, r); 
    99142    return true; 
    100143} 
     
    160203    ENTER_CRITICAL_SECTION; 
    161204 
    162     m_dll_e2 = m_update_period * (double)rate; 
     205    m_current_rate = rate; 
     206    m_dll_e2 = m_update_period * m_current_rate; 
    163207    m_buffer_next_tail_timestamp = (ffado_timestamp_t)((double)m_buffer_tail_timestamp + m_dll_e2); 
    164208 
     
    289333 * 
    290334 * Resets the TimestampedBuffer, clearing the buffers and counters. 
    291  * Also resets the DLL to the nominal values. 
     335 * [DEL Also resets the DLL to the nominal values. DEL] 
    292336 * 
    293337 * \note when this is called, you should make sure that the buffer 
     
    302346 
    303347    m_current_rate = m_nominal_rate; 
    304     m_dll_e2=m_nominal_rate * (float)m_update_period; 
    305     // this will init the internal timestamps to a sensible value 
    306     setBufferTailTimestamp(m_buffer_tail_timestamp); 
     348    m_dll_e2 = m_current_rate * (float)m_update_period; 
    307349 
    308350    return true; 
     
    360402 
    361403    // init the DLL 
    362     m_dll_e2=m_nominal_rate * (float)m_update_period; 
    363  
    364     m_dll_b=((float)(DLL_COEFF_B)); 
    365     m_dll_c=((float)(DLL_COEFF_C)); 
    366      
    367     // this will init the internal timestamps to a sensible value 
    368     setBufferTailTimestamp(m_buffer_tail_timestamp); 
     404    m_dll_e2 = m_nominal_rate * (float)m_update_period; 
     405 
     406    // init the timestamps to a bogus value, as there is not 
     407    // really something sane to say about them 
     408    m_buffer_tail_timestamp = TIMESTAMP_MAX + 1.0; 
     409    m_buffer_next_tail_timestamp = TIMESTAMP_MAX + 1.0; 
    369410 
    370411    return true; 
     
    423464        // while disabled, we don't update the DLL, nor do we write frames 
    424465        // we just set the correct timestamp for the frames 
     466        if (m_buffer_tail_timestamp < TIMESTAMP_MAX && m_buffer_next_tail_timestamp < TIMESTAMP_MAX) { 
     467            incrementFrameCounter(nframes, ts); 
     468            decrementFrameCounter(nframes); 
     469        } 
    425470        setBufferTailTimestamp(ts); 
    426471    } else { 
     
    461506        return false; 
    462507    } 
    463      
     508 
    464509    // make sure the head timestamp remains identical 
    465510    signed int fc; 
     
    756801 
    757802    // add the offsets 
    758     ffado_timestamp_t ts=new_timestamp; 
     803    ffado_timestamp_t ts = new_timestamp; 
    759804 
    760805    if (ts >= m_wrap_at) { 
     
    777822    m_buffer_tail_timestamp = ts; 
    778823 
    779     m_dll_e2=m_update_period * (double)m_nominal_rate; 
     824    m_dll_e2 = m_update_period * (double)m_current_rate; 
    780825    m_buffer_next_tail_timestamp = (ffado_timestamp_t)((double)m_buffer_tail_timestamp + m_dll_e2); 
    781826 
     
    804849#ifdef DEBUG 
    805850    if (new_timestamp >= m_wrap_at) { 
    806         debugWarning("timestamp not wrapped: "TIMESTAMP_FORMAT_SPEC"\n",new_timestamp); 
     851        debugWarning("timestamp not wrapped: "TIMESTAMP_FORMAT_SPEC"\n", new_timestamp); 
    807852    } 
    808853#endif 
     
    813858 
    814859    // add the time 
    815     ts += (ffado_timestamp_t)(m_nominal_rate * (float)m_framecounter); 
     860    ts += (ffado_timestamp_t)(m_current_rate * (float)(m_framecounter)); 
    816861 
    817862    if (ts >= m_wrap_at) { 
     
    823868    m_buffer_tail_timestamp = ts; 
    824869 
    825     m_dll_e2=m_update_period * (double)m_nominal_rate; 
     870    m_dll_e2 = m_update_period * (double)m_current_rate; 
    826871    m_buffer_next_tail_timestamp = (ffado_timestamp_t)((double)m_buffer_tail_timestamp + m_dll_e2); 
    827872 
     
    908953    ffado_timestamp_t retval; 
    909954    ENTER_CRITICAL_SECTION; 
    910     retval = getTimestampFromTail(m_framecounter-nframes); 
     955    retval = getTimestampFromTail(m_framecounter - nframes); 
    911956    EXIT_CRITICAL_SECTION; 
    912957    return retval; 
     
    9581003 
    9591004#ifdef DEBUG 
     1005 
    9601006    // check whether the update is within the allowed bounds 
    9611007    ffado_timestamp_t max_abs_diff = 3072/2; // half a cycle is what we consider 'normal' 
     
    10611107    debugOutputShort( DEBUG_LEVEL_NORMAL, "   Timestamps           : head: "TIMESTAMP_FORMAT_SPEC", Tail: "TIMESTAMP_FORMAT_SPEC", Next tail: "TIMESTAMP_FORMAT_SPEC"\n", 
    10621108                                          ts_head, m_buffer_tail_timestamp, m_buffer_next_tail_timestamp); 
    1063     debugOutputShort( DEBUG_LEVEL_NORMAL, "    Head - Tail         : "TIMESTAMP_FORMAT_SPEC"\n", diff); 
     1109    debugOutputShort( DEBUG_LEVEL_NORMAL, "    Head - Tail         : "TIMESTAMP_FORMAT_SPEC" (%f frames)\n", diff, diff/m_dll_e2*m_update_period); 
    10641110    debugOutputShort( DEBUG_LEVEL_NORMAL, "   DLL Rate             : %f (%f)\n", m_dll_e2, m_dll_e2/m_update_period); 
     1111    debugOutputShort( DEBUG_LEVEL_NORMAL, "   DLL Bandwidth        : %10e 1/ticks (%f Hz)\n", getBandwidth(), getBandwidth() * TICKS_PER_SECOND); 
    10651112} 
    10661113 
  • trunk/libffado/src/libutil/TimestampedBuffer.h

    r1336 r1531  
    3131//typedef float ffado_timestamp_t; 
    3232//#define TIMESTAMP_FORMAT_SPEC "%14.3f" 
     33 
    3334typedef double ffado_timestamp_t; 
    3435#define TIMESTAMP_FORMAT_SPEC "%14.3f" 
     36#define TIMESTAMP_MAX 3145728000.0 
     37 
    3538// typedef int64_t ffado_timestamp_t; 
    3639// #define TIMESTAMP_FORMAT_SPEC "%012lld" 
     
    136139 
    137140        // dll stuff 
     141        bool setBandwidth(double bw); 
     142        double getBandwidth(); 
    138143        bool setNominalRate ( float r ); 
    139144        float getNominalRate() {return m_nominal_rate;}; 
  • trunk/libffado/src/motu/motu_avdevice.cpp

    r1502 r1531  
    11/* 
    22 * Copyright (C) 2005-2008 by Pieter Palmers 
    3  * Copyright (C) 2005-2008 by Jonathan Woithe 
     3 * Copyright (C) 2005-2009 by Jonathan Woithe 
    44 * 
    55 * This file is part of FFADO 
     
    2323 */ 
    2424 
     25#include "config.h" 
     26 
    2527#include "motu/motu_avdevice.h" 
     28 
     29#include "devicemanager.h" 
    2630 
    2731#include "libieee1394/configrom.h" 
     
    110114    {"Analog8", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 37}, 
    111115    {"Analog8", MOTU_PA_INOUT | MOTU_PA_RATE_4x|MOTU_PA_OPTICAL_ANY, 31}, 
    112     {"MainOut-L", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 40}, 
    113     {"MainOut-R", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 43}, 
    114     {"AES/EBU1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 46}, 
    115     {"AES/EBU2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 49}, 
    116     {"ADAT1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 52}, 
    117     {"ADAT2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 55}, 
    118     {"ADAT3", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 58}, 
    119     {"ADAT4", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 61}, 
    120     {"ADAT5", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 64}, 
    121     {"ADAT6", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 67}, 
    122     {"ADAT7", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 70}, 
    123     {"ADAT8", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 73}, 
     116    {"MainOut-L", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 40}, 
     117    {"MainOut-R", MOTU_PA_OUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 43}, 
     118    {"unknown-1", MOTU_PA_IN | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 40}, 
     119    {"unknown-2", MOTU_PA_IN | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ANY, 43}, 
     120    {"ADAT1", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 46}, 
     121    {"ADAT2", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 49}, 
     122    {"ADAT3", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 52}, 
     123    {"ADAT4", MOTU_PA_INOUT | MOTU_PA_RATE_1x2x|MOTU_PA_OPTICAL_ADAT, 55}, 
     124    {"ADAT5", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 58}, 
     125    {"ADAT6", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 61}, 
     126    {"ADAT7", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 64}, 
     127    {"ADAT8", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ADAT, 67}, 
     128    {"AES/EBU1", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ANY, 70}, 
     129    {"AES/EBU2", MOTU_PA_INOUT | MOTU_PA_RATE_1x|MOTU_PA_OPTICAL_ANY, 73}, 
     130    {"AES/EBU1", MOTU_PA_INOUT | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ANY, 58}, 
     131    {"AES/EBU2", MOTU_PA_INOUT | MOTU_PA_RATE_2x|MOTU_PA_OPTICAL_ANY, 61}, 
    124132}; 
    125133 
     
    334342    {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
    335343    {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
     344    {"Mainout_",  "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, 
     345    {"Phones_",   "Phones ",  "", MOTU_CTRL_MIX_FADER, 0x0c10, }, 
    336346 
    337347    /* For mic/line input controls, the "register" is the zero-based channel number */ 
     
    388398    {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
    389399    {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
     400    {"Mainout_",  "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, 
     401    {"Phones_",   "Phones ",  "", MOTU_CTRL_MIX_FADER, 0x0c10, }, 
     402 
     403    /* For mic/line input controls, the "register" is the zero-based channel number */ 
     404    {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 0}, 
     405    {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 1}, 
     406    {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 2}, 
     407    {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 3}, 
     408    {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 4}, 
     409    {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 5}, 
     410    {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6}, 
     411    {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7}, 
     412    {"Control/Spdif1_", "SPDIF 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6}, 
     413    {"Control/Spdif2_", "SPDIF 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7}, 
     414 
     415    /* For phones source control, "register" is currently unused */ 
     416    {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, 
     417 
     418    /* For optical mode controls, the "register" is used to indicate direction */ 
     419    {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, 
     420    {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, 
     421}; 
     422 
     423const MatrixMixBus MixerBuses_896HD[] = { 
     424    {"Mix 1", 0x4000, }, 
     425    {"Mix 2", 0x4100, }, 
     426    {"Mix 3", 0x4200, }, 
     427    {"Mix 4", 0x4300, }, 
     428}; 
     429 
     430const MatrixMixChannel MixerChannels_896HD[] = { 
     431    {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, 
     432    {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, 
     433    {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, 
     434    {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, 
     435    {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, 
     436    {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, 
     437    {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, 
     438    {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, 
     439    {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, 
     440    {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, 
     441    {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0048, }, 
     442    {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x004c, }, 
     443    {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0028, }, 
     444    {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x002c, }, 
     445    {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0030, }, 
     446    {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x0034, }, 
     447    {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0038, }, 
     448    {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x003c, }, 
     449    {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0040, }, 
     450    {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x0044, }, 
     451}; 
     452 
     453const MixerCtrl MixerCtrls_896HD[] = { 
     454    {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, 
     455    {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, 
     456    {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
     457    {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
     458    {"Mainout_",  "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, 
     459    {"Phones_",   "Phones ",  "", MOTU_CTRL_MIX_FADER, 0x0c10, }, 
     460 
     461    /* For phones source control, "register" is currently unused */ 
     462    {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, 
     463 
     464    /* For optical mode controls, the "register" is used to indicate direction */ 
     465    {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, 
     466    {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, 
     467 
     468    /* For meter controls the "register" indicates which meter controls are available */ 
     469    {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER, 
     470      MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC |  
     471      MOTU_CTRL_METER_PROG_SRC}, 
     472}; 
     473 
     474const MatrixMixBus MixerBuses_828Mk2[] = { 
     475    {"Mix 1", 0x4000, }, 
     476    {"Mix 2", 0x4100, }, 
     477    {"Mix 3", 0x4200, }, 
     478    {"Mix 4", 0x4300, }, 
     479}; 
     480 
     481const MatrixMixChannel MixerChannels_828Mk2[] = { 
     482    {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, 
     483    {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, 
     484    {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, 
     485    {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, 
     486    {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, 
     487    {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, 
     488    {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, 
     489    {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, 
     490    {"Mic 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, 
     491    {"Mic 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, 
     492    {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, }, 
     493    {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, }, 
     494    {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, }, 
     495    {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, }, 
     496    {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, }, 
     497    {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, }, 
     498    {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, }, 
     499    {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, }, 
     500    {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, }, 
     501    {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, }, 
     502}; 
     503 
     504const MixerCtrl MixerCtrls_828Mk2[] = { 
     505    {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, 
     506    {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, 
     507    {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
     508    {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
     509    {"Mainout_",  "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, 
     510    {"Phones_",   "Phones ",  "", MOTU_CTRL_MIX_FADER, 0x0c10, }, 
    390511 
    391512    /* For mic/line input controls, the "register" is the zero-based channel number */ 
     
    407528}; 
    408529 
    409 const MixerCtrl MixerCtrls_896HD[] = { 
    410     {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, 
    411     {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, 
    412     {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
    413     {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
    414  
    415     /* For phones source control, "register" is currently unused */ 
    416     {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, 
    417  
    418     /* For optical mode controls, the "register" is used to indicate direction */ 
    419     {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, 
    420     {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, 
    421  
    422     /* For meter controls the "register" indicates which meter controls are available */ 
    423     {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER, 
    424       MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC |  
    425       MOTU_CTRL_METER_PROG_SRC}, 
    426 }; 
    427  
    428 const MixerCtrl MixerCtrls_828Mk2[] = { 
    429     {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, 
    430     {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, 
    431     {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 
    432     {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 
    433  
    434     /* For mic/line input controls, the "register" is the zero-based channel number */ 
    435     {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 0}, 
    436     {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 1}, 
    437     {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 2}, 
    438     {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 3}, 
    439     {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4}, 
    440     {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5}, 
    441     {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6}, 
    442     {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7}, 
    443  
    444     /* For phones source control, "register" is currently unused */ 
    445     {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, 
    446  
    447     /* For optical mode controls, the "register" is used to indicate direction */ 
    448     {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, 
    449     {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, 
    450 }; 
    451  
    452530const MotuMixer Mixer_Traveler = MOTUMIXER( 
    453531    MixerCtrls_Traveler, MixerBuses_Traveler, MixerChannels_Traveler); 
     
    457535 
    458536const MotuMixer Mixer_828Mk2 = MOTUMIXER( 
    459     MixerCtrls_828Mk2, MixerBuses_Traveler, MixerChannels_Traveler); 
     537    MixerCtrls_828Mk2, MixerBuses_828Mk2, MixerChannels_828Mk2); 
    460538 
    461539const MotuMixer Mixer_896HD = MOTUMIXER( 
    462     MixerCtrls_896HD, MixerBuses_Traveler, MixerChannels_Traveler); 
     540    MixerCtrls_896HD, MixerBuses_896HD, MixerChannels_896HD); 
    463541 
    464542/* The order of DevicesProperty entries must match the numeric order of the 
     
    645723        } 
    646724 
     725        if (type & MOTU_CTRL_INPUT_UL_GAIN) { 
     726            snprintf(name, 100, "%s%s", ctrl->name, "trimgain"); 
     727            snprintf(label,100, "%s%s", ctrl->label,"trimgain"); 
     728            result &= m_MixerContainer->addElement( 
     729                new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_UL_GAIN, 
     730                    name, label, ctrl->desc)); 
     731            type &= ~MOTU_CTRL_INPUT_UL_GAIN; 
     732        } 
     733        if (type & MOTU_CTRL_INPUT_PHASE_INV) { 
     734            snprintf(name, 100, "%s%s", ctrl->name, "invert"); 
     735            snprintf(label,100, "%s%s", ctrl->label,"invert"); 
     736            result &= m_MixerContainer->addElement( 
     737                new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PHASE_INV, 
     738                    name, label, ctrl->desc)); 
     739            type &= ~MOTU_CTRL_INPUT_PHASE_INV; 
     740        } 
    647741        if (type & MOTU_CTRL_INPUT_TRIMGAIN) { 
    648742            snprintf(name, 100, "%s%s", ctrl->name, "trimgain"); 
    649743            snprintf(label,100, "%s%s", ctrl->label,"trimgain"); 
    650744            result &= m_MixerContainer->addElement( 
    651                 new InputGainPad(*this, ctrl->dev_register, MOTU_CTRL_MODE_TRIMGAIN, 
     745                new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_TRIMGAIN, 
    652746                    name, label, ctrl->desc)); 
    653747            type &= ~MOTU_CTRL_INPUT_TRIMGAIN; 
     
    657751            snprintf(label,100, "%s%s", ctrl->label,"pad"); 
    658752            result &= m_MixerContainer->addElement( 
    659                 new InputGainPad(*this, ctrl->dev_register, MOTU_CTRL_MODE_PAD, 
     753                new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PAD, 
    660754                    name, label, ctrl->desc)); 
    661755            type &= ~MOTU_CTRL_INPUT_PAD; 
     
    756850    result &= m_MixerContainer->addElement( 
    757851        new InfoElement(*this, MOTU_INFO_SAMPLE_RATE, "Info/SampleRate", "Device sample rate", "")); 
    758     result &= m_MixerContainer->addElement( 
    759         new InfoElement(*this, MOTU_INFO_HAS_MIC_INPUTS, "Info/HasMicInputs", "Device has mic inputs", "")); 
    760     result &= m_MixerContainer->addElement( 
    761         new InfoElement(*this, MOTU_INFO_HAS_AESEBU_INPUTS, "Info/HasAESEBUInputs", "Device has AES/EBU inputs", "")); 
    762     result &= m_MixerContainer->addElement( 
    763         new InfoElement(*this, MOTU_INFO_HAS_SPDIF_INPUTS, "Info/HasSPDIFInputs", "Device has SPDIF inputs", "")); 
    764     result &= m_MixerContainer->addElement( 
    765         new InfoElement(*this, MOTU_INFO_HAS_OPTICAL_SPDIF, "Info/HasOpticalSPDIF", "Device has Optical SPDIF", "")); 
    766852 
    767853    if (!addElement(m_MixerContainer)) { 
     
    13151401    } 
    13161402 
     1403    // get the device specific and/or global SP configuration 
     1404    Util::Configuration &config = getDeviceManager().getConfiguration(); 
     1405    // base value is the config.h value 
     1406    float recv_sp_dll_bw = STREAMPROCESSOR_DLL_BW_HZ; 
     1407    float xmit_sp_dll_bw = STREAMPROCESSOR_DLL_BW_HZ; 
     1408 
     1409    // we can override that globally 
     1410    config.getValueForSetting("streaming.spm.recv_sp_dll_bw", recv_sp_dll_bw); 
     1411    config.getValueForSetting("streaming.spm.xmit_sp_dll_bw", xmit_sp_dll_bw); 
     1412 
     1413    // or override in the device section 
     1414    config.getValueForDeviceSetting(getConfigRom().getNodeVendorId(), getConfigRom().getModelId(), "recv_sp_dll_bw", recv_sp_dll_bw); 
     1415    config.getValueForDeviceSetting(getConfigRom().getNodeVendorId(), getConfigRom().getModelId(), "xmit_sp_dll_bw", xmit_sp_dll_bw); 
     1416 
    13171417    m_receiveProcessor=new Streaming::MotuReceiveStreamProcessor(*this, event_size_in); 
     1418    m_receiveProcessor->setVerboseLevel(getDebugLevel()); 
    13181419 
    13191420    // The first thing is to initialize the processor.  This creates the 
     
    13231424        return false; 
    13241425    } 
    1325     m_receiveProcessor->setVerboseLevel(getDebugLevel()); 
     1426 
     1427    if(!m_receiveProcessor->setDllBandwidth(recv_sp_dll_bw)) { 
     1428        debugFatal("Could not set DLL bandwidth\n"); 
     1429        delete m_receiveProcessor; 
     1430        m_receiveProcessor = NULL; 
     1431        return false; 
     1432    } 
    13261433 
    13271434    // Now we add ports to the processor 
     
    13851492    } 
    13861493 
     1494    if(!m_transmitProcessor->setDllBandwidth(xmit_sp_dll_bw)) { 
     1495        debugFatal("Could not set DLL bandwidth\n"); 
     1496        delete m_transmitProcessor; 
     1497        m_transmitProcessor = NULL; 
     1498        return false; 
     1499    } 
     1500 
    13871501    // Now we add ports to the processor 
    13881502    debugOutput(DEBUG_LEVEL_VERBOSE,"Adding ports to transmit processor\n"); 
  • trunk/libffado/src/motu/motu_avdevice.h

    r1502 r1531  
    8585#define MOTU_REG_INPUT_GAIN_PAD_0  0x0c1c 
    8686#define MOTU_REG_CLKSRC_NAME0      0x0c60 
     87#define MOTU_REG_INPUT_GAIN_PHINV0 0x0c70 
     88#define MOTU_REG_INPUT_GAIN_PHINV1 0x0c74 
     89#define MOTU_REG_INPUT_GAIN_PHINV2 0x0c78 
    8790 
    8891/* Port Active Flags (ports declaration) */ 
  • trunk/libffado/src/motu/motu_controls.cpp

    r1498 r1531  
    11/* 
    22 * Copyright (C) 2005-2008 by Pieter Palmers 
    3  * Copyright (C) 2008 by Jonathan Woithe 
     3 * Copyright (C) 2008-2009 by Jonathan Woithe 
    44 * 
    55 * This file is part of FFADO 
     
    723723} 
    724724 
    725 InputGainPad::InputGainPad(MotuDevice &parent, unsigned int channel, unsigned int mode) 
     725InputGainPadInv::InputGainPadInv(MotuDevice &parent, unsigned int channel, unsigned int mode) 
    726726: MotuDiscreteCtrl(parent, channel) 
    727727{ 
     
    730730} 
    731731 
    732 InputGainPad::InputGainPad(MotuDevice &parent, unsigned int channel, unsigned int mode, 
     732InputGainPadInv::InputGainPadInv(MotuDevice &parent, unsigned int channel, unsigned int mode, 
    733733             std::string name, std::string label, std::string descr) 
    734734: MotuDiscreteCtrl(parent, channel, name, label, descr) 
     
    738738} 
    739739 
    740 void InputGainPad::validate(void) { 
    741     if (m_register > MOTU_CTRL_TRIMGAINPAD_MAX_CHANNEL) { 
     740void InputGainPadInv::validate(void) { 
     741    if ((m_mode==MOTU_CTRL_MODE_PAD || m_mode==MOTU_CTRL_MODE_TRIMGAIN) && 
     742        m_register>MOTU_CTRL_TRIMGAINPAD_MAX_CHANNEL) { 
    742743        debugOutput(DEBUG_LEVEL_VERBOSE, "Invalid channel %d: max supported is %d, assuming 0\n",  
    743744            m_register, MOTU_CTRL_TRIMGAINPAD_MAX_CHANNEL); 
    744745        m_register = 0; 
    745746    } 
    746     if (m_mode!=MOTU_CTRL_MODE_PAD && m_mode!=MOTU_CTRL_MODE_TRIMGAIN) { 
     747    if ((m_mode==MOTU_CTRL_MODE_UL_GAIN || m_mode==MOTU_CTRL_MODE_PHASE_INV) && 
     748        m_register>MOTU_CTRL_GAINPHASEINV_MAX_CHANNEL) { 
     749        debugOutput(DEBUG_LEVEL_VERBOSE, "Invalid ultralite channel %d: max supported is %d, assuming 0\n",  
     750            m_register, MOTU_CTRL_GAINPHASEINV_MAX_CHANNEL); 
     751        m_register = 0; 
     752    } 
     753    if (m_mode!=MOTU_CTRL_MODE_PAD && m_mode!=MOTU_CTRL_MODE_TRIMGAIN && 
     754        m_mode!=MOTU_CTRL_MODE_UL_GAIN && m_mode!=MOTU_CTRL_MODE_PHASE_INV) { 
    747755        debugOutput(DEBUG_LEVEL_VERBOSE, "Invalid mode %d, assuming %d\n", m_mode, MOTU_CTRL_MODE_PAD); 
    748756        m_mode = MOTU_CTRL_MODE_PAD; 
     
    750758} 
    751759 
    752 unsigned int InputGainPad::dev_register(void) { 
     760unsigned int InputGainPadInv::dev_register(void) { 
    753761    /* Work out the device register to use for the associated channel */ 
    754     if (m_register>=0 && m_register<=3) { 
    755       return MOTU_REG_INPUT_GAIN_PAD_0;       
     762    /* Registers for gain/phase inversion controls on the Ultralite differ from those 
     763     * of other devices. 
     764     */ 
     765    if (m_mode==MOTU_CTRL_MODE_PAD || m_mode==MOTU_CTRL_MODE_TRIMGAIN) { 
     766       if (m_register>=0 && m_register<=3) { 
     767          return MOTU_REG_INPUT_GAIN_PAD_0;       
     768       } else { 
     769          debugOutput(DEBUG_LEVEL_VERBOSE, "unsupported channel %d\n", m_register); 
     770       } 
    756771    } else { 
    757       debugOutput(DEBUG_LEVEL_VERBOSE, "unsupported channel %d\n", m_register); 
     772       if (m_register>=0 && m_register<=3) 
     773          return MOTU_REG_INPUT_GAIN_PHINV0; 
     774       else if (m_register>=4 && m_register<=7) 
     775          return MOTU_REG_INPUT_GAIN_PHINV1; 
     776       else if (m_register>=8 && m_register<=11) 
     777          return MOTU_REG_INPUT_GAIN_PHINV2; 
     778       else { 
     779          debugOutput(DEBUG_LEVEL_VERBOSE, "unsupported ultralite channel %d\n", m_register); 
     780       } 
    758781    } 
    759782    return 0; 
     
    761784              
    762785bool 
    763 InputGainPad::setValue(int v) 
     786InputGainPadInv::setValue(int v) 
    764787{ 
    765788    unsigned int val; 
     
    785808    switch (m_mode) { 
    786809        case MOTU_CTRL_MODE_PAD: 
    787             // Set pad bit (bit 6 of relevant channel's byte) 
     810        case MOTU_CTRL_MODE_PHASE_INV: 
     811            // Set pad/phase inversion bit (bit 6 of relevant channel's byte) 
    788812            if (v == 0) { 
    789813                val &= ~(0x40 << reg_shift); 
     
    793817            break; 
    794818      case MOTU_CTRL_MODE_TRIMGAIN: 
     819      case MOTU_CTRL_MODE_UL_GAIN: 
    795820            // Set the gain trim (bits 0-5 of the channel's byte).  Maximum 
    796             // gain is 53 dB. 
    797             if (v > 0x35) 
    798                 v = 0x35; 
     821            // gain is 53 dB for trimgain on non-ultralite devices.  For 
     822            // ultralites, mic inputs max out at 0x18, line inputs at 0x12 
     823            // and spdif inputs at 0x0c.  We just clip at 0x18 for now. 
     824            if (m_mode==MOTU_CTRL_MODE_TRIMGAIN) { 
     825               if (v > 0x35) 
     826                  v = 0x35; 
     827            } else { 
     828               if (v > 0x18) 
     829                  v = 0x18; 
     830            } 
    799831            val = (val & ~(0x3f << reg_shift)) | (v << reg_shift); 
    800832            break; 
     
    813845 
    814846int 
    815 InputGainPad::getValue() 
     847InputGainPadInv::getValue() 
    816848{ 
    817849    unsigned int val; 
     
    829861    reg_shift = (m_register & 0x03) * 8; 
    830862 
    831     // The pad status is in bit 6 of the channel's respective byte with the 
    832     // trim in bits 0-5.  Bit 7 is the write enable bit for the channel. 
     863    // The pad/phase inversion status is in bit 6 of the channel's 
     864    // respective byte with the trim in bits 0-5.  Bit 7 is the write enable 
     865    // bit for the channel. 
    833866    val = m_parent.ReadRegister(reg); 
    834867 
    835868    switch (m_mode) { 
    836         case MOTU_CTRL_MODE_PAD: 
    837             val = ((val >> reg_shift) & 0x40) != 0; 
    838             break; 
    839       case MOTU_CTRL_MODE_TRIMGAIN: 
    840             val = ((val >> reg_shift) & 0x3f); 
    841             break; 
    842       default: 
    843         debugOutput(DEBUG_LEVEL_VERBOSE, "unsupported mode %d\n", m_mode); 
    844         return 0; 
     869       case MOTU_CTRL_MODE_PAD: 
     870       case MOTU_CTRL_MODE_PHASE_INV: 
     871          val = ((val >> reg_shift) & 0x40) != 0; 
     872          break; 
     873       case MOTU_CTRL_MODE_TRIMGAIN: 
     874       case MOTU_CTRL_MODE_UL_GAIN: 
     875          val = ((val >> reg_shift) & 0x3f); 
     876          break; 
     877       default: 
     878          debugOutput(DEBUG_LEVEL_VERBOSE, "unsupported mode %d\n", m_mode); 
     879          return 0; 
    845880    } 
    846881 
     
    950985            debugOutput(DEBUG_LEVEL_VERBOSE, "SampleRate: %d\n", res); 
    951986            break; 
    952         case MOTU_INFO_HAS_MIC_INPUTS: 
    953             /* Only the 828Mk2 has separate mic inputs.  In time this may be 
    954              * deduced by walking the port info array within the parent. 
    955              */ 
    956             res = m_parent.m_motu_model == MOTU_MODEL_828mkII ? 1:0; 
    957             debugOutput(DEBUG_LEVEL_VERBOSE, "Has mic inputs: %d\n", res); 
    958             break; 
    959         case MOTU_INFO_HAS_AESEBU_INPUTS: 
    960             /* AES/EBU inputs are currently present on the Traveler and 
    961              * 896HD.  In time this may be deduced by walking the port info 
    962              * array within the parent. 
    963              */ 
    964             val = m_parent.m_motu_model; 
    965             res = (val==MOTU_MODEL_TRAVELER || val==MOTU_MODEL_896HD); 
    966             debugOutput(DEBUG_LEVEL_VERBOSE, "HasAESEBUInputs: %d\n", res); 
    967             break; 
    968         case MOTU_INFO_HAS_SPDIF_INPUTS: 
    969             /* SPDIF inputs are present on all supported models except the 
    970              * 896HD and the 8pre.  In time this may be deduced by walking 
    971              * the port info array within the parent. 
    972              */ 
    973             val = m_parent.m_motu_model; 
    974             res = (val!=MOTU_MODEL_8PRE && val!=MOTU_MODEL_896HD); 
    975             debugOutput(DEBUG_LEVEL_VERBOSE, "HasSPDIFInputs: %d\n", res); 
    976             break; 
    977         case MOTU_INFO_HAS_OPTICAL_SPDIF: 
    978             /* THe 896HD doesn't have optical SPDIF capability */ 
    979             val = m_parent.m_motu_model; 
    980             res = (val != MOTU_MODEL_896HD); 
    981             debugOutput(DEBUG_LEVEL_VERBOSE, "HasOpticalSPDIF: %d\n", res); 
    982             break; 
    983987    } 
    984988    return res; 
  • trunk/libffado/src/motu/motu_controls.h

    r1498 r1531  
    22 * Copyright (C) 2005-2008 by Daniel Wagner 
    33 * Copyright (C) 2005-2008 by Pieter Palmers 
    4  * Copyright (C) 2008 by Jonathan Woithe 
     4 * Copyright (C) 2008-2009 by Jonathan Woithe 
    55 * 
    66 * This file is part of FFADO 
     
    4343#define MOTU_CTRL_METER           0x00001000 
    4444 
     45#define MOTU_CTRL_INPUT_UL_GAIN   0x00400000  /* Gain on Ultralite channels */ 
     46#define MOTU_CTRL_INPUT_PHASE_INV 0x00800000 
    4547#define MOTU_CTRL_INPUT_TRIMGAIN  0x01000000 
    4648#define MOTU_CTRL_INPUT_PAD       0x02000000 
     
    6365    (MOTU_CTRL_INPUT_LEVEL|MOTU_CTRL_INPUT_BOOST) 
    6466 
     67#define MOTU_CTRL_ULTRALITE_INPUT_CTRLS \ 
     68    (MOTU_CTRL_INPUT_UL_GAIN|MOTU_CTRL_INPUT_PHASE_INV) 
     69 
    6570#define MOTU_CTRL_MASK_MUTE_VALUE          0x00010000 
    6671#define MOTU_CTRL_MASK_MUTE_SETENABLE      0x01000000 
     
    7580#define MOTU_CTRL_MODE_PAD                 0x00000000 
    7681#define MOTU_CTRL_MODE_TRIMGAIN            0x00000001 
     82#define MOTU_CTRL_MODE_UL_GAIN             0x00000002 
     83#define MOTU_CTRL_MODE_PHASE_INV           0x00000003 
    7784 
    7885#define MOTU_CTRL_METER_PEAKHOLD           0x00000001 
     
    8895#define MOTU_INFO_IS_STREAMING             0x00000002 
    8996#define MOTU_INFO_SAMPLE_RATE              0x00000003 
    90 #define MOTU_INFO_HAS_MIC_INPUTS           0x00000004 
    91 #define MOTU_INFO_HAS_AESEBU_INPUTS        0x00000005 
    92 #define MOTU_INFO_HAS_SPDIF_INPUTS         0x00000006 
    93 #define MOTU_INFO_HAS_OPTICAL_SPDIF        0x00000007 
    9497 
    9598#define MOTU_CTRL_TRIMGAINPAD_MAX_CHANNEL  3 
     99#define MOTU_CTRL_GAINPHASEINV_MAX_CHANNEL 9 
    96100 
    97101/* A "register" value used to signify that a particular control in a matrix 
     
    293297}; 
    294298 
    295 class InputGainPad 
    296     : public MotuDiscreteCtrl 
    297 { 
    298 public: 
    299     InputGainPad(MotuDevice &parent, unsigned int channel, unsigned int mode); 
    300     InputGainPad(MotuDevice &parent, unsigned int channel, unsigned int mode,  
     299class InputGainPadInv 
     300    : public MotuDiscreteCtrl 
     301{ 
     302public: 
     303    InputGainPadInv(MotuDevice &parent, unsigned int channel, unsigned int mode); 
     304    InputGainPadInv(MotuDevice &parent, unsigned int channel, unsigned int mode,  
    301305          std::string name, std::string label, std::string descr); 
    302306 
  • trunk/libffado/support/mixer-qt4/mixer_motu.py

    r1501 r1531  
    2222# 
    2323 
    24 from PyQt4.QtCore import SIGNAL, SLOT, QObject 
    25 from PyQt4.QtGui import QWidget 
     24from PyQt4.QtCore import SIGNAL, SLOT, QObject, Qt 
     25from PyQt4.QtGui import QWidget, QApplication 
    2626from mixer_motuui import * 
    2727 
     
    5050        # first index (the row) is the zero-based mix number while the 
    5151        # second index (the column) is the zero-based channel number.  The 
    52         # order of the channel enumeration must agree with that used when 
    53         # creating the dbus controls within motu_avdevice.cpp. 
     52        # third index gives the control of the stereo pair of the control 
     53        # used as the key.  The order of the channel enumeration must agree 
     54        # with that used when creating the dbus controls within 
     55        # motu_avdevice.cpp. 
    5456        self.ChannelFaders={ 
    55             self.mix1ana1_fader: ['/Mixer/fader', 0, 0], 
    56             self.mix1ana2_fader: ['/Mixer/fader', 0, 1], 
    57             self.mix1ana3_fader: ['/Mixer/fader', 0, 2], 
    58             self.mix1ana4_fader: ['/Mixer/fader', 0, 3], 
    59             self.mix1ana5_fader: ['/Mixer/fader', 0, 4], 
    60             self.mix1ana6_fader: ['/Mixer/fader', 0, 5], 
    61             self.mix1ana7_fader: ['/Mixer/fader', 0, 6], 
    62             self.mix1ana8_fader: ['/Mixer/fader', 0, 7], 
    63             self.mix1aes1_fader: ['/Mixer/fader', 0, 8], 
    64             self.mix1aes2_fader: ['/Mixer/fader', 0, 9], 
    65             self.mix1spdif1_fader: ['/Mixer/fader', 0, 10], 
    66             self.mix1spdif2_fader: ['/Mixer/fader', 0, 11], 
    67             self.mix1adat1_fader: ['/Mixer/fader', 0, 12], 
    68             self.mix1adat2_fader: ['/Mixer/fader', 0, 13], 
    69             self.mix1adat3_fader: ['/Mixer/fader', 0, 14], 
    70             self.mix1adat4_fader: ['/Mixer/fader', 0, 15], 
    71             self.mix1adat5_fader: ['/Mixer/fader', 0, 16], 
    72             self.mix1adat6_fader: ['/Mixer/fader', 0, 17], 
    73             self.mix1adat7_fader: ['/Mixer/fader', 0, 18], 
    74             self.mix1adat8_fader: ['/Mixer/fader', 0, 19], 
    75  
    76             self.mix2ana1_fader: ['/Mixer/fader', 1, 0], 
    77             self.mix2ana2_fader: ['/Mixer/fader', 1, 1], 
    78             self.mix2ana3_fader: ['/Mixer/fader', 1, 2], 
    79             self.mix2ana4_fader: ['/Mixer/fader', 1, 3], 
    80             self.mix2ana5_fader: ['/Mixer/fader', 1, 4], 
    81             self.mix2ana6_fader: ['/Mixer/fader', 1, 5], 
    82             self.mix2ana7_fader: ['/Mixer/fader', 1, 6], 
    83             self.mix2ana8_fader: ['/Mixer/fader', 1, 7], 
    84             self.mix2aes1_fader: ['/Mixer/fader', 1, 8], 
    85             self.mix2aes2_fader: ['/Mixer/fader', 1, 9], 
    86             self.mix2spdif1_fader: ['/Mixer/fader', 1, 10], 
    87             self.mix2spdif2_fader: ['/Mixer/fader', 1, 11], 
    88             self.mix2adat1_fader: ['/Mixer/fader', 1, 12], 
    89             self.mix2adat2_fader: ['/Mixer/fader', 1, 13], 
    90             self.mix2adat3_fader: ['/Mixer/fader', 1, 14], 
    91             self.mix2adat4_fader: ['/Mixer/fader', 1, 15], 
    92             self.mix2adat5_fader: ['/Mixer/fader', 1, 16], 
    93             self.mix2adat6_fader: ['/Mixer/fader', 1, 17], 
    94             self.mix2adat7_fader: ['/Mixer/fader', 1, 18], 
    95             self.mix2adat8_fader: ['/Mixer/fader', 1, 19], 
    96  
    97             self.mix3ana1_fader: ['/Mixer/fader', 2, 0], 
    98             self.mix3ana2_fader: ['/Mixer/fader', 2, 1], 
    99             self.mix3ana3_fader: ['/Mixer/fader', 2, 2], 
    100             self.mix3ana4_fader: ['/Mixer/fader', 2, 3], 
    101             self.mix3ana5_fader: ['/Mixer/fader', 2, 4], 
    102             self.mix3ana6_fader: ['/Mixer/fader', 2, 5], 
    103             self.mix3ana7_fader: ['/Mixer/fader', 2, 6], 
    104             self.mix3ana8_fader: ['/Mixer/fader', 2, 7], 
    105             self.mix3aes1_fader: ['/Mixer/fader', 2, 8], 
    106             self.mix3aes2_fader: ['/Mixer/fader', 2, 9], 
    107             self.mix3spdif1_fader: ['/Mixer/fader', 2, 10], 
    108             self.mix3spdif2_fader: ['/Mixer/fader', 2, 11], 
    109             self.mix3adat1_fader: ['/Mixer/fader', 2, 12], 
    110             self.mix3adat2_fader: ['/Mixer/fader', 2, 13], 
    111             self.mix3adat3_fader: ['/Mixer/fader', 2, 14], 
    112             self.mix3adat4_fader: ['/Mixer/fader', 2, 15], 
    113             self.mix3adat5_fader: ['/Mixer/fader', 2, 16], 
    114             self.mix3adat6_fader: ['/Mixer/fader', 2, 17], 
    115             self.mix3adat7_fader: ['/Mixer/fader', 2, 18], 
    116             self.mix3adat8_fader: ['/Mixer/fader', 2, 19], 
    117  
    118             self.mix4ana1_fader: ['/Mixer/fader', 3, 0], 
    119             self.mix4ana2_fader: ['/Mixer/fader', 3, 1], 
    120             self.mix4ana3_fader: ['/Mixer/fader', 3, 2], 
    121             self.mix4ana4_fader: ['/Mixer/fader', 3, 3], 
    122             self.mix4ana5_fader: ['/Mixer/fader', 3, 4], 
    123             self.mix4ana6_fader: ['/Mixer/fader', 3, 5], 
    124             self.mix4ana7_fader: ['/Mixer/fader', 3, 6], 
    125             self.mix4ana8_fader: ['/Mixer/fader', 3, 7], 
    126             self.mix4aes1_fader: ['/Mixer/fader', 3, 8], 
    127             self.mix4aes2_fader: ['/Mixer/fader', 3, 9], 
    128             self.mix4spdif1_fader: ['/Mixer/fader', 3, 10], 
    129             self.mix4spdif2_fader: ['/Mixer/fader', 3, 11], 
    130             self.mix4adat1_fader: ['/Mixer/fader', 3, 12], 
    131             self.mix4adat2_fader: ['/Mixer/fader', 3, 13], 
    132             self.mix4adat3_fader: ['/Mixer/fader', 3, 14], 
    133             self.mix4adat4_fader: ['/Mixer/fader', 3, 15], 
    134             self.mix4adat5_fader: ['/Mixer/fader', 3, 16], 
    135             self.mix4adat6_fader: ['/Mixer/fader', 3, 17], 
    136             self.mix4adat7_fader: ['/Mixer/fader', 3, 18], 
    137             self.mix4adat8_fader: ['/Mixer/fader', 3, 19], 
     57            self.mix1ana1_fader: ['/Mixer/fader', 0, 0, self.mix1ana2_fader], 
     58            self.mix1ana2_fader: ['/Mixer/fader', 0, 1, self.mix1ana1_fader], 
     59            self.mix1ana3_fader: ['/Mixer/fader', 0, 2, self.mix1ana4_fader], 
     60            self.mix1ana4_fader: ['/Mixer/fader', 0, 3, self.mix1ana3_fader], 
     61            self.mix1ana5_fader: ['/Mixer/fader', 0, 4, self.mix1ana6_fader], 
     62            self.mix1ana6_fader: ['/Mixer/fader', 0, 5, self.mix1ana5_fader], 
     63            self.mix1ana7_fader: ['/Mixer/fader', 0, 6, self.mix1ana8_fader], 
     64            self.mix1ana8_fader: ['/Mixer/fader', 0, 7, self.mix1ana7_fader], 
     65            self.mix1aes1_fader: ['/Mixer/fader', 0, 8, self.mix1aes2_fader], 
     66            self.mix1aes2_fader: ['/Mixer/fader', 0, 9, self.mix1aes1_fader], 
     67            self.mix1spdif1_fader: ['/Mixer/fader', 0, 10, self.mix1spdif2_fader], 
     68            self.mix1spdif2_fader: ['/Mixer/fader', 0, 11, self.mix1spdif1_fader], 
     69            self.mix1adat1_fader: ['/Mixer/fader', 0, 12, self.mix1adat2_fader], 
     70            self.mix1adat2_fader: ['/Mixer/fader', 0, 13, self.mix1adat1_fader], 
     71            self.mix1adat3_fader: ['/Mixer/fader', 0, 14, self.mix1adat4_fader], 
     72            self.mix1adat4_fader: ['/Mixer/fader', 0, 15, self.mix1adat3_fader], 
     73            self.mix1adat5_fader: ['/Mixer/fader', 0, 16, self.mix1adat6_fader], 
     74            self.mix1adat6_fader: ['/Mixer/fader', 0, 17, self.mix1adat5_fader], 
     75            self.mix1adat7_fader: ['/Mixer/fader', 0, 18, self.mix1adat8_fader], 
     76            self.mix1adat8_fader: ['/Mixer/fader', 0, 19, self.mix1adat7_fader], 
     77 
     78            self.mix2ana1_fader: ['/Mixer/fader', 1, 0, self.mix2ana2_fader], 
     79            self.mix2ana2_fader: ['/Mixer/fader', 1, 1, self.mix2ana1_fader], 
     80            self.mix2ana3_fader: ['/Mixer/fader', 1, 2, self.mix2ana4_fader], 
     81            self.mix2ana4_fader: ['/Mixer/fader', 1, 3, self.mix2ana3_fader], 
     82            self.mix2ana5_fader: ['/Mixer/fader', 1, 4, self.mix2ana6_fader], 
     83            self.mix2ana6_fader: ['/Mixer/fader', 1, 5, self.mix2ana5_fader], 
     84            self.mix2ana7_fader: ['/Mixer/fader', 1, 6, self.mix2ana8_fader], 
     85            self.mix2ana8_fader: ['/Mixer/fader', 1, 7, self.mix2ana7_fader], 
     86            self.mix2aes1_fader: ['/Mixer/fader', 1, 8, self.mix2aes2_fader], 
     87            self.mix2aes2_fader: ['/Mixer/fader', 1, 9, self.mix2aes1_fader], 
     88            self.mix2spdif1_fader: ['/Mixer/fader', 1, 10, self.mix2spdif2_fader], 
     89            self.mix2spdif2_fader: ['/Mixer/fader', 1, 11, self.mix2spdif1_fader], 
     90            self.mix2adat1_fader: ['/Mixer/fader', 1, 12, self.mix2adat2_fader], 
     91            self.mix2adat2_fader: ['/Mixer/fader', 1, 13, self.mix2adat1_fader], 
     92            self.mix2adat3_fader: ['/Mixer/fader', 1, 14, self.mix2adat4_fader], 
     93            self.mix2adat4_fader: ['/Mixer/fader', 1, 15, self.mix2adat3_fader], 
     94            self.mix2adat5_fader: ['/Mixer/fader', 1, 16, self.mix2adat6_fader], 
     95            self.mix2adat6_fader: ['/Mixer/fader', 1, 17, self.mix2adat5_fader], 
     96            self.mix2adat7_fader: ['/Mixer/fader', 1, 18, self.mix2adat8_fader], 
     97            self.mix2adat8_fader: ['/Mixer/fader', 1, 19, self.mix2adat7_fader], 
     98 
     99            self.mix3ana1_fader: ['/Mixer/fader', 2, 0, self.mix3ana2_fader], 
     100            self.mix3ana2_fader: ['/Mixer/fader', 2, 1, self.mix3ana1_fader], 
     101            self.mix3ana3_fader: ['/Mixer/fader', 2, 2, self.mix3ana4_fader], 
     102            self.mix3ana4_fader: ['/Mixer/fader', 2, 3, self.mix3ana3_fader], 
     103            self.mix3ana5_fader: ['/Mixer/fader', 2, 4, self.mix3ana6_fader], 
     104            self.mix3ana6_fader: ['/Mixer/fader', 2, 5, self.mix3ana5_fader], 
     105            self.mix3ana7_fader: ['/Mixer/fader', 2, 6, self.mix3ana8_fader], 
     106            self.mix3ana8_fader: ['/Mixer/fader', 2, 7, self.mix3ana7_fader], 
     107            self.mix3aes1_fader: ['/Mixer/fader', 2, 8, self.mix3aes2_fader], 
     108            self.mix3aes2_fader: ['/Mixer/fader', 2, 9, self.mix3aes1_fader], 
     109            self.mix3spdif1_fader: ['/Mixer/fader', 2, 10, self.mix3spdif2_fader], 
     110            self.mix3spdif2_fader: ['/Mixer/fader', 2, 11, self.mix3spdif1_fader], 
     111            self.mix3adat1_fader: ['/Mixer/fader', 2, 12, self.mix3adat2_fader], 
     112            self.mix3adat2_fader: ['/Mixer/fader', 2, 13, self.mix3adat1_fader], 
     113            self.mix3adat3_fader: ['/Mixer/fader', 2, 14, self.mix3adat4_fader], 
     114            self.mix3adat4_fader: ['/Mixer/fader', 2, 15, self.mix3adat3_fader], 
     115            self.mix3adat5_fader: ['/Mixer/fader', 2, 16, self.mix3adat6_fader], 
     116            self.mix3adat6_fader: ['/Mixer/fader', 2, 17, self.mix3adat5_fader], 
     117            self.mix3adat7_fader: ['/Mixer/fader', 2, 18, self.mix3adat8_fader], 
     118            self.mix3adat8_fader: ['/Mixer/fader', 2, 19, self.mix3adat7_fader], 
     119 
     120            self.mix4ana1_fader: ['/Mixer/fader', 3, 0, self.mix4ana2_fader], 
     121            self.mix4ana2_fader: ['/Mixer/fader', 3, 1, self.mix4ana1_fader], 
     122            self.mix4ana3_fader: ['/Mixer/fader', 3, 2, self.mix4ana4_fader], 
     123            self.mix4ana4_fader: ['/Mixer/fader', 3, 3, self.mix4ana3_fader], 
     124            self.mix4ana5_fader: ['/Mixer/fader', 3, 4, self.mix4ana6_fader], 
     125            self.mix4ana6_fader: ['/Mixer/fader', 3, 5, self.mix4ana5_fader], 
     126            self.mix4ana7_fader: ['/Mixer/fader', 3, 6, self.mix4ana8_fader], 
     127            self.mix4ana8_fader: ['/Mixer/fader', 3, 7, self.mix4ana7_fader], 
     128            self.mix4aes1_fader: ['/Mixer/fader', 3, 8, self.mix4aes2_fader], 
     129            self.mix4aes2_fader: ['/Mixer/fader', 3, 9, self.mix4aes1_fader], 
     130            self.mix4spdif1_fader: ['/Mixer/fader', 3, 10, self.mix4spdif2_fader], 
     131            self.mix4spdif2_fader: ['/Mixer/fader', 3, 11, self.mix4spdif1_fader], 
     132            self.mix4adat1_fader: ['/Mixer/fader', 3, 12, self.mix4adat2_fader], 
     133            self.mix4adat2_fader: ['/Mixer/fader', 3, 13, self.mix4adat1_fader], 
     134            self.mix4adat3_fader: ['/Mixer/fader', 3, 14, self.mix4adat4_fader], 
     135            self.mix4adat4_fader: ['/Mixer/fader', 3, 15, self.mix4adat3_fader], 
     136            self.mix4adat5_fader: ['/Mixer/fader', 3, 16, self.mix4adat6_fader], 
     137            self.mix4adat6_fader: ['/Mixer/fader', 3, 17, self.mix4adat5_fader], 
     138            self.mix4adat7_fader: ['/Mixer/fader', 3, 18, self.mix4adat8_fader], 
     139            self.mix4adat8_fader: ['/Mixer/fader', 3, 19, self.mix4adat7_fader], 
    138140        } 
    139141 
     
    143145            self.mix3_fader: ['/Mixer/Mix3/Mix_fader'], 
    144146            self.mix4_fader: ['/Mixer/Mix4/Mix_fader'], 
     147            self.mainout_fader: ['/Mixer/Mainout_fader'], 
     148            self.phones_fader:  ['/Mixer/Phones_fader'], 
    145149        } 
    146150 
     
    236240            self.ana3_trimgain:  ['/Mixer/Control/Ana3_trimgain'], 
    237241            self.ana4_trimgain:  ['/Mixer/Control/Ana4_trimgain'], 
     242            self.ana5_trimgain:  ['/Mixer/Control/Ana5_trimgain'], 
     243            self.ana6_trimgain:  ['/Mixer/Control/Ana6_trimgain'], 
     244            self.ana7_trimgain:  ['/Mixer/Control/Ana7_trimgain'], 
     245            self.ana8_trimgain:  ['/Mixer/Control/Ana8_trimgain'], 
     246            self.spdif1_trimgain:  ['/Mixer/Control/Spdif1_trimgain'], 
     247            self.spdif2_trimgain:  ['/Mixer/Control/Spdif2_trimgain'], 
    238248        } 
    239249 
     
    414424            self.ana3_pad:       ['/Mixer/Control/Ana3_pad'], 
    415425            self.ana4_pad:       ['/Mixer/Control/Ana4_pad'], 
     426            self.ana5_pad:       ['/Mixer/Control/Ana5_pad'], 
     427            self.ana6_pad:       ['/Mixer/Control/Ana6_pad'], 
     428            self.ana7_pad:       ['/Mixer/Control/Ana7_pad'], 
     429            self.ana8_pad:       ['/Mixer/Control/Ana8_pad'], 
     430            self.ana1_invert:    ['/Mixer/Control/Ana1_invert'], 
     431            self.ana2_invert:    ['/Mixer/Control/Ana2_invert'], 
     432            self.ana3_invert:    ['/Mixer/Control/Ana3_invert'], 
     433            self.ana4_invert:    ['/Mixer/Control/Ana4_invert'], 
     434            self.ana5_invert:    ['/Mixer/Control/Ana5_invert'], 
     435            self.ana6_invert:    ['/Mixer/Control/Ana6_invert'], 
     436            self.ana7_invert:    ['/Mixer/Control/Ana7_invert'], 
     437            self.ana8_invert:    ['/Mixer/Control/Ana8_invert'], 
     438            self.spdif1_invert:  ['/Mixer/Control/Spdif1_invert'], 
     439            self.spdif2_invert:  ['/Mixer/Control/Spdif2_invert'], 
     440            self.ana1_level:     ['/Mixer/Control/Ana1_level'], 
     441            self.ana2_level:     ['/Mixer/Control/Ana2_level'], 
     442            self.ana3_level:     ['/Mixer/Control/Ana3_level'], 
     443            self.ana4_level:     ['/Mixer/Control/Ana4_level'], 
    416444            self.ana5_level:     ['/Mixer/Control/Ana5_level'], 
    417445            self.ana6_level:     ['/Mixer/Control/Ana6_level'], 
    418446            self.ana7_level:     ['/Mixer/Control/Ana7_level'], 
    419447            self.ana8_level:     ['/Mixer/Control/Ana8_level'], 
     448            self.ana1_boost:     ['/Mixer/Control/Ana1_boost'], 
     449            self.ana2_boost:     ['/Mixer/Control/Ana2_boost'], 
     450            self.ana3_boost:     ['/Mixer/Control/Ana3_boost'], 
     451            self.ana4_boost:     ['/Mixer/Control/Ana4_boost'], 
    420452            self.ana5_boost:     ['/Mixer/Control/Ana5_boost'], 
    421453            self.ana6_boost:     ['/Mixer/Control/Ana6_boost'], 
    422454            self.ana7_boost:     ['/Mixer/Control/Ana7_boost'], 
    423455            self.ana8_boost:     ['/Mixer/Control/Ana8_boost'], 
    424  
    425             # Some interfaces have level/boost on analog 1-4 in place of trimgain/pad 
    426             self.ana1_level:     ['/Mixer/Control/Ana1_level'], 
    427             self.ana2_level:     ['/Mixer/Control/Ana2_level'], 
    428             self.ana3_level:     ['/Mixer/Control/Ana3_level'], 
    429             self.ana4_level:     ['/Mixer/Control/Ana4_level'], 
    430             self.ana1_boost:     ['/Mixer/Control/Ana1_boost'], 
    431             self.ana2_boost:     ['/Mixer/Control/Ana2_boost'], 
    432             self.ana3_boost:     ['/Mixer/Control/Ana3_boost'], 
    433             self.ana4_boost:     ['/Mixer/Control/Ana4_boost'], 
    434  
    435456        } 
    436457 
    437         # Ultimately these may be rolled into the BinarySwitches controls, 
    438         # but since they aren't implemented and therefore need to be 
    439         # disabled it's easier to keep them separate for the moment.  The 
    440         # dbus path for these is yet to be finalised too - for example we 
    441         # may end up using a matrix mixer. 
    442         self.PairSwitches={ 
    443 #            self.mix1ana1_2_pair:   ['Mixer/Mix1/Ana1_2_pair'], 
    444 #            self.mix1ana3_4_pair:   ['Mixer/Mix1/Ana3_4_pair'], 
    445 #            self.mix1ana5_6_pair:   ['Mixer/Mix1/Ana5_6_pair'], 
    446 #            self.mix1ana7_8_pair:   ['Mixer/Mix1/Ana7_8_pair'], 
    447 #            self.mix1aes1_2_pair:   ['Mixer/Mix1/Aes1_2_pair'], 
    448 #            self.mix1adat1_2_pair:  ['Mixer/Mix1/Adat1_2_pair'], 
    449 #            self.mix1adat3_4_pair:  ['Mixer/Mix1/Adat3_4_pair'], 
    450 #            self.mix1adat5_6_pair:  ['Mixer/Mix1/Adat5_6_pair'], 
    451 #            self.mix1adat7_8_pair:  ['Mixer/Mix1/Adat7_8_pair'], 
    452 #            self.mix1spdif1_2_pair: ['Mixer/Mix1/Spdif1_2_pair'], 
    453  
    454 #            self.mix2ana1_2_pair:   ['Mixer/Mix2/Ana1_2_pair'], 
    455 #            self.mix2ana3_4_pair:   ['Mixer/Mix2/Ana3_4_pair'], 
    456 #            self.mix2ana5_6_pair:   ['Mixer/Mix2/Ana5_6_pair'], 
    457 #            self.mix2ana7_8_pair:   ['Mixer/Mix2/Ana7_8_pair'], 
    458 #            self.mix2aes1_2_pair:   ['Mixer/Mix2/Aes1_2_pair'], 
    459 #            self.mix2adat1_2_pair:  ['Mixer/Mix2/Adat1_2_pair'], 
    460 #            self.mix2adat3_4_pair:  ['Mixer/Mix2/Adat3_4_pair'], 
    461 #            self.mix2adat5_6_pair:  ['Mixer/Mix2/Adat5_6_pair'], 
    462 #            self.mix2adat7_8_pair:  ['Mixer/Mix2/Adat7_8_pair'], 
    463 #            self.mix2spdif1_2_pair: ['Mixer/Mix2/Spdif1_2_pair'], 
    464  
    465 #            self.mix3ana1_2_pair:   ['Mixer/Mix3/Ana1_2_pair'], 
    466 #            self.mix3ana3_4_pair:   ['Mixer/Mix3/Ana3_4_pair'], 
    467 #            self.mix3ana5_6_pair:   ['Mixer/Mix3/Ana5_6_pair'], 
    468 #            self.mix3ana7_8_pair:   ['Mixer/Mix3/Ana7_8_pair'], 
    469 #            self.mix3aes1_2_pair:   ['Mixer/Mix3/Aes1_2_pair'], 
    470 #            self.mix3adat1_2_pair:  ['Mixer/Mix3/Adat1_2_pair'], 
    471 #            self.mix3adat3_4_pair:  ['Mixer/Mix3/Adat3_4_pair'], 
    472 #            self.mix3adat5_6_pair:  ['Mixer/Mix3/Adat5_6_pair'], 
    473 #            self.mix3adat7_8_pair:  ['Mixer/Mix3/Adat7_8_pair'], 
    474 #            self.mix3spdif1_2_pair: ['Mixer/Mix3/Spdif1_2_pair'], 
    475  
    476 #            self.mix4ana1_2_pair:   ['Mixer/Mix4/Ana1_2_pair'], 
    477 #            self.mix4ana3_4_pair:   ['Mixer/Mix4/Ana3_4_pair'], 
    478 #            self.mix4ana5_6_pair:   ['Mixer/Mix4/Ana5_6_pair'], 
    479 #            self.mix4ana7_8_pair:   ['Mixer/Mix4/Ana7_8_pair'], 
    480 #            self.mix4aes1_2_pair:   ['Mixer/Mix4/Aes1_2_pair'], 
    481 #            self.mix4adat1_2_pair:  ['Mixer/Mix4/Adat1_2_pair'], 
    482 #            self.mix4adat3_4_pair:  ['Mixer/Mix4/Adat3_4_pair'], 
    483 #            self.mix4adat5_6_pair:  ['Mixer/Mix4/Adat5_6_pair'], 
    484 #            self.mix4adat7_8_pair:  ['Mixer/Mix4/Adat7_8_pair'], 
    485 #            self.mix4spdif1_2_pair: ['Mixer/Mix4/Spdif1_2_pair'], 
    486         } 
    487  
    488         self.MixDests={ 
     458        self.Selectors={ 
    489459            self.mix1_dest:      ['/Mixer/Mix1/Mix_dest'], 
    490460            self.mix2_dest:      ['/Mixer/Mix2/Mix_dest'], 
     
    501471            self.peakhold_time_ctrl:['/Mixer/Control/Meter_peakhold_time'], 
    502472            self.cliphold_time_ctrl:['/Mixer/Control/Meter_cliphold_time'], 
    503         } 
    504  
    505         self.SelectorControls={ 
    506  
    507473        } 
    508474 
     
    521487        self.hw.setMatrixMixerValue(self.ChannelFaders[sender][0], 
    522488            self.ChannelFaders[sender][1], self.ChannelFaders[sender][2], vol) 
     489        # Using the ctrl modifier key makes stereo pairs move in unison 
     490        if (QApplication.keyboardModifiers() == Qt.ControlModifier): 
     491            pair = self.ChannelFaders[sender][3] 
     492            pair.setValue(vol) 
    523493 
    524494    # public slot: a multivalue control within a matrix mixer 
     
    561531        self.hw.setDiscrete(self.Faders[sender][0], vol) 
    562532 
    563     # public slot: mix destination control 
    564     def updateMixDest(self, a0): 
     533    # public slot: selectors (eg: mix destination controls) 
     534    def updateSelector(self, a0): 
    565535        sender = self.sender() 
    566536        dest=a0 
    567         log.debug("setting %s mix destination to %d" % (self.MixDests[sender][0], dest)) 
    568         self.hw.setDiscrete(self.MixDests[sender][0], dest) 
     537        log.debug("setting %s selector to %d" % (self.Selectors[sender][0], dest)) 
     538        self.hw.setDiscrete(self.Selectors[sender][0], dest) 
    569539 
    570540    # public slots: mix output controls 
     
    588558        log.debug("device streaming flag: %d" % (self.is_streaming)) 
    589559 
    590         # Retrieve other device settings as needed 
     560        # Retrieve other device settings as needed and customise the UI 
     561        # based on these options. 
    591562        self.model = self.hw.getDiscrete('/Mixer/Info/Model') 
    592563        log.debug("device model identifier: %d" % (self.model)) 
    593564        self.sample_rate = self.hw.getDiscrete('/Mixer/Info/SampleRate') 
    594565        log.debug("device sample rate: %d" % (self.sample_rate)) 
    595         self.has_mic_inputs = self.hw.getDiscrete('/Mixer/Info/HasMicInputs') 
    596         log.debug("device has mic inputs: %d" % (self.has_mic_inputs)) 
    597         self.has_aesebu_inputs = self.hw.getDiscrete('/Mixer/Info/HasAESEBUInputs') 
    598         log.debug("device has AES/EBU inputs: %d" % (self.has_aesebu_inputs)) 
    599         self.has_spdif_inputs = self.hw.getDiscrete('/Mixer/Info/HasSPDIFInputs') 
    600         log.debug("device has SPDIF inputs: %d" % (self.has_spdif_inputs)) 
    601         self.has_optical_spdif = self.hw.getDiscrete('/Mixer/Info/HasOpticalSPDIF') 
    602         log.debug("device has optical SPDIF: %d" % (self.has_optical_spdif)) 
    603  
    604         # Customise the UI based on device options retrieved 
    605         if (self.has_mic_inputs): 
    606             # Mic input controls displace AES/EBU since no current device 
    607             # has both. 
     566 
     567        # The 828Mk2 has separate Mic inputs but no AES/EBU, so use the 
     568        # AES/EBU mixer controls as "Mic" controls.  If a device comes along 
     569        # with both mic and AES inputs this approach will have to be 
     570        # re-thought. 
     571        # Doing this means that on the 828Mk2, the mixer matrix elements 
     572        # used for AES/EBU on other models are used for the Mic channels.  
     573        # So long as the MixerChannels_828Mk2 definition in 
     574        # motu_avdevice.cpp defines the mic channels immediately after the 8 
     575        # analog channels we'll be right.  Note that we don't need to change 
     576        # the matrix lookup tables (self.ChannelFaders etc) because the QT 
     577        # controls are still named *aesebu*. 
     578        if (self.model == MOTU_MODEL_828mkII): 
    608579            self.mix1_tab.setTabText(1, "Mic inputs"); 
    609580            self.mix2_tab.setTabText(1, "Mic inputs"); 
    610581            self.mix3_tab.setTabText(1, "Mic inputs"); 
    611582            self.mix4_tab.setTabText(1, "Mic inputs"); 
    612             # FIXME: when implemented, will mic channels just reuse the AES/EBU 
    613             # dbus path?  If not we'll have to reset the respective values in 
    614             # the control arrays (self.ChannelFaders etc). 
    615583        else: 
    616             if (not(self.has_aesebu_inputs)): 
     584            # Only the Traveler and 896HD have AES/EBU inputs, so disable the AES/EBU 
     585            # tab for all other models. 
     586            if (self.model!=MOTU_MODEL_TRAVELER and self.model!=MOTU_MODEL_896HD): 
    617587                self.mix1_tab.setTabEnabled(1, False) 
    618588                self.mix2_tab.setTabEnabled(1, False) 
    619589                self.mix3_tab.setTabEnabled(1, False) 
    620590                self.mix4_tab.setTabEnabled(1, False) 
    621         if (not(self.has_spdif_inputs)): 
     591 
     592        # All models except the 896HD and 8pre have SPDIF inputs. 
     593        if (self.model==MOTU_MODEL_8PRE or self.model==MOTU_MODEL_896HD): 
    622594            self.mix1_tab.setTabEnabled(2, False); 
    623595            self.mix2_tab.setTabEnabled(2, False); 
     
    625597            self.mix4_tab.setTabEnabled(2, False); 
    626598 
    627         # Devices without AES/EBU inputs/outputs (normally ID 6 in the 
    628         # destination lists) have dedicated "MainOut" outputs instead.  The 
    629         # 896HD is an exception: it uses ID 6 for MainOut and ID 7 
    630         # (nominally SPDIF) for AES/EBU. 
    631         if (not(self.has_aesebu_inputs) or self.model==MOTU_MODEL_896HD): 
     599        # Devices without AES/EBU inputs/outputs (currently all except the 
     600        # Traveler and 896HD) have dedicated "MainOut" outputs instead.  
     601        # AES/EBU is normally ID 6 in the destination lists and "MainOut" 
     602        # displaces it on non-AES/EBU models.  The 896HD has both AES/EBU 
     603        # and MainOut which complicates this; it uses ID 6 for MainOut and 
     604        # ID 7 (nominally SPDIF) for AES/EBU.  Therefore change ID 6 to 
     605        # "MainOut" for everything but the Traveler, and set ID 7 (nominally 
     606        # SPDIF) to AES/EBU for the 896HD. 
     607        if (self.model != MOTU_MODEL_TRAVELER): 
    632608            self.mix1_dest.setItemText(6, "MainOut") 
    633609            self.mix2_dest.setItemText(6, "MainOut") 
     
    635611            self.mix4_dest.setItemText(6, "MainOut") 
    636612            self.phones_src.setItemText(6, "MainOut") 
    637         # Change the SPDIF destination to AES/EBU for the 896HD. 
    638613        if (self.model == MOTU_MODEL_896HD): 
    639614            self.mix1_dest.setItemText(7, "AES/EBU") 
     
    653628            self.optical_out_mode.setEnabled(False) 
    654629 
    655         # Some devices don't have the option of selecting an optical SPDIF 
    656         # mode. 
    657         if (not(self.has_optical_spdif)): 
     630        # The 896HD doesn't have optical SPDIF (aka Toslink) capability 
     631        if (self.model == MOTU_MODEL_896HD): 
    658632            self.optical_in_mode.removeItem(2) 
    659633            self.optical_out_mode.removeItem(2) 
     
    706680            self.mix4_adat8.setEnabled(False) 
    707681 
    708         # Ensure the correct input controls are active for a given interface 
    709         if (self.model == MOTU_MODEL_TRAVELER): 
     682        # Ensure the correct input controls are active for a given interface. 
     683        # Only the Ultralite has phase inversion switches. 
     684        if (not(self.model == MOTU_MODEL_ULTRALITE)): 
     685            self.disable_hide(self.ana1_invert) 
     686            self.disable_hide(self.ana2_invert) 
     687            self.disable_hide(self.ana3_invert) 
     688            self.disable_hide(self.ana4_invert) 
     689            self.disable_hide(self.ana5_invert) 
     690            self.disable_hide(self.ana6_invert) 
     691            self.disable_hide(self.ana7_invert) 
     692            self.disable_hide(self.ana8_invert) 
     693            self.disable_hide(self.spdif1_invert) 
     694            self.disable_hide(self.spdif2_invert) 
     695        # The Traveler has pad switches for analog 1-4 only; other interfaces 
     696        # don't have pad switches at all. 
     697        if (not(self.model == MOTU_MODEL_TRAVELER)): 
     698            self.disable_hide(self.ana1_pad) 
     699            self.disable_hide(self.ana2_pad) 
     700            self.disable_hide(self.ana3_pad) 
     701            self.disable_hide(self.ana4_pad) 
     702        self.disable_hide(self.ana5_pad) 
     703        self.disable_hide(self.ana6_pad) 
     704        self.disable_hide(self.ana7_pad) 
     705        self.disable_hide(self.ana8_pad) 
     706        # The Traveler has level and boost switchs for analog 5-8.  The Ultralite 
     707        # doesn't implement them.  All other interfaces have them over analog 1-8. 
     708        if (self.model==MOTU_MODEL_TRAVELER or self.model==MOTU_MODEL_ULTRALITE): 
    710709            self.disable_hide(self.ana1_level) 
    711710            self.disable_hide(self.ana2_level) 
     
    716715            self.disable_hide(self.ana3_boost) 
    717716            self.disable_hide(self.ana4_boost) 
     717        if (self.model == MOTU_MODEL_ULTRALITE): 
     718            self.disable_hide(self.ana5_level) 
     719            self.disable_hide(self.ana6_level) 
     720            self.disable_hide(self.ana7_level) 
     721            self.disable_hide(self.ana8_level) 
     722            self.disable_hide(self.ana5_boost) 
     723            self.disable_hide(self.ana6_boost) 
     724            self.disable_hide(self.ana7_boost) 
     725            self.disable_hide(self.ana8_boost) 
     726        # The Traveler has trimgain for analog 1-4.  The Ultralite has trimgain for 
     727        # analog 1-8 and SPDIF 1-2.  All other interfaces don't have trimgain. 
     728        if (not(self.model==MOTU_MODEL_TRAVELER or self.model==MOTU_MODEL_ULTRALITE)): 
     729            self.disable_hide(self.ana1_trimgain) 
     730            self.disable_hide(self.ana1_trimgain_label) 
     731            self.disable_hide(self.ana2_trimgain) 
     732            self.disable_hide(self.ana2_trimgain_label) 
     733            self.disable_hide(self.ana3_trimgain) 
     734            self.disable_hide(self.ana3_trimgain_label) 
     735            self.disable_hide(self.ana4_trimgain) 
     736            self.disable_hide(self.ana4_trimgain_label) 
     737        if (not(self.model == MOTU_MODEL_ULTRALITE)): 
    718738            self.disable_hide(self.ana5_trimgain) 
    719739            self.disable_hide(self.ana5_trimgain_label) 
     
    724744            self.disable_hide(self.ana8_trimgain) 
    725745            self.disable_hide(self.ana8_trimgain_label) 
    726             self.disable_hide(self.ana5_pad) 
    727             self.disable_hide(self.ana6_pad) 
    728             self.disable_hide(self.ana7_pad) 
    729             self.disable_hide(self.ana8_pad) 
    730         else: 
    731             self.disable_hide(self.ana1_trimgain) 
    732             self.disable_hide(self.ana1_trimgain_label) 
    733             self.disable_hide(self.ana2_trimgain) 
    734             self.disable_hide(self.ana2_trimgain_label) 
    735             self.disable_hide(self.ana3_trimgain) 
    736             self.disable_hide(self.ana3_trimgain_label) 
    737             self.disable_hide(self.ana4_trimgain) 
    738             self.disable_hide(self.ana4_trimgain_label) 
    739             self.disable_hide(self.ana1_pad) 
    740             self.disable_hide(self.ana2_pad) 
    741             self.disable_hide(self.ana3_pad) 
    742             self.disable_hide(self.ana4_pad) 
    743             self.disable_hide(self.ana5_trimgain) 
    744             self.disable_hide(self.ana5_trimgain_label) 
    745             self.disable_hide(self.ana6_trimgain) 
    746             self.disable_hide(self.ana6_trimgain_label) 
    747             self.disable_hide(self.ana7_trimgain) 
    748             self.disable_hide(self.ana7_trimgain_label) 
    749             self.disable_hide(self.ana8_trimgain) 
    750             self.disable_hide(self.ana8_trimgain_label) 
    751             self.disable_hide(self.ana5_pad) 
    752             self.disable_hide(self.ana6_pad) 
    753             self.disable_hide(self.ana7_pad) 
    754             self.disable_hide(self.ana8_pad) 
    755         # Only the Ultralite has digital trim controls over the SPDIF channels 
    756         if (not(self.model == MOTU_MODEL_ULTRALITE)): 
    757746            self.disable_hide(self.spdif1_trimgain); 
    758747            self.disable_hide(self.spdif1_trimgain_label); 
     
    795784            ctrl.setValue(pan) 
    796785            QObject.connect(ctrl, SIGNAL('valueChanged(int)'), self.updateControl) 
    797  
    798         # Disable the channel pair controls since they aren't yet implemented 
    799         for ctrl, info in self.PairSwitches.iteritems(): 
    800             log.debug("%s control is not implemented yet: disabling" % (info[0])) 
    801             ctrl.setEnabled(False) 
    802786 
    803787        for ctrl, info in self.ChannelBinarySwitches.iteritems(): 
     
    823807            QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateBinarySwitch) 
    824808 
    825         for ctrl, info in self.MixDests.iteritems(): 
     809        for ctrl, info in self.Selectors.iteritems(): 
    826810            if (not(ctrl.isEnabled())): 
    827811                continue 
    828812            dest = self.hw.getDiscrete(info[0]) 
    829             log.debug("%s mix destination is %d" % (info[0] , dest)) 
     813            log.debug("%s selector is %d" % (info[0] , dest)) 
    830814            ctrl.setCurrentIndex(dest) 
    831             QObject.connect(ctrl, SIGNAL('activated(int)'), self.updateMixDest) 
    832  
    833         for name, ctrl in self.SelectorControls.iteritems(): 
    834             state = self.hw.getDiscrete(ctrl[0]) 
    835             log.debug("%s state is %d" % (name , state)) 
    836             ctrl[1].setCurrentIndex(state) 
    837  
    838         # FIXME: If optical mode is not ADAT, disable ADAT controls here.  
    839         # It can't be done earlier because we need the current values of the 
    840         # ADAT channel controls in case the user goes ahead and enables the 
    841         # ADAT optical mode. 
     815            QObject.connect(ctrl, SIGNAL('activated(int)'), self.updateSelector) 
     816 
     817        # We could enable/disable ADAT controls here depending on whether 
     818        # the optical port is set to ADAT or something else.  A disable 
     819        # can't be done earlier since we have to read the ADAT mixer 
     820        # settings (which won't happen if they're disabled).  However, on 
     821        # the other hand it may be more convenient to leave all controls 
     822        # active at all times.  We'll see. 
  • trunk/libffado/support/mixer-qt4/mixer_motu.ui

    r1501 r1531  
    2424    <x>0</x> 
    2525    <y>0</y> 
    26     <width>1129</width> 
    27     <height>706</height> 
     26    <width>1156</width> 
     27    <height>803</height> 
    2828   </rect> 
    2929  </property> 
     
    3737   <string>Form1</string> 
    3838  </property> 
    39   <layout class="QHBoxLayout"
     39  <layout class="QHBoxLayout" name="horizontalLayout_5"
    4040   <item> 
    4141    <widget class="QGroupBox" name="settings_pane" > 
     
    433433      <enum>QFrame::Plain</enum> 
    434434     </property> 
    435      <layout class="QVBoxLayout" > 
    436       <property name="margin" > 
    437        <number>0</number> 
    438       </property> 
     435     <layout class="QVBoxLayout" name="verticalLayout" > 
    439436      <item> 
    440437       <widget class="QGroupBox" name="groupBox41" > 
     
    501498            </item> 
    502499            <item> 
     500             <widget class="QToolButton" name="ana1_invert" > 
     501              <property name="text" > 
     502               <string>Invert</string> 
     503              </property> 
     504              <property name="checkable" > 
     505               <bool>true</bool> 
     506              </property> 
     507             </widget> 
     508            </item> 
     509            <item> 
    503510             <widget class="QToolButton" name="ana1_boost" > 
    504511              <property name="enabled" > 
     
    613620            </item> 
    614621            <item> 
     622             <widget class="QToolButton" name="ana2_invert" > 
     623              <property name="text" > 
     624               <string>Invert</string> 
     625              </property> 
     626              <property name="checkable" > 
     627               <bool>true</bool> 
     628              </property> 
     629             </widget> 
     630            </item> 
     631            <item> 
    615632             <widget class="QToolButton" name="ana2_boost" > 
    616633              <property name="enabled" > 
     
    725742            </item> 
    726743            <item> 
     744             <widget class="QToolButton" name="ana3_invert" > 
     745              <property name="text" > 
     746               <string>Invert</string> 
     747              </property> 
     748              <property name="checkable" > 
     749               <bool>true</bool> 
     750              </property> 
     751             </widget> 
     752            </item> 
     753            <item> 
    727754             <widget class="QToolButton" name="ana3_boost" > 
    728755              <property name="enabled" > 
     
    837864            </item> 
    838865            <item> 
     866             <widget class="QToolButton" name="ana4_invert" > 
     867              <property name="text" > 
     868               <string>Invert</string> 
     869              </property> 
     870              <property name="checkable" > 
     871               <bool>true</bool> 
     872              </property> 
     873             </widget> 
     874            </item> 
     875            <item> 
    839876             <widget class="QToolButton" name="ana4_boost" > 
    840877              <property name="enabled" > 
     
    949986            </item> 
    950987            <item> 
     988             <widget class="QToolButton" name="ana5_invert" > 
     989              <property name="text" > 
     990               <string>Invert</string> 
     991              </property> 
     992              <property name="checkable" > 
     993               <bool>true</bool> 
     994              </property> 
     995             </widget> 
     996            </item> 
     997            <item> 
    951998             <widget class="QToolButton" name="ana5_boost" > 
    952999              <property name="enabled" > 
     
    10611108            </item> 
    10621109            <item> 
     1110             <widget class="QToolButton" name="ana6_invert" > 
     1111              <property name="text" > 
     1112               <string>Invert</string> 
     1113              </property> 
     1114              <property name="checkable" > 
     1115               <bool>true</bool> 
     1116              </property> 
     1117             </widget> 
     1118            </item> 
     1119            <item> 
    10631120             <widget class="QToolButton" name="ana6_boost" > 
    10641121              <property name="enabled" > 
     
    11731230            </item> 
    11741231            <item> 
     1232             <widget class="QToolButton" name="ana7_invert" > 
     1233              <property name="text" > 
     1234               <string>Invert</string> 
     1235              </property> 
     1236              <property name="checkable" > 
     1237               <bool>true</bool> 
     1238              </property> 
     1239              <property name="checked" > 
     1240               <bool>false</bool> 
     1241              </property> 
     1242             </widget> 
     1243            </item> 
     1244            <item> 
    11751245             <widget class="QToolButton" name="ana7_boost" > 
    11761246              <property name="enabled" > 
     
    12851355            </item> 
    12861356            <item> 
     1357             <widget class="QToolButton" name="ana8_invert" > 
     1358              <property name="text" > 
     1359               <string>Invert</string> 
     1360              </property> 
     1361              <property name="checkable" > 
     1362               <bool>true</bool> 
     1363              </property> 
     1364             </widget> 
     1365            </item> 
     1366            <item> 
    12871367             <widget class="QToolButton" name="ana8_boost" > 
    12881368              <property name="enabled" > 
     
    13821462            </item> 
    13831463            <item> 
     1464             <widget class="QToolButton" name="spdif1_invert" > 
     1465              <property name="text" > 
     1466               <string>Invert</string> 
     1467              </property> 
     1468              <property name="checkable" > 
     1469               <bool>true</bool> 
     1470              </property> 
     1471             </widget> 
     1472            </item> 
     1473            <item> 
    13841474             <spacer name="verticalSpacer" > 
    13851475              <property name="orientation" > 
     
    14581548              <property name="wordWrap" > 
    14591549               <bool>false</bool> 
     1550              </property> 
     1551             </widget> 
     1552            </item> 
     1553            <item> 
     1554             <widget class="QToolButton" name="spdif2_invert" > 
     1555              <property name="text" > 
     1556               <string>Invert</string> 
     1557              </property> 
     1558              <property name="checkable" > 
     1559               <bool>true</bool> 
    14601560              </property> 
    14611561             </widget> 
     
    15191619      </item> 
    15201620      <item> 
    1521        <widget class="QTabWidget" name="tabWidget4" > 
    1522         <property name="currentIndex" > 
     1621       <widget class="QFrame" name="frame" > 
     1622        <property name="frameShape" > 
     1623         <enum>QFrame::NoFrame</enum> 
     1624        </property> 
     1625        <property name="frameShadow" > 
     1626         <enum>QFrame::Plain</enum> 
     1627        </property> 
     1628        <property name="lineWidth" > 
    15231629         <number>0</number> 
    15241630        </property> 
    1525         <widget class="QWidget" name="mix1" > 
    1526          <attribute name="title" > 
    1527           <string>Mix 1</string
    1528          </attribute
    1529          <layout class="QHBoxLayout"
    1530           <item
    1531            <widget class="QTabWidget" name="mix1_tab" > 
    1532             <property name="currentIndex"
    1533              <number>0</number
    1534             </property
    1535             <widget class="QWidget" name="tab" > 
    1536              <attribute name="title"
    1537               <string>Analog</string
    1538             </attribute
    1539              <layout class="QHBoxLayout"
    1540               <property name="spacing" > 
    1541                <number>0</number
    1542               </property
    1543               <item
    1544                <widget class="QFrame" name="mix1ana1" > 
    1545                 <property name="frameShape" > 
    1546                  <enum>QFrame::NoFrame</enum
    1547                 </property
    1548                 <property name="frameShadow" > 
    1549                  <enum>QFrame::Plain</enum
    1550                 </property
    1551                 <layout class="QVBoxLayout"
     1631        <layout class="QHBoxLayout" name="horizontalLayout_4" > 
     1632         <property name="margin" > 
     1633          <number>0</number
     1634         </property
     1635         <item
     1636          <widget class="QTabWidget" name="tabWidget4"
     1637           <property name="currentIndex" > 
     1638            <number>0</number
     1639           </property
     1640           <widget class="QWidget" name="mix1"
     1641            <attribute name="title" > 
     1642             <string>Mix 1</string
     1643            </attribute
     1644            <layout class="QHBoxLayout"
     1645             <item
     1646              <widget class="QTabWidget" name="mix1_tab" > 
     1647               <property name="currentIndex"
     1648                <number>0</number
     1649              </property
     1650               <widget class="QWidget" name="tab" > 
     1651                <attribute name="title" > 
     1652                 <string>Analog</string
     1653                </attribute
     1654                <layout class="QHBoxLayout" > 
     1655                 <property name="spacing"
     1656                  <number>0</number
     1657                </property
    15521658                 <item> 
    1553                   <widget class="QToolButton" name="mix1ana1_solo" > 
    1554                    <property name="font" > 
    1555                     <font> 
    1556                      <pointsize>9</pointsize> 
    1557                     </font> 
    1558                    </property> 
    1559                    <property name="text" > 
    1560                     <string>Solo</string> 
    1561                    </property> 
    1562                    <property name="checkable" > 
    1563                     <bool>true</bool> 
    1564                    </property> 
    1565                   </widget> 
    1566                  </item> 
    1567                  <item> 
    1568                   <widget class="QToolButton" name="mix1ana1_mute" > 
    1569                    <property name="font" > 
    1570                     <font> 
    1571                      <pointsize>9</pointsize> 
    1572                     </font> 
    1573                    </property> 
    1574                    <property name="text" > 
    1575                     <string>Mute</string> 
    1576                    </property> 
    1577                    <property name="shortcut" > 
    1578                     <string/> 
    1579                    </property> 
    1580                    <property name="checkable" > 
    1581                     <bool>true</bool> 
    1582                    </property> 
    1583                   </widget> 
    1584                  </item> 
    1585                  <item> 
    1586                   <widget class="QSpinBox" name="mix1ana1_pan" > 
    1587                    <property name="font" > 
    1588                     <font> 
    1589                      <pointsize>9</pointsize> 
    1590                     </font> 
    1591                    </property> 
    1592                    <property name="minimum" > 
    1593                     <number>-64</number> 
    1594                    </property> 
    1595                    <property name="maximum" > 
    1596                     <number>64</number> 
    1597                    </property> 
    1598                   </widget> 
    1599                  </item> 
    1600                  <item> 
    1601                   <widget class="QLabel" name="textLabel1" > 
    1602                    <property name="font" > 
    1603                     <font> 
    1604                      <pointsize>9</pointsize> 
    1605                     </font> 
    1606                    </property> 
    1607                    <property name="text" > 
    1608                     <string>Pan</string> 
    1609                    </property> 
    1610                    <property name="alignment" > 
    1611                     <set>Qt::AlignCenter</set> 
    1612                    </property> 
    1613                    <property name="wordWrap" > 
    1614                     <bool>false</bool> 
    1615                    </property> 
    1616                   </widget> 
    1617                  </item> 
    1618                  <item> 
    1619                   <widget class="QFrame" name="frame8_2" > 
     1659                  <widget class="QFrame" name="mix1ana1" > 
    16201660                   <property name="frameShape" > 
    16211661                    <enum>QFrame::NoFrame</enum> 
     
    16241664                    <enum>QFrame::Plain</enum> 
    16251665                   </property> 
    1626                    <layout class="QHBoxLayout" > 
    1627                     <property name="margin" > 
    1628                      <number>0</number> 
    1629                     </property> 
    1630                     <item> 
    1631                      <spacer> 
    1632                       <property name="orientation" > 
    1633                        <enum>Qt::Horizontal</enum> 
    1634                       </property> 
    1635                       <property name="sizeType" > 
    1636                        <enum>QSizePolicy::Expanding</enum> 
    1637                       </property> 
    1638                       <property name="sizeHint" stdset="0" > 
    1639                        <size> 
    1640                         <width>1</width> 
    1641                         <height>20</height> 
    1642                        </size> 
    1643                       </property> 
    1644                      </spacer> 
    1645                     </item> 
    1646                     <item> 
    1647                      <widget class="QSlider" name="mix1ana1_fader" > 
    1648                       <property name="minimumSize" > 
    1649                        <size> 
    1650                         <width>12</width> 
    1651                         <height>0</height> 
    1652                        </size> 
     1666                   <layout class="QVBoxLayout" > 
     1667                    <item> 
     1668                     <widget class="QToolButton" name="mix1ana1_solo" > 
     1669                      <property name="font" > 
     1670                       <font> 
     1671                        <pointsize>9</pointsize> 
     1672                       </font> 
     1673                      </property> 
     1674                      <property name="text" > 
     1675                       <string>Solo</string> 
     1676                      </property> 
     1677                      <property name="checkable" > 
     1678                       <bool>true</bool> 
     1679                      </property> 
     1680                     </widget> 
     1681                    </item> 
     1682                    <item> 
     1683                     <widget class="QToolButton" name="mix1ana1_mute" > 
     1684                      <property name="font" > 
     1685                       <font> 
     1686                        <pointsize>9</pointsize> 
     1687                       </font> 
     1688                      </property> 
     1689                      <property name="text" > 
     1690                       <string>Mute</string> 
     1691                      </property> 
     1692                      <property name="shortcut" > 
     1693                       <string/> 
     1694                      </property> 
     1695                      <property name="checkable" > 
     1696                       <bool>true</bool> 
     1697                      </property> 
     1698                     </widget> 
     1699                    </item> 
     1700                    <item> 
     1701                     <widget class="QSpinBox" name="mix1ana1_pan" > 
     1702                      <property name="font" > 
     1703                       <font> 
     1704                        <pointsize>9</pointsize> 
     1705                       </font> 
     1706                      </property> 
     1707                      <property name="minimum" > 
     1708                       <number>-64</number> 
    16531709                      </property> 
    16541710                      <property name="maximum" > 
    1655                        <number>128</number> 
    1656                       </property> 
    1657                       <property name="value" > 
    1658                        <number>128</number> 
    1659                       </property> 
    1660                       <property name="orientation" > 
    1661                        <enum>Qt::Vertical</enum> 
    1662                       </property> 
    1663                       <property name="tickInterval" > 
    1664                        <number>5</number> 
    1665                       </property> 
    1666                      </widget> 
    1667                     </item> 
    1668                     <item> 
    1669                      <spacer> 
    1670                       <property name="orientation" > 
    1671                        <enum>Qt::Horizontal</enum> 
    1672                       </property> 
    1673                       <property name="sizeType" > 
    1674                        <enum>QSizePolicy::Expanding</enum> 
    1675                       </property> 
    1676                       <property name="sizeHint" stdset="0" > 
    1677                        <size> 
    1678                         <width>1</width> 
    1679                         <height>20</height> 
    1680                        </size> 
    1681                       </property> 
    1682                      </spacer> 
     1711                       <number>64</number> 
     1712                      </property> 
     1713                     </widget> 
     1714                    </item> 
     1715                    <item> 
     1716                     <widget class="QLabel" name="textLabel1" > 
     1717                      <property name="font" > 
     1718                       <font> 
     1719                        <pointsize>9</pointsize> 
     1720                       </font> 
     1721                      </property> 
     1722                      <property name="text" > 
     1723                       <string>Pan</string> 
     1724                      </property> 
     1725                      <property name="alignment" > 
     1726                       <set>Qt::AlignCenter</set> 
     1727                      </property> 
     1728                      <property name="wordWrap" > 
     1729                       <bool>false</bool> 
     1730                      </property> 
     1731                     </widget> 
     1732                    </item> 
     1733                    <item> 
     1734                     <widget class="QFrame" name="frame8_2" > 
     1735                      <property name="frameShape" > 
     1736                       <enum>QFrame::NoFrame</enum> 
     1737                      </property> 
     1738                      <property name="frameShadow" > 
     1739                       <enum>QFrame::Plain</enum> 
     1740                      </property> 
     1741                      <layout class="QHBoxLayout" > 
     1742                       <property name="margin" > 
     1743                        <number>0</number> 
     1744                       </property> 
     1745                       <item> 
     1746                        <spacer> 
     1747                         <property name="orientation" > 
     1748                          <enum>Qt::Horizontal</enum> 
     1749                         </property> 
     1750                         <property name="sizeType" > 
     1751                          <enum>QSizePolicy::Expanding</enum> 
     1752                         </property> 
     1753                         <property name="sizeHint" stdset="0" > 
     1754                          <size> 
     1755                           <width>1</width> 
     1756                           <height>20</height> 
     1757                          </size> 
     1758                         </property> 
     1759                        </spacer> 
     1760                       </item> 
     1761                       <item> 
     1762                        <widget class="QSlider" name="mix1ana1_fader" > 
     1763                         <property name="minimumSize" > 
     1764                          <size> 
     1765                           <width>12</width> 
     1766                           <height>0</height> 
     1767                          </size> 
     1768                         </property> 
     1769                         <property name="maximum" > 
     1770                          <number>128</number> 
     1771                         </property> 
     1772                         <property name="value" > 
     1773                          <number>128</number> 
     1774                         </property> 
     1775                         <property name="orientation" > 
     1776                          <enum>Qt::Vertical</enum> 
     1777                         </property> 
     1778                         <property name="tickInterval" > 
     1779                          <number>5</number> 
     1780                         </property> 
     1781                        </widget> 
     1782                       </item> 
     1783                       <item> 
     1784                        <spacer> 
     1785                         <property name="orientation" > 
     1786                          <enum>Qt::Horizontal</enum> 
     1787                         </property> 
     1788                         <property name="sizeType" > 
     1789                          <enum>QSizePolicy::Expanding</enum> 
     1790                         </property> 
     1791                         <property name="sizeHint" stdset="0" > 
     1792                          <size> 
     1793                           <width>1</width> 
     1794                           <height>20</height> 
     1795                          </size> 
     1796                         </property> 
     1797                        </spacer> 
     1798                       </item> 
     1799                      </layout> 
     1800                     </widget> 
     1801                    </item> 
     1802                    <item> 
     1803                     <widget class="QLabel" name="textLabel6" > 
     1804                      <property name="font" > 
     1805                       <font> 
     1806                        <weight>75</weight> 
     1807                        <bold>true</bold> 
     1808                       </font> 
     1809                      </property> 
     1810                      <property name="text" > 
     1811                       <string>1</string> 
     1812                      </property> 
     1813                      <property name="alignment" > 
     1814                       <set>Qt::AlignCenter</set> 
     1815                      </property> 
     1816                      <property name="wordWrap" > 
     1817                       <bool>false</bool> 
     1818                      </property> 
     1819                     </widget> 
    16831820                    </item> 
    16841821                   </layout> 
     
    16861823                 </item> 
    16871824                 <item> 
    1688                   <widget class="QLabel" name="textLabel6" > 
    1689                    <property name="font" > 
    1690                     <font> 
    1691                      <weight>75</weight> 
    1692                      <bold>true</bold> 
    1693                     </font> 
    1694                    </property> 
    1695                    <property name="text" > 
    1696                     <string>1</string> 
    1697                    </property> 
    1698                    <property name="alignment" > 
    1699                     <set>Qt::AlignCenter</set> 
    1700                    </property> 
    1701                    <property name="wordWrap" > 
    1702                     <bool>false</bool> 
    1703                    </property> 
     1825                  <widget class="QFrame" name="mix1ana2" > 
     1826                   <property name="frameShape" > 
     1827                    <enum>QFrame::NoFrame</enum> 
     1828                   </property> 
     1829                   <property name="frameShadow" > 
     1830                    <enum>QFrame::Plain</enum> 
     1831                   </property> 
     1832                   <layout class="QVBoxLayout" > 
     1833                    <item> 
     1834                     <widget class="QToolButton" name="mix1ana2_solo" > 
     1835                      <property name="font" > 
     1836                       <font> 
     1837                        <pointsize>9</pointsize> 
     1838                       </font> 
     1839                      </property> 
     1840                      <property name="text" > 
     1841                       <string>Solo</string> 
     1842                      </property> 
     1843                      <property name="checkable" > 
     1844                       <bool>true</bool> 
     1845                      </property> 
     1846                     </widget> 
     1847                    </item> 
     1848                    <item> 
     1849                     <widget class="QToolButton" name="mix1ana2_mute" > 
     1850                      <property name="font" > 
     1851                       <font> 
     1852                        <pointsize>9</pointsize> 
     1853                       </font> 
     1854                      </property> 
     1855                      <property name="text" > 
     1856                       <string>Mute</string> 
     1857                      </property> 
     1858                      <property name="shortcut" > 
     1859                       <string/> 
     1860                      </property> 
     1861                      <property name="checkable" > 
     1862                       <bool>true</bool> 
     1863                      </property> 
     1864                     </widget> 
     1865                    </item> 
     1866                    <item> 
     1867                     <widget class="QSpinBox" name="mix1ana2_pan" > 
     1868                      <property name="font" > 
     1869                       <font> 
     1870                        <pointsize>9</pointsize> 
     1871                       </font> 
     1872                      </property> 
     1873                      <property name="minimum" > 
     1874                       <number>-64</number> 
     1875                      </property> 
     1876                      <property name="maximum" > 
     1877                       <number>64</number> 
     1878                      </property> 
     1879                     </widget> 
     1880                    </item> 
     1881                    <item> 
     1882                     <widget class="QLabel" name="textLabel1_3" > 
     1883                      <property name="font" > 
     1884                       <font> 
     1885                        <pointsize>9</pointsize> 
     1886                       </font> 
     1887                      </property> 
     1888                      <property name="text" > 
     1889                       <string>Pan</string> 
     1890                      </property> 
     1891                      <property name="alignment" > 
     1892                       <set>Qt::AlignCenter</set> 
     1893                      </property> 
     1894                      <property name="wordWrap" > 
     1895                       <bool>false</bool> 
     1896                      </property> 
     1897                     </widget> 
     1898                    </item> 
     1899                    <item> 
     1900                     <widget class="QFrame" name="frame8_2_3" > 
     1901                      <property name="frameShape" > 
     1902                       <enum>QFrame::NoFrame</enum> 
     1903                      </property> 
     1904                      <property name="frameShadow" > 
     1905                       <enum>QFrame::Plain</enum> 
     1906                      </property> 
     1907                      <layout class="QHBoxLayout" > 
     1908                       <property name="margin" > 
     1909                        <number>0</number> 
     1910                       </property> 
     1911                       <item> 
     1912                        <spacer> 
     1913                         <property name="orientation" > 
     1914                          <enum>Qt::Horizontal</enum> 
     1915                         </property> 
     1916                         <property name="sizeType" > 
     1917                          <enum>QSizePolicy::Expanding</enum> 
     1918                         </property> 
     1919                         <property name="sizeHint" stdset="0" > 
     1920                          <size> 
     1921                           <width>1</width> 
     1922                           <height>20</height> 
     1923                          </size> 
     1924                         </property> 
     1925                        </spacer> 
     1926                       </item> 
     1927                       <item> 
     1928                        <widget class="QSlider" name="mix1ana2_fader" > 
     1929                         <property name="minimumSize" > 
     1930                          <size> 
     1931                           <width>12</width> 
     1932                           <height>0</height> 
     1933                          </size> 
     1934                         </property> 
     1935                         <property name="maximum" > 
     1936                          <number>128</number> 
     1937                         </property> 
     1938                         <property name="value" > 
     1939                          <number>128</number> 
     1940                         </property> 
     1941                         <property name="orientation" > 
     1942                          <enum>Qt::Vertical</enum> 
     1943                         </property> 
     1944                         <property name="tickInterval" > 
     1945                          <number>5</number> 
     1946                         </property> 
     1947                        </widget> 
     1948                       </item> 
     1949                       <item> 
     1950                        <spacer> 
     1951                         <property name="orientation" > 
     1952                          <enum>Qt::Horizontal</enum> 
     1953                         </property> 
     1954                         <property name="sizeType" > 
     1955                          <enum>QSizePolicy::Expanding</enum> 
     1956                         </property> 
     1957                         <property name="sizeHint" stdset="0" > 
     1958                          <size> 
     1959                           <width>1</width> 
     1960                           <height>20</height> 
     1961                          </size> 
     1962                         </property> 
     1963                        </spacer> 
     1964                       </item> 
     1965                      </layout> 
     1966                     </widget> 
     1967                    </item> 
     1968                    <item> 
     1969                     <widget class="QLabel" name="textLabel6_3" > 
     1970                      <property name="font" > 
     1971                       <font> 
     1972                        <weight>75</weight> 
     1973                        <bold>true</bold> 
     1974                       </font> 
     1975                      </property> 
     1976                      <property name="text" > 
     1977                       <string>2</string> 
     1978                      </property> 
     1979                      <property name="alignment" > 
     1980                       <set>Qt::AlignCenter</set> 
     1981                      </property> 
     1982                      <property name="wordWrap" > 
     1983                       <bool>false</bool> 
     1984                      </property> 
     1985                     </widget> 
     1986                    </item> 
     1987                   </layout> 
     1988                  </widget> 
     1989                 </item> 
     1990                 <item> 
     1991                  <widget class="QFrame" name="mix1ana3" > 
     1992                   <property name="frameShape" > 
     1993                    <enum>QFrame::NoFrame</enum> 
     1994                   </property> 
     1995                   <property name="frameShadow" > 
     1996                    <enum>QFrame::Plain</enum> 
     1997                   </property> 
     1998                   <layout class="QVBoxLayout" > 
     1999                    <item> 
     2000                     <widget class="QToolButton" name="mix1ana3_solo" > 
     2001                      <property name="font" > 
     2002                       <font> 
     2003                        <pointsize>9</pointsize> 
     2004                       </font> 
     2005                      </property> 
     2006                      <property name="text" > 
     2007                       <string>Solo</string> 
     2008                      </property> 
     2009                      <property name="checkable" > 
     2010                       <bool>true</bool> 
     2011                      </property> 
     2012                     </widget> 
     2013                    </item> 
     2014                    <item> 
     2015                     <widget class="QToolButton" name="mix1ana3_mute" > 
     2016                      <property name="font" > 
     2017                       <font> 
     2018                        <pointsize>9</pointsize> 
     2019                       </font> 
     2020                      </property> 
     2021                      <property name="text" > 
     2022                       <string>Mute</string> 
     2023                      </property> 
     2024                      <property name="shortcut" > 
     2025                       <string/> 
     2026                      </property> 
     2027                      <property name="checkable" > 
     2028                       <bool>true</bool> 
     2029                      </property> 
     2030                     </widget> 
     2031                    </item> 
     2032                    <item> 
     2033                     <widget class="QSpinBox" name="mix1ana3_pan" > 
     2034                      <property name="font" > 
     2035                       <font> 
     2036                        <pointsize>9</pointsize> 
     2037                       </font> 
     2038                      </property> 
     2039                      <property name="minimum" > 
     2040                       <number>-64</number> 
     2041                      </property> 
     2042                      <property name="maximum" > 
     2043                       <number>64</number> 
     2044                      </property> 
     2045                     </widget> 
     2046                    </item> 
     2047                    <item> 
     2048                     <widget class="QLabel" name="textLabel1_4" > 
     2049                      <property name="font" > 
     2050                       <font> 
     2051                        <pointsize>9</pointsize> 
     2052                       </font> 
     2053                      </property> 
     2054                      <property name="text" > 
     2055                       <string>Pan</string> 
     2056                      </property> 
     2057                      <property name="alignment" > 
     2058                       <set>Qt::AlignCenter</set> 
     2059                      </property> 
     2060                      <property name="wordWrap" > 
     2061                       <bool>false</bool> 
     2062                      </property> 
     2063                     </widget> 
     2064                    </item> 
     2065                    <item> 
     2066                     <widget class="QFrame" name="frame8_2_4" > 
     2067                      <property name="frameShape" > 
     2068                       <enum>QFrame::NoFrame</enum> 
     2069                      </property> 
     2070                      <property name="frameShadow" > 
     2071                       <enum>QFrame::Plain</enum> 
     2072                      </property> 
     2073                      <layout class="QHBoxLayout" > 
     2074                       <property name="margin" > 
     2075                        <number>0</number> 
     2076                       </property> 
     2077                       <item> 
     2078                        <spacer> 
     2079                         <property name="orientation" > 
     2080                          <enum>Qt::Horizontal</enum> 
     2081                         </property> 
     2082                         <property name="sizeType" > 
     2083                          <enum>QSizePolicy::Expanding</enum> 
     2084                         </property> 
     2085                         <property name="sizeHint" stdset="0" > 
     2086                          <size> 
     2087                           <width>1</width> 
     2088                           <height>20</height> 
     2089                          </size> 
     2090                         </property> 
     2091                        </spacer> 
     2092                       </item> 
     2093                       <item> 
     2094                        <widget class="QSlider" name="mix1ana3_fader" > 
     2095                         <property name="minimumSize" > 
     2096                          <size> 
     2097                           <width>12</width> 
     2098                           <height>0</height> 
     2099                          </size> 
     2100                         </property> 
     2101                         <property name="maximum" > 
     2102                          <number>128</number> 
     2103                         </property> 
     2104                         <property name="value" > 
     2105                          <number>128</number> 
     2106                         </property> 
     2107                         <property name="orientation" > 
     2108                          <enum>Qt::Vertical</enum> 
     2109                         </property> 
     2110                         <property name="tickInterval" > 
     2111                          <number>5</number> 
     2112                         </property> 
     2113                        </widget> 
     2114                       </item> 
     2115                       <item> 
     2116                        <spacer> 
     2117                         <property name="orientation" > 
     2118                          <enum>Qt::Horizontal</enum> 
     2119                         </property> 
     2120                         <property name="sizeType" > 
     2121                          <enum>QSizePolicy::Expanding</enum> 
     2122                         </property> 
     2123                         <property name="sizeHint" stdset="0" > 
     2124                          <size> 
     2125                           <width>1</width> 
     2126                           <height>20</height> 
     2127                          </size> 
     2128                         </property> 
     2129                        </spacer> 
     2130                       </item> 
     2131                      </layout> 
     2132                     </widget> 
     2133                    </item> 
     2134                    <item> 
     2135                     <widget class="QLabel" name="textLabel6_4" > 
     2136                      <property name="font" > 
     2137                       <font> 
     2138                        <weight>75</weight> 
     2139                        <bold>true</bold> 
     2140                       </font> 
     2141                      </property> 
     2142                      <property name="text" > 
     2143                       <string>3</string> 
     2144                      </property> 
     2145                      <property name="alignment" > 
     2146                       <set>Qt::AlignCenter</set> 
     2147                      </property> 
     2148                      <property name="wordWrap" > 
     2149                       <bool>false</bool> 
     2150                      </property> 
     2151                     </widget> 
     2152                    </item> 
     2153                   </layout> 
     2154                  </widget> 
     2155                 </item> 
     2156                 <item> 
     2157                  <widget class="QFrame" name="mix1ana4" > 
     2158                   <property name="frameShape" > 
     2159                    <enum>QFrame::NoFrame</enum> 
     2160                   </property> 
     2161                   <property name="frameShadow" > 
     2162                    <enum>QFrame::Plain</enum> 
     2163                   </property> 
     2164                   <layout class="QVBoxLayout" > 
     2165                    <item> 
     2166                     <widget class="QToolButton" name="mix1ana4_solo" > 
     2167                      <property name="font" > 
     2168                       <font> 
     2169                        <pointsize>9</pointsize> 
     2170                       </font> 
     2171                      </property> 
     2172                      <property name="text" > 
     2173                       <string>Solo</string> 
     2174                      </property> 
     2175                      <property name="checkable" > 
     2176                       <bool>true</bool> 
     2177                      </property> 
     2178                     </widget> 
     2179                    </item> 
     2180                    <item> 
     2181                     <widget class="QToolButton" name="mix1ana4_mute" > 
     2182                      <property name="font" > 
     2183                       <font> 
     2184                        <pointsize>9</pointsize> 
     2185                       </font> 
     2186                      </property> 
     2187                      <property name="text" > 
     2188                       <string>Mute</string> 
     2189                      </property> 
     2190                      <property name="shortcut" > 
     2191                       <string/> 
     2192                      </property> 
     2193                      <property name="checkable" > 
     2194                       <bool>true</bool> 
     2195                      </property> 
     2196                     </widget> 
     2197                    </item> 
     2198                    <item> 
     2199                     <widget class="QSpinBox" name="mix1ana4_pan" > 
     2200                      <property name="font" > 
     2201                       <font> 
     2202                        <pointsize>9</pointsize> 
     2203                       </font> 
     2204                      </property> 
     2205                      <property name="minimum" > 
     2206                       <number>-64</number> 
     2207                      </property> 
     2208                      <property name="maximum" > 
     2209                       <number>64</number> 
     2210                      </property> 
     2211                     </widget> 
     2212                    </item> 
     2213                    <item> 
     2214                     <widget class="QLabel" name="textLabel1_5" > 
     2215                      <property name="font" > 
     2216                       <font> 
     2217                        <pointsize>9</pointsize> 
     2218                       </font> 
     2219                      </property> 
     2220                      <property name="text" > 
     2221                       <string>Pan</string> 
     2222                      </property> 
     2223                      <property name="alignment" > 
     2224                       <set>Qt::AlignCenter</set> 
     2225                      </property> 
     2226                      <property name="wordWrap" > 
     2227                       <bool>false</bool> 
     2228                      </property> 
     2229                     </widget> 
     2230                    </item> 
     2231                    <item> 
     2232                     <widget class="QFrame" name="frame8_2_5" > 
     2233                      <property name="frameShape" > 
     2234                       <enum>QFrame::NoFrame</enum> 
     2235                      </property> 
     2236                      <property name="frameShadow" > 
     2237                       <enum>QFrame::Plain</enum> 
     2238                      </property> 
     2239                      <layout class="QHBoxLayout" > 
     2240                       <property name="margin" > 
     2241                        <number>0</number> 
     2242                       </property> 
     2243                       <item> 
     2244                        <spacer> 
     2245                         <property name="orientation" > 
     2246                          <enum>Qt::Horizontal</enum> 
     2247                         </property> 
     2248                         <property name="sizeType" > 
     2249                          <enum>QSizePolicy::Expanding</enum> 
     2250                         </property> 
     2251                         <property name="sizeHint" stdset="0" > 
     2252                          <size> 
     2253                           <width>1</width> 
     2254                           <height>20</height> 
     2255                          </size> 
     2256                         </property> 
     2257                        </spacer> 
     2258                       </item> 
     2259                       <item> 
     2260                        <widget class="QSlider" name="mix1ana4_fader" > 
     2261                         <property name="minimumSize" > 
     2262                          <size> 
     2263                           <width>12</width> 
     2264                           <height>0</height> 
     2265                          </size> 
     2266                         </property> 
     2267                         <property name="maximum" > 
     2268                          <number>128</number> 
     2269                         </property> 
     2270                         <property name="value" > 
     2271                          <number>128</number> 
     2272                         </property> 
     2273                         <property name="orientation" > 
     2274                          <enum>Qt::Vertical</enum> 
     2275                         </property> 
     2276                         <property name="tickInterval" > 
     2277                          <number>5</number> 
     2278                         </property> 
     2279                        </widget> 
     2280                       </item> 
     2281                       <item> 
     2282                        <spacer> 
     2283                         <property name="orientation" > 
     2284                          <enum>Qt::Horizontal</enum> 
     2285                         </property> 
     2286                         <property name="sizeType" > 
     2287                          <enum>QSizePolicy::Expanding</enum> 
     2288                         </property> 
     2289                         <property name="sizeHint" stdset="0" > 
     2290                          <size> 
     2291                           <width>1</width> 
     2292                           <height>20</height> 
     2293                          </size> 
     2294                         </property> 
     2295                        </spacer> 
     2296                       </item> 
     2297                      </layout> 
     2298                     </widget> 
     2299                    </item> 
     2300                    <item> 
     2301                     <widget class="QLabel" name="textLabel6_5" > 
     2302                      <property name="font" > 
     2303                       <font> 
     2304                        <weight>75</weight> 
     2305                        <bold>true</bold> 
     2306                       </font> 
     2307                      </property> 
     2308                      <property name="text" > 
     2309                       <string>4</string> 
     2310                      </property> 
     2311                      <property name="alignment" > 
     2312                       <set>Qt::AlignCenter</set> 
     2313                      </property> 
     2314                      <property name="wordWrap" > 
     2315                       <bool>false</bool> 
     2316                      </property> 
     2317                     </widget> 
     2318                    </item> 
     2319                   </layout> 
     2320                  </widget> 
     2321                 </item> 
     2322                 <item> 
     2323                  <widget class="QFrame" name="mix1ana5" > 
     2324                   <property name="frameShape" > 
     2325                    <enum>QFrame::NoFrame</enum> 
     2326                   </property> 
     2327                   <property name="frameShadow" > 
     2328                    <enum>QFrame::Plain</enum> 
     2329                   </property> 
     2330                   <layout class="QVBoxLayout" > 
     2331                    <item> 
     2332                     <widget class="QToolButton" name="mix1ana5_solo" > 
     2333                      <property name="font" > 
     2334                       <font> 
     2335                        <pointsize>9</pointsize> 
     2336                       </font> 
     2337                      </property> 
     2338                      <property name="text" > 
     2339                       <string>Solo</string> 
     2340                      </property> 
     2341                      <property name="checkable" > 
     2342                       <bool>true</bool> 
     2343                      </property> 
     2344                     </widget> 
     2345                    </item> 
     2346                    <item> 
     2347                     <widget class="QToolButton" name="mix1ana5_mute" > 
     2348                      <property name="font" > 
     2349                       <font> 
     2350                        <pointsize>9</pointsize> 
     2351                       </font> 
     2352                      </property> 
     2353                      <property name="text" > 
     2354                       <string>Mute</string> 
     2355                      </property> 
     2356                      <property name="shortcut" > 
     2357                       <string/> 
     2358                      </property> 
     2359                      <property name="checkable" > 
     2360                       <bool>true</bool> 
     2361                      </property> 
     2362                     </widget> 
     2363                    </item> 
     2364                    <item> 
     2365                     <widget class="QSpinBox" name="mix1ana5_pan" > 
     2366                      <property name="font" > 
     2367                       <font> 
     2368                        <pointsize>9</pointsize> 
     2369                       </font> 
     2370                      </property> 
     2371                      <property name="minimum" > 
     2372                       <number>-64</number> 
     2373                      </property> 
     2374                      <property name="maximum" > 
     2375                       <number>64</number> 
     2376                      </property> 
     2377                     </widget> 
     2378                    </item> 
     2379                    <item> 
     2380                     <widget class="QLabel" name="textLabel1_6" > 
     2381                      <property name="font" > 
     2382                       <font> 
     2383                        <pointsize>9</pointsize> 
     2384                       </font> 
     2385                      </property> 
     2386                      <property name="text" > 
     2387                       <string>Pan</string> 
     2388                      </property> 
     2389                      <property name="alignment" > 
     2390                       <set>Qt::AlignCenter</set> 
     2391                      </property> 
     2392                      <property name="wordWrap" > 
     2393                       <bool>false</bool> 
     2394                      </property> 
     2395                     </widget> 
     2396                    </item> 
     2397                    <item> 
     2398                     <widget class="QFrame" name="frame8_2_6" > 
     2399                      <property name="frameShape" > 
     2400                       <enum>QFrame::NoFrame</enum> 
     2401                      </property> 
     2402                      <property name="frameShadow" > 
     2403                       <enum>QFrame::Plain</enum> 
     2404                      </property> 
     2405                      <layout class="QHBoxLayout" > 
     2406                       <property name="margin" > 
     2407                        <number>0</number> 
     2408                       </property> 
     2409                       <item> 
     2410                        <spacer> 
     2411                         <property name="orientation" > 
     2412                          <enum>Qt::Horizontal</enum> 
     2413                         </property> 
     2414                         <property name="sizeType" > 
     2415                          <enum>QSizePolicy::Expanding</enum> 
     2416                         </property> 
     2417                         <property name="sizeHint" stdset="0" > 
     2418                          <size> 
     2419                           <width>1</width> 
     2420                           <height>20</height> 
     2421                          </size> 
     2422                         </property> 
     2423                        </spacer> 
     2424                       </item> 
     2425                       <item> 
     2426                        <widget class="QSlider" name="mix1ana5_fader" > 
     2427                         <property name="minimumSize" > 
     2428                          <size> 
     2429                           <width>12</width> 
     2430                           <height>0</height> 
     2431                          </size> 
     2432                         </property> 
     2433                         <property name="maximum" > 
     2434                          <number>128</number> 
     2435                         </property> 
     2436                         <property name="value" > 
     2437                          <number>128</number> 
     2438                         </property> 
     2439                         <property name="orientation" > 
     2440                          <enum>Qt::Vertical</enum> 
     2441                         </property> 
     2442                         <property name="tickInterval" > 
     2443                          <number>5</number> 
     2444                         </property> 
     2445                        </widget> 
     2446                       </item> 
     2447                       <item> 
     2448                        <spacer> 
     2449                         <property name="orientation" > 
     2450                          <enum>Qt::Horizontal</enum> 
     2451                         </property> 
     2452                         <property name="sizeType" > 
     2453                          <enum>QSizePolicy::Expanding</enum> 
     2454                         </property> 
     2455                         <property name="sizeHint" stdset="0" > 
     2456                          <size> 
     2457                           <width>1</width> 
     2458                           <height>20</height> 
     2459                          </size> 
     2460                         </property> 
     2461                        </spacer> 
     2462                       </item> 
     2463                      </layout> 
     2464                     </widget> 
     2465                    </item> 
     2466                    <item> 
     2467                     <widget class="QLabel" name="textLabel6_6" > 
     2468                      <property name="font" > 
     2469                       <font> 
     2470                        <weight>75</weight> 
     2471                        <bold>true</bold> 
     2472                       </font> 
     2473                      </property> 
     2474                      <property name="text" > 
     2475                       <string>5</string> 
     2476                      </property> 
     2477                      <property name="alignment" > 
     2478                       <set>Qt::AlignCenter</set> 
     2479                      </property> 
     2480                      <property name="wordWrap" > 
     2481                       <bool>false</bool> 
     2482                      </property> 
     2483                     </widget> 
     2484                    </item> 
     2485                   </layout> 
     2486                  </widget> 
     2487                 </item> 
     2488                 <item> 
     2489                  <widget class="QFrame" name="mix1ana6" > 
     2490                   <property name="frameShape" > 
     2491                    <enum>QFrame::NoFrame</enum> 
     2492                   </property> 
     2493                   <property name="frameShadow" > 
     2494                    <enum>QFrame::Plain</enum> 
     2495                   </property> 
     2496                   <layout class="QVBoxLayout" > 
     2497                    <item> 
     2498                     <widget class="QToolButton" name="mix1ana6_solo" > 
     2499                      <property name="font" > 
     2500                       <font> 
     2501                        <pointsize>9</pointsize> 
     2502                       </font> 
     2503                      </property> 
     2504                      <property name="text" > 
     2505                       <string>Solo</string> 
     2506                      </property> 
     2507                      <property name="checkable" > 
     2508                       <bool>true</bool> 
     2509                      </property> 
     2510                     </widget> 
     2511                    </item> 
     2512                    <item> 
     2513                     <widget class="QToolButton" name="mix1ana6_mute" > 
     2514                      <property name="font" > 
     2515                       <font> 
     2516                        <pointsize>9</pointsize> 
     2517                       </font> 
     2518                      </property> 
     2519                      <property name="text" > 
     2520                       <string>Mute</string> 
     2521                      </property> 
     2522                      <property name="shortcut" > 
     2523                       <string/> 
     2524                      </property> 
     2525                      <property name="checkable" > 
     2526                       <bool>true</bool> 
     2527                      </property> 
     2528                     </widget> 
     2529                    </item> 
     2530                    <item> 
     2531                     <widget class="QSpinBox" name="mix1ana6_pan" > 
     2532                      <property name="font" > 
     2533                       <font> 
     2534                        <pointsize>9</pointsize> 
     2535                       </font> 
     2536                      </property> 
     2537                      <property name="minimum" > 
     2538                       <number>-64</number> 
     2539                      </property> 
     2540                      <property name="maximum" > 
     2541                       <number>64</number> 
     2542                      </property> 
     2543                     </widget> 
     2544                    </item> 
     2545                    <item> 
     2546                     <widget class="QLabel" name="textLabel1_7" > 
     2547                      <property name="font" > 
     2548                       <font> 
     2549                        <pointsize>9</pointsize> 
     2550                       </font> 
     2551                      </property> 
     2552                      <property name="text" > 
     2553                       <string>Pan</string> 
     2554                      </property> 
     2555                      <property name="alignment" > 
     2556                       <set>Qt::AlignCenter</set> 
     2557                      </property> 
     2558                      <property name="wordWrap" > 
     2559                       <bool>false</bool> 
     2560                      </property> 
     2561                     </widget> 
     2562                    </item> 
     2563                    <item> 
     2564                     <widget class="QFrame" name="frame8_2_7" > 
     2565                      <property name="frameShape" > 
     2566                       <enum>QFrame::NoFrame</enum> 
     2567                      </property> 
     2568                      <property name="frameShadow" > 
     2569                       <enum>QFrame::Plain</enum> 
     2570                      </property> 
     2571                      <layout class="QHBoxLayout" > 
     2572                       <property name="margin" > 
     2573                        <number>0</number> 
     2574                       </property> 
     2575                       <item> 
     2576                        <spacer> 
     2577                         <property name="orientation" > 
     2578                          <enum>Qt::Horizontal</enum> 
     2579                         </property> 
     2580                         <property name="sizeType" > 
     2581                          <enum>QSizePolicy::Expanding</enum> 
     2582                         </property> 
     2583                         <property name="sizeHint" stdset="0" > 
     2584                          <size> 
     2585                           <width>1</width> 
     2586                           <height>20</height> 
     2587                          </size> 
     2588                         </property> 
     2589                        </spacer> 
     2590                       </item> 
     2591                       <item> 
     2592                        <widget class="QSlider" name="mix1ana6_fader" > 
     2593                         <property name="minimumSize" > 
     2594                          <size> 
     2595                           <width>12</width> 
     2596                           <height>0</height> 
     2597                          </size> 
     2598                         </property> 
     2599                         <property name="maximum" > 
     2600                          <number>128</number> 
     2601                         </property> 
     2602                         <property name="value" > 
     2603                          <number>128</number> 
     2604                         </property> 
     2605                         <property name="orientation" > 
     2606                          <enum>Qt::Vertical</enum> 
     2607                         </property> 
     2608                         <property name="tickInterval" > 
     2609                          <number>5</number> 
     2610                         </property> 
     2611                        </widget> 
     2612                       </item> 
     2613                       <item> 
     2614                        <spacer> 
     2615                         <property name="orientation" > 
     2616                          <enum>Qt::Horizontal</enum> 
     2617                         </property> 
     2618                         <property name="sizeType" > 
     2619                          <enum>QSizePolicy::Expanding</enum> 
     2620                         </property> 
     2621                         <property name="sizeHint" stdset="0" > 
     2622                          <size> 
     2623                           <width>1</width> 
     2624                           <height>20</height> 
     2625                          </size> 
     2626                         </property> 
     2627                        </spacer> 
     2628                       </item> 
     2629                      </layout> 
     2630                     </widget> 
     2631                    </item> 
     2632                    <item> 
     2633                     <widget class="QLabel" name="textLabel6_7" > 
     2634                      <property name="font" > 
     2635                       <font> 
     2636                        <weight>75</weight> 
     2637                        <bold>true</bold> 
     2638                       </font> 
     2639                      </property> 
     2640                      <property name="text" > 
     2641                       <string>6</string> 
     2642                      </property> 
     2643                      <property name="alignment" > 
     2644                       <set>Qt::AlignCenter</set> 
     2645                      </property> 
     2646                      <property name="wordWrap" > 
     2647                       <bool>false</bool> 
     2648                      </property> 
     2649                     </widget> 
     2650                    </item> 
     2651                   </layout> 
     2652                  </widget> 
     2653                 </item> 
     2654                 <item> 
     2655                  <widget class="QFrame" name="mix1ana7" > 
     2656                   <property name="frameShape" > 
     2657                    <enum>QFrame::NoFrame</enum> 
     2658                   </property> 
     2659                   <property name="frameShadow" > 
     2660                    <enum>QFrame::Plain</enum> 
     2661                   </property> 
     2662                   <layout class="QVBoxLayout" > 
     2663                    <item> 
     2664                     <widget class="QToolButton" name="mix1ana7_solo" > 
     2665                      <property name="font" > 
     2666                       <font> 
     2667                        <pointsize>9</pointsize> 
     2668                       </font> 
     2669                      </property> 
     2670                      <property name="text" > 
     2671                       <string>Solo</string> 
     2672                      </property> 
     2673                      <property name="checkable" > 
     2674                       <bool>true</bool> 
     2675                      </property> 
     2676                     </widget> 
     2677                    </item> 
     2678                    <item> 
     2679                     <widget class="QToolButton" name="mix1ana7_mute" > 
     2680                      <property name="font" > 
     2681                       <font> 
     2682                        <pointsize>9</pointsize> 
     2683                       </font> 
     2684                      </property> 
     2685                      <property name="text" > 
     2686                       <string>Mute</string> 
     2687                      </property> 
     2688                      <property name="shortcut" > 
     2689                       <string/> 
     2690                      </property> 
     2691                      <property name="checkable" > 
     2692                       <bool>true</bool> 
     2693                      </property> 
     2694                     </widget> 
     2695                    </item> 
     2696                    <item> 
     2697                     <widget class="QSpinBox" name="mix1ana7_pan" > 
     2698                      <property name="font" > 
     2699                       <font> 
     2700                        <pointsize>9</pointsize> 
     2701                       </font> 
     2702                      </property> 
     2703                      <property name="minimum" > 
     2704                       <number>-64</number> 
     2705                      </property> 
     2706                      <property name="maximum" > 
     2707                       <number>64</number> 
     2708                      </property> 
     2709                     </widget> 
     2710                    </item> 
     2711                    <item> 
     2712                     <widget class="QLabel" name="textLabel1_8" > 
     2713                      <property name="font" > 
     2714                       <font> 
     2715                        <pointsize>9</pointsize> 
     2716                       </font> 
     2717                      </property> 
     2718                      <property name="text" > 
     2719                       <string>Pan</string> 
     2720                      </property> 
     2721                      <property name="alignment" > 
     2722                       <set>Qt::AlignCenter</set> 
     2723                      </property> 
     2724                      <property name="wordWrap" > 
     2725                       <bool>false</bool> 
     2726                      </property> 
     2727                     </widget> 
     2728                    </item> 
     2729                    <item> 
     2730                     <widget class="QFrame" name="frame8_2_8" > 
     2731                      <property name="frameShape" > 
     2732                       <enum>QFrame::NoFrame</enum> 
     2733                      </property> 
     2734                      <property name="frameShadow" > 
     2735                       <enum>QFrame::Plain</enum> 
     2736                      </property> 
     2737                      <layout class="QHBoxLayout" > 
     2738                       <property name="margin" > 
     2739                        <number>0</number> 
     2740                       </property> 
     2741                       <item> 
     2742                        <spacer> 
     2743                         <property name="orientation" > 
     2744                          <enum>Qt::Horizontal</enum> 
     2745                         </property> 
     2746                         <property name="sizeType" > 
     2747                          <enum>QSizePolicy::Expanding</enum> 
     2748                         </property> 
     2749                         <property name="sizeHint" stdset="0" > 
     2750                          <size> 
     2751                           <width>1</width> 
     2752                           <height>20</height> 
     2753                          </size> 
     2754                         </property> 
     2755                        </spacer> 
     2756                       </item> 
     2757                       <item> 
     2758                        <widget class="QSlider" name="mix1ana7_fader" > 
     2759                         <property name="minimumSize" > 
     2760                          <size> 
     2761                           <width>12</width> 
     2762                           <height>0</height> 
     2763                          </size> 
     2764                         </property> 
     2765                         <property name="maximum" > 
     2766                          <number>128</number> 
     2767                         </property> 
     2768                         <property name="value" > 
     2769                          <number>128</number> 
     2770                         </property> 
     2771                         <property name="orientation" > 
     2772                          <enum>Qt::Vertical</enum> 
     2773                         </property> 
     2774                         <property name="tickInterval" > 
     2775                          <number>5</number> 
     2776                         </property> 
     2777                        </widget> 
     2778                       </item> 
     2779                       <item> 
     2780                        <spacer> 
     2781                         <property name="orientation" > 
     2782                          <enum>Qt::Horizontal</enum> 
     2783                         </property> 
     2784                         <property name="sizeType" > 
     2785                          <enum>QSizePolicy::Expanding</enum> 
     2786                         </property> 
     2787                         <property name="sizeHint" stdset="0" > 
     2788                          <size> 
     2789                           <width>1</width> 
     2790                           <height>20</height> 
     2791                          </size> 
     2792                         </property> 
     2793                        </spacer> 
     2794                       </item> 
     2795                      </layout> 
     2796                     </widget> 
     2797                    </item> 
     2798                    <item> 
     2799                     <widget class="QLabel" name="textLabel6_8" > 
     2800                      <property name="font" > 
     2801                       <font> 
     2802                        <weight>75</weight> 
     2803                        <bold>true</bold> 
     2804                       </font> 
     2805                      </property> 
     2806                      <property name="text" > 
     2807                       <string>7</string> 
     2808                      </property> 
     2809                      <property name="alignment" > 
     2810                       <set>Qt::AlignCenter</set> 
     2811                      </property> 
     2812                      <property name="wordWrap" > 
     2813                       <bool>false</bool> 
     2814                      </property> 
     2815                     </widget> 
     2816                    </item> 
     2817                   </layout> 
     2818                  </widget> 
     2819                 </item> 
     2820                 <item> 
     2821                  <widget class="QFrame" name="mix1ana8" > 
     2822                   <property name="frameShape" > 
     2823                    <enum>QFrame::NoFrame</enum> 
     2824                   </property> 
     2825                   <property name="frameShadow" > 
     2826                    <enum>QFrame::Plain</enum> 
     2827                   </property> 
     2828                   <layout class="QVBoxLayout" > 
     2829                    <item> 
     2830                     <widget class="QToolButton" name="mix1ana8_solo" > 
     2831                      <property name="font" > 
     2832                       <font> 
     2833                        <pointsize>9</pointsize> 
     2834                       </font> 
     2835                      </property> 
     2836                      <property name="text" > 
     2837                       <string>Solo</string> 
     2838                      </property> 
     2839                      <property name="checkable" > 
     2840                       <bool>true</bool> 
     2841                      </property> 
     2842                     </widget> 
     2843                    </item> 
     2844                    <item> 
     2845                     <widget class="QToolButton" name="mix1ana8_mute" > 
     2846                      <property name="font" > 
     2847                       <font> 
     2848                        <pointsize>9</pointsize> 
     2849                       </font> 
     2850                      </property> 
     2851                      <property name="text" > 
     2852                       <string>Mute</string> 
     2853                      </property> 
     2854                      <property name="shortcut" > 
     2855                       <string/> 
     2856                      </property> 
     2857                      <property name="checkable" > 
     2858                       <bool>true</bool> 
     2859                      </property> 
     2860                     </widget> 
     2861                    </item> 
     2862                    <item> 
     2863                     <widget class="QSpinBox" name="mix1ana8_pan" > 
     2864                      <property name="font" > 
     2865                       <font> 
     2866                        <pointsize>9</pointsize> 
     2867                       </font> 
     2868                      </property> 
     2869                      <property name="minimum" > 
     2870                       <number>-64</number> 
     2871                      </property> 
     2872                      <property name="maximum" > 
     2873                       <number>64</number> 
     2874                      </property> 
     2875                     </widget> 
     2876                    </item> 
     2877                    <item> 
     2878                     <widget class="QLabel" name="textLabel1_9" > 
     2879                      <property name="font" > 
     2880                       <font> 
     2881                        <pointsize>9</pointsize> 
     2882                       </font> 
     2883                      </property> 
     2884                      <property name="text" > 
     2885                       <string>Pan</string> 
     2886                      </property> 
     2887                      <property name="alignment" > 
     2888                       <set>Qt::AlignCenter</set> 
     2889                      </property> 
     2890                      <property name="wordWrap" > 
     2891                       <bool>false</bool> 
     2892                      </property> 
     2893                     </widget> 
     2894                    </item> 
     2895                    <item> 
     2896                     <widget class="QFrame" name="frame8_2_9" > 
     2897                      <property name="frameShape" > 
     2898                       <enum>QFrame::NoFrame</enum> 
     2899                      </property> 
     2900                      <property name="frameShadow" > 
     2901                       <enum>QFrame::Plain</enum> 
     2902                      </property> 
     2903                      <layout class="QHBoxLayout" > 
     2904                       <property name="margin" > 
     2905                        <number>0</number> 
     2906                       </property> 
     2907                       <item> 
     2908                        <spacer> 
     2909                         <property name="orientation" > 
     2910                          <enum>Qt::Horizontal</enum> 
     2911                         </property> 
     2912                         <property name="sizeType" > 
     2913                          <enum>QSizePolicy::Expanding</enum> 
     2914                         </property> 
     2915                         <property name="sizeHint" stdset="0" > 
     2916                          <size> 
     2917                           <width>1</width> 
     2918                           <height>20</height> 
     2919                          </size> 
     2920                         </property> 
     2921                        </spacer> 
     2922                       </item> 
     2923                       <item> 
     2924                        <widget class="QSlider" name="mix1ana8_fader" > 
     2925                         <property name="minimumSize" > 
     2926                          <size> 
     2927                           <width>12</width> 
     2928                           <height>0</height> 
     2929                          </size> 
     2930                         </property> 
     2931                         <property name="maximum" > 
     2932                          <number>128</number> 
     2933                         </property> 
     2934                         <property name="value" > 
     2935                          <number>128</number> 
     2936                         </property> 
     2937                         <property name="orientation" > 
     2938                          <enum>Qt::Vertical</enum> 
     2939                         </property> 
     2940                         <property name="tickInterval" > 
     2941                          <number>5</number> 
     2942                         </property> 
     2943                        </widget> 
     2944                       </item> 
     2945                       <item> 
     2946                        <spacer> 
     2947                         <property name="orientation" > 
     2948                          <enum>Qt::Horizontal</enum> 
     2949                         </property> 
     2950                         <property name="sizeType" > 
     2951                          <enum>QSizePolicy::Expanding</enum> 
     2952                         </property> 
     2953                         <property name="sizeHint" stdset="0" > 
     2954                          <size> 
     2955                           <width>1</width> 
     2956                           <height>20</height> 
     2957                          </size> 
     2958                         </property> 
     2959                        </spacer> 
     2960                       </item> 
     2961                      </layout> 
     2962                     </widget> 
     2963                    </item> 
     2964                    <item> 
     2965                     <widget class="QLabel" name="textLabel6_9" > 
     2966                      <property name="font" > 
     2967                       <font> 
     2968                        <weight>75</weight> 
     2969                        <bold>true</bold> 
     2970                       </font> 
     2971                      </property> 
     2972                      <property name="text" > 
     2973                       <string>8</string> 
     2974                      </property> 
     2975                      <property name="alignment" > 
     2976                       <set>Qt::AlignCenter</set> 
     2977                      </property> 
     2978                      <property name="wordWrap" > 
     2979                       <bool>false</bool> 
     2980                      </property> 
     2981                     </widget> 
     2982                    </item> 
     2983                   </layout> 
    17042984                  </widget> 
    17052985                 </item> 
    17062986                </layout> 
    17072987               </widget> 
    1708               </item> 
    1709               <item> 
    1710                <widget class="QFrame" name="mix1ana2" > 
    1711                 <property name="frameShape" > 
    1712                  <enum>QFrame::NoFrame</enum> 
    1713                 </property> 
    1714                 <property name="frameShadow" > 
    1715                  <enum>QFrame::Plain</enum> 
    1716                 </property> 
    1717                 <layout class="QVBoxLayout" > 
     2988               <widget class="QWidget" name="tab" > 
     2989                <attribute name="title" > 
     2990                 <string>AES/EBU</string> 
     2991                </attribute> 
     2992                <layout class="QHBoxLayout" > 
     2993                 <property name="spacing" > 
     2994                  <number>0</number> 
     2995                 </property> 
    17182996                 <item> 
    1719                   <widget class="QToolButton" name="mix1ana2_solo" > 
    1720                    <property name="font" > 
    1721                     <font> 
    1722                      <pointsize>9</pointsize> 
    1723                     </font> 
    1724                    </property> 
    1725                    <property name="text" > 
    1726                     <string>Solo</string> 
    1727                    </property> 
    1728                    <property name="checkable" > 
    1729                     <bool>true</bool> 
    1730                    </property> 
    1731                   </widget> 
    1732                  </item> 
    1733                  <item> 
    1734                   <widget class="QToolButton" name="mix1ana2_mute" > 
    1735                    <property name="font" > 
    1736                     <font> 
    1737                      <pointsize>9</pointsize> 
    1738                     </font> 
    1739                    </property> 
    1740                    <property name="text" > 
    1741                     <string>Mute</string> 
    1742                    </property> 
    1743                    <property name="shortcut" > 
    1744                     <string/> 
    1745                    </property> 
    1746                    <property name="checkable" > 
    1747                     <bool>true</bool> 
    1748                    </property> 
    1749                   </widget> 
    1750                  </item> 
    1751                  <item> 
    1752                   <widget class="QSpinBox" name="mix1ana2_pan" > 
    1753                    <property name="font" > 
    1754                     <font> 
    1755                      <pointsize>9</pointsize> 
    1756                     </font> 
    1757                    </property> 
    1758                    <property name="minimum" > 
    1759                     <number>-64</number> 
    1760                    </property> 
    1761                    <property name="maximum" > 
    1762                     <number>64</number> 
    1763                    </property> 
    1764                   </widget> 
    1765                  </item> 
    1766                  <item> 
    1767                   <widget class="QLabel" name="textLabel1_3" > 
    1768                    <property name="font" > 
    1769                     <font> 
    1770                      <pointsize>9</pointsize> 
    1771                     </font> 
    1772                    </property> 
    1773                    <property name="text" > 
    1774                     <string>Pan</string> 
    1775                    </property> 
    1776                    <property name="alignment" > 
    1777                     <set>Qt::AlignCenter</set> 
    1778                    </property> 
    1779                    <property name="wordWrap" > 
    1780                     <bool>false</bool> 
    1781                    </property> 
    1782                   </widget> 
    1783                  </item> 
    1784                  <item> 
    1785                   <widget class="QFrame" name="frame8_2_3" > 
     2997                  <widget class="QFrame" name="mix1aes1" > 
    17862998                   <property name="frameShape" > 
    17872999                    <enum>QFrame::NoFrame</enum> 
     
    17903002                    <enum>QFrame::Plain</enum> 
    17913003                   </property> 
    1792                    <layout class="QHBoxLayout" > 
    1793                     <property name="margin" > 
    1794                      <number>0</number> 
    1795                     </property> 
    1796                     <item> 
    1797                      <spacer> 
    1798                       <property name="orientation" > 
    1799                        <enum>Qt::Horizontal</enum> 
    1800                       </property> 
    1801                       <property name="sizeType" > 
    1802                        <enum>QSizePolicy::Expanding</enum> 
    1803                       </property> 
    1804                       <property name="sizeHint" stdset="0" > 
    1805                        <size> 
    1806                         <width>1</width> 
    1807                         <height>20</height> 
    1808                        </size> 
    1809                       </property> 
    1810                      </spacer> 
    1811                     </item> 
    1812                     <item> 
    1813                      <widget class="QSlider" name="mix1ana2_fader" > 
    1814                       <property name="minimumSize" > 
    1815                        <size> 
    1816                         <width>12</width> 
    1817                         <height>0</height> 
    1818                        </size> 
     3004                   <layout class="QVBoxLayout" > 
     3005                    <item> 
     3006                     <widget class="QToolButton" name="mix1aes1_solo" > 
     3007                      <property name="font" > 
     3008                       <font> 
     3009                        <pointsize>9</pointsize> 
     3010                       </font> 
     3011                      </property> 
     3012                      <property name="text" > 
     3013                       <string>Solo</string> 
     3014                      </property> 
     3015                      <property name="checkable" > 
     3016                       <bool>true</bool> 
     3017                      </property> 
     3018                     </widget> 
     3019                    </item> 
     3020                    <item> 
     3021                     <widget class="QToolButton" name="mix1aes1_mute" > 
     3022                      <property name="font" > 
     3023                       <font> 
     3024                        <pointsize>9</pointsize> 
     3025                       </font> 
     3026                      </property> 
     3027                      <property name="text" > 
     3028                       <string>Mute</string> 
     3029                      </property> 
     3030                      <property name="shortcut" > 
     3031                       <string/> 
     3032                      </property> 
     3033                      <property name="checkable" > 
     3034                       <bool>true</bool> 
     3035                      </property> 
     3036                     </widget> 
     3037                    </item> 
     3038                    <item> 
     3039                     <widget class="QSpinBox" name="mix1aes1_pan" > 
     3040                      <property name="font" > 
     3041                       <font> 
     3042                        <pointsize>9</pointsize> 
     3043                       </font> 
     3044                      </property> 
     3045                      <property name="minimum" > 
     3046                       <number>-64</number> 
    18193047                      </property> 
    18203048                      <property name="maximum" > 
    1821                        <number>128</number> 
    1822                       </property> 
    1823                       <property name="value" > 
    1824                        <number>128</number> 
    1825                       </property> 
    1826                       <property name="orientation" > 
    1827                        <enum>Qt::Vertical</enum> 
    1828                       </property> 
    1829                       <property name="tickInterval" > 
    1830                        <number>5</number> 
    1831                       </property> 
    1832                      </widget> 
    1833                     </item> 
    1834                     <item> 
    1835                      <spacer> 
    1836                       <property name="orientation" > 
    1837                        <enum>Qt::Horizontal</enum> 
    1838                       </property> 
    1839                       <property name="sizeType" > 
    1840                        <enum>QSizePolicy::Expanding</enum> 
    1841                       </property> 
    1842                       <property name="sizeHint" stdset="0" > 
    1843                        <size> 
    1844                         <width>1</width> 
    1845                         <height>20</height> 
    1846                        </size> 
    1847                       </property> 
    1848                      </spacer> 
     3049                       <number>64</number> 
     3050                      </property> 
     3051                     </widget> 
     3052                    </item> 
     3053                    <item> 
     3054                     <widget class="QLabel" name="textLabel1_13" > 
     3055                      <property name="font" > 
     3056                       <font> 
     3057                        <pointsize>9</pointsize> 
     3058                       </font> 
     3059                      </property> 
     3060                      <property name="text" > 
     3061                       <string>Pan</string> 
     3062                      </property> 
     3063                      <property name="alignment" > 
     3064                       <set>Qt::AlignCenter</set> 
     3065                      </property> 
     3066                      <property name="wordWrap" > 
     3067                       <bool>false</bool> 
     3068                      </property> 
     3069                     </widget> 
     3070                    </item> 
     3071                    <item> 
     3072                     <widget class="QFrame" name="frame8_2_13" > 
     3073                      <property name="frameShape" > 
     3074                       <enum>QFrame::NoFrame</enum> 
     3075                      </property> 
     3076                      <property name="frameShadow" > 
     3077                       <enum>QFrame::Plain</enum> 
     3078                      </property> 
     3079                      <layout class="QHBoxLayout" > 
     3080                       <property name="margin" > 
     3081                        <number>0</number> 
     3082                       </property> 
     3083                       <item> 
     3084                        <spacer> 
     3085                         <property name="orientation" > 
     3086                          <enum>Qt::Horizontal</enum> 
     3087                         </property> 
     3088                         <property name="sizeType" > 
     3089                          <enum>QSizePolicy::Expanding</enum> 
     3090                         </property> 
     3091                         <property name="sizeHint" stdset="0" > 
     3092                          <size> 
     3093                           <width>1</width> 
     3094                           <height>20</height> 
     3095                          </size> 
     3096                         </property> 
     3097                        </spacer> 
     3098                       </item> 
     3099                       <item> 
     3100                        <widget class="QSlider" name="mix1aes1_fader" > 
     3101                         <property name="minimumSize" > 
     3102                          <size> 
     3103                           <width>12</width> 
     3104                           <height>0</height> 
     3105                          </size> 
     3106                         </property> 
     3107                         <property name="maximum" > 
     3108                          <number>128</number> 
     3109                         </property> 
     3110                         <property name="value" > 
     3111                          <number>128</number> 
     3112                         </property> 
     3113                         <property name="orientation" > 
     3114                          <enum>Qt::Vertical</enum> 
     3115                         </property> 
     3116                         <property name="tickInterval" > 
     3117                          <number>5</number> 
     3118                         </property> 
     3119                        </widget> 
     3120                       </item> 
     3121                       <item> 
     3122                        <spacer> 
     3123                         <property name="orientation" > 
     3124                          <enum>Qt::Horizontal</enum> 
     3125                         </property> 
     3126                         <property name="sizeType" > 
     3127                          <enum>QSizePolicy::Expanding</enum> 
     3128                         </property> 
     3129                         <property name="sizeHint" stdset="0" > 
     3130                          <size> 
     3131                           <width>1</width> 
     3132                           <height>20</height> 
     3133                          </size> 
     3134                         </property> 
     3135                        </spacer> 
     3136                       </item> 
     3137                      </layout> 
     3138                     </widget> 
     3139                    </item> 
     3140                    <item> 
     3141                     <widget class="QLabel" name="textLabel6_12" > 
     3142                      <property name="font" > 
     3143                       <font> 
     3144                        <weight>75</weight> 
     3145                        <bold>true</bold> 
     3146                       </font> 
     3147                      </property> 
     3148                      <property name="text" > 
     3149                       <string>1</string> 
     3150                      </property> 
     3151                      <property name="alignment" > 
     3152                       <set>Qt::AlignCenter</set> 
     3153                      </property> 
     3154                      <property name="wordWrap" > 
     3155                       <bool>false</bool> 
     3156                      </property> 
     3157                     </widget> 
    18493158                    </item> 
    18503159                   </layout> 
     
    18523161                 </item> 
    18533162                 <item> 
    1854                   <widget class="QLabel" name="textLabel6_3" > 
    1855                    <property name="font" > 
    1856                     <font> 
    1857                      <weight>75</weight> 
    1858                      <bold>true</bold> 
    1859                     </font> 
    1860                    </property> 
    1861                    <property name="text" > 
    1862                     <string>2</string> 
    1863                    </property> 
    1864                    <property name="alignment" > 
    1865                     <set>Qt::AlignCenter</set> 
    1866                    </property> 
    1867                    <property name="wordWrap" > 
    1868                     <bool>false</bool> 
    1869                    </property> 
     3163                  <widget class="QFrame" name="mix1aes2" > 
     3164                   <property name="frameShape" > 
     3165                    <enum>QFrame::NoFrame</enum> 
     3166                   </property> 
     3167                   <property name="frameShadow" > 
     3168                    <enum>QFrame::Plain</enum> 
     3169                   </property> 
     3170                   <layout class="QVBoxLayout" > 
     3171                    <item> 
     3172                     <widget class="QToolButton" name="mix1aes2_solo" > 
     3173                      <property name="font" > 
     3174                       <font> 
     3175                        <pointsize>9</pointsize> 
     3176                       </font> 
     3177                      </property> 
     3178                      <property name="text" > 
     3179                       <string>Solo</string> 
     3180                      </property> 
     3181                      <property name="checkable" > 
     3182                       <bool>true</bool> 
     3183                      </property> 
     3184                     </widget> 
     3185                    </item> 
     3186                    <item> 
     3187                     <widget class="QToolButton" name="mix1aes2_mute" > 
     3188                      <property name="font" > 
     3189                       <font> 
     3190                        <pointsize>9</pointsize> 
     3191                       </font> 
     3192                      </property> 
     3193                      <property name="text" > 
     3194                       <string>Mute</string> 
     3195                      </property> 
     3196                      <property name="shortcut" > 
     3197                       <string/> 
     3198                      </property> 
     3199                      <property name="checkable" > 
     3200                       <bool>true</bool> 
     3201                      </property> 
     3202                     </widget> 
     3203                    </item> 
     3204                    <item> 
     3205                     <widget class="QSpinBox" name="mix1aes2_pan" > 
     3206                      <property name="font" > 
     3207                       <font> 
     3208                        <pointsize>9</pointsize> 
     3209                       </font> 
     3210                      </property> 
     3211                      <property name="minimum" > 
     3212                       <number>-64</number> 
     3213                      </property> 
     3214                      <property name="maximum" > 
     3215                       <number>64</number> 
     3216                      </property> 
     3217                     </widget> 
     3218                    </item> 
     3219                    <item> 
     3220                     <widget class="QLabel" name="textLabel1_3_5" > 
     3221                      <property name="font" > 
     3222                       <font> 
     3223                        <pointsize>9</pointsize> 
     3224                       </font> 
     3225                      </property> 
     3226                      <property name="text" > 
     3227                       <string>Pan</string> 
     3228                      </property> 
     3229                      <property name="alignment" > 
     3230                       <set>Qt::AlignCenter</set> 
     3231                      </property> 
     3232                      <property name="wordWrap" > 
     3233                       <bool>false</bool> 
     3234                      </property> 
     3235                     </widget> 
     3236                    </item> 
     3237                    <item> 
     3238                     <widget class="QFrame" name="frame8_2_3_5" > 
     3239                      <property name="frameShape" > 
     3240                       <enum>QFrame::NoFrame</enum> 
     3241                      </property> 
     3242                      <property name="frameShadow" > 
     3243                       <enum>QFrame::Plain</enum> 
     3244                      </property> 
     3245                      <layout class="QHBoxLayout" > 
     3246                       <property name="margin" > 
     3247                        <number>0</number> 
     3248                       </property> 
     3249                       <item> 
     3250                        <spacer> 
     3251                         <property name="orientation" > 
     3252                          <enum>Qt::Horizontal</enum> 
     3253                         </property> 
     3254                         <property name="sizeType" > 
     3255                          <enum>QSizePolicy::Expanding</enum> 
     3256                         </property> 
     3257                         <property name="sizeHint" stdset="0" > 
     3258                          <size> 
     3259                           <width>1</width> 
     3260                           <height>20</height> 
     3261                          </size> 
     3262                         </property> 
     3263                        </spacer> 
     3264                       </item> 
     3265                       <item> 
     3266                        <widget class="QSlider" name="mix1aes2_fader" > 
     3267                         <property name="minimumSize" > 
     3268                          <size> 
     3269                           <width>12</width> 
     3270                           <height>0</height> 
     3271                          </size> 
     3272                         </property> 
     3273                         <property name="maximum" > 
     3274                          <number>128</number> 
     3275                         </property> 
     3276                         <property name="value" > 
     3277                          <number>128</number> 
     3278                         </property> 
     3279                         <property name="orientation" > 
     3280                          <enum>Qt::Vertical</enum> 
     3281                         </property> 
     3282                         <property name="tickInterval" > 
     3283                          <number>5</number> 
     3284                         </property> 
     3285                        </widget> 
     3286                       </item> 
     3287                       <item> 
     3288                        <spacer> 
     3289                         <property name="orientation" > 
     3290                          <enum>Qt::Horizontal</enum> 
     3291                         </property> 
     3292                         <property name="sizeType" > 
     3293                          <enum>QSizePolicy::Expanding</enum> 
     3294                         </property> 
     3295                         <property name="sizeHint" stdset="0" > 
     3296                          <size> 
     3297                           <width>1</width> 
     3298                           <height>20</height> 
     3299                          </size> 
     3300                         </property> 
     3301                        </spacer> 
     3302                       </item> 
     3303                      </layout> 
     3304                     </widget> 
     3305                    </item> 
     3306                    <item> 
     3307                     <widget class="QLabel" name="textLabel6_3_5" > 
     3308                      <property name="font" > 
     3309                       <font> 
     3310                        <weight>75</weight> 
     3311                        <bold>true</bold> 
     3312                       </font> 
     3313                      </property> 
     3314                      <property name="text" > 
     3315                       <string>2</string> 
     3316                      </property> 
     3317                      <property name="alignment" > 
     3318                       <set>Qt::AlignCenter</set> 
     3319                      </property> 
     3320                      <property name="wordWrap" > 
     3321                       <bool>false</bool> 
     3322                      </property> 
     3323                     </widget> 
     3324                    </item> 
     3325                   </layout> 
     3326                  </widget> 
     3327                 </item> 
     3328                 <item> 
     3329                  <spacer> 
     3330                   <property name="orientation" > 
     3331                    <enum>Qt::Horizontal</enum> 
     3332                   </property> 
     3333                   <property name="sizeType" > 
     3334                    <enum>QSizePolicy::Expanding</enum> 
     3335                   </property> 
     3336                   <property name="sizeHint" stdset="0" > 
     3337                    <size> 
     3338                     <width>450</width> 
     3339                     <height>20</height> 
     3340                    </size> 
     3341                   </property> 
     3342                  </spacer> 
     3343                 </item> 
     3344                </layout> 
     3345               </widget> 
     3346               <widget class="QWidget" name="TabPage" > 
     3347                <attribute name="title" > 
     3348                 <string>SPDIF</string> 
     3349                </attribute> 
     3350                <layout class="QHBoxLayout" > 
     3351                 <property name="spacing" > 
     3352                  <number>0</number> 
     3353                 </property> 
     3354                 <item> 
     3355                  <widget class="QFrame" name="mix1spdif1" > 
     3356                   <property name="frameShape" > 
     3357                    <enum>QFrame::NoFrame</enum> 
     3358                   </property> 
     3359                   <property name="frameShadow" > 
     3360                    <enum>QFrame::Plain</enum> 
     3361                   </property> 
     3362                   <layout class="QVBoxLayout" > 
     3363                    <item> 
     3364                     <widget class="QToolButton" name="mix1spdif1_solo" > 
     3365                      <property name="font" > 
     3366                       <font> 
     3367                        <pointsize>9</pointsize> 
     3368                       </font> 
     3369                      </property> 
     3370                      <property name="text" > 
     3371                       <string>Solo</string> 
     3372                      </property> 
     3373                      <property name="checkable" > 
     3374                       <bool>true</bool> 
     3375                      </property> 
     3376                     </widget> 
     3377                    </item> 
     3378                    <item> 
     3379                     <widget class="QToolButton" name="mix1spdif1_mute" > 
     3380                      <property name="font" > 
     3381                       <font> 
     3382                        <pointsize>9</pointsize> 
     3383                       </font> 
     3384                      </property> 
     3385                      <property name="text" > 
     3386                       <string>Mute</string> 
     3387                      </property> 
     3388                      <property name="shortcut" > 
     3389                       <string/> 
     3390                      </property> 
     3391                      <property name="checkable" > 
     3392                       <bool>true</bool> 
     3393                      </property> 
     3394                     </widget> 
     3395                    </item> 
     3396                    <item> 
     3397                     <widget class="QSpinBox" name="mix1spdif1_pan" > 
     3398                      <property name="font" > 
     3399                       <font> 
     3400                        <pointsize>9</pointsize> 
     3401                       </font> 
     3402                      </property> 
     3403                      <property name="minimum" > 
     3404                       <number>-64</number> 
     3405                      </property> 
     3406                      <property name="maximum" > 
     3407                       <number>64</number> 
     3408                      </property> 
     3409                     </widget> 
     3410                    </item> 
     3411                    <item> 
     3412                     <widget class="QLabel" name="textLabel1_14" > 
     3413                      <property name="font" > 
     3414                       <font> 
     3415                        <pointsize>9</pointsize> 
     3416                       </font> 
     3417                      </property> 
     3418                      <property name="text" > 
     3419                       <string>Pan</string> 
     3420                      </property> 
     3421                      <property name="alignment" > 
     3422                       <set>Qt::AlignCenter</set> 
     3423                      </property> 
     3424                      <property name="wordWrap" > 
     3425                       <bool>false</bool> 
     3426                      </property> 
     3427                     </widget> 
     3428                    </item> 
     3429                    <item> 
     3430                     <widget class="QFrame" name="frame8_2_14" > 
     3431                      <property name="frameShape" > 
     3432                       <enum>QFrame::NoFrame</enum> 
     3433                      </property> 
     3434                      <property name="frameShadow" > 
     3435                       <enum>QFrame::Plain</enum> 
     3436                      </property> 
     3437                      <layout class="QHBoxLayout" > 
     3438                       <property name="margin" > 
     3439                        <number>0</number> 
     3440                       </property> 
     3441                       <item> 
     3442                        <spacer> 
     3443                         <property name="orientation" > 
     3444                          <enum>Qt::Horizontal</enum> 
     3445                         </property> 
     3446                         <property name="sizeType" > 
     3447                          <enum>QSizePolicy::Expanding</enum> 
     3448                         </property> 
     3449                         <property name="sizeHint" stdset="0" > 
     3450                          <size> 
     3451                           <width>1</width> 
     3452                           <height>20</height> 
     3453                          </size> 
     3454                         </property> 
     3455                        </spacer> 
     3456                       </item> 
     3457                       <item> 
     3458                        <widget class="QSlider" name="mix1spdif1_fader" > 
     3459                         <property name="minimumSize" > 
     3460                          <size> 
     3461                           <width>12</width> 
     3462                           <height>0</height> 
     3463                          </size> 
     3464                         </property> 
     3465                         <property name="maximum" > 
     3466                          <number>128</number> 
     3467                         </property> 
     3468                         <property name="value" > 
     3469                          <number>128</number> 
     3470                         </property> 
     3471                         <property name="orientation" > 
     3472                          <enum>Qt::Vertical</enum> 
     3473                         </property> 
     3474                         <property name="tickInterval" > 
     3475                          <number>5</number> 
     3476                         </property> 
     3477                        </widget> 
     3478                       </item> 
     3479                       <item> 
     3480                        <spacer> 
     3481                         <property name="orientation" > 
     3482                          <enum>Qt::Horizontal</enum> 
     3483                         </property> 
     3484                         <property name="sizeType" > 
     3485                          <enum>QSizePolicy::Expanding</enum> 
     3486                         </property> 
     3487                         <property name="sizeHint" stdset="0" > 
     3488                          <size> 
     3489                           <width>1</width> 
     3490                           <height>20</height> 
     3491                          </size> 
     3492                         </property> 
     3493                        </spacer> 
     3494                       </item> 
     3495                      </layout> 
     3496                     </widget> 
     3497                    </item> 
     3498                    <item> 
     3499                     <widget class="QLabel" name="textLabel6_13" > 
     3500                      <property name="font" > 
     3501                       <font> 
     3502                        <weight>75</weight> 
     3503                        <bold>true</bold> 
     3504                       </font> 
     3505                      </property> 
     3506                      <property name="text" > 
     3507                       <string>1</string> 
     3508                      </property> 
     3509                      <property name="alignment" > 
     3510                       <set>Qt::AlignCenter</set> 
     3511                      </property> 
     3512                      <property name="wordWrap" > 
     3513                       <bool>false</bool> 
     3514                      </property> 
     3515                     </widget> 
     3516                    </item> 
     3517                   </layout> 
     3518                  </widget> 
     3519                 </item> 
     3520                 <item> 
     3521                  <widget class="QFrame" name="mix1spdif2" > 
     3522                   <property name="frameShape" > 
     3523                    <enum>QFrame::NoFrame</enum> 
     3524                   </property> 
     3525                   <property name="frameShadow" > 
     3526                    <enum>QFrame::Plain</enum> 
     3527                   </property> 
     3528                   <layout class="QVBoxLayout" > 
     3529                    <item> 
     3530                     <widget class="QToolButton" name="mix1spdif2_solo" > 
     3531                      <property name="font" > 
     3532                       <font> 
     3533                        <pointsize>9</pointsize> 
     3534                       </font> 
     3535                      </property> 
     3536                      <property name="text" > 
     3537                       <string>Solo</string> 
     3538                      </property> 
     3539                      <property name="checkable" > 
     3540                       <bool>true</bool> 
     3541                      </property> 
     3542                     </widget> 
     3543                    </item> 
     3544                    <item> 
     3545                     <widget class="QToolButton" name="mix1spdif2_mute" > 
     3546                      <property name="font" > 
     3547                       <font> 
     3548                        <pointsize>9</pointsize> 
     3549                       </font> 
     3550                      </property> 
     3551                      <property name="text" > 
     3552                       <string>Mute</string> 
     3553                      </property> 
     3554                      <property name="shortcut" > 
     3555                       <string/> 
     3556                      </property> 
     3557                      <property name="checkable" > 
     3558                       <bool>true</bool> 
     3559                      </property> 
     3560                     </widget> 
     3561                    </item> 
     3562                    <item> 
     3563                     <widget class="QSpinBox" name="mix1spdif2_pan" > 
     3564                      <property name="font" > 
     3565                       <font> 
     3566                        <pointsize>9</pointsize> 
     3567                       </font> 
     3568                      </property> 
     3569                      <property name="minimum" > 
     3570                       <number>-64</number> 
     3571                      </property> 
     3572                      <property name="maximum" > 
     3573                       <number>64</number> 
     3574                      </property> 
     3575                     </widget> 
     3576                    </item> 
     3577                    <item> 
     3578                     <widget class="QLabel" name="textLabel1_3_6" > 
     3579                      <property name="font" > 
     3580                       <font> 
     3581                        <pointsize>9</pointsize> 
     3582                       </font> 
     3583                      </property> 
     3584                      <property name="text" > 
     3585                       <string>Pan</string> 
     3586                      </property> 
     3587                      <property name="alignment" > 
     3588                       <set>Qt::AlignCenter</set> 
     3589                      </property> 
     3590                      <property name="wordWrap" > 
     3591                       <bool>false</bool> 
     3592                      </property> 
     3593                     </widget> 
     3594                    </item> 
     3595                    <item> 
     3596                     <widget class="QFrame" name="frame8_2_3_6" > 
     3597                      <property name="frameShape" > 
     3598                       <enum>QFrame::NoFrame</enum> 
     3599                      </property> 
     3600                      <property name="frameShadow" > 
     3601                       <enum>QFrame::Plain</enum> 
     3602                      </property> 
     3603                      <layout class="QHBoxLayout" > 
     3604                       <property name="margin" > 
     3605                        <number>0</number> 
     3606                       </property> 
     3607                       <item> 
     3608                        <spacer> 
     3609                         <property name="orientation" > 
     3610                          <enum>Qt::Horizontal</enum> 
     3611                         </property> 
     3612                         <property name="sizeType" > 
     3613                          <enum>QSizePolicy::Expanding</enum> 
     3614                         </property> 
     3615                         <property name="sizeHint" stdset="0" > 
     3616                          <size> 
     3617                           <width>1</width> 
     3618                           <height>20</height> 
     3619                          </size> 
     3620                         </property> 
     3621                        </spacer> 
     3622                       </item> 
     3623                       <item> 
     3624                        <widget class="QSlider" name="mix1spdif2_fader" > 
     3625                         <property name="minimumSize" > 
     3626                          <size> 
     3627                           <width>12</width> 
     3628                           <height>0</height> 
     3629                          </size> 
     3630                         </property> 
     3631                         <property name="maximum" > 
     3632                          <number>128</number> 
     3633                         </property> 
     3634                         <property name="value" > 
     3635                          <number>128</number> 
     3636                         </property> 
     3637                         <property name="orientation" > 
     3638                          <enum>Qt::Vertical</enum> 
     3639                         </property> 
     3640                         <property name="tickInterval" > 
     3641                          <number>5</number> 
     3642                         </property> 
     3643                        </widget> 
     3644                       </item> 
     3645                       <item> 
     3646                        <spacer> 
     3647                         <property name="orientation" > 
     3648                          <enum>Qt::Horizontal</enum> 
     3649                         </property> 
     3650                         <property name="sizeType" > 
     3651                          <enum>QSizePolicy::Expanding</enum> 
     3652                         </property> 
     3653                         <property name="sizeHint" stdset="0" > 
     3654                          <size> 
     3655                           <width>1</width> 
     3656                           <height>20</height> 
     3657                          </size> 
     3658                         </property> 
     3659                        </spacer> 
     3660                       </item> 
     3661                      </layout> 
     3662                     </widget> 
     3663                    </item> 
     3664                    <item> 
     3665                     <widget class="QLabel" name="textLabel6_3_6" > 
     3666                      <property name="font" > 
     3667                       <font> 
     3668                        <weight>75</weight> 
     3669                        <bold>true</bold> 
     3670                       </font> 
     3671                      </property> 
     3672                      <property name="text" > 
     3673                       <string>2</string> 
     3674                      </property> 
     3675                      <property name="alignment" > 
     3676                       <set>Qt::AlignCenter</set> 
     3677                      </property> 
     3678                      <property name="wordWrap" > 
     3679                       <bool>false</bool> 
     3680                      </property> 
     3681                     </widget> 
     3682                    </item> 
     3683                   </layout> 
     3684                  </widget> 
     3685                 </item> 
     3686                 <item> 
     3687                  <spacer> 
     3688                   <property name="orientation" > 
     3689                    <enum>Qt::Horizontal</enum> 
     3690                   </property> 
     3691                   <property name="sizeType" > 
     3692                    <enum>QSizePolicy::Expanding</enum> 
     3693                   </property> 
     3694                   <property name="sizeHint" stdset="0" > 
     3695                    <size> 
     3696                     <width>470</width> 
     3697                     <height>20</height> 
     3698                    </size> 
     3699                   </property> 
     3700                  </spacer> 
     3701                 </item> 
     3702                </layout> 
     3703               </widget> 
     3704               <widget class="QWidget" name="TabPage" > 
     3705                <attribute name="title" > 
     3706                 <string>ADAT</string> 
     3707                </attribute> 
     3708                <layout class="QHBoxLayout" > 
     3709                 <property name="spacing" > 
     3710                  <number>0</number> 
     3711                 </property> 
     3712                 <item> 
     3713                  <widget class="QFrame" name="mix1adat1" > 
     3714                   <property name="frameShape" > 
     3715                    <enum>QFrame::NoFrame</enum> 
     3716                   </property> 
     3717                   <property name="frameShadow" > 
     3718                    <enum>QFrame::Plain</enum> 
     3719                   </property> 
     3720                   <layout class="QVBoxLayout" > 
     3721                    <item> 
     3722                     <widget class="QToolButton" name="mix1adat1_solo" > 
     3723                      <property name="font" > 
     3724                       <font> 
     3725                        <pointsize>9</pointsize> 
     3726                       </font> 
     3727                      </property> 
     3728                      <property name="text" > 
     3729                       <string>Solo</string> 
     3730                      </property> 
     3731                      <property name="checkable" > 
     3732                       <bool>true</bool> 
     3733                      </property> 
     3734                     </widget> 
     3735                    </item> 
     3736                    <item> 
     3737                     <widget class="QToolButton" name="mix1adat1_mute" > 
     3738                      <property name="font" > 
     3739                       <font> 
     3740                        <pointsize>9</pointsize> 
     3741                       </font> 
     3742                      </property> 
     3743                      <property name="text" > 
     3744                       <string>Mute</string> 
     3745                      </property> 
     3746                      <property name="shortcut" > 
     3747                       <string/> 
     3748                      </property> 
     3749                      <property name="checkable" > 
     3750                       <bool>true</bool> 
     3751                      </property> 
     3752                     </widget> 
     3753                    </item> 
     3754                    <item> 
     3755                     <widget class="QSpinBox" name="mix1adat1_pan" > 
     3756                      <property name="font" > 
     3757                       <font> 
     3758                        <pointsize>9</pointsize> 
     3759                       </font> 
     3760                      </property> 
     3761                      <property name="minimum" > 
     3762                       <number>-64</number> 
     3763                      </property> 
     3764                      <property name="maximum" > 
     3765                       <number>64</number> 
     3766                      </property> 
     3767                     </widget> 
     3768                    </item> 
     3769                    <item> 
     3770                     <widget class="QLabel" name="textLabel1_12" > 
     3771                      <property name="font" > 
     3772                       <font> 
     3773                        <pointsize>9</pointsize> 
     3774                       </font> 
     3775                      </property> 
     3776                      <property name="text" > 
     3777                       <string>Pan</string> 
     3778                      </property> 
     3779                      <property name="alignment" > 
     3780                       <set>Qt::AlignCenter</set> 
     3781                      </property> 
     3782                      <property name="wordWrap" > 
     3783                       <bool>false</bool> 
     3784                      </property> 
     3785                     </widget> 
     3786                    </item> 
     3787                    <item> 
     3788                     <widget class="QFrame" name="frame8_2_12" > 
     3789                      <property name="frameShape" > 
     3790                       <enum>QFrame::NoFrame</enum> 
     3791                      </property> 
     3792                      <property name="frameShadow" > 
     3793                       <enum>QFrame::Plain</enum> 
     3794                      </property> 
     3795                      <layout class="QHBoxLayout" > 
     3796                       <property name="margin" > 
     3797                        <number>0</number> 
     3798                       </property> 
     3799                       <item> 
     3800                        <spacer> 
     3801                         <property name="orientation" > 
     3802                          <enum>Qt::Horizontal</enum> 
     3803                         </property> 
     3804                         <property name="sizeType" > 
     3805                          <enum>QSizePolicy::Expanding</enum> 
     3806                         </property> 
     3807                         <property name="sizeHint" stdset="0" > 
     3808                          <size> 
     3809                           <width>1</width> 
     3810                           <height>20</height> 
     3811                          </size> 
     3812                         </property> 
     3813                        </spacer> 
     3814                       </item> 
     3815                       <item> 
     3816                        <widget class="QSlider" name="mix1adat1_fader" > 
     3817                         <property name="minimumSize" > 
     3818                          <size> 
     3819                           <width>12</width> 
     3820                           <height>0</height> 
     3821                          </size> 
     3822                         </property> 
     3823                         <property name="maximum" > 
     3824                          <number>128</number> 
     3825                         </property> 
     3826                         <property name="value" > 
     3827                          <number>128</number> 
     3828                         </property> 
     3829                         <property name="orientation" > 
     3830                          <enum>Qt::Vertical</enum> 
     3831                         </property> 
     3832                         <property name="tickInterval" > 
     3833                          <number>5</number> 
     3834                         </property> 
     3835                        </widget> 
     3836                       </item> 
     3837                       <item> 
     3838                        <spacer> 
     3839                         <property name="orientation" > 
     3840                          <enum>Qt::Horizontal</enum> 
     3841                         </property> 
     3842                         <property name="sizeType" > 
     3843                          <enum>QSizePolicy::Expanding</enum> 
     3844                         </property> 
     3845                         <property name="sizeHint" stdset="0" > 
     3846                          <size> 
     3847                           <width>1</width> 
     3848                           <height>20</height> 
     3849                          </size> 
     3850                         </property> 
     3851                        </spacer> 
     3852                       </item> 
     3853                      </layout> 
     3854                     </widget> 
     3855                    </item> 
     3856                    <item> 
     3857                     <widget class="QLabel" name="textLabel6_11" > 
     3858                      <property name="font" > 
     3859                       <font> 
     3860                        <weight>75</weight> 
     3861                        <bold>true</bold> 
     3862                       </font> 
     3863                      </property> 
     3864                      <property name="text" > 
     3865                       <string>1</string> 
     3866                      </property> 
     3867                      <property name="alignment" > 
     3868                       <set>Qt::AlignCenter</set> 
     3869                      </property> 
     3870                      <property name="wordWrap" > 
     3871                       <bool>false</bool> 
     3872                      </property> 
     3873                     </widget> 
     3874                    </item> 
     3875                   </layout> 
     3876                  </widget> 
     3877                 </item> 
     3878                 <item> 
     3879                  <widget class="QFrame" name="mix1adat2" > 
     3880                   <property name="frameShape" > 
     3881                    <enum>QFrame::NoFrame</enum> 
     3882                   </property> 
     3883                   <property name="frameShadow" > 
     3884                    <enum>QFrame::Plain</enum> 
     3885                   </property> 
     3886                   <layout class="QVBoxLayout" > 
     3887                    <item> 
     3888                     <widget class="QToolButton" name="mix1adat2_solo" > 
     3889                      <property name="font" > 
     3890                       <font> 
     3891                        <pointsize>9</pointsize> 
     3892                       </font> 
     3893                      </property> 
     3894                      <property name="text" > 
     3895                       <string>Solo</string> 
     3896                      </property> 
     3897                      <property name="checkable" > 
     3898                       <bool>true</bool> 
     3899                      </property> 
     3900                     </widget> 
     3901                    </item> 
     3902                    <item> 
     3903                     <widget class="QToolButton" name="mix1adat2_mute" > 
     3904                      <property name="font" > 
     3905                       <font> 
     3906                        <pointsize>9</pointsize> 
     3907                       </font> 
     3908                      </property> 
     3909                      <property name="text" > 
     3910                       <string>Mute</string> 
     3911                      </property> 
     3912                      <property name="shortcut" > 
     3913                       <string/> 
     3914                      </property> 
     3915                      <property name="checkable" > 
     3916                       <bool>true</bool> 
     3917                      </property> 
     3918                     </widget> 
     3919                    </item> 
     3920                    <item> 
     3921                     <widget class="QSpinBox" name="mix1adat2_pan" > 
     3922                      <property name="font" > 
     3923                       <font> 
     3924                        <pointsize>9</pointsize> 
     3925                       </font> 
     3926                      </property> 
     3927                      <property name="minimum" > 
     3928                       <number>-64</number> 
     3929                      </property> 
     3930                      <property name="maximum" > 
     3931                       <number>64</number> 
     3932                      </property> 
     3933                     </widget> 
     3934                    </item> 
     3935                    <item> 
     3936                     <widget class="QLabel" name="textLabel1_3_4" > 
     3937                      <property name="font" > 
     3938                       <font> 
     3939                        <pointsize>9</pointsize> 
     3940                       </font> 
     3941                      </property> 
     3942                      <property name="text" > 
     3943                       <string>Pan</string> 
     3944                      </property> 
     3945                      <property name="alignment" > 
     3946                       <set>Qt::AlignCenter</set> 
     3947                      </property> 
     3948                      <property name="wordWrap" > 
     3949                       <bool>false</bool> 
     3950                      </property> 
     3951                     </widget> 
     3952                    </item> 
     3953                    <item> 
     3954                     <widget class="QFrame" name="frame8_2_3_4" > 
     3955                      <property name="frameShape" > 
     3956                       <enum>QFrame::NoFrame</enum> 
     3957                      </property> 
     3958                      <property name="frameShadow" > 
     3959                       <enum>QFrame::Plain</enum> 
     3960                      </property> 
     3961                      <layout class="QHBoxLayout" > 
     3962                       <property name="margin" > 
     3963                        <number>0</number> 
     3964                       </property> 
     3965                       <item> 
     3966                        <spacer> 
     3967                         <property name="orientation" > 
     3968                          <enum>Qt::Horizontal</enum> 
     3969                         </property> 
     3970                         <property name="sizeType" > 
     3971                          <enum>QSizePolicy::Expanding</enum> 
     3972                         </property> 
     3973                         <property name="sizeHint" stdset="0" > 
     3974                          <size> 
     3975                           <width>1</width> 
     3976                           <height>20</height> 
     3977                          </size> 
     3978                         </property> 
     3979                        </spacer> 
     3980                       </item> 
     3981                       <item> 
     3982                        <widget class="QSlider" name="mix1adat2_fader" > 
     3983                         <property name="minimumSize" > 
     3984                          <size> 
     3985                           <width>12</width> 
     3986                           <height>0</height> 
     3987                          </size> 
     3988                         </property> 
     3989                         <property name="maximum" > 
     3990                          <number>128</number> 
     3991                         </property> 
     3992                         <property name="value" > 
     3993                          <number>128</number> 
     3994                         </property> 
     3995                         <property name="orientation" > 
     3996                          <enum>Qt::Vertical</enum> 
     3997                         </property> 
     3998                         <property name="tickInterval" > 
     3999                          <number>5</number> 
     4000                         </property> 
     4001                        </widget> 
     4002                       </item> 
     4003                       <item> 
     4004                        <spacer> 
     4005                         <property name="orientation" > 
     4006                          <enum>Qt::Horizontal</enum> 
     4007                         </property> 
     4008                         <property name="sizeType" > 
     4009                          <enum>QSizePolicy::Expanding</enum> 
     4010                         </property> 
     4011                         <property name="sizeHint" stdset="0" > 
     4012                          <size> 
     4013                           <width>1</width> 
     4014                           <height>20</height> 
     4015                          </size> 
     4016                         </property> 
     4017                        </spacer> 
     4018                       </item> 
     4019                      </layout> 
     4020                     </widget> 
     4021                    </item> 
     4022                    <item> 
     4023                     <widget class="QLabel" name="textLabel6_3_4" > 
     4024                      <property name="font" > 
     4025                       <font> 
     4026                        <weight>75</weight> 
     4027                        <bold>true</bold> 
     4028                       </font> 
     4029                      </property> 
     4030                      <property name="text" > 
     4031                       <string>2</string> 
     4032                      </property> 
     4033                      <property name="alignment" > 
     4034                       <set>Qt::AlignCenter</set> 
     4035                      </property> 
     4036                      <property name="wordWrap" > 
     4037                       <bool>false</bool> 
     4038                      </property> 
     4039                     </widget> 
     4040                    </item> 
     4041                   </layout> 
     4042                  </widget> 
     4043                 </item> 
     4044                 <item> 
     4045                  <widget class="QFrame" name="mix1adat3" > 
     4046                   <property name="frameShape" > 
     4047                    <enum>QFrame::NoFrame</enum> 
     4048                   </property> 
     4049                   <property name="frameShadow" > 
     4050                    <enum>QFrame::Plain</enum> 
     4051                   </property> 
     4052                   <layout class="QVBoxLayout" > 
     4053                    <item> 
     4054                     <widget class="QToolButton" name="mix1adat3_solo" > 
     4055                      <property name="font" > 
     4056                       <font> 
     4057                        <pointsize>9</pointsize> 
     4058                       </font> 
     4059                      </property> 
     4060                      <property name="text" > 
     4061                       <string>Solo</string> 
     4062                      </property> 
     4063                      <property name="checkable" > 
     4064                       <bool>true</bool> 
     4065                      </property> 
     4066                     </widget> 
     4067                    </item> 
     4068                    <item> 
     4069                     <widget class="QToolButton" name="mix1adat3_mute" > 
     4070                      <property name="font" > 
     4071                       <font> 
     4072                        <pointsize>9</pointsize> 
     4073                       </font> 
     4074                      </property> 
     4075                      <property name="text" > 
     4076                       <string>Mute</string> 
     4077                      </property> 
     4078                      <property name="shortcut" > 
     4079                       <string/> 
     4080                      </property> 
     4081                      <property name="checkable" > 
     4082                       <bool>true</bool> 
     4083                      </property> 
     4084                     </widget> 
     4085                    </item> 
     4086                    <item> 
     4087                     <widget class="QSpinBox" name="mix1adat3_pan" > 
     4088                      <property name="font" > 
     4089                       <font> 
     4090                        <pointsize>9</pointsize> 
     4091                       </font> 
     4092                      </property> 
     4093                      <property name="minimum" > 
     4094                       <number>-64</number> 
     4095                      </property> 
     4096                      <property name="maximum" > 
     4097                       <number>64</number> 
     4098                      </property> 
     4099                     </widget> 
     4100                    </item> 
     4101                    <item> 
     4102                     <widget class="QLabel" name="textLabel1_4_4" > 
     4103                      <property name="font" > 
     4104                       <font> 
     4105                        <pointsize>9</pointsize> 
     4106                       </font> 
     4107                      </property> 
     4108                      <property name="text" > 
     4109                       <string>Pan</string> 
     4110                      </property> 
     4111                      <property name="alignment" > 
     4112                       <set>Qt::AlignCenter</set> 
     4113                      </property> 
     4114                      <property name="wordWrap" > 
     4115                       <bool>false</bool> 
     4116                      </property> 
     4117                     </widget> 
     4118                    </item> 
     4119                    <item> 
     4120                     <widget class="QFrame" name="frame8_2_4_4" > 
     4121                      <property name="frameShape" > 
     4122                       <enum>QFrame::NoFrame</enum> 
     4123                      </property> 
     4124                      <property name="frameShadow" > 
     4125                       <enum>QFrame::Plain</enum> 
     4126                      </property> 
     4127                      <layout class="QHBoxLayout" > 
     4128                       <property name="margin" > 
     4129                        <number>0</number> 
     4130                       </property> 
     4131                       <item> 
     4132                        <spacer> 
     4133                         <property name="orientation" > 
     4134                          <enum>Qt::Horizontal</enum> 
     4135                         </property> 
     4136                         <property name="sizeType" > 
     4137                          <enum>QSizePolicy::Expanding</enum> 
     4138                         </property> 
     4139                         <property name="sizeHint" stdset="0" > 
     4140                          <size> 
     4141                           <width>1</width> 
     4142                           <height>20</height> 
     4143                          </size> 
     4144                         </property> 
     4145                        </spacer> 
     4146                       </item> 
     4147                       <item> 
     4148                        <widget class="QSlider" name="mix1adat3_fader" > 
     4149                         <property name="minimumSize" > 
     4150                          <size> 
     4151                           <width>12</width> 
     4152                           <height>0</height> 
     4153                          </size> 
     4154                         </property> 
     4155                         <property name="maximum" > 
     4156                          <number>128</number> 
     4157                         </property> 
     4158                         <property name="value" > 
     4159                          <number>128</number> 
     4160                         </property> 
     4161                         <property name="orientation" > 
     4162                          <enum>Qt::Vertical</enum> 
     4163                         </property> 
     4164                         <property name="tickInterval" > 
     4165                          <number>5</number> 
     4166                         </property> 
     4167                        </widget> 
     4168                       </item> 
     4169                       <item> 
     4170                        <spacer> 
     4171                         <property name="orientation" > 
     4172                          <enum>Qt::Horizontal</enum> 
     4173                         </property> 
     4174                         <property name="sizeType" > 
     4175                          <enum>QSizePolicy::Expanding</enum> 
     4176                         </property> 
     4177                         <property name="sizeHint" stdset="0" > 
     4178                          <size> 
     4179                           <width>1</width> 
     4180                           <height>20</height> 
     4181                          </size> 
     4182                         </property> 
     4183                        </spacer> 
     4184                       </item> 
     4185                      </layout> 
     4186                     </widget> 
     4187                    </item> 
     4188                    <item> 
     4189                     <widget class="QLabel" name="textLabel6_4_4" > 
     4190                      <property name="font" > 
     4191                       <font> 
     4192                        <weight>75</weight> 
     4193                        <bold>true</bold> 
     4194                       </font> 
     4195                      </property> 
     4196                      <property name="text" > 
     4197                       <string>3</string> 
     4198                      </property> 
     4199                      <property name="alignment" > 
     4200                       <set>Qt::AlignCenter</set> 
     4201                      </property> 
     4202                      <property name="wordWrap" > 
     4203                       <bool>false</bool> 
     4204                      </property> 
     4205                     </widget> 
     4206                    </item> 
     4207                   </layout> 
     4208                  </widget> 
     4209                 </item> 
     4210                 <item> 
     4211                  <widget class="QFrame" name="mix1adat4" > 
     4212                   <property name="frameShape" > 
     4213                    <enum>QFrame::NoFrame</enum> 
     4214                   </property> 
     4215                   <property name="frameShadow" > 
     4216                    <enum>QFrame::Plain</enum> 
     4217                   </property> 
     4218                   <layout class="QVBoxLayout" > 
     4219                    <item> 
     4220                     <widget class="QToolButton" name="mix1adat4_solo" > 
     4221                      <property name="font" > 
     4222                       <font> 
     4223                        <pointsize>9</pointsize> 
     4224                       </font> 
     4225                      </property> 
     4226                      <property name="text" > 
     4227                       <string>Solo</string> 
     4228                      </property> 
     4229                      <property name="checkable" > 
     4230                       <bool>true</bool> 
     4231                      </property> 
     4232                     </widget> 
     4233                    </item> 
     4234                    <item> 
     4235                     <widget class="QToolButton" name="mix1adat4_mute" > 
     4236                      <property name="font" > 
     4237                       <font> 
     4238                        <pointsize>9</pointsize> 
     4239                       </font> 
     4240                      </property> 
     4241                      <property name="text" > 
     4242                       <string>Mute</string> 
     4243                      </property> 
     4244                      <property name="shortcut" > 
     4245                       <string/> 
     4246                      </property> 
     4247                      <property name="checkable" > 
     4248                       <bool>true</bool> 
     4249                      </property> 
     4250                     </widget> 
     4251                    </item> 
     4252                    <item> 
     4253                     <widget class="QSpinBox" name="mix1adat4_pan" > 
     4254                      <property name="font" > 
     4255                       <font> 
     4256                        <pointsize>9</pointsize> 
     4257                       </font> 
     4258                      </property> 
     4259                      <property name="minimum" > 
     4260                       <number>-64</number> 
     4261                      </property> 
     4262                      <property name="maximum" > 
     4263                       <number>64</number> 
     4264                      </property> 
     4265                     </widget> 
     4266                    </item> 
     4267                    <item> 
     4268                     <widget class="QLabel" name="textLabel1_5_4" > 
     4269                      <property name="font" > 
     4270                       <font> 
     4271                        <pointsize>9</pointsize> 
     4272                       </font> 
     4273                      </property> 
     4274                      <property name="text" > 
     4275                       <string>Pan</string> 
     4276                      </property> 
     4277                      <property name="alignment" > 
     4278                       <set>Qt::AlignCenter</set> 
     4279                      </property> 
     4280                      <property name="wordWrap" > 
     4281                       <bool>false</bool> 
     4282                      </property> 
     4283                     </widget> 
     4284                    </item> 
     4285                    <item> 
     4286                     <widget class="QFrame" name="frame8_2_5_4" > 
     4287                      <property name="frameShape" > 
     4288                       <enum>QFrame::NoFrame</enum> 
     4289                      </property> 
     4290                      <property name="frameShadow" > 
     4291                       <enum>QFrame::Plain</enum> 
     4292                      </property> 
     4293                      <layout class="QHBoxLayout" > 
     4294                       <property name="margin" > 
     4295                        <number>0</number> 
     4296                       </property> 
     4297                       <item> 
     4298                        <spacer> 
     4299                         <property name="orientation" > 
     4300                          <enum>Qt::Horizontal</enum> 
     4301                         </property> 
     4302                         <property name="sizeType" > 
     4303                          <enum>QSizePolicy::Expanding</enum> 
     4304                         </property> 
     4305                         <property name="sizeHint" stdset="0" > 
     4306                          <size> 
     4307                           <width>1</width> 
     4308                           <height>20</height> 
     4309                          </size> 
     4310                         </property> 
     4311                        </spacer> 
     4312                       </item> 
     4313                       <item> 
     4314                        <widget class="QSlider" name="mix1adat4_fader" > 
     4315                         <property name="minimumSize" > 
     4316                          <size> 
     4317                           <width>12</width> 
     4318                           <height>0</height> 
     4319                          </size> 
     4320                         </property> 
     4321                         <property name="maximum" > 
     4322                          <number>128</number> 
     4323                         </property> 
     4324                         <property name="value" > 
     4325                          <number>128</number> 
     4326                         </property> 
     4327                         <property name="orientation" > 
     4328