Changeset 1366

Show
Ignore:
Timestamp:
10/21/08 10:45:01 (12 years ago)
Author:
ppalmers
Message:

sometimes a busreset is issued to indicate a config change of a device. This requires a device to be rediscovered.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/src/bebob/bebob_avdevice.cpp

    r1351 r1366  
    6262AvDevice::AvDevice( DeviceManager& d, std::auto_ptr< ConfigRom >( configRom ) ) 
    6363    : GenericAVC::AvDevice( d, configRom ) 
     64    , m_last_discovery_config_id ( 0xFFFFFFFFFFFFFFFFLLU ) 
    6465    , m_Mixer ( 0 ) 
    6566{ 
     
    208209        debugWarning("Could not build mixer\n"); 
    209210    } 
     211 
     212    // keep track of the config id of this discovery 
     213    m_last_discovery_config_id = getConfigurationId(); 
     214 
    210215    return true; 
    211216} 
     
    656661} 
    657662 
     663bool 
     664AvDevice::needsRediscovery() 
     665{ 
     666    // require rediscovery if the config id differs from the one saved 
     667    // in the previous discovery 
     668    return getConfigurationId() != m_last_discovery_config_id; 
     669} 
     670 
    658671uint64_t 
    659672AvDevice::getConfigurationId() 
  • branches/libffado-2.0/src/bebob/bebob_avdevice.h

    r1351 r1366  
    112112 
    113113    virtual uint64_t getConfigurationId(); 
     114    virtual bool needsRediscovery(); 
    114115 
    115116    std::string getCachePath(); 
     
    121122 
    122123    std::vector<int> m_supported_frequencies; 
     124    uint64_t         m_last_discovery_config_id; 
     125 
    123126protected: 
    124127    Mixer*             m_Mixer; 
  • branches/libffado-2.0/src/bebob/focusrite/focusrite_saffirepro.cpp

    r1294 r1366  
    524524} 
    525525 
     526uint64_t 
     527SaffireProDevice::getConfigurationId() 
     528{ 
     529    // have the generic mechanism create a unique configuration id. 
     530    uint64_t id = BeBoB::AvDevice::getConfigurationId(); 
     531 
     532    // there are some parts that can be enabled/disabled and 
     533    // that have influence on the AV/C model and channel config 
     534    // so add them to the config id 
     535    #if 0 
     536    // FIXME: doesn't seem to be working, but the channel count 
     537    //        makes that it's not that important 
     538    if(getEnableDigitalChannel(eDC_SPDIF)) { 
     539        id |= 1ULL << 40; 
     540    } 
     541    if(isPro26()) { 
     542        if(getEnableDigitalChannel(eDC_ADAT1)) { 
     543            id |= 1ULL << 41; 
     544        } 
     545        if(getEnableDigitalChannel(eDC_ADAT2)) { 
     546            id |= 1ULL << 42; 
     547        } 
     548    } 
     549    #endif 
     550    return id; 
     551} 
     552 
    526553bool 
    527554SaffireProDevice::setNickname( std::string name) 
     
    863890                     "PLL lock range: %d\n", retval ); 
    864891    return retval; 
     892} 
     893 
     894bool 
     895SaffireProDevice::isMidiEnabled() { 
     896    uint32_t ready; 
     897    if ( !getSpecificValue(FR_SAFFIREPRO_CMD_ID_AVC_MODEL_MIDI, &ready ) ) { 
     898        debugError( "getSpecificValue failed\n" ); 
     899        return false; 
     900    } 
     901 
     902    debugOutput( DEBUG_LEVEL_VERBOSE, 
     903                     "isMidiEnabled: %d\n", ready != 0 ); 
     904    return ready != 0; 
    865905} 
    866906 
  • branches/libffado-2.0/src/bebob/focusrite/focusrite_saffirepro.h

    r1294 r1366  
    373373    void flashLed(); 
    374374    bool isAudioOn(); 
     375    bool isMidiEnabled(); 
    375376    bool isExtClockLocked(); 
    376377    uint32_t getCount32(); 
     
    409410protected: 
    410411    virtual uint16_t getConfigurationIdSyncMode(); 
     412    virtual uint64_t getConfigurationId(); 
    411413 
    412414private: 
  • branches/libffado-2.0/src/devicemanager.cpp

    r1299 r1366  
    449449 
    450450    if (!slaveMode) { 
     451        // for the devices that are still in the list check if they require re-discovery 
     452        FFADODeviceVector failed_to_rediscover; 
     453        for ( FFADODeviceVectorIterator it_dev = m_avDevices.begin(); 
     454            it_dev != m_avDevices.end(); 
     455            ++it_dev ) 
     456        { 
     457            FFADODevice* avDevice = *it_dev; 
     458            if(avDevice->needsRediscovery()) { 
     459                debugOutput( DEBUG_LEVEL_NORMAL, 
     460                             "Device with GUID %s requires rediscovery (state changed)...\n", 
     461                             avDevice->getConfigRom().getGuidString().c_str()); 
     462 
     463                bool isFromCache = false; 
     464                if ( useCache && avDevice->loadFromCache() ) { 
     465                    debugOutput( DEBUG_LEVEL_VERBOSE, "could load from cache\n" ); 
     466                    isFromCache = true; 
     467                    // restore the debug level for everything that was loaded 
     468                    avDevice->setVerboseLevel( getDebugLevel() ); 
     469                } else if ( avDevice->discover() ) { 
     470                    debugOutput( DEBUG_LEVEL_VERBOSE, "discovery successful\n" ); 
     471                } else { 
     472                    debugError( "could not discover device\n" ); 
     473                    failed_to_rediscover.push_back(avDevice); 
     474                    continue; 
     475                } 
     476                if ( !isFromCache && !avDevice->saveCache() ) { 
     477                    debugOutput( DEBUG_LEVEL_VERBOSE, "No cached version of AVC model created\n" ); 
     478                } 
     479            } else { 
     480                debugOutput( DEBUG_LEVEL_NORMAL, 
     481                             "Device with GUID %s does not require rediscovery...\n", 
     482                             avDevice->getConfigRom().getGuidString().c_str()); 
     483            } 
     484        } 
     485        // remove devices that failed to rediscover 
     486        // FIXME: surely there has to be a better way to do this 
     487        FFADODeviceVector to_keep; 
     488        for ( FFADODeviceVectorIterator it = m_avDevices.begin(); 
     489            it != m_avDevices.end(); 
     490            ++it ) 
     491        { 
     492            bool keep_this_device = true; 
     493            for ( FFADODeviceVectorIterator it2 = failed_to_rediscover.begin(); 
     494                it2 != failed_to_rediscover.end(); 
     495                ++it2 ) 
     496            { 
     497                if(*it == *it2) { 
     498                    debugOutput( DEBUG_LEVEL_NORMAL, 
     499                                "Removing device with GUID %s due to failed discovery...\n", 
     500                                (*it)->getConfigRom().getGuidString().c_str()); 
     501                    keep_this_device = false; 
     502                    break; 
     503                } 
     504            } 
     505            if(keep_this_device) { 
     506                to_keep.push_back(*it); 
     507            } 
     508        } 
     509        for ( FFADODeviceVectorIterator it2 = failed_to_rediscover.begin(); 
     510            it2 != failed_to_rediscover.end(); 
     511            ++it2 ) 
     512        { 
     513            if (!deleteElement(*it2)) { 
     514                debugWarning("failed to remove AvDevice from Control::Container\n"); 
     515            } 
     516            delete *it2; 
     517        } 
     518        m_avDevices = to_keep; 
     519 
     520        // pick up new devices 
    451521        for ( Ieee1394ServiceVectorIterator it = m_1394Services.begin(); 
    452522            it != m_1394Services.end(); 
     
    480550 
    481551                bool already_in_vector = false; 
    482                 for ( FFADODeviceVectorIterator it = m_avDevices.begin(); 
    483                     it != m_avDevices.end(); 
    484                     ++it
     552                for ( FFADODeviceVectorIterator it_dev = m_avDevices.begin(); 
     553                    it_dev != m_avDevices.end(); 
     554                    ++it_dev
    485555                { 
    486                     if ((*it)->getConfigRom().getGuid() == configRom->getGuid()) { 
     556                    if ((*it_dev)->getConfigRom().getGuid() == configRom->getGuid()) { 
    487557                        already_in_vector = true; 
    488558                        break; 
  • branches/libffado-2.0/src/ffadodevice.cpp

    r1215 r1366  
    142142{ 
    143143    return false; 
     144} 
     145 
     146bool 
     147FFADODevice::needsRediscovery() 
     148{ 
     149    // require rediscovery by default 
     150    return true; 
    144151} 
    145152 
  • branches/libffado-2.0/src/ffadodevice.h

    r1288 r1366  
    103103     */ 
    104104    virtual bool saveCache(); 
     105 
     106    /** 
     107     * @brief Called by DeviceManager to check whether a device requires rediscovery 
     108     * 
     109     * This function is called to figure out if the device has to be rediscovered 
     110     * e.g. after a bus reset where the device internal structure changed. 
     111     * 
     112     * @returns true if device requires rediscovery 
     113     */ 
     114    virtual bool needsRediscovery(); 
    105115 
    106116    /**