2 * Copyright (C) 2011, BMW AG
4 * GeniviAudioMananger AudioManagerDaemon
6 * \file ControlReceiver.cpp
8 * \date 20-Oct-2011 3:42:04 PM
9 * \author Christian Mueller (christian.ei.mueller@bmw.de)
12 * GNU Lesser General Public License, version 2.1, with special exception (GENIVI clause)
13 * Copyright (C) 2011, BMW AG Christian Mueller Christian.ei.mueller@bmw.de
15 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License, version 2.1, as published by the Free Software Foundation.
16 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License, version 2.1, for more details.
17 * You should have received a copy of the GNU Lesser General Public License, version 2.1, along with this program; if not, see <http://www.gnu.org/licenses/lgpl-2.1.html>.
18 * Note that the copyright holders assume that the GNU Lesser General Public License, version 2.1, may also be applicable to programs even in cases in which the program is not a library in the technical sense.
19 * Linking AudioManager statically or dynamically with other modules is making a combined work based on AudioManager. You may license such other modules under the GNU Lesser General Public License, version 2.1. If you do not want to license your linked modules under the GNU Lesser General Public License, version 2.1, you may use the program under the following exception.
20 * As a special exception, the copyright holders of AudioManager give you permission to combine AudioManager with software programs or libraries that are released under any license unless such a combination is not permitted by the license of such a software program or library. You may copy and distribute such a system following the terms of the GNU Lesser General Public License, version 2.1, including this special exception, for AudioManager and the licenses of the other code concerned.
21 * Note that people who make modified versions of AudioManager are not obligated to grant this special exception for their modified versions; it is their choice whether to do so. The GNU Lesser General Public License, version 2.1, gives permission to release a modified version without this exception; this exception also makes it possible to release a modified version which carries forward this exception.
25 #include "ControlReceiver.h"
29 DLT_IMPORT_CONTEXT(DLT_CONTEXT)
33 ControlReceiver::ControlReceiver(DatabaseHandler *iDatabaseHandler, RoutingSender *iRoutingSender, CommandSender *iCommandSender)
34 : mDatabaseHandler(iDatabaseHandler),
35 mRoutingSender(iRoutingSender),
36 mCommandSender(iCommandSender)
38 assert(mDatabaseHandler!=NULL);
39 assert(mRoutingSender!=NULL);
40 assert(mCommandSender!=NULL);
43 ControlReceiver::~ControlReceiver()
47 am_Error_e ControlReceiver::getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s> & returnList)
49 //todo: implement routing algorithm
55 am_Error_e ControlReceiver::connect(am_Handle_s & handle, am_connectionID_t & connectionID, const am_ConnectionFormat_e format, const am_sourceID_t sourceID, const am_sinkID_t sinkID)
57 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::connect got called, connectionFormat"),DLT_INT(format),DLT_STRING("sourceID"),DLT_INT(sourceID),DLT_STRING("sinkID"),DLT_INT(sinkID));
59 am_Connection_s tempConnection;
60 tempConnection.sinkID=sinkID;
61 tempConnection.sourceID=sourceID;
62 tempConnection.connectionFormat=format;
63 tempConnection.connectionID=0;
65 //todo: enter function to find out what happends if the same connection is in the course of being build up.
66 if (mDatabaseHandler->existConnection(tempConnection)) return E_ALREADY_EXISTS; //todo:enter the correct connectionID here?
68 mDatabaseHandler->enterConnectionDB(tempConnection,connectionID);
69 return mRoutingSender->asyncConnect(handle,connectionID,sourceID,sinkID,format);
74 am_Error_e ControlReceiver::disconnect(am_Handle_s & handle, const am_connectionID_t connectionID)
76 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::disconnect got called, connectionID="),DLT_INT(connectionID));
78 if (!mDatabaseHandler->existConnectionID(connectionID)) return E_NON_EXISTENT; //todo: check with EA model and correct
79 return mRoutingSender->asyncDisconnect(handle,connectionID);
84 am_Error_e ControlReceiver::crossfade(am_Handle_s & handle, const am_HotSink_e hotSource, const am_crossfaderID_t crossfaderID, const am_RampType_e rampType, const am_time_t rampTime)
86 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::crossfade got called, hotSource="),DLT_INT(hotSource),DLT_STRING("crossfaderID="),DLT_INT(crossfaderID),DLT_STRING("rampType="),DLT_INT(rampType),DLT_STRING("rampTime="),DLT_INT(rampTime));
88 if (!mDatabaseHandler->existcrossFader(crossfaderID)) return E_NON_EXISTENT;
89 return mRoutingSender->asyncCrossFade(handle,crossfaderID,hotSource,rampType,rampTime);
94 am_Error_e ControlReceiver::setSourceState(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SourceState_e state)
96 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSourceState got called, sourceID="),DLT_INT(sourceID),DLT_STRING("state="),DLT_INT(state));
98 am_SourceState_e sourceState;
99 if(mDatabaseHandler->getSoureState(sourceID,sourceState)!=E_OK) return E_UNKNOWN;
100 if(sourceState==state) return E_NO_CHANGE;
101 return mRoutingSender->asyncSetSourceState(handle,sourceID,state);
106 am_Error_e ControlReceiver::setSinkVolume(am_Handle_s & handle, const am_sinkID_t sinkID, const am_volume_t volume, const am_RampType_e ramp, const am_time_t time)
108 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSinkVolume got called, sinkID="),DLT_INT(sinkID),DLT_STRING("volume="),DLT_INT(volume),DLT_STRING("ramp="),DLT_INT(ramp),DLT_STRING("time="),DLT_INT(time));
110 am_volume_t tempVolume;
111 if(mDatabaseHandler->getSinkVolume(sinkID,tempVolume)!=E_OK) return E_UNKNOWN;
112 if(tempVolume==volume) return E_NO_CHANGE;
113 return mRoutingSender->asyncSetSinkVolume(handle,sinkID,volume,ramp,time);
118 am_Error_e ControlReceiver::setSourceVolume(am_Handle_s & handle, const am_sourceID_t sourceID, const am_volume_t volume, const am_RampType_e rampType, const am_time_t time)
120 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSourceVolume got called, sourceID="),DLT_INT(sourceID),DLT_STRING("volume="),DLT_INT(volume),DLT_STRING("ramp="),DLT_INT(rampType),DLT_STRING("time="),DLT_INT(time));
122 am_volume_t tempVolume;
123 if(mDatabaseHandler->getSourceVolume(sourceID,tempVolume)!=E_OK) return E_UNKNOWN;
124 if(tempVolume==volume) return E_NO_CHANGE;
125 return mRoutingSender->asyncSetSourceVolume(handle,sourceID,volume,rampType,time);
130 am_Error_e ControlReceiver::setSinkSoundProperty(am_Handle_s & handle, const am_sinkID_t sinkID, const am_SoundProperty_s & soundProperty)
132 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSinkSoundProperty got called, sinkID="),DLT_INT(sinkID),DLT_STRING("soundProperty.Type="),DLT_INT(soundProperty.type),DLT_STRING("soundProperty.value="),DLT_INT(soundProperty.value));
135 if(mDatabaseHandler->getSinkSoundPropertyValue(sinkID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
136 if(value==soundProperty.value) return E_NO_CHANGE;
137 return mRoutingSender->asyncSetSinkSoundProperty(handle,sinkID,soundProperty);
142 am_Error_e ControlReceiver::setSourceSoundProperty(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SoundProperty_s & soundProperty)
144 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSourceSoundProperty got called, sourceID="),DLT_INT(sourceID),DLT_STRING("soundProperty.Type="),DLT_INT(soundProperty.type),DLT_STRING("soundProperty.value="),DLT_INT(soundProperty.value));
147 if(mDatabaseHandler->getSourceSoundPropertyValue(sourceID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
148 if(value==soundProperty.value) return E_NO_CHANGE;
149 return mRoutingSender->asyncSetSourceSoundProperty(handle,sourceID,soundProperty);
154 am_Error_e ControlReceiver::setDomainState(const am_domainID_t domainID, const am_DomainState_e domainState)
156 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setDomainState got called, domainID="),DLT_INT(domainID),DLT_STRING("domainState="),DLT_INT(domainState));
158 am_DomainState_e tempState=DS_MIN;
159 if(mDatabaseHandler->getDomainState(domainID,tempState)!=E_OK) return E_UNKNOWN;
160 if(tempState==domainState) return E_NO_CHANGE;
161 return mRoutingSender->setDomainState(domainID,domainState);
166 am_Error_e ControlReceiver::abortAction(const am_Handle_s handle)
168 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::abortAction got called, handle.type="),DLT_INT(handle.handle),DLT_STRING("handle.handleType="),DLT_INT(handle.handleType));
170 return mRoutingSender->asyncAbort(handle);
175 am_Error_e ControlReceiver::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID)
177 return mDatabaseHandler->enterDomainDB(domainData,domainID);
182 am_Error_e ControlReceiver::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID)
184 return mDatabaseHandler->enterMainConnectionDB(mainConnectionData,connectionID);
189 am_Error_e ControlReceiver::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
191 return mDatabaseHandler->enterSinkDB(sinkData,sinkID);
196 am_Error_e ControlReceiver::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
198 return mDatabaseHandler->enterCrossfaderDB(crossfaderData,crossfaderID);
203 am_Error_e ControlReceiver::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
205 return mDatabaseHandler->enterGatewayDB(gatewayData,gatewayID);
210 am_Error_e ControlReceiver::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID)
212 return mDatabaseHandler->enterSourceDB(sourceData,sourceID);
215 am_Error_e ControlReceiver::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID)
217 return mDatabaseHandler->enterSinkClassDB(sinkClass,sinkClassID);
220 am_Error_e ControlReceiver::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass)
222 return mDatabaseHandler->enterSourceClassDB(sourceClassID,sourceClass);
226 am_Error_e ControlReceiver::enterSystemPropertiesListDB(const std::vector<am_SystemProperty_s> & listSystemProperties)
228 return mDatabaseHandler->enterSystemProperties(listSystemProperties);
232 am_Error_e ControlReceiver::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const am_Route_s & route)
234 return mDatabaseHandler->changeMainConnectionRouteDB(mainconnectionID,route);
239 am_Error_e ControlReceiver::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState)
241 return mDatabaseHandler->changeMainConnectionStateDB(mainconnectionID,connectionState);
246 am_Error_e ControlReceiver::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID)
248 return mDatabaseHandler->changeSinkMainVolumeDB(mainVolume,sinkID);
253 am_Error_e ControlReceiver::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID)
255 return mDatabaseHandler->changeSinkAvailabilityDB(availability,sinkID);
260 am_Error_e ControlReceiver::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID)
262 return mDatabaseHandler->changDomainStateDB(domainState,domainID);
267 am_Error_e ControlReceiver::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID)
269 return mDatabaseHandler->changeSinkMuteStateDB(muteState,sinkID);
274 am_Error_e ControlReceiver::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID)
276 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sinkID);
281 am_Error_e ControlReceiver::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID)
283 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sourceID);
288 am_Error_e ControlReceiver::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID)
290 return mDatabaseHandler->changeSourceAvailabilityDB(availability,sourceID);
295 am_Error_e ControlReceiver::changeSystemPropertyDB(const am_SystemProperty_s & property)
297 return mDatabaseHandler->changeSystemPropertyDB(property);
302 am_Error_e ControlReceiver::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID)
304 return mDatabaseHandler->removeMainConnectionDB(mainConnectionID);
309 am_Error_e ControlReceiver::removeSinkDB(const am_sinkID_t sinkID)
311 return mDatabaseHandler->removeSinkDB(sinkID);
316 am_Error_e ControlReceiver::removeSourceDB(const am_sourceID_t sourceID)
318 return mDatabaseHandler->removeSourceDB(sourceID);
323 am_Error_e ControlReceiver::removeGatewayDB(const am_gatewayID_t gatewayID)
325 return mDatabaseHandler->removeGatewayDB(gatewayID);
330 am_Error_e ControlReceiver::removeCrossfaderDB(const am_crossfaderID_t crossfaderID)
332 return mDatabaseHandler->removeCrossfaderDB(crossfaderID);
337 am_Error_e ControlReceiver::removeDomainDB(const am_domainID_t domainID)
339 return mDatabaseHandler->removeDomainDB(domainID);
344 am_Error_e ControlReceiver::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const
346 return mDatabaseHandler->getSourceClassInfoDB(sourceID,classInfo);
350 am_Error_e ControlReceiver::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const
352 return mDatabaseHandler->getSinkClassInfoDB(sinkID,sinkClass);
357 am_Error_e ControlReceiver::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const
359 return mDatabaseHandler->getGatewayInfoDB(gatewayID,gatewayData);
364 am_Error_e ControlReceiver::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const
366 return mDatabaseHandler->getCrossfaderInfoDB(crossfaderID,crossfaderData);
371 am_Error_e ControlReceiver::getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t> & listSinkID) const
373 return mDatabaseHandler->getListSinksOfDomain(domainID,listSinkID);
378 am_Error_e ControlReceiver::getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t> & listSourceID) const
380 return mDatabaseHandler->getListSourcesOfDomain(domainID,listSourceID);
385 am_Error_e ControlReceiver::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listGatewaysID) const
387 return mDatabaseHandler->getListCrossfadersOfDomain(domainID,listGatewaysID);
392 am_Error_e ControlReceiver::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t> & listGatewaysID) const
394 return mDatabaseHandler->getListGatewaysOfDomain(domainID,listGatewaysID);
399 am_Error_e ControlReceiver::getListMainConnections(std::vector<am_MainConnection_s> & listMainConnections) const
401 return mDatabaseHandler->getListMainConnections(listMainConnections);
406 am_Error_e ControlReceiver::getListDomains(std::vector<am_Domain_s> & listDomains) const
408 return mDatabaseHandler->getListDomains(listDomains);
413 am_Error_e ControlReceiver::getListConnections(std::vector<am_Connection_s> & listConnections) const
415 return mDatabaseHandler->getListConnections(listConnections);
420 am_Error_e ControlReceiver::getListSinks(std::vector<am_Sink_s> & listSinks) const
422 return mDatabaseHandler->getListSinks(listSinks);
427 am_Error_e ControlReceiver::getListSources(std::vector<am_Source_s> & listSources) const
429 return mDatabaseHandler->getListSources(listSources);
434 am_Error_e ControlReceiver::getListSourceClasses(std::vector<am_SourceClass_s> & listSourceClasses) const
436 return mDatabaseHandler->getListSourceClasses(listSourceClasses);
441 am_Error_e ControlReceiver::getListHandles(std::vector<am_Handle_s> & listHandles) const
443 return mRoutingSender->getListHandles(listHandles);
448 am_Error_e ControlReceiver::getListCrossfaders(std::vector<am_Crossfader_s> & listCrossfaders) const
450 return mDatabaseHandler->getListCrossfaders(listCrossfaders);
455 am_Error_e ControlReceiver::getListGateways(std::vector<am_Gateway_s> & listGateways) const
457 return mDatabaseHandler->getListGateways(listGateways);
462 am_Error_e ControlReceiver::getListSinkClasses(std::vector<am_SinkClass_s> & listSinkClasses) const
464 return mDatabaseHandler->getListSinkClasses(listSinkClasses);
468 am_Error_e ControlReceiver::getListSystemProperties(std::vector<am_SystemProperty_s> & listSystemProperties) const
470 return mDatabaseHandler->getListSystemProperties(listSystemProperties);
474 am_Error_e ControlReceiver::changeSinkClassInfoDB(const am_SinkClass_s & classInfo)
476 return mDatabaseHandler->changeSinkClassInfoDB(classInfo);
479 am_Error_e ControlReceiver::changeSourceClassInfoDB(const am_SourceClass_s & classInfo)
481 return mDatabaseHandler->changeSourceClassInfoDB(classInfo);
484 am_Error_e ControlReceiver::removeSinkClassDB(const am_sinkClass_t sinkClassID)
486 return mDatabaseHandler->removeSinkClassDB(sinkClassID);
489 am_Error_e ControlReceiver::removeSourceClassDB(const am_sourceClass_t sourceClassID)
491 return mDatabaseHandler->removeSourceClassDB(sourceClassID);
494 void ControlReceiver::setCommandReady()
496 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setCommandReady got called"));
497 mCommandSender->cbCommunicationReady();
500 void ControlReceiver::setRoutingReady()
502 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setRoutingReady got called"));
503 mRoutingSender->routingInterfacesReady();