diff options
Diffstat (limited to 'AudioManagerDaemon/include')
-rw-r--r-- | AudioManagerDaemon/include/CAmControlReceiver.h | 6 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmControlSender.h | 3 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmDatabaseHandlerMap.h | 36 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h | 18 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmDatabaseObserver.h | 2 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmGraph.h | 622 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmRouter.h | 298 | ||||
-rw-r--r-- | AudioManagerDaemon/include/CAmRoutingReceiver.h | 3 | ||||
-rw-r--r-- | AudioManagerDaemon/include/IAmDatabaseHandler.h | 17 |
9 files changed, 954 insertions, 51 deletions
diff --git a/AudioManagerDaemon/include/CAmControlReceiver.h b/AudioManagerDaemon/include/CAmControlReceiver.h index 9487d17..b0a9d1a 100644 --- a/AudioManagerDaemon/include/CAmControlReceiver.h +++ b/AudioManagerDaemon/include/CAmControlReceiver.h @@ -61,6 +61,7 @@ public: am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID); am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); + am_Error_e enterConverterDB(const am_Converter_s & converterData, am_converterID_t & converterID); am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass); @@ -81,6 +82,7 @@ public: am_Error_e removeSinkDB(const am_sinkID_t sinkID); am_Error_e removeSourceDB(const am_sourceID_t sourceID); am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); + am_Error_e removeConverterDB(const am_converterID_t converterID); am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); am_Error_e removeDomainDB(const am_domainID_t domainID); am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); @@ -90,12 +92,14 @@ public: am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; + am_Error_e getConverterInfoDB(const am_converterID_t converterID, am_Converter_s& converterData) const; am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const; am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t>& listSinkID) const; am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t>& listSourceID) const; am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t>& listCrossfadersID) const; am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t>& listGatewaysID) const; + am_Error_e getListConvertersOfDomain(const am_domainID_t domainID, std::vector<am_converterID_t>& listConverterID) const; am_Error_e getListMainConnections(std::vector<am_MainConnection_s>& listMainConnections) const; am_Error_e getListDomains(std::vector<am_Domain_s>& listDomains) const; am_Error_e getListConnections(std::vector<am_Connection_s>& listConnections) const; @@ -105,6 +109,7 @@ public: am_Error_e getListHandles(std::vector<am_Handle_s>& listHandles) const; am_Error_e getListCrossfaders(std::vector<am_Crossfader_s>& listCrossfaders) const; am_Error_e getListGateways(std::vector<am_Gateway_s>& listGateways) const; + am_Error_e getListConverters(std::vector<am_Converter_s>& listConverters) const; am_Error_e getListSinkClasses(std::vector<am_SinkClass_s>& listSinkClasses) const; am_Error_e getListSystemProperties(std::vector<am_SystemProperty_s>& listSystemProperties) const; void setCommandReady(); @@ -118,6 +123,7 @@ public: am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix) ; + am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix); am_Error_e setVolumes(am_Handle_s& handle, const std::vector<am_Volumes_s>& listVolumes) ; am_Error_e setSinkNotificationConfiguration(am_Handle_s& handle, const am_sinkID_t sinkID, const am_NotificationConfiguration_s& notificationConfiguration) ; am_Error_e setSourceNotificationConfiguration(am_Handle_s& handle, const am_sourceID_t sourceID, const am_NotificationConfiguration_s& notificationConfiguration) ; diff --git a/AudioManagerDaemon/include/CAmControlSender.h b/AudioManagerDaemon/include/CAmControlSender.h index 58bae0b..fb82484 100644 --- a/AudioManagerDaemon/include/CAmControlSender.h +++ b/AudioManagerDaemon/include/CAmControlSender.h @@ -61,7 +61,9 @@ public: am_Error_e hookSystemRegisterSource(const am_Source_s& sourceData, am_sourceID_t& sourceID) ; am_Error_e hookSystemDeregisterSource(const am_sourceID_t sourceID) ; am_Error_e hookSystemRegisterGateway(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID) ; + am_Error_e hookSystemRegisterConverter(const am_Converter_s& converterData, am_converterID_t& converterID); am_Error_e hookSystemDeregisterGateway(const am_gatewayID_t gatewayID) ; + am_Error_e hookSystemDeregisterConverter(const am_converterID_t converterID) ; am_Error_e hookSystemRegisterCrossfader(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID) ; am_Error_e hookSystemDeregisterCrossfader(const am_crossfaderID_t crossfaderID) ; void hookSystemSinkVolumeTick(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume) ; @@ -92,6 +94,7 @@ public: am_Error_e hookSystemUpdateSink(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; am_Error_e hookSystemUpdateSource(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; am_Error_e hookSystemUpdateGateway(const am_gatewayID_t gatewayID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFromats, const std::vector<bool>& convertionMatrix) ; + am_Error_e hookSystemUpdateConverter(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFromats, const std::vector<bool>& convertionMatrix); void cbAckSetVolume(const am_Handle_s handle, const std::vector<am_Volumes_s>& listVolumes, const am_Error_e error) ; void cbAckSetSinkNotificationConfiguration(const am_Handle_s handle, const am_Error_e error) ; void cbAckSetSourceNotificationConfiguration(const am_Handle_s handle, const am_Error_e error) ; diff --git a/AudioManagerDaemon/include/CAmDatabaseHandlerMap.h b/AudioManagerDaemon/include/CAmDatabaseHandlerMap.h index 0793bf8..0c97185 100644 --- a/AudioManagerDaemon/include/CAmDatabaseHandlerMap.h +++ b/AudioManagerDaemon/include/CAmDatabaseHandlerMap.h @@ -27,7 +27,9 @@ #include <sstream> #include <iostream> #include <unordered_map> +#include <algorithm> #include <assert.h> +#include <vector> #include "IAmDatabaseHandler.h" namespace am @@ -62,6 +64,7 @@ class CAmDatabaseHandlerMap : public IAmDatabaseHandler bool mFirstStaticSink; //!< bool for dynamic range handling bool mFirstStaticSource; //!< bool for dynamic range handling bool mFirstStaticGateway; //!< bool for dynamic range handling + bool mFirstStaticConverter; //!< bool for dynamic range handling bool mFirstStaticSinkClass; //!< bool for dynamic range handling bool mFirstStaticSourceClass; //!< bool for dynamic range handling bool mFirstStaticCrossfader; //!< bool for dynamic range handling @@ -74,6 +77,7 @@ public: am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID); am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); + am_Error_e enterConverterDB(const am_Converter_s & converterData, am_converterID_t & converterID); am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID); am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); @@ -104,6 +108,7 @@ public: am_Error_e removeSinkDB(const am_sinkID_t sinkID); am_Error_e removeSourceDB(const am_sourceID_t sourceID); am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); + am_Error_e removeConverterDB(const am_converterID_t converterID); am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); am_Error_e removeDomainDB(const am_domainID_t domainID); am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); @@ -112,6 +117,7 @@ public: am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const; am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const; am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; + am_Error_e getConverterInfoDB(const am_converterID_t converterID, am_Converter_s& converterData) const; am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; @@ -124,6 +130,7 @@ public: am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t>& listSourceID) const; am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t>& listGatewaysID) const; am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t>& listGatewaysID) const; + am_Error_e getListConvertersOfDomain(const am_domainID_t domainID, std::vector<am_converterID_t>& listConvertersID) const; am_Error_e getListMainConnections(std::vector<am_MainConnection_s>& listMainConnections) const; am_Error_e getListDomains(std::vector<am_Domain_s>& listDomains) const; am_Error_e getListConnections(std::vector<am_Connection_s>& listConnections) const; @@ -132,6 +139,7 @@ public: am_Error_e getListSourceClasses(std::vector<am_SourceClass_s>& listSourceClasses) const; am_Error_e getListCrossfaders(std::vector<am_Crossfader_s>& listCrossfaders) const; am_Error_e getListGateways(std::vector<am_Gateway_s>& listGateways) const; + am_Error_e getListConverters(std::vector<am_Converter_s> & listConverters) const; am_Error_e getListSinkClasses(std::vector<am_SinkClass_s>& listSinkClasses) const; am_Error_e getListVisibleMainConnections(std::vector<am_MainConnectionType_s>& listConnections) const; am_Error_e getListMainSinks(std::vector<am_SinkType_s>& listMainSinks) const; @@ -147,7 +155,6 @@ public: am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const; am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const; am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const; - am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector<CAmRoutingTreeItem*>& flatTree); am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID); am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID); @@ -160,11 +167,12 @@ public: am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector<am_CustomAvailabilityReason_t>& listSourceConnectionFormats, const std::vector<am_CustomAvailabilityReason_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix); + am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix); am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration); am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration); bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const; - bool existcrossFader(const am_crossfaderID_t crossfaderID) const; + bool existCrossFader(const am_crossfaderID_t crossfaderID) const; bool existConnection(const am_Connection_s & connection) const; bool existConnectionID(const am_connectionID_t connectionID) const; bool existSource(const am_sourceID_t sourceID) const; @@ -175,13 +183,19 @@ public: bool existSinkName(const std::string& name) const; bool existDomain(const am_domainID_t domainID) const; bool existGateway(const am_gatewayID_t gatewayID) const; + bool existConverter(const am_converterID_t converterID) const; bool existSinkClass(const am_sinkClass_t sinkClassID) const; bool existSourceClass(const am_sourceClass_t sourceClassID) const; void registerObserver(CAmDatabaseObserver *iObserver); bool sourceVisible(const am_sourceID_t sourceID) const; bool sinkVisible(const am_sinkID_t sinkID) const; - + bool isComponentConnected(const am_Gateway_s & gateway) const; + bool isComponentConnected(const am_Converter_s & converter) const; void dump( std::ostream & output ) const; + am_Error_e enumerateSources(std::function<void(const am_Source_s & element)> cb) const; + am_Error_e enumerateSinks(std::function<void(const am_Sink_s & element)> cb) const; + am_Error_e enumerateGateways(std::function<void(const am_Gateway_s & element)> cb) const; + am_Error_e enumerateConverters(std::function<void(const am_Converter_s & element)> cb) const; /** * The following structures extend the base structures with the field 'reserved'. */ @@ -260,6 +274,9 @@ public: AM_TYPEDEF_SUBCLASS_BEGIN(am_Gateway_Database_s, am_Gateway_s) AM_TYPEDEF_SUBCLASS_END(CAmGateway) + AM_TYPEDEF_SUBCLASS_BEGIN(am_Converter_Database_s, am_Converter_s) + AM_TYPEDEF_SUBCLASS_END(CAmConverter) + AM_TYPEDEF_SUBCLASS_BEGIN(am_Crossfader_Database_s, am_Crossfader_s) AM_TYPEDEF_SUBCLASS_END(CAmCrossfader) @@ -270,6 +287,7 @@ public: typedef std::unordered_map<am_sinkID_t, CAmSink> CAmMapSink; typedef std::unordered_map<am_sourceID_t, CAmSource> CAmMapSource; typedef std::unordered_map<am_gatewayID_t, CAmGateway> CAmMapGateway; + typedef std::unordered_map<am_converterID_t, CAmConverter> CAmMapConverter; typedef std::unordered_map<am_crossfaderID_t, CAmCrossfader> CAmMapCrossfader; typedef std::unordered_map<am_connectionID_t, CAmConnection> CAmMapConnection; typedef std::unordered_map<am_mainConnectionID_t, CAmMainConnection> CAmMapMainConnection; @@ -303,6 +321,7 @@ public: am_Identifier_s mCurrentSinkID; //!< sink ID am_Identifier_s mCurrentSourceID; //!< source ID am_Identifier_s mCurrentGatewayID; //!< gateway ID + am_Identifier_s mCurrentConverterID; //!< converter ID am_Identifier_s mCurrentCrossfaderID; //!< crossfader ID am_Identifier_s mCurrentConnectionID; //!< connection ID am_Identifier_s mCurrentMainConnectionID; //!< mainconnection ID @@ -314,6 +333,7 @@ public: CAmMapSink mSinkMap; //!< map for sink structures CAmMapSource mSourceMap; //!< map for source structures CAmMapGateway mGatewayMap; //!< map for gateway structures + CAmMapConverter mConverterMap; //!< map for converter structures CAmMapCrossfader mCrossfaderMap; //!< map for crossfader structures CAmMapConnection mConnectionMap; //!< map for connection structures CAmMapMainConnection mMainConnectionMap; //!< map for main connection structures @@ -325,13 +345,14 @@ public: mCurrentSinkID(DYNAMIC_ID_BOUNDARY, SHRT_MAX), mCurrentSourceID(DYNAMIC_ID_BOUNDARY, SHRT_MAX), mCurrentGatewayID(DYNAMIC_ID_BOUNDARY, SHRT_MAX), + mCurrentConverterID(DYNAMIC_ID_BOUNDARY, SHRT_MAX), mCurrentCrossfaderID(DYNAMIC_ID_BOUNDARY, SHRT_MAX), mCurrentConnectionID(1, AM_MAX_CONNECTIONS), mCurrentMainConnectionID(1, AM_MAX_MAIN_CONNECTIONS), mSystemProperties(), mDomainMap(),mSourceClassesMap(), mSinkClassesMap(), mSinkMap(AM_MAP_CAPACITY), mSourceMap(AM_MAP_CAPACITY), - mGatewayMap(), mCrossfaderMap(), mConnectionMap(), mMainConnectionMap() + mGatewayMap(), mConverterMap(), mCrossfaderMap(), mConnectionMap(), mMainConnectionMap() {}; /** * \brief Increases a given map ID. @@ -386,11 +407,18 @@ public: bool insertSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID); bool insertCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID); bool insertGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID); + bool insertConverterDB(const am_Converter_s & converteData, am_converterID_t & converterID); bool insertSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID); bool insertSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID); bool insertSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass); const am_Sink_Database_s * sinkWithNameOrID(const am_sinkID_t sinkID, const std::string & name) const; const am_Source_Database_s * sourceWithNameOrID(const am_sourceID_t sourceID, const std::string & name) const; + template <class Component> bool isConnected(const Component & comp) const + { + return std::find_if(mMappedData.mConnectionMap.begin(), mMappedData.mConnectionMap.end(),[&](const std::pair<am_connectionID_t, am_Connection_Database_s>& rConnection){ + return (rConnection.second.sinkID == comp.sinkID ||rConnection.second.sourceID ==comp.sourceID);})!=mMappedData.mConnectionMap.end(); + } + CAmDatabaseObserver *mpDatabaseObserver; //!< pointer to the Observer ListConnectionFormat mListConnectionFormat; //!< list of connection formats diff --git a/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h b/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h index fad2e57..b53bd7f 100644 --- a/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h +++ b/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h @@ -53,6 +53,7 @@ private: bool mFirstStaticSink; //!< bool for dynamic range handling bool mFirstStaticSource; //!< bool for dynamic range handling bool mFirstStaticGateway; //!< bool for dynamic range handling + bool mFirstStaticConverter; //!< bool for dynamic range handling bool mFirstStaticSinkClass; //!< bool for dynamic range handling bool mFirstStaticSourceClass; //!< bool for dynamic range handling bool mFirstStaticCrossfader; //!< bool for dynamic range handling @@ -71,6 +72,7 @@ public: am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID); am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); + am_Error_e enterConverterDB(const am_Converter_s & converteData, am_converterID_t & converterID); am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID); am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); @@ -101,6 +103,7 @@ public: am_Error_e removeSinkDB(const am_sinkID_t sinkID); am_Error_e removeSourceDB(const am_sourceID_t sourceID); am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); + am_Error_e removeConverterDB(const am_converterID_t converterID); am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); am_Error_e removeDomainDB(const am_domainID_t domainID); am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); @@ -109,6 +112,7 @@ public: am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const; am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const; am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; + am_Error_e getConverterInfoDB(const am_converterID_t converterID, am_Converter_s& converterData) const; am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; @@ -121,6 +125,7 @@ public: am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t>& listSourceID) const; am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t>& listGatewaysID) const; am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t>& listGatewaysID) const; + am_Error_e getListConvertersOfDomain(const am_domainID_t domainID, std::vector<am_converterID_t>& listConvertersID) const; am_Error_e getListMainConnections(std::vector<am_MainConnection_s>& listMainConnections) const; am_Error_e getListDomains(std::vector<am_Domain_s>& listDomains) const; am_Error_e getListConnections(std::vector<am_Connection_s>& listConnections) const; @@ -129,6 +134,7 @@ public: am_Error_e getListSourceClasses(std::vector<am_SourceClass_s>& listSourceClasses) const; am_Error_e getListCrossfaders(std::vector<am_Crossfader_s>& listCrossfaders) const; am_Error_e getListGateways(std::vector<am_Gateway_s>& listGateways) const; + am_Error_e getListConverters(std::vector<am_Converter_s> & listConverters) const; am_Error_e getListSinkClasses(std::vector<am_SinkClass_s>& listSinkClasses) const; am_Error_e getListVisibleMainConnections(std::vector<am_MainConnectionType_s>& listConnections) const; am_Error_e getListMainSinks(std::vector<am_SinkType_s>& listMainSinks) const; @@ -139,12 +145,12 @@ public: am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector<am_CustomAvailabilityReason_t> & listConnectionFormats) const; am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector<am_CustomAvailabilityReason_t> & listConnectionFormats) const; am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector<bool> & listConnectionFormat) const; + am_Error_e getListConverterConnectionFormats(const am_converterID_t converterID, std::vector<bool> & listConnectionFormat) const; am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const; am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const; am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const; am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const; am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const; - am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector<CAmRoutingTreeItem*>& flatTree); am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID); am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID); @@ -157,11 +163,12 @@ public: am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector<am_CustomAvailabilityReason_t>& listSourceConnectionFormats, const std::vector<am_CustomAvailabilityReason_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix); + am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix); am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration); am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration); bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const; - bool existcrossFader(const am_crossfaderID_t crossfaderID) const; + bool existCrossFader(const am_crossfaderID_t crossfaderID) const; bool existConnection(const am_Connection_s & connection) const; bool existConnectionID(const am_connectionID_t connectionID) const; bool existSource(const am_sourceID_t sourceID) const; @@ -172,13 +179,20 @@ public: bool existSinkName(const std::string& name) const; bool existDomain(const am_domainID_t domainID) const; bool existGateway(const am_gatewayID_t gatewayID) const; + bool existConverter(const am_converterID_t converterID) const; bool existSinkClass(const am_sinkClass_t sinkClassID) const; bool existSourceClass(const am_sourceClass_t sourceClassID) const; void registerObserver(CAmDatabaseObserver *iObserver); bool sourceVisible(const am_sourceID_t sourceID) const; bool sinkVisible(const am_sinkID_t sinkID) const; + bool isComponentConnected(const am_Gateway_s & gateway) const; + bool isComponentConnected(const am_Converter_s & converter) const; //todo: Implement dump for SQLite database handler void dump( std::ostream & output) const { output << __FUNCTION__ << " not implemented!"; }; + am_Error_e enumerateSources(std::function<void(const am_Source_s & element)> cb) const; + am_Error_e enumerateSinks(std::function<void(const am_Sink_s & element)> cb) const; + am_Error_e enumerateGateways(std::function<void(const am_Gateway_s & element)> cb) const; + am_Error_e enumerateConverters(std::function<void(const am_Converter_s & element)> cb) const; }; } diff --git a/AudioManagerDaemon/include/CAmDatabaseObserver.h b/AudioManagerDaemon/include/CAmDatabaseObserver.h index e3a016d..d6f980d 100644 --- a/AudioManagerDaemon/include/CAmDatabaseObserver.h +++ b/AudioManagerDaemon/include/CAmDatabaseObserver.h @@ -49,6 +49,7 @@ public: void newSource(const am_Source_s& source); void newDomain(const am_Domain_s& domain); void newGateway(const am_Gateway_s& gateway); + void newConverter(const am_Converter_s& coverter); void newCrossfader(const am_Crossfader_s& crossfader); void newMainConnection(const am_MainConnectionType_s& mainConnection); void removedMainConnection(const am_mainConnectionID_t mainConnection); @@ -56,6 +57,7 @@ public: void removedSource(const am_sourceID_t sourceID, const bool visible); void removeDomain(const am_domainID_t domainID); void removeGateway(const am_gatewayID_t gatewayID); + void removeConverter(const am_converterID_t converterID); void removeCrossfader(const am_crossfaderID_t crossfaderID); void mainConnectionStateChanged(const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState); void mainSinkSoundPropertyChanged(const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty); diff --git a/AudioManagerDaemon/include/CAmGraph.h b/AudioManagerDaemon/include/CAmGraph.h new file mode 100644 index 0000000..16783e6 --- /dev/null +++ b/AudioManagerDaemon/include/CAmGraph.h @@ -0,0 +1,622 @@ +/** + * Copyright (C) 2012, BMW AG + * + * This file is part of GENIVI Project AudioManager. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2014 + * + * \file CAmGraph.h + * For further information see http://www.genivi.org/. + * + */ + +#ifndef GRAPH_H +#define GRAPH_H + +#include <functional> +#include <iostream> +#include <vector> +#include <map> +#include <list> +#include <stack> +#include <queue> +#include <algorithm> +#include <limits.h> +#include <iomanip> +#include <cstring> +#include <set> + + +namespace am +{ + /** + * Graph element status. + */ + typedef enum:uint8_t + { + GES_NOT_VISITED, + GES_IN_PROGRESS, + GES_VISITED + }am_GraphElementStatus_e; + + /** + * Callback parameter telling on which position in the path we are. + */ + typedef enum:uint8_t + { + GRAPH_PATH_START, //at the beginning of the path + GRAPH_PATH_MIDDLE, //in middle of the path + GRAPH_PATH_END //at the end of the path + }am_GraphPathPosition_e; + + + /** + * This class is base class for nodes and vertices. + */ + class CAmGraphElement + { + am_GraphElementStatus_e mStatus; //!< item status + public: + CAmGraphElement(): mStatus(GES_NOT_VISITED) { }; + ~CAmGraphElement() { }; + /** + * Setter and getter. + */ + void setStatus(const am_GraphElementStatus_e s) { mStatus = s; }; + am_GraphElementStatus_e getStatus() const { return mStatus; }; + }; + + template <class NodeData> class CAmNode : public CAmGraphElement + { + uint16_t mIndex; //!< uint16_t index used for direct access + NodeData mData; //!< NodeData user data + public: + CAmNode(const NodeData & in):CAmGraphElement(), mIndex(0), mData(in) { }; + CAmNode(const NodeData & in, const uint16_t index):CAmGraphElement(), mIndex(index), mData(in) { }; + ~CAmNode() { }; + /** + * Setters and getters. + */ + NodeData & getData() { return mData; } + uint16_t getIndex() const { return mIndex; } + void setIndex(uint16_t index) { mIndex = index; } + }; + + template <class NodeData, class VertexData> class CAmVertex : public CAmGraphElement + { + CAmNode<NodeData>* mpNode; //!< CAmNode<NodeData>* pointer to a node + VertexData mVertexData; //!< VertexData vertex user data + uint16_t mWeight; //!< uint16_t a positive value used in the shortest path algorithms + public: + CAmVertex(CAmNode<NodeData> *aNode, const VertexData & vertexData, const uint16_t weight):CAmGraphElement(), + mpNode(aNode), mVertexData(vertexData), mWeight(weight) { }; + ~CAmVertex() { }; + /** + * Setters and getters. + */ + CAmNode<NodeData>* getNode() const { return mpNode; } + VertexData & getData() { return mVertexData; } + uint16_t getWeight() const { return mWeight; } + void setWeight(const uint16_t weight) { mWeight=weight; } + }; + + /** + * Class representing a directed or undirected graph. It contains nodes and connections. + * T, V are types for custom user data. + */ + template <class T, class V> class CAmGraph + { + typedef typename std::vector<CAmNode<T>*> CAmListNodePtrs; + typedef typename std::list<CAmVertex<T,V>> CAmListVertices; + typedef typename std::list<CAmVertex<T,V>>::iterator CAmListVerticesItr; + typedef typename std::list<CAmVertex<T,V>>::const_iterator CAmListVerticesItrConst; + typedef typename std::list<CAmListVertices> CAmNodesAdjList; + typedef typename std::list<CAmListVertices>::iterator CAmNodesAdjListItr; + typedef typename std::list<CAmListVertices>::const_iterator CAmNodesAdjListItrConst; + typedef typename std::list<CAmNode<T>> CAmListNodes; + typedef typename std::list<CAmNode<T>>::iterator CAmListNodesItr; + typedef typename std::list<CAmNode<T>>::const_iterator CAmListNodesItrConst; + typedef typename std::vector<CAmNode<T>*> CAmNodeReferenceList; + typedef typename std::vector<CAmListVertices*> CAmVertexReferenceList; + + CAmListNodes mStoreNodes; //!< CAmListNodes list with all nodes + CAmNodesAdjList mStoreAdjList; //!< CAmNodesAdjList adjacency list + CAmNodeReferenceList mPointersNodes; //!< CAmNodeReferenceList vector with pointers to nodes for direct access + CAmVertexReferenceList mPointersAdjList; //!< CAmVertexReferenceList vector with pointers to vertices for direct access + bool mIsCyclic; //!< bool the graph has cycles or not + + /** + * Updates the node indexes after adding or removing nodes. + * + * @param fromIndex updates all nodes from given index. + */ + void updateIndexes(const int16_t fromIndex) + { + if( fromIndex<mPointersNodes.size() ) + { + for(auto iter = mPointersNodes.begin()+fromIndex; iter!=mPointersNodes.end(); iter++) + (*iter)->setIndex(iter-mPointersNodes.begin()); + } + } + + + /** + * Finds the shortest path and the minimal weights from given node. + * + * @param node start node. + * @param minDistance vector with all result distances. + * @param previous vector with previous nodes. + */ + + typedef uint16_t vertex_t; + typedef uint16_t weight_t; + + void findShortestsPathsFromNode(const CAmNode<T> & node, std::vector<weight_t> &minDistance, std::vector<CAmNode<T> *> &previous) + { + typename CAmListVertices::const_iterator nIter; + CAmListVertices * neighbors; + weight_t dist, weight, v, distanceThroughU; + CAmNode<T>* pU; + CAmVertex<T,V> * pVertex; + CAmNode<T> *pDstNode; + + size_t n = mPointersAdjList.size(); + std::set<std::pair<weight_t, CAmNode<T>*> > vertexQueue; + + minDistance.clear(); + minDistance.resize(n, std::numeric_limits<weight_t>::max()); + minDistance[node.getIndex()] = 0; + previous.clear(); + previous.resize(n, NULL); + + vertexQueue.insert(std::make_pair(minDistance[node.getIndex()], (CAmNode<T>*)&node)); + + while (!vertexQueue.empty()) + { + dist = vertexQueue.begin()->first; + pU = vertexQueue.begin()->second; + vertexQueue.erase(vertexQueue.begin()); + //todo: terminate the search at this position if you want the path to a target node ( if(pU==target)break; ) + + // Visit each edge exiting u + neighbors = mPointersAdjList[pU->getIndex()]; + nIter = neighbors->begin(); + for (; nIter != neighbors->end(); nIter++) + { + pVertex = (CAmVertex<T,V> *)&(*nIter); + pDstNode = pVertex->getNode(); + + v = pDstNode->getIndex(); + weight = pVertex->getWeight(); + distanceThroughU = dist + weight; + if (distanceThroughU < minDistance[pDstNode->getIndex()]) + { + vertexQueue.erase(std::make_pair(minDistance[v], pDstNode)); + minDistance[v] = distanceThroughU; + previous[v] = pU; + vertexQueue.insert(std::make_pair(minDistance[v], pDstNode)); + } + } + } + } + + /** + * Constructs a path to given node after findShortestsPathsFromNode has been called. + * + * @param node end node. + * @param previous vector with previous nodes. + * @param result result path. + */ + void constructShortestPathTo(const CAmNode<T> & node, const std::vector<CAmNode<T> *> &previous, CAmListNodePtrs & result) + { + CAmNode<T> * vertex = (CAmNode<T> *)&node; + + int i=0; + while ( (vertex = previous[vertex->getIndex()])!=NULL ) + { + result.insert(result.begin(), vertex); + i++; + } + if(i) + result.push_back((CAmNode<T> *)&node); + } + + /** + * Calls a function with every node from this path after findShortestsPathsFromNode has been called. + * The construction of the path is delegated to the caller. + * + * @param node end node. + * @param previous vector with previous nodes. + * @param cb callback which is mostly used for constructing. + */ + void constructShortestPathTo(const CAmNode<T> & node, const std::vector<CAmNode<T> *> &previous, std::function<void(const am_GraphPathPosition_e pos, CAmNode<T> &)> cb) + { + CAmNode<T> * vertex = (CAmNode<T> *)&node; + CAmNode<T> * prev = vertex; + int i=0; + while ( (vertex = previous[vertex->getIndex()])!=NULL ) + { + cb(i==0?GRAPH_PATH_START:GRAPH_PATH_MIDDLE, *prev); + prev = vertex; + i++; + } + if(i) + cb(GRAPH_PATH_END, *prev); + } + + /** + * Generates list with all possible paths to given destination node after findShortestsPathsFromNode has been called. + * Finding paths is observed through the callback. The caller is informed after a new path has been found. + * + * @param dst end node. + * @param visited vector with current path. + * @param cb callback which is mostly used for constructing. + */ + void goThroughAllPaths(const CAmNode<T> & dst, std::vector<CAmNode<T>*> & visited, std::function<void(const CAmNodeReferenceList & path)> cb) + { + CAmListVertices * nodes = mPointersAdjList[visited.back()->getIndex()]; + CAmListVerticesItrConst vItr(nodes->begin()); + for (; vItr != nodes->end(); ++vItr) + { + const CAmVertex<T,V> & vertex = (*vItr); + if(vertex.getNode()->getStatus()!=GES_NOT_VISITED) + continue; + if (vertex.getNode()==&dst) + { + vertex.getNode()->setStatus(GES_IN_PROGRESS); + visited.push_back(vertex.getNode()); + //notify observer + cb(visited); + //remove last node from the list + auto last = visited.end()-1; + visited.erase(last); + vertex.getNode()->setStatus(GES_NOT_VISITED); + break; + } + } + vItr = nodes->begin(); + //bfs like loop + for (; vItr != nodes->end(); ++vItr) + { + const CAmVertex<T,V> & vertex = (*vItr); + if(vertex.getNode()->getStatus()!=GES_NOT_VISITED||vertex.getNode()==&dst) + continue; + vertex.getNode()->setStatus(GES_IN_PROGRESS); + visited.push_back(vertex.getNode()); + goThroughAllPaths(dst, visited, cb); + //remove last node from the list + auto last = visited.end()-1; + visited.erase(last); + vertex.getNode()->setStatus(GES_NOT_VISITED); + } + reset(); + } + + public: + explicit CAmGraph(const std::vector<T> &v):mStoreNodes(), mStoreAdjList(), mPointersNodes(), mPointersAdjList() + { + typedef typename std::vector<T>::const_iterator inItr; + inItr itr(v.begin()); + + for (; itr != v.end(); ++itr) + { + addNode(*itr); + } + + mIsCyclic = false; + }; + CAmGraph():mStoreNodes(), mStoreAdjList(), mPointersNodes(), mPointersAdjList(), mIsCyclic(false){}; + ~CAmGraph(){} + + const CAmListNodes & getNodes() const + { + return mStoreNodes; + } + + /** + * Returns pointer to a node which data is equal to the given. + * @return pointer to a node or NULL. + */ + const CAmNode<T>* findNode(const T & in) + { + typename CAmNodeReferenceList::const_iterator itr (mPointersNodes.begin()); + + for (; itr != mPointersNodes.end(); ++itr) + { + if ((*itr)->getData() == in) { + return (*itr); + } + } + return NULL; + } + + /** + * Returns pointer to a vertex which two ends are equal to the given nodes. + * @return pointer to a vertex or NULL. + */ + const CAmVertex<T,V>* findVertex(const CAmNode<T> & edge1, const CAmNode<T> & edge2) const + { + const CAmNode<T> * pEdge2 = (CAmNode<T> *)&edge2; + const CAmListVertices * list = mPointersAdjList[edge1.getIndex()]; + CAmListVerticesItrConst result = std::find_if(list->begin(), list->end(), [&](const CAmVertex<T,V> & refObject){ + return refObject.getNode()==pEdge2; + }); + if(result!=list->end()) + return (CAmVertex<T,V>*)&(*result); + + return NULL; + } + + bool hasCycles() const + { + return mIsCyclic; + } + + + /** + * Adds a new node to the graph with given user data. + * @return reference to the newly inserted node. + */ + CAmNode<T> & addNode(const T & in) + { + size_t index = mStoreNodes.size(); + mStoreNodes.emplace_back(in, index); + mStoreAdjList.emplace_back(); + mPointersNodes.push_back(&mStoreNodes.back()); + mPointersAdjList.push_back(&mStoreAdjList.back()); + return mStoreNodes.back(); + } + + /** + * Removes a vertex with two ends equal to the given nodes . + */ + void removeVertex(const CAmNode<T> & edge1, const CAmNode<T> & edge2) + { + const CAmListVertices * list = mPointersAdjList[edge1.getIndex()]; + CAmListVerticesItr iter = std::find_if(list->begin(), list->end(), [&edge2](const CAmVertex<T,V> & refVertex){ + return (refVertex.getNode()==&edge2); + }); + if(iter!=list->end()) + list->erase(iter); + } + + /** + * Removes all vertices to given node . + */ + void removeAllVerticesToNode(const CAmNode<T> & node) + { + auto comparator = [&node](const CAmVertex<T,V> & refVertex){ + return (refVertex.getNode()==&node); + }; + auto itr = mPointersAdjList.begin(); + for(;itr!=mPointersAdjList.end();itr++) + { + CAmListVertices * vertices = *itr; + auto iterVert = std::find_if(vertices->begin(), vertices->end(), comparator); + if(iterVert!=vertices->end()) + vertices->erase(iterVert); + } + } + + /** + * Removes a node with given user data . + */ + void removeNode(const T & in) + { + CAmNode<T> * node = findNode(in); + if(node!=NULL) + removeNode(*node); + } + + /** + * Removes the given node from the graph . + */ + void removeNode(const CAmNode<T> & node) + { + uint16_t index = node.getIndex(); + removeAllVerticesToNode(node); + mPointersAdjList.erase(mPointersAdjList.begin()+index); + mPointersNodes.erase(mPointersNodes.begin()+index); + auto iter = std::find_if(mStoreNodes.begin(), mStoreNodes.end(), [&node](const CAmNode<T> & otherNode){ + return &otherNode==&node; + }); + if(iter!=mStoreNodes.end()) + mStoreNodes.erase(iter); + updateIndexes(index); + } + + /** + * Connect first with last node and set user data and weight to the vertex. + */ + void connectNodes(const CAmNode<T> & first, const CAmNode<T> & last, const V & vertexData, const int16_t weight = 1) + { + CAmListVertices * list = mPointersAdjList[first.getIndex()]; + CAmNode<T> * node = mPointersNodes[last.getIndex()]; + list->emplace_back(node, vertexData, weight); + } + + /** + * Exists any vertex with two given ends. + * @return TRUE on successfully changed ID. + */ + bool isAnyVertex(const CAmNode<T> & edge1, const CAmNode<T> & edge2) const + { + return findVertex(edge1, edge2)!=NULL; + } + + /** + * Sets the status of all nodes and vertices to GES_NOT_VISITED. + */ + void reset() + { + // set all nodes to GES_NOT_VISITED + std::for_each(mPointersNodes.begin(), mPointersNodes.end(), [](CAmNode<T> * refNode){ + if(refNode->getStatus()!= GES_NOT_VISITED) + refNode->setStatus(GES_NOT_VISITED); + }); + // set all vertices to GES_NOT_VISITED + auto action = [](CAmVertex<T,V> & refVertex){ + if(refVertex.getStatus()!= GES_NOT_VISITED) + refVertex.setStatus(GES_NOT_VISITED); + }; + auto itr1(mPointersAdjList.begin()); + for (; itr1 != mPointersAdjList.end(); ++itr1) + { + CAmListVertices * vertices = *itr1; + std::for_each(vertices->begin(), vertices->end(), action); + } + } + + /** + * Clears all nodes and vertices. + */ + void clear() + { + mStoreNodes.clear(); + mStoreAdjList.clear(); + mPointersAdjList.clear(); + mPointersNodes.clear(); + mPointersAdjList.clear(); + } + + /** + * Goes through all nodes and vertices and calls the callback. + */ + void trace(std::function<void(const CAmNode<T> &, const std::vector<CAmVertex<T,V>*> &)> cb) + { + std::for_each(mPointersNodes.begin(), mPointersNodes.end(), [&](CAmNode<T> * refNode){ + CAmListVertices * vertices = mPointersAdjList[refNode->getIndex()]; + std::vector<CAmVertex<T,V>*> list; + std::for_each(vertices->begin(), vertices->end(), [&list](CAmVertex<T,V> & refVertex){ + list.push_back(&refVertex); + }); + cb(*refNode, list); + }); + } + + /** + * Finds the shortest path from given node to all nodes in listTargets. + * + * @param source start node. + * @param listTargets destination nodes. + * @param resultPath list with all shortest paths. + */ + void getShortestPath(const CAmNode<T> & source, const CAmListNodePtrs & listTargets, std::vector<CAmListNodePtrs> & resultPath ) + { + const size_t numberOfNodes = mPointersNodes.size(); + if(numberOfNodes==0) + return; + + std::vector<weight_t> min_distance; + std::vector<CAmNode<T>*> previous; + findShortestsPathsFromNode(source, min_distance, previous); + + for(auto it=listTargets.begin(); it!=listTargets.end(); it++) + { + CAmNode<T> *node = *it; + resultPath.emplace_back(); + CAmListNodePtrs & path = resultPath.back(); + constructShortestPathTo(*node, previous, path); + if(path.empty()) + { + typename std::vector<CAmListNodePtrs>::iterator iter = resultPath.end(); + resultPath.erase(--iter); + } + } + } + + /** + * Finds the shortest path between two nodes. + * + * @param source start node. + * @param destination destination node. + * @param resultPath list with the found shortest paths. + */ + void getShortestPath(const CAmNode<T> & source, const CAmNode<T> & destination, CAmListNodePtrs & resultPath ) + { + const size_t numberOfNodes = mPointersNodes.size(); + if(numberOfNodes==0) + return; + std::vector<weight_t> min_distance; + std::vector<CAmNode<T>*> previous; + findShortestsPathsFromNode(source, min_distance, previous); + constructShortestPathTo(destination, previous, resultPath); + } + + /** + * Finds the shortest path from given node to all nodes in listTargets. + * Delegates the construction of the path to the caller. + * + * @param source start node. + * @param listTargets destination nodes. + * @param cb callabck. + */ + void getShortestPath(const CAmNode<T> & source, + const CAmListNodePtrs & listTargets, + std::function<void(const am_GraphPathPosition_e, CAmNode<T> &)> cb ) + { + const size_t numberOfNodes = mPointersNodes.size(); + if(numberOfNodes==0) + return; + + std::vector<weight_t> min_distance; + std::vector<CAmNode<T>*> previous; + findShortestsPathsFromNode(source, min_distance, previous); + + for(auto it=listTargets.begin(); it!=listTargets.end(); it++) + { + CAmNode<T>* node = *it; + constructShortestPathTo(*node, previous, cb); + } + } + + /** + * Finds the shortest path between two given nodes. + * Delegates the construction of the path to the caller. + * + * @param source start node. + * @param destination destination node. + * @param cb callabck. + */ + void getShortestPath(const CAmNode<T> & source, + const CAmNode<T> & destination, + std::function<void(const am_GraphPathPosition_e, CAmNode<T> &)> cb ) + { + const size_t numberOfNodes = mPointersNodes.size(); + if(numberOfNodes==0) + return; + + std::vector<weight_t> min_distance; + std::vector<CAmNode<T>*> previous; + findShortestsPathsFromNode(source, min_distance, previous); + constructShortestPathTo(destination, previous, cb); + } + + /** + * Finds all possible paths between two given nodes. + * Delegates the construction of the path to the caller. + * + * @param src start node. + * @param dst destination node. + * @param cb callabck. + */ + void getAllPaths(const CAmNode<T> & src, const CAmNode<T> & dst, std::function<void(const CAmNodeReferenceList & path)> cb) + { + CAmNodeReferenceList visited; + visited.push_back((CAmNode<T>*)&src); + goThroughAllPaths(dst, visited, cb); + } + }; + +} + +#endif diff --git a/AudioManagerDaemon/include/CAmRouter.h b/AudioManagerDaemon/include/CAmRouter.h index 76cf5fc..6a3aacc 100644 --- a/AudioManagerDaemon/include/CAmRouter.h +++ b/AudioManagerDaemon/include/CAmRouter.h @@ -13,6 +13,7 @@ * * * \author Christian Mueller, christian.ei.mueller@bmw.de BMW 2011,2012 + * \author Aleksandar Donchev, Aleksander.Donchev@partner.bmw.de BMW 2013,2014 * * \file CAmRouter.h * For further information see http://www.genivi.org/. @@ -22,68 +23,281 @@ #ifndef ROUTER_H_ #define ROUTER_H_ +#include <assert.h> +#include <vector> #include "audiomanagertypes.h" +#include "CAmGraph.h" +#include "IAmDatabaseHandler.h" + namespace am { +/** + * Optimal path search between a source and a sink is implemented with a graph which contains nodes - sinks, sources, gateways, converters. + * + * If EXTENDED_ROUTING_GRAPH is defined the graph will contain nodes, which are identified by sinkID, sourceID, gatewayID, converterID and connectionFormat. + * All possible connections between all nodes (1 connection is 1 connection format) are represented in the graph (Node[id=1, connectionFormat=1] ---> Node[id=2, connectionFormat=1]). + * + * If EXTENDED_ROUTING_GRAPH is NOT defined the graph will contain nodes, which are identified by sinkID, sourceID, gatewayID, converterID. + * A possible connection between two nodes represents the facts that the nodes can be connected with one or more connectionFormats (Node[id=1] ---> Node[id=2]). + * It is assumption that the two nodes can be connected. The controller itself decides later whether the connection is possible or not. This is default. + * + */ +#undef EXTENDED_ROUTING_GRAPH + +/** + * Trace on/off. + */ +#undef TRACE_GRAPH + + +class CAmRouter; + +/** + * A structure used as user data in the graph nodes. + */ +struct am_RoutingNodeData_s +{ + typedef enum:uint8_t {SINK, SOURCE, GATEWAY, CONVERTER} am_NodeDataType_e; + am_NodeDataType_e type; //!< data type:sink, source, gateway or converter +#ifdef EXTENDED_ROUTING_GRAPH + am_CustomConnectionFormat_t inConnectionFormat; //!< input connection format for sink, source, gateway or converter + am_CustomConnectionFormat_t outConnectionFormat; //!< output connection format usually for gateways and converters +#endif + union + { + am_Source_s *source; + am_Sink_s *sink; + am_Gateway_s *gateway; + am_Converter_s *converter; + } data; //!< union pointer to sink, source, gateway or converter + + am_RoutingNodeData_s():type(SINK) +#ifdef EXTENDED_ROUTING_GRAPH + ,inConnectionFormat(CF_UNKNOWN) + ,outConnectionFormat(CF_UNKNOWN) +#endif + {} + + bool operator==(const am_RoutingNodeData_s & anotherObject) const + { + bool result = false; + if(type==anotherObject.type) + { +#ifdef EXTENDED_ROUTING_GRAPH + result = (inConnectionFormat==anotherObject.inConnectionFormat && outConnectionFormat==anotherObject.outConnectionFormat); +#else + result = true; +#endif + if(type==SINK) + result &= (data.sink->sinkID==anotherObject.data.sink->sinkID); + else if(type==SOURCE) + result &= (data.source->sourceID==anotherObject.data.source->sourceID); + else if(type==GATEWAY) + result &= (data.gateway->gatewayID==anotherObject.data.gateway->gatewayID); + else if(type==CONVERTER) + result &= (data.converter->converterID==anotherObject.data.converter->converterID); + } + return result; + }; + +#ifdef TRACE_GRAPH + void trace() const + { + if(type==SINK) + std::cout << "[SINK:" << data.sink->sinkID << ":" << data.sink->name +#ifdef EXTENDED_ROUTING_GRAPH + << "(" << inConnectionFormat << "," << outConnectionFormat << ")" +#endif + << "]"; + else if(type==SOURCE) + std::cout << "[SOUR:" << data.source->sourceID << ":" << data.source->name +#ifdef EXTENDED_ROUTING_GRAPH + << "(" << inConnectionFormat << "," << outConnectionFormat << ")" +#endif + << "]"; + else if(type==GATEWAY) + std::cout << "[GATE:" << data.gateway->gatewayID << ":" << data.gateway->name +#ifdef EXTENDED_ROUTING_GRAPH + << "(" << inConnectionFormat << "," << outConnectionFormat << ")" +#endif + << "]"; + else if(type==CONVERTER) + std::cout << "[CONV:" << data.converter->converterID << ":" << data.converter->name +#ifdef EXTENDED_ROUTING_GRAPH + << "(" << inConnectionFormat << "," << outConnectionFormat << ")" +#endif + << "]"; + }; +#endif +}; + +#define NodeDataType am_RoutingNodeData_s::am_NodeDataType_e + -class IAmDatabaseHandler; class CAmControlSender; + /** * Implements an autorouting algorithm for connecting sinks and sources via different audio domains. */ class CAmRouter { + IAmDatabaseHandler* mpDatabaseHandler; //!< pointer to database handler + CAmControlSender* mpControlSender; //!< pointer the controlsender - is used to retrieve information for the optimal route + bool mOnlyFreeConversionNodes; //!< bool flag whether only disconnected elements should be considered or not + CAmGraph<am_RoutingNodeData_s, uint16_t> mRoutingGraph; //!< graph object + std::vector<CAmNode<am_RoutingNodeData_s>*> mNodeListSources; //!< vector with pointers to nodes with sources, used for quick access + std::vector<CAmNode<am_RoutingNodeData_s>*> mNodeListSinks; //!< vector with pointers to nodes with sinks, used for quick access + std::vector<CAmNode<am_RoutingNodeData_s>*> mNodeListGateways; //!< vector with pointers to nodes with gateways, used for quick access + std::vector<CAmNode<am_RoutingNodeData_s>*> mNodeListConverters;//!< vector with pointers to nodes with converters, used for quick access + std::map<am_sourceID_t, bool> mNodeListSourceStatus; //!< vector with flags preventing going through group of nodes during the path search + std::map<am_sinkID_t, bool> mNodeListSinkStatus; //!< vector with flags preventing going through group of nodes during the path search + std::map<am_converterID_t, bool> mNodeListConverterStatus; //!< vector with flags preventing going through group of nodes during the path search + std::map<am_gatewayID_t, bool> mNodeListGatewayStatus; //!< vector with flags preventing going through group of nodes during the path search +#ifdef EXTENDED_ROUTING_GRAPH + am_Source_s *mpRootSource; //!< pointer to source + am_Sink_s *mpRootSink; //!< pointer to sink + + /* + * Methods for getting shortest path from the graph. + */ + void getShortestPath(const am_Source_s & aSource, const am_Sink_s & aSink, std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & resultPath); + void getShortestPath(std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & resultPath); + void getShortestPath(const am_Source_s & aSource, const am_Sink_s & aSink, + std::vector<am_Route_s> & resultPath, std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & resultNodesPath); + void getShortestPath(std::vector<am_Route_s> & routes, std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & nodes); + + /** + * Returns a sink node with given sinkID and connection format. + * + * @param sinkID sink id. + * @param connectionFormat connection format. + * @return pointer to node or NULL. + */ + + CAmNode<am_RoutingNodeData_s>* sinkNodeWithID(const am_sinkID_t sinkID, const am_CustomConnectionFormat_t connectionFormat); + /** + * Returns a source node with given sourceID and connection format. + * + * @param sourceID source id. + * @param connectionFormat connection format. + * @return pointer to node or NULL. + */ + CAmNode<am_RoutingNodeData_s>* sourceNodeWithID(const am_sourceID_t sourceID, const am_CustomConnectionFormat_t connectionFormat); +#else + CAmNode<am_RoutingNodeData_s> *mpRootSource; //!< pointer to source node + CAmNode<am_RoutingNodeData_s> *mpRootSink; //!< pointer to sink node + + am_Error_e determineConnectionFormatsForPath(am_Route_s & routeObjects, std::vector<CAmNode<am_RoutingNodeData_s>*> & nodes); + am_Error_e doConnectionFormatsForPath(am_Route_s & routeObjects, + std::vector<CAmNode<am_RoutingNodeData_s>*> & route, + std::vector<am_RoutingElement_s>::iterator routingElementIterator, + std::vector<CAmNode<am_RoutingNodeData_s>*>::iterator routeIterator); + void getShortestPath(const CAmNode<am_RoutingNodeData_s> & source, + const CAmNode<am_RoutingNodeData_s> & destination, + std::vector<CAmNode<am_RoutingNodeData_s>*> & resultPath); + void getShortestPath(std::vector<CAmNode<am_RoutingNodeData_s>*> & resultPath); + void getShortestPath(CAmNode<am_RoutingNodeData_s> & aSource, CAmNode<am_RoutingNodeData_s> & aSink, + am_Route_s & resultPath, std::vector<CAmNode<am_RoutingNodeData_s>*> & resultNodesPath); + void getShortestPath(am_Route_s & resultPath, std::vector<CAmNode<am_RoutingNodeData_s>*> & resultNodesPath); + am_Error_e getAllPaths(CAmNode<am_RoutingNodeData_s> & aSource, CAmNode<am_RoutingNodeData_s> & aSink, + std::vector<am_Route_s> & resultPath, std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & resultNodesPath); + am_Error_e getAllPaths(std::vector<am_Route_s> & resultPath, std::vector<std::vector<CAmNode<am_RoutingNodeData_s>*>> & resultNodesPath); + + /** + * Returns a sink node with given sinkID. + * + * @param sinkID sink id. + * @return pointer to node or NULL. + */ + CAmNode<am_RoutingNodeData_s>* sinkNodeWithID(const am_sinkID_t sinkID); + + /** + * Returns a source node with given sourceID. + * + * @param sourceID source id. + * @return pointer to node or NULL. + */ + CAmNode<am_RoutingNodeData_s>* sourceNodeWithID(const am_sourceID_t sourceID); +#endif + + /** + * Makes connection between two nodes. + * + * @param node1. + * @param node2. + * @param vertexData associated data. + * @param weight connection weight used for finding optimal path. + */ + void connectNodes(const CAmNode<am_RoutingNodeData_s> & node1, + const CAmNode<am_RoutingNodeData_s> & node2, + const am_CustomConnectionFormat_t vertexData, + const int16_t weight = 1); + /** + * Builds path in a domain from source to sink. + * + * @param aSource starting point. + * @param aSink ending point. + */ + bool routeInSameDomain(CAmNode<am_RoutingNodeData_s> & aSource, CAmNode<am_RoutingNodeData_s> & aSink); + + /** + * Builds path from source to sink when the source and the sink belongs to different domains. + * + * @param aSource starting point. + * @param aSink ending point. + */ + bool routeInAnotherDomain(CAmNode<am_RoutingNodeData_s> & aSource, CAmNode<am_RoutingNodeData_s> & aSink); + void clear(); + + /** + * Fills the graph with nodes and connections. + * + * @param aSource starting point. + * @param aSink ending point. + */ + void buildGraph(const am_Source_s & aSource, const am_Sink_s & aSink); + template <class Component> bool isComponentConnected(const Component & comp) + { + return mpDatabaseHandler->isComponentConnected(comp); + } + public: CAmRouter(IAmDatabaseHandler* iDatabaseHandler, CAmControlSender* iSender); ~CAmRouter(); + + /** + * Finds all possible paths between given source and sink. + * + * @param onlyfree only disconnected elements should be included or not. + * @param sourceID starting point. + * @param sinkID ending point. + * @param returnList list with all possible paths + * @return E_OK on success(0 or more paths) or E_NOT_POSSIBLE on failure. + */ am_Error_e getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s>& returnList); + am_Error_e getRoute(const bool onlyfree, const am_Source_s & aSource, const am_Sink_s & aSink, std::vector<am_Route_s> & listRoutes); -private: - am_Error_e findBestWay(am_sinkID_t sinkID, am_sourceID_t sourceID, std::vector<am_RoutingElement_s>& listRoute, std::vector<am_RoutingElement_s>::iterator routeIterator, std::vector<am_gatewayID_t>::iterator gatewayIterator); - void listPossibleConnectionFormats(const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_CustomConnectionFormat_t>& listFormats) const; - void listRestrictedOutputFormatsGateways(const am_gatewayID_t gatewayID, const am_CustomConnectionFormat_t sinkConnectionFormat, std::vector<am_CustomConnectionFormat_t>& listFormats) const; - IAmDatabaseHandler* mpDatabaseHandler; //!< pointer to database handler - CAmControlSender* mpControlSender; //!< pointer the controlsender - is used to retrieve information for the optimal route -}; + /** + * Helper methods. + */ + static bool getAllowedFormatsFromConvMatrix(const std::vector<bool> & convertionMatrix, + const std::vector<am_CustomConnectionFormat_t> & listSourceFormats, + const std::vector<am_CustomConnectionFormat_t> & listSinkFormats, + std::vector<am_CustomConnectionFormat_t> & sourceFormats, + std::vector<am_CustomConnectionFormat_t> & sinkFormats); + static bool getRestrictedOutputFormats(const std::vector<bool> & convertionMatrix, + const std::vector<am_CustomConnectionFormat_t> & listSourceFormats, + const std::vector<am_CustomConnectionFormat_t> & listSinkFormats, + const am_CustomConnectionFormat_t connectionFormat, + std::vector<am_CustomConnectionFormat_t> & listFormats); -/** - * an item in the routing tree - */ -class CAmRoutingTreeItem -{ -public: - CAmRoutingTreeItem(const am_domainID_t domainID, const am_gatewayID_t gatewayID = 0, CAmRoutingTreeItem *parent = 0); - ~CAmRoutingTreeItem(); - void appendChild(CAmRoutingTreeItem *newChild); //!< appends a new child - void returnChildItems(std::vector<CAmRoutingTreeItem*> listChildItems); //!< returns the list of childs - am_domainID_t returnDomainID() const; //!< returns the domainID of the tree - am_gatewayID_t returnGatewayID() const; //!< returns the gatewayID of the tree - CAmRoutingTreeItem* returnParent() const; //!< returns the parent item of the tree -private: - std::vector<CAmRoutingTreeItem*> mListChildItems; //!< List of all child items - am_domainID_t mDomainID; //!< the domain ID of the item - am_gatewayID_t mGatewayID; //!< the gateway Id - CAmRoutingTreeItem *mpParentItem; //!< pointer to the parent item + static void listPossibleConnectionFormats(std::vector<am_CustomConnectionFormat_t> & inListSourceFormats, + std::vector<am_CustomConnectionFormat_t> & inListSinkFormats, + std::vector<am_CustomConnectionFormat_t> & outConnectionFormats); }; -/** - * a routing tree - */ -class CAmRoutingTree -{ -public: - CAmRoutingTree(const am_domainID_t rootDomainID); - ~CAmRoutingTree(); - CAmRoutingTreeItem* insertItem(const am_domainID_t domainID, const am_gatewayID_t gatewayID, CAmRoutingTreeItem *parent); - void getRoute(CAmRoutingTreeItem* targetItem, std::vector<am_gatewayID_t>& listGateways); - am_domainID_t returnRootDomainID() const; - CAmRoutingTreeItem* returnRootItem(); -private: - CAmRoutingTreeItem mRootItem; //!< pointer to root item - std::vector<CAmRoutingTreeItem*> mListChild; //!< list of all childs -}; } /* namespace am */ #endif /* ROUTER_H_ */ diff --git a/AudioManagerDaemon/include/CAmRoutingReceiver.h b/AudioManagerDaemon/include/CAmRoutingReceiver.h index 4eca2aa..bf42f6b 100644 --- a/AudioManagerDaemon/include/CAmRoutingReceiver.h +++ b/AudioManagerDaemon/include/CAmRoutingReceiver.h @@ -58,7 +58,9 @@ public: am_Error_e registerDomain(const am_Domain_s& domainData, am_domainID_t& domainID); am_Error_e deregisterDomain(const am_domainID_t domainID); am_Error_e registerGateway(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); + am_Error_e registerConverter(const am_Converter_s& converterData, am_converterID_t& converterID); am_Error_e deregisterGateway(const am_gatewayID_t gatewayID); + am_Error_e deregisterConverter(const am_converterID_t converterID); am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); am_Error_e registerSink(const am_Sink_s& sinkData, am_sinkID_t& sinkID); am_Error_e deregisterSink(const am_sinkID_t sinkID); @@ -82,6 +84,7 @@ public: void confirmRoutingReady(const uint16_t handle, const am_Error_e error); void confirmRoutingRundown(const uint16_t handle, const am_Error_e error); am_Error_e updateGateway(const am_gatewayID_t gatewayID, const std::vector<am_CustomConnectionFormat_t>& listSourceFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkFormats, const std::vector<bool>& convertionMatrix) ; + am_Error_e updateConverter(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkFormats, const std::vector<bool>& convertionMatrix); am_Error_e updateSink(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; am_Error_e updateSource(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector<am_SoundProperty_s>& listSoundProperties, const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats, const std::vector<am_MainSoundProperty_s>& listMainSoundProperties) ; void ackSetVolumes(const am_Handle_s handle, const std::vector<am_Volumes_s>& listvolumes, const am_Error_e error) ; diff --git a/AudioManagerDaemon/include/IAmDatabaseHandler.h b/AudioManagerDaemon/include/IAmDatabaseHandler.h index 8a36801..e053635 100644 --- a/AudioManagerDaemon/include/IAmDatabaseHandler.h +++ b/AudioManagerDaemon/include/IAmDatabaseHandler.h @@ -27,6 +27,7 @@ #include <vector> #include <string> #include <iostream> +#include <functional> namespace am { @@ -62,6 +63,7 @@ public: virtual am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID) = 0; virtual am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID) = 0; virtual am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID) = 0; + virtual am_Error_e enterConverterDB(const am_Converter_s & converteData, am_converterID_t & converterID) = 0; virtual am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID) = 0; virtual am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) = 0; virtual am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID) = 0; @@ -92,6 +94,7 @@ public: virtual am_Error_e removeSinkDB(const am_sinkID_t sinkID) = 0; virtual am_Error_e removeSourceDB(const am_sourceID_t sourceID) = 0; virtual am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID) = 0; + virtual am_Error_e removeConverterDB(const am_converterID_t converterID) = 0; virtual am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID) = 0; virtual am_Error_e removeDomainDB(const am_domainID_t domainID) = 0; virtual am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID) = 0; @@ -100,6 +103,7 @@ public: virtual am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const = 0; virtual am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const = 0; virtual am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const = 0; + virtual am_Error_e getConverterInfoDB(const am_converterID_t converterID, am_Converter_s& converterData) const = 0; virtual am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const = 0; virtual am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const = 0; virtual am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const = 0; @@ -112,6 +116,7 @@ public: virtual am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t>& listSourceID) const = 0; virtual am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t>& listGatewaysID) const = 0; virtual am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t>& listGatewaysID) const = 0; + virtual am_Error_e getListConvertersOfDomain(const am_domainID_t domainID, std::vector<am_converterID_t>& listConvertersID) const = 0; virtual am_Error_e getListMainConnections(std::vector<am_MainConnection_s>& listMainConnections) const = 0; virtual am_Error_e getListDomains(std::vector<am_Domain_s>& listDomains) const = 0; virtual am_Error_e getListConnections(std::vector<am_Connection_s>& listConnections) const = 0; @@ -120,6 +125,7 @@ public: virtual am_Error_e getListSourceClasses(std::vector<am_SourceClass_s>& listSourceClasses) const = 0; virtual am_Error_e getListCrossfaders(std::vector<am_Crossfader_s>& listCrossfaders) const = 0; virtual am_Error_e getListGateways(std::vector<am_Gateway_s>& listGateways) const = 0; + virtual am_Error_e getListConverters(std::vector<am_Converter_s> & listConverters) const = 0; virtual am_Error_e getListSinkClasses(std::vector<am_SinkClass_s>& listSinkClasses) const = 0; virtual am_Error_e getListVisibleMainConnections(std::vector<am_MainConnectionType_s>& listConnections) const = 0; virtual am_Error_e getListMainSinks(std::vector<am_SinkType_s>& listMainSinks) const = 0; @@ -135,7 +141,6 @@ public: virtual am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const = 0; virtual am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const = 0; virtual am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const = 0; - virtual am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector<CAmRoutingTreeItem*>& flatTree) = 0; virtual am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID) = 0; virtual am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID) = 0; virtual am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID) = 0; @@ -148,11 +153,12 @@ public: virtual am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; virtual am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; virtual am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix) = 0; + virtual am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats, const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats, const std::vector<bool>& convertionMatrix) = 0; virtual am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration) = 0; virtual am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration) = 0; virtual bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const = 0; - virtual bool existcrossFader(const am_crossfaderID_t crossfaderID) const = 0; + virtual bool existCrossFader(const am_crossfaderID_t crossfaderID) const = 0; virtual bool existConnection(const am_Connection_s & connection) const = 0; virtual bool existConnectionID(const am_connectionID_t connectionID) const = 0; virtual bool existSource(const am_sourceID_t sourceID) const = 0; @@ -168,9 +174,14 @@ public: virtual void registerObserver(CAmDatabaseObserver *iObserver) = 0; virtual bool sourceVisible(const am_sourceID_t sourceID) const = 0; virtual bool sinkVisible(const am_sinkID_t sinkID) const = 0; - + virtual bool isComponentConnected(const am_Gateway_s & gateway) const = 0; + virtual bool isComponentConnected(const am_Converter_s & converter) const = 0; virtual am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const = 0; //!< calculates a new main connection delay virtual void dump( std::ostream & output) const = 0 ; + virtual am_Error_e enumerateSources(std::function<void(const am_Source_s & element)> cb) const = 0 ; + virtual am_Error_e enumerateSinks(std::function<void(const am_Sink_s & element)> cb) const = 0 ; + virtual am_Error_e enumerateGateways(std::function<void(const am_Gateway_s & element)> cb) const = 0 ; + virtual am_Error_e enumerateConverters(std::function<void(const am_Converter_s & element)> cb) const = 0 ; }; |