Changeset 1238

Show
Ignore:
Timestamp:
06/01/08 03:53:03 (13 years ago)
Author:
ppalmers
Message:

move global id bookkeeping to the plugmanager, being a per-device singleton. plug id's only have to be unique within one device. correctly detect the case where a PCR output plug has no connections.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/config.h.in

    r1213 r1238  
    8484 
    8585// discovery 
    86 #define ENABLE_DISCOVERY_CACHE               0 
     86#define ENABLE_DISCOVERY_CACHE               1 
    8787 
    8888// watchdog 
  • branches/libffado-2.0/src/libavc/ccm/avc_signal_source.h

    r864 r1238  
    7272{ 
    7373public: 
     74    enum eOutputStatus { 
     75        eOS_Effective = 0, 
     76        eOS_NotEffective = 1, 
     77        eOS_InsufficientResource = 2, 
     78        eOS_Ready = 3, 
     79        eOS_Output = 4, 
     80    }; 
     81public: 
    7482    SignalSourceCmd( Ieee1394Service& ieee1394service ); 
    7583    virtual ~SignalSourceCmd(); 
  • branches/libffado-2.0/src/libavc/general/avc_plug.cpp

    r1228 r1238  
    3838namespace AVC { 
    3939 
    40 int Plug::m_globalIdCounter = 0; 
    41  
    4240IMPL_DEBUG_MODULE( Plug, Plug, DEBUG_LEVEL_NORMAL ); 
    4341IMPL_DEBUG_MODULE( PlugManager, PlugManager, DEBUG_LEVEL_NORMAL ); 
     
    5957    , m_infoPlugType( eAPT_Unknown ) 
    6058    , m_nrOfChannels( 0 ) 
    61     , m_globalId( m_globalIdCounter++ ) 
    62 
     59    , m_globalId( unit->getPlugManager().requestNewGlobalId() ) 
     60
     61    debugOutput( DEBUG_LEVEL_VERBOSE, 
     62                 "nodeId = %d, subunitType = %d, " 
     63                 "subunitId = %d, functionBlockType = %d, " 
     64                 "functionBlockId = %d, addressType = %d, " 
     65                 "direction = %d, id = %d\n", 
     66                 m_unit->getConfigRom().getNodeId(), 
     67                 getSubunitType(), 
     68                 getSubunitId(), 
     69                 m_functionBlockType, 
     70                 m_functionBlockId, 
     71                 m_addressType, 
     72                 m_direction, 
     73                 m_id ); 
     74
     75 
     76Plug::Plug( Unit* unit, 
     77            Subunit* subunit, 
     78            function_block_type_t functionBlockType, 
     79            function_block_id_t functionBlockId, 
     80            EPlugAddressType plugAddressType, 
     81            EPlugDirection plugDirection, 
     82            plug_id_t plugId, 
     83            int globalId ) 
     84    : m_unit( unit ) 
     85    , m_subunit( subunit ) 
     86    , m_functionBlockType( functionBlockType ) 
     87    , m_functionBlockId( functionBlockId ) 
     88    , m_addressType( plugAddressType ) 
     89    , m_direction( plugDirection ) 
     90    , m_id( plugId ) 
     91    , m_infoPlugType( eAPT_Unknown ) 
     92    , m_nrOfChannels( 0 ) 
     93
     94    if(globalId < 0) { 
     95        m_globalId = unit->getPlugManager().requestNewGlobalId(); 
     96    } else { 
     97        m_globalId = globalId; 
     98    } 
    6399    debugOutput( DEBUG_LEVEL_VERBOSE, 
    64100                 "nodeId = %d, subunitType = %d, " 
     
    91127    , m_clusterInfos( rhs.m_clusterInfos ) 
    92128    , m_formatInfos( rhs.m_formatInfos ) 
    93  
     129// FIXME: how about the global id? 
    94130{ 
    95131    if ( getDebugLevel() ) { 
     
    577613       (getPlugAddressType() == eAPA_ExternalPlug)) { 
    578614        if (getPlugDirection() != eAPD_Output) { 
    579             debugOutput(DEBUG_LEVEL_NORMAL, "Signal Source command not valid for non-output unit plugs...\n"); 
     615            debugOutput(DEBUG_LEVEL_VERBOSE, "Signal Source command not valid for non-output unit plugs...\n"); 
    580616            return -1; 
    581617        } 
     
    584620    if(getPlugAddressType() == eAPA_SubunitPlug) { 
    585621        if (getPlugDirection() != eAPD_Input) { 
    586             debugOutput(DEBUG_LEVEL_NORMAL, "Signal Source command not valid for non-input subunit plugs...\n"); 
     622            debugOutput(DEBUG_LEVEL_VERBOSE, "Signal Source command not valid for non-input subunit plugs...\n"); 
    587623            return -1; 
    588624        } 
     
    617653        if(dynamic_cast<SignalUnitAddress *>(src)) { 
    618654            SignalUnitAddress *usrc=dynamic_cast<SignalUnitAddress *>(src); 
    619             if (usrc->m_plugId & 0x80) { 
     655            if(usrc->m_plugId == 0xFE) { 
     656                debugOutput(DEBUG_LEVEL_VERBOSE, "No/Invalid connection...\n"); 
     657                return -1; 
     658            } else if (usrc->m_plugId & 0x80) { 
    620659                p=m_unit->getPlugManager().getPlug( eST_Unit, 0xFF, 
    621660                        0xFF, 0xFF, eAPA_ExternalPlug, eAPD_Input, 
     
    628667        } else if (dynamic_cast<SignalSubunitAddress *>(src)) { 
    629668            SignalSubunitAddress *susrc=dynamic_cast<SignalSubunitAddress *>(src); 
    630             p=m_unit->getPlugManager().getPlug( byteToSubunitType(susrc->m_subunitType), 
    631                     susrc->m_subunitId, 0xFF, 0xFF, eAPA_SubunitPlug, 
    632                     eAPD_Output, susrc->m_plugId); 
     669            if(susrc->m_plugId == 0xFE) { 
     670                debugOutput(DEBUG_LEVEL_VERBOSE, "No/Invalid connection...\n"); 
     671                return -1; 
     672            } else { 
     673                p=m_unit->getPlugManager().getPlug( byteToSubunitType(susrc->m_subunitType), 
     674                        susrc->m_subunitId, 0xFF, 0xFF, eAPA_SubunitPlug, 
     675                        eAPD_Output, susrc->m_plugId); 
     676            } 
    633677        } else return -1; 
    634678 
    635679        if (p==NULL) { 
    636             debugError("reported signal source plug not found\n"); 
     680            debugError("reported signal source plug not found for '%s'\n", 
     681                       getName()); 
    637682            return -1; 
    638683        } 
     
    16341679    result &= serializePlugVector( basePath + "m_outputConnections", ser, m_outputConnections ); 
    16351680    result &= ser.write( basePath + "m_globalId", m_globalId); 
    1636     result &= ser.write( basePath + "m_globalIdCounter", m_globalIdCounter ); 
    16371681 
    16381682    return result; 
     
    16521696    EPlugDirection        direction; 
    16531697    plug_id_t             id; 
     1698    int                   globalId; 
    16541699 
    16551700    if ( !deser.isExisting( basePath + "m_subunitType" ) ) { 
     
    16681713    result &= deser.read( basePath + "m_direction", direction ); 
    16691714    result &= deser.read( basePath + "m_id", id ); 
     1715    result &= deser.read( basePath + "m_globalId", globalId ); 
    16701716 
    16711717    Plug* pPlug = unit.createPlug( &unit, subunit, functionBlockType,  
    1672                                    functionBlockId, addressType, direction, id); 
     1718                                   functionBlockId, addressType, direction,  
     1719                                   id, globalId); 
    16731720    if ( !pPlug ) { 
    16741721        return 0; 
     
    16881735    // input and output connections can't be processed here because not all plugs might 
    16891736    // deserialized at this point. so we do that in deserializeUpdate. 
    1690     result &= deser.read( basePath + "m_globalId", pPlug->m_globalId ); 
    1691     result &= deser.read( basePath + "m_globalIdCounter", pPlug->m_globalIdCounter ); 
    16921737 
    16931738    if ( !result ) { 
     
    17841829 
    17851830PlugManager::PlugManager(  ) 
     1831: m_globalIdCounter( 0 ) 
    17861832{ 
    17871833 
     
    17891835 
    17901836PlugManager::PlugManager( const PlugManager& rhs ) 
     1837: m_globalIdCounter( rhs.m_globalIdCounter ) 
    17911838{ 
    17921839    setDebugLevel( rhs.getDebugLevel() ); 
     
    21732220        i++; 
    21742221    } 
     2222    result &= ser.write( basePath + "m_globalIdCounter", m_globalIdCounter ); 
    21752223 
    21762224    return result; 
     
    21872235    if ( !pMgr ) { 
    21882236        return 0; 
     2237    } 
     2238 
     2239    if(!deser.read( basePath + "m_globalIdCounter", pMgr->m_globalIdCounter )) { 
     2240        pMgr->m_globalIdCounter = 0; 
    21892241    } 
    21902242 
  • branches/libffado-2.0/src/libavc/general/avc_plug.h

    r1154 r1238  
    9292          EPlugDirection plugDirection, 
    9393          plug_id_t plugId ); 
     94    Plug( Unit* unit, 
     95          Subunit* subunit, 
     96          function_block_type_t functionBlockType, 
     97          function_block_type_t functionBlockId, 
     98          EPlugAddressType plugAddressType, 
     99          EPlugDirection plugDirection, 
     100          plug_id_t plugId, 
     101          int globalId ); 
    94102    Plug( const Plug& rhs ); 
    95103    virtual ~Plug(); 
     
    294302    PlugVector                  m_outputConnections; 
    295303    int                         m_globalId; 
    296     static int                  m_globalIdCounter; 
    297304 
    298305    DECLARE_DEBUG_MODULE; 
     
    317324    int getPlugCount() 
    318325        { return m_plugs.size(); }; 
     326 
     327    int requestNewGlobalId() 
     328        { return m_globalIdCounter++; }; 
    319329 
    320330    Plug* getPlug( ESubunitType subunitType, 
     
    347357 
    348358private: 
     359    int m_globalIdCounter; 
    349360 
    350361    PlugVector   m_plugs; 
  • branches/libffado-2.0/src/libavc/general/avc_unit.cpp

    r1229 r1238  
    6666                  Plug::EPlugAddressType plugAddressType, 
    6767                  Plug::EPlugDirection plugDirection, 
    68                   plug_id_t plugId ) 
     68                  plug_id_t plugId, 
     69                  int globalId ) 
    6970{ 
    7071 
     
    7576                       plugAddressType, 
    7677                       plugDirection, 
    77                        plugId ); 
     78                       plugId, 
     79                       globalId ); 
    7880    if (p) p->setVerboseLevel(getDebugLevel()); 
    7981    return p; 
  • branches/libffado-2.0/src/libavc/general/avc_unit.h

    r1159 r1238  
    114114                                   AVC::Plug::EPlugAddressType plugAddressType, 
    115115                                   AVC::Plug::EPlugDirection plugDirection, 
    116                                    AVC::plug_id_t plugId ); 
     116                                   AVC::plug_id_t plugId, 
     117                                   int globalId = -1 ); 
    117118 
    118119protected: 
  • branches/libffado-2.0/support/dbus/ffado-dbus-server.cpp

    r1219 r1238  
    104104 
    105105    {"verbose",  'v', "level",    0,  "Produce verbose output" }, 
    106     {"cache",    'c', "enable",   0,  "Use AVC model cache (default=enable)" }, 
    107  
     106#if ENABLE_DISCOVERY_CACHE 
     107    {"cache",    'c', "enable",   0,  "Use AVC model cache" }, 
     108#endif 
    108109 
    109110    {"node",     'n',    "id",    0,  "Only expose mixer of a device on a specific node" }, 
  • branches/libffado-2.0/tests/test-ffado.cpp

    r1184 r1238  
    9090 
    9191    {"verbose",  'v', "level",    0,  "Produce verbose output" }, 
    92     {"cache",    'c', "enable",   0,  "Use AVC model cache (default=enabled)" }, 
    93  
     92#if ENABLE_DISCOVERY_CACHE 
     93    {"cache",    'c', "enable",   0,  "Use AVC model cache" }, 
     94#endif 
    9495 
    9596    {"node",     'n',    "id",    0,  "Node to use" }, 
     
    131132            } 
    132133        } 
    133         break;       
     134        break; 
    134135    case 'p': 
    135136        if (arg) {