From efe1f88f36383ab1f1ad657e14e4fd4885eaf55f Mon Sep 17 00:00:00 2001 From: Martin Koch Date: Fri, 26 Jun 2020 12:21:50 +0200 Subject: AM: change handling or registerEarlyConnection - use type am_Route_s for announcement from routing side - register also main connection internally - forward route details to controller Signed-off-by: Martin Koch --- AudioManagerCore/include/CAmControlReceiver.h | 1 + AudioManagerCore/include/CAmControlSender.h | 2 +- AudioManagerCore/include/CAmRoutingReceiver.h | 2 +- AudioManagerCore/src/CAmControlReceiver.cpp | 5 ++++ AudioManagerCore/src/CAmControlSender.cpp | 4 +-- AudioManagerCore/src/CAmRoutingReceiver.cpp | 43 ++++++++++++++++++++------- include/IAmControl.h | 9 +++++- include/IAmRouting.h | 4 +-- 8 files changed, 52 insertions(+), 18 deletions(-) diff --git a/AudioManagerCore/include/CAmControlReceiver.h b/AudioManagerCore/include/CAmControlReceiver.h index a7cb394..73aac03 100644 --- a/AudioManagerCore/include/CAmControlReceiver.h +++ b/AudioManagerCore/include/CAmControlReceiver.h @@ -103,6 +103,7 @@ public: 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 getConnectionInfoDB(const am_connectionID_t connectionID, am_Connection_s &connectionData) 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 &listSinkID) const; am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector &listSourceID) const; diff --git a/AudioManagerCore/include/CAmControlSender.h b/AudioManagerCore/include/CAmControlSender.h index 494f7f3..f90116d 100644 --- a/AudioManagerCore/include/CAmControlSender.h +++ b/AudioManagerCore/include/CAmControlSender.h @@ -72,7 +72,7 @@ public: am_Error_e hookSystemRegisterCrossfader(const am_Crossfader_s &crossfaderData, am_crossfaderID_t &crossfaderID); am_Error_e hookSystemDeregisterCrossfader(const am_crossfaderID_t crossfaderID); am_Error_e hookSystemRegisterEarlyConnection(am_domainID_t domainID - , const am_MainConnection_s &mainConnectionData); + , const am_MainConnection_s &mainConnectionData, const am_Route_s &route); void hookSystemSinkVolumeTick(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume); void hookSystemSourceVolumeTick(const am_Handle_s handle, const am_sourceID_t sourceID, const am_volume_t volume); void hookSystemInterruptStateChange(const am_sourceID_t sourceID, const am_InterruptState_e interruptState); diff --git a/AudioManagerCore/include/CAmRoutingReceiver.h b/AudioManagerCore/include/CAmRoutingReceiver.h index 3f85ba7..fe12ccd 100644 --- a/AudioManagerCore/include/CAmRoutingReceiver.h +++ b/AudioManagerCore/include/CAmRoutingReceiver.h @@ -60,7 +60,7 @@ public: am_Error_e peekDomain(const std::string &name, am_domainID_t &domainID); 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 registerEarlyConnection(am_domainID_t domainID, const std::vector< am_Connection_s > &route + am_Error_e registerEarlyConnection(am_domainID_t domainID, const am_Route_s &route , am_ConnectionState_e state); 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); diff --git a/AudioManagerCore/src/CAmControlReceiver.cpp b/AudioManagerCore/src/CAmControlReceiver.cpp index bbd1116..737e659 100644 --- a/AudioManagerCore/src/CAmControlReceiver.cpp +++ b/AudioManagerCore/src/CAmControlReceiver.cpp @@ -291,6 +291,11 @@ am_Error_e CAmControlReceiver::getSourceInfoDB(const am_sourceID_t sourceID, am_ return (mDatabaseHandler->getSourceInfoDB(sourceID, sourceData)); } +am_Error_e CAmControlReceiver::getConnectionInfoDB(const am_connectionID_t connectionID, am_Connection_s &connectionData) const +{ + return (mDatabaseHandler->getConnectionInfoDB(connectionID, connectionData)); +} + am_Error_e CAmControlReceiver::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s &mainConnectionData) const { return (mDatabaseHandler->getMainConnectionInfoDB(mainConnectionID, mainConnectionData)); diff --git a/AudioManagerCore/src/CAmControlSender.cpp b/AudioManagerCore/src/CAmControlSender.cpp index 0d28dfb..6bd4f07 100644 --- a/AudioManagerCore/src/CAmControlSender.cpp +++ b/AudioManagerCore/src/CAmControlSender.cpp @@ -320,10 +320,10 @@ am_Error_e CAmControlSender::hookSystemDeregisterCrossfader(const am_crossfaderI } am_Error_e CAmControlSender::hookSystemRegisterEarlyConnection(am_domainID_t domainID - , const am_MainConnection_s &mainConnectionData) + , const am_MainConnection_s &mainConnectionData, const am_Route_s &route) { assert(mController); - return mController->hookSystemRegisterEarlyMainConnection(domainID, mainConnectionData); + return mController->hookSystemRegisterEarlyMainConnection(domainID, mainConnectionData, route); } void CAmControlSender::hookSystemSinkVolumeTick(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume) diff --git a/AudioManagerCore/src/CAmRoutingReceiver.cpp b/AudioManagerCore/src/CAmRoutingReceiver.cpp index 8f4d1ba..29aea65 100644 --- a/AudioManagerCore/src/CAmRoutingReceiver.cpp +++ b/AudioManagerCore/src/CAmRoutingReceiver.cpp @@ -247,37 +247,58 @@ am_Error_e CAmRoutingReceiver::deregisterDomain(const am_domainID_t domainID) } am_Error_e CAmRoutingReceiver::registerEarlyConnection(am_domainID_t domainID - , const std::vector< am_Connection_s > &route, am_ConnectionState_e state) + , const am_Route_s &route, am_ConnectionState_e state) { - if (route.size() < 1) + const auto &segmentList = route.route; + if (segmentList.size() < 1) { - logWarning(__METHOD_NAME__, "route empty"); + logError(__METHOD_NAME__, "empty route from domain", domainID); return E_NOT_POSSIBLE; } am_MainConnection_s mainConnectionData; - mainConnectionData.sourceID = route.front().sourceID; - mainConnectionData.sinkID = route.back().sinkID; + mainConnectionData.sourceID = segmentList.front().sourceID; + mainConnectionData.sinkID = segmentList.back().sinkID; mainConnectionData.connectionState = state; - mainConnectionData.listConnectionID.reserve(route.size()); - for (auto & conn : route) + mainConnectionData.listConnectionID.reserve(segmentList.size()); + for (const auto &segment : segmentList) { - am_connectionID_t connectionID; - am_Error_e success = mpDatabaseHandler->enterConnectionDB(conn, connectionID); + am_Connection_s conn; + conn.sourceID = segment.sourceID; + conn.sinkID = segment.sinkID; + conn.connectionFormat = segment.connectionFormat; + conn.connectionID = 0; + am_Error_e success = mpDatabaseHandler->enterConnectionDB(conn, conn.connectionID); switch (success) { case E_OK: case E_ALREADY_EXISTS: case E_NO_CHANGE: - mainConnectionData.listConnectionID.push_back(connectionID); + mainConnectionData.listConnectionID.push_back(conn.connectionID); break; default: + logError(__METHOD_NAME__, "failed to enter connection segment", conn.sourceID + , "to", conn.sinkID, "from domain", domainID, "error=", success); return success; } } - return mpControlSender->hookSystemRegisterEarlyConnection(domainID, mainConnectionData); + am_Error_e success = mpDatabaseHandler->enterMainConnectionDB(mainConnectionData, mainConnectionData.mainConnectionID); + switch (success) + { + case E_OK: + case E_ALREADY_EXISTS: + case E_NO_CHANGE: + break; + + default: + logError(__METHOD_NAME__, "failed to enter main connection", mainConnectionData.sourceID + , "to", mainConnectionData.sinkID, "from domain", domainID, "error=", success); + return success; + } + + return mpControlSender->hookSystemRegisterEarlyConnection(domainID, mainConnectionData, route); } am_Error_e CAmRoutingReceiver::registerGateway(const am_Gateway_s &gatewayData, am_gatewayID_t &gatewayID) diff --git a/include/IAmControl.h b/include/IAmControl.h index d393b56..e3fe74c 100644 --- a/include/IAmControl.h +++ b/include/IAmControl.h @@ -438,6 +438,12 @@ public: * crossfader was not found */ virtual am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const =0; + /** + * returns details of a connection, including involved sources and sinks + * @return E_OK on success, E_DATABASE_ERROR on error, E_NON_EXISTENT if + * crossfader was not found + */ + virtual am_Error_e getConnectionInfoDB(const am_connectionID_t connectionID, am_Connection_s& connectionData) const =0; /** * returns sources and the sink of a crossfader * @return E_OK on success, E_DATABASE_ERROR on error, E_NON_EXISTENT if @@ -882,6 +888,7 @@ public: * * @param domainID: home domain announcing this early connection * @param mainConnectionData: details of main connection + * @param route: route details as requested from routing side * * @return success indicator. Controller should use E_OK on success, * E_ALREADY_EXISTS or E_NO_CHANGE if given connection is already registered, @@ -889,7 +896,7 @@ public: * E_NOT_POSSIBLE if feature is not supported by the controller */ virtual am_Error_e hookSystemRegisterEarlyMainConnection(am_domainID_t domainID - , const am_MainConnection_s &mainConnectionData) + , const am_MainConnection_s &mainConnectionData, const am_Route_s &route) { return E_NOT_POSSIBLE; // empty default implementation } diff --git a/include/IAmRouting.h b/include/IAmRouting.h index c58c721..b86e782 100644 --- a/include/IAmRouting.h +++ b/include/IAmRouting.h @@ -144,7 +144,7 @@ public: * Support announcement of audio connections already active at AM startup * * @param domainID: home domain announcing this early connection - * @param route: list of sub-connections (populated with unspecified connectionID=0 field) + * @param route: list of connection segments * @param state: either stable CS_CONNECTED, CS_DISCONNECTED, CS_SUSPENDED * or transient CS_CONNECTING, CS_DISCONNECTING * @@ -154,7 +154,7 @@ public: * CS_CONNECTING or CS_DISCONNECTING, a secondary registerEarlyConnection() * call is expected once a stable state is reached */ - virtual am_Error_e registerEarlyConnection(am_domainID_t domainID, const std::vector< am_Connection_s > &route + virtual am_Error_e registerEarlyConnection(am_domainID_t domainID, const am_Route_s &route , am_ConnectionState_e state) = 0; /** -- cgit v1.2.1