summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Koch <martin.koch@ese.de>2020-07-01 14:46:52 +0200
committerMartin Koch <martin.koch@ese.de>2020-07-01 14:46:52 +0200
commitefe087370361f5600e82243edfe4dcc64e0144b6 (patch)
treefebe1ad11f1af9d0d66c525a855192d85df9ca7e
parente592ea695ace7c5dc9dfac835c144b6b54ab8eb5 (diff)
downloadaudiomanager-efe087370361f5600e82243edfe4dcc64e0144b6.tar.gz
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 <martin.koch@ese.de>
-rw-r--r--AudioManagerCore/include/CAmDatabaseHandlerMap.h4
-rw-r--r--AudioManagerCore/include/IAmDatabaseHandler.h4
-rw-r--r--AudioManagerCore/src/CAmControlReceiver.cpp2
-rw-r--r--AudioManagerCore/src/CAmDatabaseHandlerMap.cpp16
-rw-r--r--AudioManagerCore/src/CAmRoutingReceiver.cpp16
-rw-r--r--AudioManagerCore/src/CAmRoutingSender.cpp2
6 files changed, 29 insertions, 15 deletions
diff --git a/AudioManagerCore/include/CAmDatabaseHandlerMap.h b/AudioManagerCore/include/CAmDatabaseHandlerMap.h
index a1ec6a3..7c3f17d 100644
--- a/AudioManagerCore/include/CAmDatabaseHandlerMap.h
+++ b/AudioManagerCore/include/CAmDatabaseHandlerMap.h
@@ -123,13 +123,13 @@ public:
};
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 enterMainConnectionDB(const am_MainConnection_s &mainConnectionData, am_mainConnectionID_t &connectionID, bool allowReserved = false) override;
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 enterConnectionDB(const am_Connection_s &connection, am_connectionID_t &connectionID, bool allowReserved = false) override;
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);
am_Error_e enterSystemProperties(const std::vector<am_SystemProperty_s> &listSystemProperties);
diff --git a/AudioManagerCore/include/IAmDatabaseHandler.h b/AudioManagerCore/include/IAmDatabaseHandler.h
index 495f4e6..281a93b 100644
--- a/AudioManagerCore/include/IAmDatabaseHandler.h
+++ b/AudioManagerCore/include/IAmDatabaseHandler.h
@@ -62,13 +62,13 @@ public:
* 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 enterMainConnectionDB(const am_MainConnection_s &mainConnectionData, am_mainConnectionID_t &connectionID, bool allowReserved) = 0;
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 enterConnectionDB(const am_Connection_s &connection, am_connectionID_t &connectionID, bool allowReserved) = 0;
virtual am_Error_e enterSinkClassDB(const am_SinkClass_s &sinkClass, am_sinkClass_t &sinkClassID) = 0;
virtual am_Error_e enterSourceClassDB(am_sourceClass_t &sourceClassID, const am_SourceClass_s &sourceClass) = 0;
virtual am_Error_e enterSystemProperties(const std::vector<am_SystemProperty_s> &listSystemProperties) = 0;
diff --git a/AudioManagerCore/src/CAmControlReceiver.cpp b/AudioManagerCore/src/CAmControlReceiver.cpp
index 6c2db01..7efee95 100644
--- a/AudioManagerCore/src/CAmControlReceiver.cpp
+++ b/AudioManagerCore/src/CAmControlReceiver.cpp
@@ -128,7 +128,7 @@ am_Error_e CAmControlReceiver::enterDomainDB(const am_Domain_s &domainData, am_d
am_Error_e CAmControlReceiver::enterMainConnectionDB(const am_MainConnection_s &mainConnectionData, am_mainConnectionID_t &connectionID)
{
- return (mDatabaseHandler->enterMainConnectionDB(mainConnectionData, connectionID));
+ return (mDatabaseHandler->enterMainConnectionDB(mainConnectionData, connectionID, false));
}
am_Error_e CAmControlReceiver::enterSinkDB(const am_Sink_s &sinkData, am_sinkID_t &sinkID)
diff --git a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp
index 95d7b1a..fc539bb 100644
--- a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp
+++ b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp
@@ -585,7 +585,7 @@ int16_t CAmDatabaseHandlerMap::calculateDelayForRoute(const std::vector<am_conne
return delay;
}
-am_Error_e CAmDatabaseHandlerMap::enterMainConnectionDB(const am_MainConnection_s &mainConnectionData, am_mainConnectionID_t &connectionID)
+am_Error_e CAmDatabaseHandlerMap::enterMainConnectionDB(const am_MainConnection_s &mainConnectionData, am_mainConnectionID_t &connectionID, bool allowReserved)
{
if (mainConnectionData.mainConnectionID != 0)
{
@@ -599,13 +599,15 @@ am_Error_e CAmDatabaseHandlerMap::enterMainConnectionDB(const am_MainConnection_
return (E_NOT_POSSIBLE);
}
- if (!existSink(mainConnectionData.sinkID))
+ auto itMappedSink = mMappedData.mSinkMap.find(mainConnectionData.sinkID);
+ if ((itMappedSink == mMappedData.mSinkMap.end()) || (itMappedSink->second.reserved && !allowReserved))
{
logError(__METHOD_NAME__, "sinkID must be valid!");
return (E_NOT_POSSIBLE);
}
- if (!existSource(mainConnectionData.sourceID))
+ auto itMappedSource = mMappedData.mSourceMap.find(mainConnectionData.sourceID);
+ if ((itMappedSource == mMappedData.mSourceMap.end()) || (itMappedSource->second.reserved && !allowReserved))
{
logError(__METHOD_NAME__, "sourceID must be valid!");
return (E_NOT_POSSIBLE);
@@ -1163,7 +1165,7 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s &sourceData, a
return (E_OK);
}
-am_Error_e CAmDatabaseHandlerMap::enterConnectionDB(const am_Connection_s &connection, am_connectionID_t &connectionID)
+am_Error_e CAmDatabaseHandlerMap::enterConnectionDB(const am_Connection_s &connection, am_connectionID_t &connectionID, bool allowReserved)
{
if (connection.connectionID != 0)
{
@@ -1171,13 +1173,15 @@ am_Error_e CAmDatabaseHandlerMap::enterConnectionDB(const am_Connection_s &conne
return (E_NOT_POSSIBLE);
}
- if (!existSink(connection.sinkID))
+ const AmMapSink::const_iterator &itMappedSink = mMappedData.mSinkMap.find(connection.sinkID);
+ if ((itMappedSink == mMappedData.mSinkMap.end()) || (itMappedSink->second.reserved && !allowReserved))
{
logError(__METHOD_NAME__, "sinkID must exist!");
return (E_NOT_POSSIBLE);
}
- if (!existSource(connection.sourceID))
+ const AmMapSource::const_iterator &itMappedSource = mMappedData.mSourceMap.find(connection.sourceID);
+ if ((itMappedSource == mMappedData.mSourceMap.end()) || (itMappedSource->second.reserved && !allowReserved))
{
logError(__METHOD_NAME__, "sourceID must exist!");
return (E_NOT_POSSIBLE);
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:
diff --git a/AudioManagerCore/src/CAmRoutingSender.cpp b/AudioManagerCore/src/CAmRoutingSender.cpp
index 64acd20..fc9f879 100644
--- a/AudioManagerCore/src/CAmRoutingSender.cpp
+++ b/AudioManagerCore/src/CAmRoutingSender.cpp
@@ -285,7 +285,7 @@ am_Error_e CAmRoutingSender::asyncConnect(am_Handle_s &handle, am_connectionID_t
tempConnection.connectionID = 0;
tempConnection.delay = -1;
- am_Error_e connError(mpDatabaseHandler->enterConnectionDB(tempConnection, connectionID));
+ am_Error_e connError(mpDatabaseHandler->enterConnectionDB(tempConnection, connectionID, false));
if (connError)
{
return(connError);