From 066c3f7f16ef69e80376942e8d6b8c4944b8ed08 Mon Sep 17 00:00:00 2001 From: Martin Koch Date: Fri, 19 Jun 2020 16:01:19 +0200 Subject: Add support for announcement and handling of pre-established audio connections through routing side As the complete initialization of the cockpit system takes some time, a few use-cases exist where information needs to be audible (or visible) right before the system is fully started. Here we mainly have: - system alerts + door open + seat belt missing + engine faults - parking assistant warnings + rear view camera screen + beeps if distance goes below limit Both routing- and control-side are extended to allow notifying about such connections Signed-off-by: Martin Koch --- AudioManagerCore/src/CAmRoutingReceiver.cpp | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'AudioManagerCore/src/CAmRoutingReceiver.cpp') diff --git a/AudioManagerCore/src/CAmRoutingReceiver.cpp b/AudioManagerCore/src/CAmRoutingReceiver.cpp index be13474..8f4d1ba 100644 --- a/AudioManagerCore/src/CAmRoutingReceiver.cpp +++ b/AudioManagerCore/src/CAmRoutingReceiver.cpp @@ -124,6 +124,19 @@ void CAmRoutingReceiver::ackDisconnect(const am_Handle_s handle, const am_connec mpControlSender->cbAckDisconnect(handle, error); } +/** + * Support hand-over acknowledgment of connections surviving shutdown of the AM + * + * @param handle: composite identifier used in the request + * @param errorID:success indicator (E_OK if application takes over, + * E_NOT_POSSIBLE if the routing adapter is not prepared to take over + * full responsibility for all involved sources and sinks) + */ +void CAmRoutingReceiver::ackTransferConnection(const am_Handle_s handle, const am_Error_e errorID) +{ + +} + void CAmRoutingReceiver::ackSetSinkVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error) { logInfo(__METHOD_NAME__, "handle=", handle, "volume=", volume, "error=", error); @@ -233,6 +246,40 @@ am_Error_e CAmRoutingReceiver::deregisterDomain(const am_domainID_t domainID) return (mpControlSender->hookSystemDeregisterDomain(domainID)); } +am_Error_e CAmRoutingReceiver::registerEarlyConnection(am_domainID_t domainID + , const std::vector< am_Connection_s > &route, am_ConnectionState_e state) +{ + if (route.size() < 1) + { + logWarning(__METHOD_NAME__, "route empty"); + return E_NOT_POSSIBLE; + } + + am_MainConnection_s mainConnectionData; + mainConnectionData.sourceID = route.front().sourceID; + mainConnectionData.sinkID = route.back().sinkID; + mainConnectionData.connectionState = state; + mainConnectionData.listConnectionID.reserve(route.size()); + for (auto & conn : route) + { + am_connectionID_t connectionID; + am_Error_e success = mpDatabaseHandler->enterConnectionDB(conn, connectionID); + switch (success) + { + case E_OK: + case E_ALREADY_EXISTS: + case E_NO_CHANGE: + mainConnectionData.listConnectionID.push_back(connectionID); + break; + + default: + return success; + } + } + + return mpControlSender->hookSystemRegisterEarlyConnection(domainID, mainConnectionData); +} + am_Error_e CAmRoutingReceiver::registerGateway(const am_Gateway_s &gatewayData, am_gatewayID_t &gatewayID) { return (mpControlSender->hookSystemRegisterGateway(gatewayData, gatewayID)); -- cgit v1.2.1 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/src/CAmRoutingReceiver.cpp | 43 +++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'AudioManagerCore/src/CAmRoutingReceiver.cpp') 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) -- cgit v1.2.1 From efe087370361f5600e82243edfe4dcc64e0144b6 Mon Sep 17 00:00:00 2001 From: Martin Koch Date: Wed, 1 Jul 2020 14:46:52 +0200 Subject: AMCore: correct behavior regarding registration of early connections - modify enterConnectionDB() and enterMainConnectionDB() to accept also connections using reserved (peeked-only) sources and/or sinks Signed-off-by: Martin Koch --- AudioManagerCore/src/CAmRoutingReceiver.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'AudioManagerCore/src/CAmRoutingReceiver.cpp') diff --git a/AudioManagerCore/src/CAmRoutingReceiver.cpp b/AudioManagerCore/src/CAmRoutingReceiver.cpp index 29aea65..56fb5e2 100644 --- a/AudioManagerCore/src/CAmRoutingReceiver.cpp +++ b/AudioManagerCore/src/CAmRoutingReceiver.cpp @@ -132,9 +132,18 @@ void CAmRoutingReceiver::ackDisconnect(const am_Handle_s handle, const am_connec * E_NOT_POSSIBLE if the routing adapter is not prepared to take over * full responsibility for all involved sources and sinks) */ -void CAmRoutingReceiver::ackTransferConnection(const am_Handle_s handle, const am_Error_e errorID) +void CAmRoutingReceiver::ackTransferConnection(const am_Handle_s handle, const am_Error_e error) { + if (error == E_OK) + { + mpRoutingSender->writeToDatabaseAndRemove(handle); + } + else + { + mpRoutingSender->removeHandle(handle); + } + mpControlSender->cbAckTransferConnection(handle, error); } void CAmRoutingReceiver::ackSetSinkVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error) @@ -257,6 +266,7 @@ am_Error_e CAmRoutingReceiver::registerEarlyConnection(am_domainID_t domainID } am_MainConnection_s mainConnectionData; + mainConnectionData.mainConnectionID = 0; mainConnectionData.sourceID = segmentList.front().sourceID; mainConnectionData.sinkID = segmentList.back().sinkID; mainConnectionData.connectionState = state; @@ -268,7 +278,7 @@ am_Error_e CAmRoutingReceiver::registerEarlyConnection(am_domainID_t domainID conn.sinkID = segment.sinkID; conn.connectionFormat = segment.connectionFormat; conn.connectionID = 0; - am_Error_e success = mpDatabaseHandler->enterConnectionDB(conn, conn.connectionID); + am_Error_e success = mpDatabaseHandler->enterConnectionDB(conn, conn.connectionID, true); switch (success) { case E_OK: @@ -284,7 +294,7 @@ am_Error_e CAmRoutingReceiver::registerEarlyConnection(am_domainID_t domainID } } - am_Error_e success = mpDatabaseHandler->enterMainConnectionDB(mainConnectionData, mainConnectionData.mainConnectionID); + am_Error_e success = mpDatabaseHandler->enterMainConnectionDB(mainConnectionData, mainConnectionData.mainConnectionID, true); switch (success) { case E_OK: -- cgit v1.2.1