From b3075389aa61c019fdb5d904abab84532f178250 Mon Sep 17 00:00:00 2001 From: Jens Lorenz Date: Tue, 14 Mar 2017 08:57:55 +0100 Subject: AMCore: Fix parameter names of increaseID & getNextConnectionID The functions are used in a generic way which should be covered by the parameter names. Signed-off-by: Jens Lorenz --- AudioManagerCore/include/CAmDatabaseHandlerMap.h | 9 ++++--- AudioManagerCore/src/CAmDatabaseHandlerMap.cpp | 30 ++++++++++++------------ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/AudioManagerCore/include/CAmDatabaseHandlerMap.h b/AudioManagerCore/include/CAmDatabaseHandlerMap.h index 3909b05..3686027 100644 --- a/AudioManagerCore/include/CAmDatabaseHandlerMap.h +++ b/AudioManagerCore/include/CAmDatabaseHandlerMap.h @@ -442,13 +442,12 @@ private: * A common method implementing the logic for static and dynamic IDs except main connection ID. * * @param resultID Pointer to an output variable. - * @param sourceID Pointer to ID, which will be manipulated. + * @param elementID Pointer to ID, which will be manipulated. * @param desiredStaticID Not 0 for static IDs and 0 for dynamic IDs. - * Usually the static IDs are in interval [1 , DYNAMIC_ID_BOUNDARY]. Default is 0. - * @param preferedStaticIDBoundary A limit for a given dynamic ID. Default is DYNAMIC_ID_BOUNDARY. + * Usually the static IDs are in interval [1 , DYNAMIC_ID_BOUNDARY-1]. Default is 0. * @return TRUE on successfully changed ID. */ - bool increaseID(int16_t & resultID, AmIdentifier & sourceID, int16_t const desiredStaticID); + bool increaseID(int16_t & resultID, AmIdentifier & elementID, int16_t const desiredStaticID); /** * \brief Increases the main connection ID. * @@ -478,7 +477,7 @@ private: AmMappedData::print(iter->second, output); } private: - template bool getNextConnectionID(int16_t & resultID, AmIdentifier & sourceID, + template bool getNextConnectionID(int16_t & resultID, AmIdentifier & connID, const std::unordered_map & map); }; diff --git a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp index 83419b9..d398a1e 100644 --- a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp +++ b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp @@ -384,17 +384,17 @@ void CAmDatabaseHandlerMap::AmCrossfader::getDescription (std::string & outStrin outString = fmt.str(); } -bool CAmDatabaseHandlerMap::AmMappedData::increaseID(int16_t & resultID, AmIdentifier & sourceID, +bool CAmDatabaseHandlerMap::AmMappedData::increaseID(int16_t & resultID, AmIdentifier & elementID, int16_t const desiredStaticID = 0) { - if( desiredStaticID > 0 && desiredStaticID < sourceID.mMin ) + if( desiredStaticID > 0 && desiredStaticID < elementID.mMin ) { resultID = desiredStaticID; return true; } - else if( sourceID.mCurrentValue < sourceID.mMax ) //The last used value is 'limit' - 1. e.g. SHRT_MAX - 1, SHRT_MAX is reserved. + else if( elementID.mCurrentValue < elementID.mMax ) //The last used value is 'limit' - 1. e.g. SHRT_MAX - 1, SHRT_MAX is reserved. { - resultID = sourceID.mCurrentValue++; + resultID = elementID.mCurrentValue++; return true; } else @@ -402,31 +402,31 @@ bool CAmDatabaseHandlerMap::AmMappedData::increaseID(int16_t & resultID, AmIdent resultID = -1; return false; } - } +} -template bool CAmDatabaseHandlerMap::AmMappedData::getNextConnectionID(int16_t & resultID, AmIdentifier & sourceID, +template bool CAmDatabaseHandlerMap::AmMappedData::getNextConnectionID(int16_t & resultID, AmIdentifier & connID, const std::unordered_map & map) { TMapKey nextID; - int16_t const lastID = sourceID.mCurrentValue; - if( sourceID.mCurrentValue < sourceID.mMax ) - nextID = sourceID.mCurrentValue++; + int16_t const lastID = connID.mCurrentValue; + if( connID.mCurrentValue < connID.mMax ) + nextID = connID.mCurrentValue++; else - nextID = sourceID.mCurrentValue = sourceID.mMin; + nextID = connID.mCurrentValue = connID.mMin; bool notFreeIDs = false; while( existsObjectWithKeyInMap(nextID, map) ) { - if( sourceID.mCurrentValue < sourceID.mMax ) - nextID = sourceID.mCurrentValue++; + if( connID.mCurrentValue < connID.mMax ) + nextID = connID.mCurrentValue++; else { - sourceID.mCurrentValue = sourceID.mMin; - nextID = sourceID.mCurrentValue++; + connID.mCurrentValue = connID.mMin; + nextID = connID.mCurrentValue; } - if( sourceID.mCurrentValue == lastID ) + if( connID.mCurrentValue == lastID ) { notFreeIDs = true; break; -- cgit v1.2.1 From 698bf42333c7f75873c455cc1321ee722b2771b2 Mon Sep 17 00:00:00 2001 From: Jens Lorenz Date: Tue, 14 Mar 2017 08:58:49 +0100 Subject: AMCore: Start dynamic resources range from DYNAMIC_ID_BOUNDARY Currently the DYNAMIC_ID_BOUNDARY value is not part of static nor dynamic section. Every element like a source which is registered with this value is not addressable. Signed-off-by: Jens Lorenz --- AudioManagerCore/src/CAmDatabaseHandlerMap.cpp | 14 +++++++------- CMakeLists.txt | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp index d398a1e..2427630 100644 --- a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp +++ b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp @@ -639,7 +639,7 @@ bool CAmDatabaseHandlerMap::insertSinkDB(const am_Sink_s & sinkData, am_sinkID_t am_Error_e CAmDatabaseHandlerMap::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) { - if(sinkData.sinkID>DYNAMIC_ID_BOUNDARY) + if(sinkData.sinkID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"sinkID must be below:",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -734,7 +734,7 @@ bool CAmDatabaseHandlerMap::insertCrossfaderDB(const am_Crossfader_s & crossfade am_Error_e CAmDatabaseHandlerMap::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) { - if(crossfaderData.crossfaderID>DYNAMIC_ID_BOUNDARY) + if(crossfaderData.crossfaderID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"crossfaderID must be below:",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -822,7 +822,7 @@ bool CAmDatabaseHandlerMap::insertGatewayDB(const am_Gateway_s & gatewayData, am am_Error_e CAmDatabaseHandlerMap::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) { - if(gatewayData.gatewayID>DYNAMIC_ID_BOUNDARY) + if(gatewayData.gatewayID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"gatewayID must be below:",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -896,7 +896,7 @@ bool CAmDatabaseHandlerMap::insertConverterDB(const am_Converter_s & converteDat am_Error_e CAmDatabaseHandlerMap::enterConverterDB(const am_Converter_s & converterData, am_converterID_t & converterID) { - if(converterData.converterID>DYNAMIC_ID_BOUNDARY) + if(converterData.converterID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"converterID must be below:",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -1003,7 +1003,7 @@ bool CAmDatabaseHandlerMap::insertSourceDB(const am_Source_s & sourceData, am_so am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) { - if(sourceData.sourceID>DYNAMIC_ID_BOUNDARY) + if(sourceData.sourceID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"sourceID must be below:",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -1136,7 +1136,7 @@ bool CAmDatabaseHandlerMap::insertSinkClassDB(const am_SinkClass_s & sinkClass, am_Error_e CAmDatabaseHandlerMap::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) { - if(sinkClass.sinkClassID>DYNAMIC_ID_BOUNDARY) + if(sinkClass.sinkClassID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"sinkClassID must be <",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); @@ -1200,7 +1200,7 @@ bool CAmDatabaseHandlerMap::insertSourceClassDB(am_sourceClass_t & sourceClassID am_Error_e CAmDatabaseHandlerMap::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) { - if(sourceClass.sourceClassID>DYNAMIC_ID_BOUNDARY) + if(sourceClass.sourceClassID>=DYNAMIC_ID_BOUNDARY) { logError(__METHOD_NAME__,"sourceClassID must be <",DYNAMIC_ID_BOUNDARY); return (E_NOT_POSSIBLE); diff --git a/CMakeLists.txt b/CMakeLists.txt index 4655a23..33433ee 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,8 +67,8 @@ set(DBUS_SERVICE_PREFIX "org.genivi.audiomanager" set(DBUS_SERVICE_OBJECT_PATH "/org/genivi/audiomanager" CACHE PROPERTY "The service object path of the AM - only changable for legacy dbus") -set(DYNAMIC_ID_BOUNDARY 100 - CACHE INTEGER "The ID boundary between static and dynamic ID ranges") +set(DYNAMIC_ID_BOUNDARY 101 + CACHE INTEGER "The ID boundary defines the starting point of the dynamic ID range") set(LIB_INSTALL_SUFFIX "audiomanager" CACHE STRINGS "The suffix used for installation of the plugins") -- cgit v1.2.1 From b0196808d2164d282c434b92fe5db34078f1a80e Mon Sep 17 00:00:00 2001 From: Jens Lorenz Date: Mon, 20 Mar 2017 20:23:02 +0100 Subject: AMCore: Fix connection state notification on remove connection The CS_DISCONNECTED was notified even in case WITH_DATABASE_CHANGE_CHECK flag was activated and the main connection was already disconnected by controller. Signed-off-by: Jens Lorenz --- AudioManagerCore/src/CAmDatabaseHandlerMap.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp index 2427630..48ef37b 100644 --- a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp +++ b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp @@ -55,6 +55,7 @@ (true) #endif + #define NOTIFY_OBSERVERS(CALL)\ for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ if(nextObserver->CALL)\ @@ -1505,12 +1506,14 @@ am_Error_e CAmDatabaseHandlerMap::removeMainConnectionDB(const am_mainConnection return (E_NON_EXISTENT); } - mMappedData.mMainConnectionMap.erase(mainConnectionID); + DB_COND_UPDATE_INIT; + DB_COND_UPDATE(mMappedData.mMainConnectionMap[mainConnectionID].mainConnectionID, CS_DISCONNECTED); + if (DB_COND_ISMODIFIED) + NOTIFY_OBSERVERS2(dboMainConnectionStateChanged, mainConnectionID, CS_DISCONNECTED) + mMappedData.mMainConnectionMap.erase(mainConnectionID); logVerbose("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); - - NOTIFY_OBSERVERS2(dboMainConnectionStateChanged, mainConnectionID, CS_DISCONNECTED) - NOTIFY_OBSERVERS1(dboRemovedMainConnection, mainConnectionID) + NOTIFY_OBSERVERS1(dboRemovedMainConnection, mainConnectionID) return (E_OK); } -- cgit v1.2.1 From 3bd66bf4c57c03c2004a8f60234cd60f791c81b9 Mon Sep 17 00:00:00 2001 From: Jens Lorenz Date: Tue, 11 Apr 2017 21:52:38 +0200 Subject: AMUtil: Only add active DBus watch FDs to socket handler Signed-off-by: Jens Lorenz --- AudioManagerUtilities/src/CAmDbusWrapper.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/AudioManagerUtilities/src/CAmDbusWrapper.cpp b/AudioManagerUtilities/src/CAmDbusWrapper.cpp index b87d3a5..1f1d5a6 100644 --- a/AudioManagerUtilities/src/CAmDbusWrapper.cpp +++ b/AudioManagerUtilities/src/CAmDbusWrapper.cpp @@ -293,18 +293,18 @@ dbus_bool_t CAmDbusWrapper::addWatchDelegate(DBusWatch * watch, void* userData) event |= POLLIN; if (flags & DBUS_WATCH_WRITABLE) event |= POLLOUT; - } - logInfo("DBusWrapper::addWatchDelegate entered new watch, fd=", dbus_watch_get_unix_fd(watch), "event flag=", event); - am_Error_e error = mpSocketHandler->addFDPoll(dbus_watch_get_unix_fd(watch), event, &pDbusPrepareCallback, &pDbusFireCallback, &pDbusCheckCallback, &pDbusDispatchCallback, watch, handle); + logInfo("DBusWrapper::addWatchDelegate entered new watch, fd=", dbus_watch_get_unix_fd(watch), "event flag=", event); + am_Error_e error = mpSocketHandler->addFDPoll(dbus_watch_get_unix_fd(watch), event, &pDbusPrepareCallback, &pDbusFireCallback, &pDbusCheckCallback, &pDbusDispatchCallback, watch, handle); - //if everything is alright, add the watch and the handle to our map so we know this relationship - if (error == E_OK && handle != 0) - { - mMapHandleWatch.insert(std::make_pair(watch, handle)); - return (true); + //if everything is alright, add the watch and the handle to our map so we know this relationship + if (error == E_OK && handle != 0) + { + mMapHandleWatch.insert(std::make_pair(watch, handle)); + return (true); + } + logError("DBusWrapper::addWatchDelegate entering watch failed"); } - logError("DBusWrapper::addWatchDelegate entering watch failed"); return (true); } -- cgit v1.2.1 From cfe230db3654094c4c098eea2736c71dd97396d0 Mon Sep 17 00:00:00 2001 From: Jens Lorenz Date: Tue, 11 Apr 2017 22:13:32 +0200 Subject: AMUtil: Fix nullptr exception in DLT singleton Application might use libraries which are using CAmDltWrapper class. The singleton implementation requires an instanctiateOnce() initialization but if the application is not aware of this AudioManager utility a nullptr exception occurs on standard instance() calls. instance() checks now if the singleton exists and initializes the singleton and registers a fallback application towards DLT on demand. Signed-off-by: Jens Lorenz --- AudioManagerUtilities/src/CAmDltWrapper.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/AudioManagerUtilities/src/CAmDltWrapper.cpp b/AudioManagerUtilities/src/CAmDltWrapper.cpp index dc594af..37a5ff0 100644 --- a/AudioManagerUtilities/src/CAmDltWrapper.cpp +++ b/AudioManagerUtilities/src/CAmDltWrapper.cpp @@ -157,6 +157,15 @@ CAmDltWrapper* CAmDltWrapper::instanctiateOnce(const char *appid, const char * d CAmDltWrapper* CAmDltWrapper::instance() { + if (!mpDLTWrapper) + { + // an application seems not to use our CAmDltWrapper class therefore create default + std::ostringstream description; + description << "PID=" << getpid() << " _=" << getenv("_"); + mpDLTWrapper = new CAmDltWrapper("AMDL", description.str().c_str()); + std::cerr << "Application doesn't call CAmDltWrapper::instanciateOnce!!!" << std::endl; + std::cerr << "-> CAmDltWrapper::instance registers DLT application [ AMDL | " << description.str() << " ]" << std::endl; + } return mpDLTWrapper; } -- cgit v1.2.1