From b616ca1e864f7530b9dfce4c38f9d24a9f0809c9 Mon Sep 17 00:00:00 2001 From: Aleksandar Donchev Date: Fri, 10 Feb 2017 11:12:42 +0100 Subject: * many database observers can be registred now by the database handler. Signed-off-by: Christian Linke --- AudioManagerCore/include/CAmCommandSender.h | 13 +- AudioManagerCore/include/CAmDatabaseHandlerMap.h | 168 +++++++++++++++-------- AudioManagerCore/include/CAmDatabaseObserver.h | 87 ------------ AudioManagerCore/include/CAmRouter.h | 6 +- AudioManagerCore/include/CAmRoutingSender.h | 5 +- AudioManagerCore/include/IAmDatabaseHandler.h | 34 +++-- 6 files changed, 147 insertions(+), 166 deletions(-) delete mode 100644 AudioManagerCore/include/CAmDatabaseObserver.h (limited to 'AudioManagerCore/include') diff --git a/AudioManagerCore/include/CAmCommandSender.h b/AudioManagerCore/include/CAmCommandSender.h index 82363de..caa72ad 100644 --- a/AudioManagerCore/include/CAmCommandSender.h +++ b/AudioManagerCore/include/CAmCommandSender.h @@ -29,21 +29,24 @@ #endif #include "IAmCommand.h" +#include "CAmDatabaseHandlerMap.h" +#include "CAmSerializer.h" namespace am { class CAmCommandReceiver; +class CAmCommandSender; /** * This class is used to send data to the CommandInterface. * All loaded plugins will be called when a callback is invoked. */ -class CAmCommandSender +class CAmCommandSender: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { public: - CAmCommandSender(const std::vector& listOfPluginDirectories); + CAmCommandSender(const std::vector& listOfPluginDirectories, CAmSocketHandler *iSocketHandler); ~CAmCommandSender(); am_Error_e startupInterfaces(CAmCommandReceiver* iCommandReceiver); void setCommandReady(); @@ -78,14 +81,18 @@ public: friend class IAmCommandBackdoor; //this is to get access to the loaded plugins and be able to exchange the interfaces #endif private: + void unloadLibraries(void); //!< unload the shared libraries std::vector mListInterfaces; //!< list of all interfaces std::vector mListLibraryHandles; //!< list of all library handles. This information is used to unload the plugins correctly. std::vector mListLibraryNames; //!< list of all library names. This information is used for getListPlugins. - + CAmCommandReceiver *mCommandReceiver; + CAmSerializer mSerializer; }; + + } #endif /* COMMANDSENDER_H_ */ diff --git a/AudioManagerCore/include/CAmDatabaseHandlerMap.h b/AudioManagerCore/include/CAmDatabaseHandlerMap.h index 05443b1..3909b05 100644 --- a/AudioManagerCore/include/CAmDatabaseHandlerMap.h +++ b/AudioManagerCore/include/CAmDatabaseHandlerMap.h @@ -74,6 +74,51 @@ class CAmDatabaseHandlerMap : public IAmDatabaseHandler public: CAmDatabaseHandlerMap(); virtual ~CAmDatabaseHandlerMap(); + + /** + * Database observer. + */ + struct AmDatabaseObserverCallbacks: public IAmDatabaseObserver + { + protected: + std::function dboNumberOfSinkClassesChanged; + std::function dboNumberOfSourceClassesChanged; + std::function dboNewSink; + std::function dboNewSource; + std::function dboNewDomain; + std::function dboNewGateway; + std::function dboNewConverter; + std::function dboNewCrossfader; + std::function dboNewMainConnection; + std::function dboRemovedMainConnection; + std::function dboRemovedSink; + std::function dboRemovedSource; + std::function dboRemoveDomain; + std::function dboRemoveGateway; + std::function dboRemoveConverter; + std::function dboRemoveCrossfader; + std::function dboMainConnectionStateChanged; + std::function dboMainSinkSoundPropertyChanged; + std::function dboMainSourceSoundPropertyChanged; + std::function dboSinkAvailabilityChanged; + std::function dboSourceAvailabilityChanged; + std::function dboVolumeChanged; + std::function dboSinkMuteStateChanged; + std::functiondboSystemPropertyChanged; + std::functiondboTimingInformationChanged; + std::function& , const bool )>dboSinkUpdated; + std::function& , const bool )>dboSourceUpdated; + std::function dboSinkMainNotificationConfigurationChanged; + std::function dboSourceMainNotificationConfigurationChanged; + public: + friend class CAmDatabaseHandlerMap; + AmDatabaseObserverCallbacks():IAmDatabaseObserver(), mpDatabaseHandler(nullptr) {} + virtual ~AmDatabaseObserverCallbacks(){ if(mpDatabaseHandler) mpDatabaseHandler->unregisterObserver(this);} + protected: + CAmDatabaseHandlerMap *mpDatabaseHandler; + + }; + am_Error_e enterDomainDB(const am_Domain_s& domainData, am_domainID_t& domainID); am_Error_e enterMainConnectionDB(const am_MainConnection_s& mainConnectionData, am_mainConnectionID_t& connectionID); am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID); @@ -196,7 +241,6 @@ public: 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; @@ -206,6 +250,11 @@ public: am_Error_e enumerateSinks(std::function cb) const; am_Error_e enumerateGateways(std::function cb) const; am_Error_e enumerateConverters(std::function cb) const; + + bool registerObserver(IAmDatabaseObserver * iObserver); + bool unregisterObserver(IAmDatabaseObserver * iObserver); + unsigned countObservers(); + /** * The following structures extend the base structures with the field 'reserved'. */ @@ -276,55 +325,55 @@ public: AM_SUBCLASS_COPY_OP_END()\ AM_SUBCLASS_OP(Subclass, Class)\ - +private: AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Domain_Database_s,am_Domain_s) - AM_SUBCLASS_END(CAmDomain) + AM_SUBCLASS_END(AmDomain) AM_TYPEDEF_SUBCLASS_SOUND_PROPERTIES_BEGIN(am_Sink_Database_s,am_Sink_s) void getSinkType(am_SinkType_s & sinkType) const;\ - AM_SUBCLASS_END(CAmSink) + AM_SUBCLASS_END(AmSink) AM_TYPEDEF_SUBCLASS_SOUND_PROPERTIES_BEGIN(am_Source_Database_s,am_Source_s) void getSourceType(am_SourceType_s & sourceType) const;\ - AM_SUBCLASS_END(CAmSource) + AM_SUBCLASS_END(AmSource) AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Connection_Database_s,am_Connection_s) - AM_SUBCLASS_END(CAmConnection) + AM_SUBCLASS_END(AmConnection) /** * The following structures extend the base structures with print capabilities. */ AM_TYPEDEF_SUBCLASS_BEGIN(am_MainConnection_Database_s, am_MainConnection_s) void getMainConnectionType(am_MainConnectionType_s & connectionType) const;\ - AM_SUBCLASS_END(CAmMainConnection) + AM_SUBCLASS_END(AmMainConnection) AM_TYPEDEF_SUBCLASS_BEGIN(am_SourceClass_Database_s, am_SourceClass_s) - AM_SUBCLASS_END(CAmSourceClass) + AM_SUBCLASS_END(AmSourceClass) AM_TYPEDEF_SUBCLASS_BEGIN(am_SinkClass_Database_s, am_SinkClass_s) - AM_SUBCLASS_END(CAmSinkClass) + AM_SUBCLASS_END(AmSinkClass) AM_TYPEDEF_SUBCLASS_BEGIN(am_Gateway_Database_s, am_Gateway_s) - AM_SUBCLASS_END(CAmGateway) + AM_SUBCLASS_END(AmGateway) AM_TYPEDEF_SUBCLASS_BEGIN(am_Converter_Database_s, am_Converter_s) - AM_SUBCLASS_END(CAmConverter) + AM_SUBCLASS_END(AmConverter) AM_TYPEDEF_SUBCLASS_BEGIN(am_Crossfader_Database_s, am_Crossfader_s) - AM_SUBCLASS_END(CAmCrossfader) - - private: - typedef std::unordered_map CAmMapDomain; - typedef std::unordered_map CAmMapSourceClass; - typedef std::unordered_map CAmMapSinkClass; - typedef std::unordered_map CAmMapSink; - typedef std::unordered_map CAmMapSource; - typedef std::unordered_map CAmMapGateway; - typedef std::unordered_map CAmMapConverter; - typedef std::unordered_map CAmMapCrossfader; - typedef std::unordered_map CAmMapConnection; - typedef std::unordered_map CAmMapMainConnection; - typedef std::vector CAmVectorSystemProperties; + AM_SUBCLASS_END(AmCrossfader) + + + typedef std::unordered_map AmMapDomain; + typedef std::unordered_map AmMapSourceClass; + typedef std::unordered_map AmMapSinkClass; + typedef std::unordered_map AmMapSink; + typedef std::unordered_map AmMapSource; + typedef std::unordered_map AmMapGateway; + typedef std::unordered_map AmMapConverter; + typedef std::unordered_map AmMapCrossfader; + typedef std::unordered_map AmMapConnection; + typedef std::unordered_map AmMapMainConnection; + typedef std::vector AmVectorSystemProperties; /** * The following structure groups the map objects needed for the implementation. * Every map object is coupled with an identifier, which hold the current value. @@ -332,46 +381,46 @@ public: * The IDs can be increased through the method increaseID(...), which follows the AudioManager logic. * For more information about the static and dynamic IDs, please see the documentation. */ - typedef struct CAmMappedData + struct AmMappedData { /** * The structure encapsulates the id boundary and the current id value. * It defines a range within the id can vary. */ - struct am_Identifier_s + struct AmIdentifier { int16_t mMin; //!< min possible value int16_t mMax; //!< max possible value int16_t mCurrentValue; //!< current value - am_Identifier_s():mMin(DYNAMIC_ID_BOUNDARY), mMax(SHRT_MAX), mCurrentValue(mMin){}; - am_Identifier_s(const int16_t & min, const int16_t & max):mMin(min), mMax(max), mCurrentValue(mMin){assert(min::const_iterator iter = t.begin(); for(; iter!=t.end(); iter++) - CAmMappedData::print(iter->second, output); + AmMappedData::print(iter->second, output); } private: - template bool getNextConnectionID(int16_t & resultID, am_Identifier_s & sourceID, + template bool getNextConnectionID(int16_t & resultID, AmIdentifier & sourceID, const std::unordered_map & map); - } CAmMappedData; + }; + /* * Helper methods. */ @@ -469,9 +519,9 @@ public: } ); } - CAmDatabaseObserver *mpDatabaseObserver; //!< pointer to the Observer ListConnectionFormat mListConnectionFormat; //!< list of connection formats - CAmMappedData mMappedData; //!< Internal structure encapsulating all the maps used in this class + AmMappedData mMappedData; //!< Internal structure encapsulating all the maps used in this class + std::vector mDatabaseObservers; #ifdef UNIT_TEST public: diff --git a/AudioManagerCore/include/CAmDatabaseObserver.h b/AudioManagerCore/include/CAmDatabaseObserver.h deleted file mode 100644 index 7d18be4..0000000 --- a/AudioManagerCore/include/CAmDatabaseObserver.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * SPDX license identifier: MPL-2.0 - * - * 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 Christian Linke, christian.linke@bmw.de BMW 2011,2012 - * - * \file CAmDatabaseObserver.h - * For further information see http://www.genivi.org/. - * - */ - -#ifndef DATABASEOBSERVER_H_ -#define DATABASEOBSERVER_H_ - -#include "audiomanagertypes.h" -#include -#include "CAmSerializer.h" - -namespace am -{ - -class CAmTelnetServer; -class CAmCommandSender; -class CAmRoutingSender; -class CAmSocketHandler; - -/** - * This class observes the Database and notifies other classes about important events, mainly the CommandSender. - */ -class CAmDatabaseObserver -{ -public: - CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler); - CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler, CAmTelnetServer *iTelnetServer); - ~CAmDatabaseObserver(); - void numberOfSinkClassesChanged(); - void numberOfSourceClassesChanged(); - void newSink(const am_Sink_s& sink); - 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); - void removedSink(const am_sinkID_t sinkID, const bool visible); - 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); - void mainSourceSoundPropertyChanged(const am_sourceID_t sourceID, const am_MainSoundProperty_s& SoundProperty); - void sinkAvailabilityChanged(const am_sinkID_t sinkID, const am_Availability_s& availability); - void sourceAvailabilityChanged(const am_sourceID_t sourceID, const am_Availability_s& availability); - void volumeChanged(const am_sinkID_t sinkID, const am_mainVolume_t volume); - void sinkMuteStateChanged(const am_sinkID_t sinkID, const am_MuteState_e muteState); - void systemPropertyChanged(const am_SystemProperty_s& SystemProperty); - void timingInformationChanged(const am_mainConnectionID_t mainConnection, const am_timeSync_t time); - void sinkUpdated(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible); - void sourceUpdated(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible); - void sinkMainNotificationConfigurationChanged(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); - void sourceMainNotificationConfigurationChanged(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); - -private: - CAmCommandSender *mCommandSender; //!< pointer to the comandSender - CAmRoutingSender* mRoutingSender; //!< pointer to the routingSender - CAmTelnetServer* mTelnetServer; //!< pointer to the telnetserver - CAmSerializer mSerializer; //!< serializer to handle the CommandInterface via the mainloop -}; - -} - -#endif /* DATABASEOBSERVER_H_ */ diff --git a/AudioManagerCore/include/CAmRouter.h b/AudioManagerCore/include/CAmRouter.h index 1242824..7543abc 100644 --- a/AudioManagerCore/include/CAmRouter.h +++ b/AudioManagerCore/include/CAmRouter.h @@ -31,7 +31,7 @@ #include #include "audiomanagertypes.h" #include "CAmGraph.h" -#include "IAmDatabaseHandler.h" +#include "CAmDatabaseHandlerMap.h" namespace am @@ -151,7 +151,7 @@ class CAmControlSender; /** * Implements an autorouting algorithm for connecting sinks and sources via different audio domains. */ -class CAmRouter +class CAmRouter: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { IAmDatabaseHandler* mpDatabaseHandler; //!< pointer to database handler CAmControlSender* mpControlSender; //!< pointer the controlsender - is used to retrieve information for the optimal route @@ -281,7 +281,7 @@ public: /** * Find the shortest path between given source and sink. This method should be called only after 'load' has been called. - * This method do not pay attention on the parameter mMaxAllowedCycles and go through all possible paths. + * This method do not pay attention on the parameter mMaxAllowedCycles and goes through all possible paths. * * @param source start point. * @param sink end point. diff --git a/AudioManagerCore/include/CAmRoutingSender.h b/AudioManagerCore/include/CAmRoutingSender.h index 8804d90..8d8a063 100644 --- a/AudioManagerCore/include/CAmRoutingSender.h +++ b/AudioManagerCore/include/CAmRoutingSender.h @@ -32,16 +32,17 @@ #include "../test/IAmRoutingBackdoor.h" #endif +#include "CAmDatabaseHandlerMap.h" + namespace am { class CAmRoutingReceiver; -class IAmDatabaseHandler; /** * Implements the RoutingSendInterface. Loads all plugins and dispatches calls to the plugins */ -class CAmRoutingSender +class CAmRoutingSender: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { public: CAmRoutingSender(const std::vector& listOfPluginDirectories, IAmDatabaseHandler* databaseHandler); diff --git a/AudioManagerCore/include/IAmDatabaseHandler.h b/AudioManagerCore/include/IAmDatabaseHandler.h index aa275db..f4fe8a1 100644 --- a/AudioManagerCore/include/IAmDatabaseHandler.h +++ b/AudioManagerCore/include/IAmDatabaseHandler.h @@ -30,18 +30,14 @@ #include #include #include +#include +#include +#include #include "audiomanagerconfig.h" namespace am { -class CAmDatabaseObserver; -class CAmRoutingTree; -class CAmRoutingTreeItem; - - -//enum { DYNAMIC_ID_BOUNDARY = 100 }; //!< the value below is reserved for staticIDs, the value above will be assigned to dynamically registered items - //todo: check the enum values before entering & changing in the database. //todo: change asserts for dynamic boundary checks into failure answers.# //todo: check autoincrement boundary and set to 16bit limits @@ -59,8 +55,12 @@ typedef std::map > ListConnectionFormat; //!< class IAmDatabaseHandler { public: - IAmDatabaseHandler () {}; - virtual ~IAmDatabaseHandler () {}; + IAmDatabaseHandler (){} + virtual ~IAmDatabaseHandler (){} + + /** + * The following interface methods must be implemented by the subclass. + */ virtual am_Error_e enterDomainDB(const am_Domain_s& domainData, am_domainID_t& domainID) = 0; virtual am_Error_e enterMainConnectionDB(const am_MainConnection_s& mainConnectionData, am_mainConnectionID_t& connectionID) = 0; virtual am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID) = 0; @@ -117,7 +117,7 @@ public: virtual am_Error_e getSourceVolume(const am_sourceID_t sourceID, am_volume_t& volume) const = 0; virtual am_Error_e getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_CustomSoundPropertyType_t propertyType, int16_t& value) const = 0; virtual am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_CustomSoundPropertyType_t propertyType, int16_t& value) const = 0; - virtual am_Error_e getListSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundproperties) const =0; + virtual am_Error_e getListSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundproperties) const =0; virtual am_Error_e getListSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSoundproperties) const =0; virtual am_Error_e getMainSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_CustomMainSoundPropertyType_t propertyType, int16_t& value) const = 0; virtual am_Error_e getMainSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_CustomMainSoundPropertyType_t propertyType, int16_t& value) const = 0; @@ -166,7 +166,6 @@ public: virtual am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& 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 existConnection(const am_Connection_s & connection) const = 0; @@ -181,7 +180,6 @@ public: virtual bool existGateway(const am_gatewayID_t gatewayID) const = 0; virtual bool existSinkClass(const am_sinkClass_t sinkClassID) const = 0; virtual bool existSourceClass(const am_sourceClass_t sourceClassID) const = 0; - 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; @@ -192,7 +190,19 @@ public: virtual am_Error_e enumerateSinks(std::function cb) const = 0 ; virtual am_Error_e enumerateGateways(std::function cb) const = 0 ; virtual am_Error_e enumerateConverters(std::function cb) const = 0 ; + /** + * Database observer protocol + */ + class IAmDatabaseObserver + { + public: + IAmDatabaseObserver() {} + virtual ~IAmDatabaseObserver(){} + }; + virtual bool registerObserver(IAmDatabaseObserver * iObserver) = 0; + virtual bool unregisterObserver(IAmDatabaseObserver * iObserver) = 0; + virtual unsigned countObservers() = 0; }; -- cgit v1.2.1