From: <tr...@ff...> - 2008-05-27 21:46:04
|
Author: ppalmers Date: 2008-05-27 14:46:09 -0700 (Tue, 27 May 2008) New Revision: 1229 Modified: branches/libffado-2.0/src/bebob/bebob_avdevice.cpp branches/libffado-2.0/src/bebob/bebob_avdevice.h branches/libffado-2.0/src/devicemanager.cpp branches/libffado-2.0/src/devicemanager.h branches/libffado-2.0/src/fireworks/fireworks_device.cpp branches/libffado-2.0/src/fireworks/fireworks_device.h branches/libffado-2.0/src/genericavc/avc_avdevice.cpp branches/libffado-2.0/src/genericavc/avc_avdevice.h branches/libffado-2.0/src/libavc/general/avc_unit.cpp branches/libffado-2.0/src/motu/motu_avdevice.cpp branches/libffado-2.0/src/motu/motu_avdevice.h Log: implement discovery fallback (closes #121) Modified: branches/libffado-2.0/src/bebob/bebob_avdevice.cpp =================================================================== --- branches/libffado-2.0/src/bebob/bebob_avdevice.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/bebob/bebob_avdevice.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -79,17 +79,48 @@ } bool -AvDevice::probe( ConfigRom& configRom ) +AvDevice::probe( ConfigRom& configRom, bool generic ) { - unsigned int vendorId = configRom.getNodeVendorId(); - unsigned int modelId = configRom.getModelId(); + if(generic) { + return false; + // try a bebob-specific command to check for the firmware + ExtendedPlugInfoCmd extPlugInfoCmd( configRom.get1394Service() ); + UnitPlugAddress unitPlugAddress( UnitPlugAddress::ePT_PCR, + configRom.getNodeId() ); + extPlugInfoCmd.setPlugAddress( PlugAddress( PlugAddress::ePD_Input, + PlugAddress::ePAM_Unit, + unitPlugAddress ) ); + extPlugInfoCmd.setNodeId( configRom.getNodeId() ); + extPlugInfoCmd.setCommandType( AVCCommand::eCT_Status ); + extPlugInfoCmd.setVerbose( configRom.getVerboseLevel() ); + ExtendedPlugInfoInfoType extendedPlugInfoInfoType( + ExtendedPlugInfoInfoType::eIT_NoOfChannels ); + extendedPlugInfoInfoType.initialize(); + extPlugInfoCmd.setInfoType( extendedPlugInfoInfoType ); + + if ( !extPlugInfoCmd.fire() ) { + debugError( "Number of channels command failed\n" ); + return false; + } + + ExtendedPlugInfoInfoType* infoType = extPlugInfoCmd.getInfoType(); + if ( infoType + && infoType->m_plugNrOfChns ) + { + return true; + } + return false; + } else { + // check if device is in supported devices list + unsigned int vendorId = configRom.getNodeVendorId(); + unsigned int modelId = configRom.getModelId(); - GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_bebob.txt" ); - if ( vendorModel.parse() ) { - return vendorModel.isPresent( vendorId, modelId ); + GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_bebob.txt" ); + if ( vendorModel.parse() ) { + return vendorModel.isPresent( vendorId, modelId ); + } + return false; } - - return false; } FFADODevice * @@ -155,7 +186,10 @@ debugOutput( DEBUG_LEVEL_VERBOSE, "found %s %s\n", m_model.vendor_name.c_str(), m_model.model_name.c_str()); - } else return false; + } else { + debugWarning("Using generic BeBoB support for unsupported device '%s %s'\n", + getConfigRom().getVendorName().c_str(), getConfigRom().getModelName().c_str()); + } if ( !Unit::discover() ) { debugError( "Could not discover unit\n" ); Modified: branches/libffado-2.0/src/bebob/bebob_avdevice.h =================================================================== --- branches/libffado-2.0/src/bebob/bebob_avdevice.h 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/bebob/bebob_avdevice.h 2008-05-27 21:46:09 UTC (rev 1229) @@ -62,7 +62,7 @@ AvDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); virtual ~AvDevice(); - static bool probe( ConfigRom& configRom ); + static bool probe( ConfigRom& configRom, bool generic = false ); virtual bool loadFromCache(); virtual bool saveCache(); virtual bool discover(); Modified: branches/libffado-2.0/src/devicemanager.cpp =================================================================== --- branches/libffado-2.0/src/devicemanager.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/devicemanager.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -435,8 +435,7 @@ continue; } - std::auto_ptr<ConfigRom> configRom = - std::auto_ptr<ConfigRom>( new ConfigRom( *portService, nodeId ) ); + ConfigRom *configRom = new ConfigRom( *portService, nodeId ); if ( !configRom->initialize() ) { // \todo If a PHY on the bus is in power safe mode then // the config rom is missing. So this might be just @@ -477,7 +476,7 @@ // if no (valid) spec strings are present, grab all // supported devices. if(m_deviceStringParser->countDeviceStrings() && - !m_deviceStringParser->match(*configRom.get())) { + !m_deviceStringParser->match(*configRom)) { debugOutput(DEBUG_LEVEL_VERBOSE, "Device doesn't match any of the spec strings. skipping...\n"); continue; } @@ -527,6 +526,9 @@ } debugOutput( DEBUG_LEVEL_NORMAL, "discovery of node %d on port %d done...\n", nodeId, portService->getPort() ); + } else { + // we didn't get a device, hence we have to delete the configrom ptr manually + delete configRom; } } } @@ -798,37 +800,59 @@ } FFADODevice* -DeviceManager::getDriverForDevice( std::auto_ptr<ConfigRom>( configRom ), - int id ) +DeviceManager::getDriverForDeviceDo( ConfigRom *configRom, + int id, bool generic ) { #ifdef ENABLE_BEBOB debugOutput( DEBUG_LEVEL_VERBOSE, "Trying BeBoB...\n" ); - if ( BeBoB::AvDevice::probe( *configRom.get() ) ) { - return BeBoB::AvDevice::createDevice( *this, configRom ); + if ( BeBoB::AvDevice::probe( *configRom, generic ) ) { + return BeBoB::AvDevice::createDevice( *this, std::auto_ptr<ConfigRom>( configRom ) ); } #endif -#ifdef ENABLE_GENERICAVC - debugOutput( DEBUG_LEVEL_VERBOSE, "Trying Generic AV/C...\n" ); - if ( GenericAVC::AvDevice::probe( *configRom.get() ) ) { - return GenericAVC::AvDevice::createDevice( *this, configRom ); +#ifdef ENABLE_FIREWORKS + debugOutput( DEBUG_LEVEL_VERBOSE, "Trying ECHO Audio FireWorks...\n" ); + if ( FireWorks::Device::probe( *configRom, generic ) ) { + return FireWorks::Device::createDevice( *this, std::auto_ptr<ConfigRom>( configRom ) ); } #endif -#ifdef ENABLE_FIREWORKS - debugOutput( DEBUG_LEVEL_VERBOSE, "Trying ECHO Audio FireWorks...\n" ); - if ( FireWorks::Device::probe( *configRom.get() ) ) { - return FireWorks::Device::createDevice( *this, configRom ); +// we want to try the non-generic AV/C platforms before trying the generic ones +#ifdef ENABLE_GENERICAVC + debugOutput( DEBUG_LEVEL_VERBOSE, "Trying Generic AV/C...\n" ); + if ( GenericAVC::AvDevice::probe( *configRom, generic ) ) { + return GenericAVC::AvDevice::createDevice( *this, std::auto_ptr<ConfigRom>( configRom ) ); } #endif #ifdef ENABLE_MOTU debugOutput( DEBUG_LEVEL_VERBOSE, "Trying Motu...\n" ); - if ( Motu::MotuDevice::probe( *configRom.get() ) ) { - return Motu::MotuDevice::createDevice( *this, configRom ); + if ( Motu::MotuDevice::probe( *configRom, generic ) ) { + return Motu::MotuDevice::createDevice( *this, std::auto_ptr<ConfigRom>( configRom ) ); } #endif + return NULL; +} + +FFADODevice* +DeviceManager::getDriverForDevice( ConfigRom *configRom, + int id ) +{ + debugOutput( DEBUG_LEVEL_VERBOSE, "Probing for supported device...\n" ); + FFADODevice* dev = getDriverForDeviceDo(configRom, id, false); + if(dev) { + debugOutput( DEBUG_LEVEL_VERBOSE, " found supported device...\n" ); + return dev; + } + + debugOutput( DEBUG_LEVEL_VERBOSE, " no supported device found, trying generic support...\n" ); + dev = getDriverForDeviceDo(configRom, id, true); + if(dev) { + debugOutput( DEBUG_LEVEL_VERBOSE, " found generic support for device...\n" ); + return dev; + } + debugOutput( DEBUG_LEVEL_VERBOSE, " device not supported...\n" ); return 0; } Modified: branches/libffado-2.0/src/devicemanager.h =================================================================== --- branches/libffado-2.0/src/devicemanager.h 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/devicemanager.h 2008-05-27 21:46:09 UTC (rev 1229) @@ -130,7 +130,9 @@ { return false;}; protected: - FFADODevice* getDriverForDevice( std::auto_ptr<ConfigRom>( configRom ), + FFADODevice* getDriverForDeviceDo( ConfigRom *configRom, + int id, bool generic ); + FFADODevice* getDriverForDevice( ConfigRom *configRom, int id ); FFADODevice* getSlaveDriver( std::auto_ptr<ConfigRom>( configRom ) ); Modified: branches/libffado-2.0/src/fireworks/fireworks_device.cpp =================================================================== --- branches/libffado-2.0/src/fireworks/fireworks_device.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/fireworks/fireworks_device.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -74,16 +74,44 @@ } bool -Device::probe( ConfigRom& configRom ) +Device::probe( ConfigRom& configRom, bool generic ) { - unsigned int vendorId = configRom.getNodeVendorId(); - unsigned int modelId = configRom.getModelId(); + if(generic) { + // try an EFC command + EfcOverAVCCmd cmd( configRom.get1394Service() ); + cmd.setCommandType( AVC::AVCCommand::eCT_Control ); + cmd.setNodeId( configRom.getNodeId() ); + cmd.setSubunitType( AVC::eST_Unit ); + cmd.setSubunitId( 0xff ); + cmd.setVerbose( configRom.getVerboseLevel() ); - GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_fireworks.txt" ); - if ( vendorModel.parse() ) { - return vendorModel.isPresent( vendorId, modelId ); + EfcHardwareInfoCmd hwInfo; + hwInfo.setVerboseLevel(configRom.getVerboseLevel()); + cmd.m_cmd = &hwInfo; + + if ( !cmd.fire()) { + return false; + } + + if ( cmd.getResponse() != AVC::AVCCommand::eR_Accepted) { + return false; + } + if ( hwInfo.m_header.retval != EfcCmd::eERV_Ok + && hwInfo.m_header.retval != EfcCmd::eERV_FlashBusy) { + debugError( "EFC command failed\n" ); + return false; + } + return true; + } else { + unsigned int vendorId = configRom.getNodeVendorId(); + unsigned int modelId = configRom.getModelId(); + + GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_fireworks.txt" ); + if ( vendorModel.parse() ) { + return vendorModel.isPresent( vendorId, modelId ); + } + return false; } - return false; } bool @@ -98,10 +126,12 @@ } if (!GenericAVC::VendorModel::isValid(m_model)) { - return false; + debugWarning("Using generic ECHO Audio FireWorks support for unsupported device '%s %s'\n", + getConfigRom().getVendorName().c_str(), getConfigRom().getModelName().c_str()); + } else { + debugOutput( DEBUG_LEVEL_VERBOSE, "found %s %s\n", + m_model.vendor_name.c_str(), m_model.model_name.c_str()); } - debugOutput( DEBUG_LEVEL_VERBOSE, "found %s %s\n", - m_model.vendor_name.c_str(), m_model.model_name.c_str()); // get the info from the EFC if ( !discoverUsingEFC() ) { Modified: branches/libffado-2.0/src/fireworks/fireworks_device.h =================================================================== --- branches/libffado-2.0/src/fireworks/fireworks_device.h 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/fireworks/fireworks_device.h 2008-05-27 21:46:09 UTC (rev 1229) @@ -45,7 +45,7 @@ Device( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom ) ); virtual ~Device(); - static bool probe( ConfigRom& configRom ); + static bool probe( ConfigRom& configRom, bool generic = false ); static FFADODevice * createDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); virtual bool discover(); Modified: branches/libffado-2.0/src/genericavc/avc_avdevice.cpp =================================================================== --- branches/libffado-2.0/src/genericavc/avc_avdevice.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/genericavc/avc_avdevice.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -30,6 +30,7 @@ #include "libavc/avc_definitions.h" #include "libavc/general/avc_plug_info.h" #include "libavc/general/avc_extended_plug_info.h" +#include "libavc/general/avc_subunit_info.h" #include "debugmodule/debugmodule.h" @@ -75,17 +76,37 @@ } bool -AvDevice::probe( ConfigRom& configRom ) +AvDevice::probe( ConfigRom& configRom, bool generic ) { - unsigned int vendorId = configRom.getNodeVendorId(); - unsigned int modelId = configRom.getModelId(); + if(generic) { + // check if we have a music subunit + SubUnitInfoCmd subUnitInfoCmd( configRom.get1394Service() ); + subUnitInfoCmd.setCommandType( AVCCommand::eCT_Status ); + subUnitInfoCmd.m_page = 0; + subUnitInfoCmd.setNodeId( configRom.getNodeId() ); + subUnitInfoCmd.setVerbose( configRom.getVerboseLevel() ); + if ( !subUnitInfoCmd.fire() ) { + debugError( "Subunit info command failed\n" ); + return false; + } + for ( int i = 0; i < subUnitInfoCmd.getNrOfValidEntries(); ++i ) { + subunit_type_t subunit_type + = subUnitInfoCmd.m_table[i].m_subunit_type; + if (subunit_type == eST_Music) return true; + } - GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_genericavc.txt" ); - if ( vendorModel.parse() ) { - return vendorModel.isPresent( vendorId, modelId ); + return false; + } else { + // check if device is in supported devices list + unsigned int vendorId = configRom.getNodeVendorId(); + unsigned int modelId = configRom.getModelId(); + + GenericAVC::VendorModel vendorModel( SHAREDIR "/ffado_driver_genericavc.txt" ); + if ( vendorModel.parse() ) { + return vendorModel.isPresent( vendorId, modelId ); + } + return false; } - - return false; } FFADODevice * @@ -110,10 +131,12 @@ } if (!GenericAVC::VendorModel::isValid(m_model)) { - return false; + debugWarning("Using generic AV/C support for unsupported device '%s %s'\n", + getConfigRom().getVendorName().c_str(), getConfigRom().getModelName().c_str()); + } else { + debugOutput( DEBUG_LEVEL_VERBOSE, "found %s %s\n", + m_model.vendor_name.c_str(), m_model.model_name.c_str()); } - debugOutput( DEBUG_LEVEL_VERBOSE, "found %s %s\n", - m_model.vendor_name.c_str(), m_model.model_name.c_str()); } if ( !Unit::discover() ) { Modified: branches/libffado-2.0/src/genericavc/avc_avdevice.h =================================================================== --- branches/libffado-2.0/src/genericavc/avc_avdevice.h 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/genericavc/avc_avdevice.h 2008-05-27 21:46:09 UTC (rev 1229) @@ -50,7 +50,7 @@ AvDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); virtual ~AvDevice(); - static bool probe( ConfigRom& configRom ); + static bool probe( ConfigRom& configRom, bool generic = false ); virtual bool discover(); static FFADODevice * createDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); Modified: branches/libffado-2.0/src/libavc/general/avc_unit.cpp =================================================================== --- branches/libffado-2.0/src/libavc/general/avc_unit.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/libavc/general/avc_unit.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -786,11 +786,13 @@ break; } } - debugOutput( DEBUG_LEVEL_NORMAL, - "Active Sync Connection: %s, '%s' -> '%s'\n", - m_activeSyncInfo->m_description.c_str(), - plug->getName(), - msuPlug->getName() ); + if(m_activeSyncInfo) { + debugOutput( DEBUG_LEVEL_NORMAL, + "Active Sync Connection: %s, '%s' -> '%s'\n", + m_activeSyncInfo->m_description.c_str(), + plug->getName(), + msuPlug->getName() ); + } } } return true; Modified: branches/libffado-2.0/src/motu/motu_avdevice.cpp =================================================================== --- branches/libffado-2.0/src/motu/motu_avdevice.cpp 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/motu/motu_avdevice.cpp 2008-05-27 21:46:09 UTC (rev 1229) @@ -586,8 +586,10 @@ } bool -MotuDevice::probe( ConfigRom& configRom ) +MotuDevice::probe( ConfigRom& configRom, bool generic) { + if(generic) return false; + unsigned int vendorId = configRom.getNodeVendorId(); unsigned int unitVersion = configRom.getUnitVersion(); unsigned int unitSpecifierId = configRom.getUnitSpecifierId(); Modified: branches/libffado-2.0/src/motu/motu_avdevice.h =================================================================== --- branches/libffado-2.0/src/motu/motu_avdevice.h 2008-05-27 20:32:21 UTC (rev 1228) +++ branches/libffado-2.0/src/motu/motu_avdevice.h 2008-05-27 21:46:09 UTC (rev 1229) @@ -150,7 +150,7 @@ virtual bool buildMixer(); virtual bool destroyMixer(); - static bool probe( ConfigRom& configRom ); + static bool probe( ConfigRom& configRom, bool generic = false ); static FFADODevice * createDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); static int getConfigurationId( ); virtual bool discover(); |