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(AudioManager)
31 ControlReceiver::ControlReceiver(DatabaseHandler *iDatabaseHandler, RoutingSender *iRoutingSender, CommandSender *iCommandSender)
32 : mDatabaseHandler(iDatabaseHandler),
33 mRoutingSender(iRoutingSender),
34 mCommandSender(iCommandSender)
36 assert(mDatabaseHandler!=NULL);
37 assert(mRoutingSender!=NULL);
38 assert(mCommandSender!=NULL);
41 ControlReceiver::~ControlReceiver()
45 am_Error_e ControlReceiver::getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s> & returnList)
47 //todo: implement routing algorithm
52 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)
54 DLT_LOG(AudioManager,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));
56 am_Connection_s tempConnection;
57 tempConnection.sinkID=sinkID;
58 tempConnection.sourceID=sourceID;
59 tempConnection.connectionFormat=format;
60 tempConnection.connectionID=0;
62 //todo: enter function to find out what happends if the same connection is in the course of being build up.
63 if (mDatabaseHandler->existConnection(tempConnection)) return E_ALREADY_EXISTS; //todo:enter the correct connectionID here?
65 mDatabaseHandler->enterConnectionDB(tempConnection,connectionID);
66 return mRoutingSender->asyncConnect(handle,connectionID,sourceID,sinkID,format);
71 am_Error_e ControlReceiver::disconnect(am_Handle_s & handle, const am_connectionID_t connectionID)
73 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::disconnect got called, connectionID="),DLT_INT(connectionID));
75 if (!mDatabaseHandler->existConnectionID(connectionID)) return E_NON_EXISTENT; //todo: check with EA model and correct
76 return mRoutingSender->asyncDisconnect(handle,connectionID);
81 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)
83 DLT_LOG(AudioManager,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));
85 if (!mDatabaseHandler->existcrossFader(crossfaderID)) return E_NON_EXISTENT;
86 return mRoutingSender->asyncCrossFade(handle,crossfaderID,hotSource,rampType,rampTime);
91 am_Error_e ControlReceiver::setSourceState(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SourceState_e state)
93 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSourceState got called, sourceID="),DLT_INT(sourceID),DLT_STRING("state="),DLT_INT(state));
95 am_SourceState_e sourceState;
96 if(mDatabaseHandler->getSoureState(sourceID,sourceState)!=E_OK) return E_UNKNOWN;
97 if(sourceState==state) return E_NO_CHANGE;
98 return mRoutingSender->asyncSetSourceState(handle,sourceID,state);
103 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)
105 DLT_LOG(AudioManager,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));
107 am_volume_t tempVolume;
108 if(mDatabaseHandler->getSinkVolume(sinkID,tempVolume)!=E_OK) return E_UNKNOWN;
109 if(tempVolume==volume) return E_NO_CHANGE;
110 return mRoutingSender->asyncSetSinkVolume(handle,sinkID,volume,ramp,time);
115 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)
117 DLT_LOG(AudioManager,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));
119 am_volume_t tempVolume;
120 if(mDatabaseHandler->getSourceVolume(sourceID,tempVolume)!=E_OK) return E_UNKNOWN;
121 if(tempVolume==volume) return E_NO_CHANGE;
122 return mRoutingSender->asyncSetSourceVolume(handle,sourceID,volume,rampType,time);
127 am_Error_e ControlReceiver::setSinkSoundProperty(am_Handle_s & handle, const am_sinkID_t sinkID, const am_SoundProperty_s & soundProperty)
129 DLT_LOG(AudioManager,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));
132 if(mDatabaseHandler->getSinkSoundPropertyValue(sinkID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
133 if(value==soundProperty.value) return E_NO_CHANGE;
134 return mRoutingSender->asyncSetSinkSoundProperty(handle,sinkID,soundProperty);
139 am_Error_e ControlReceiver::setSourceSoundProperty(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SoundProperty_s & soundProperty)
141 DLT_LOG(AudioManager,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));
144 if(mDatabaseHandler->getSourceSoundPropertyValue(sourceID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
145 if(value==soundProperty.value) return E_NO_CHANGE;
146 return mRoutingSender->asyncSetSourceSoundProperty(handle,sourceID,soundProperty);
151 am_Error_e ControlReceiver::setDomainState(const am_domainID_t domainID, const am_DomainState_e domainState)
153 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setDomainState got called, domainID="),DLT_INT(domainID),DLT_STRING("domainState="),DLT_INT(domainState));
155 am_DomainState_e tempState=DS_MIN;
156 if(mDatabaseHandler->getDomainState(domainID,tempState)!=E_OK) return E_UNKNOWN;
157 if(tempState==domainState) return E_NO_CHANGE;
158 return mRoutingSender->setDomainState(domainID,domainState);
163 am_Error_e ControlReceiver::abortAction(const am_Handle_s handle)
165 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::abortAction got called, handle.type="),DLT_INT(handle.handle),DLT_STRING("handle.handleType="),DLT_INT(handle.handleType));
167 return mRoutingSender->asyncAbort(handle);
172 am_Error_e ControlReceiver::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID)
174 return mDatabaseHandler->enterDomainDB(domainData,domainID);
179 am_Error_e ControlReceiver::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID)
181 return mDatabaseHandler->enterMainConnectionDB(mainConnectionData,connectionID);
186 am_Error_e ControlReceiver::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
188 return mDatabaseHandler->enterSinkDB(sinkData,sinkID);
193 am_Error_e ControlReceiver::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
195 return mDatabaseHandler->enterCrossfaderDB(crossfaderData,crossfaderID);
200 am_Error_e ControlReceiver::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
202 return mDatabaseHandler->enterGatewayDB(gatewayData,gatewayID);
207 am_Error_e ControlReceiver::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID)
209 return mDatabaseHandler->enterSourceDB(sourceData,sourceID);
212 am_Error_e ControlReceiver::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID)
214 return mDatabaseHandler->enterSinkClassDB(sinkClass,sinkClassID);
217 am_Error_e ControlReceiver::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass)
219 return mDatabaseHandler->enterSourceClassDB(sourceClassID,sourceClass);
223 am_Error_e ControlReceiver::enterSystemPropertiesListDB(const std::vector<am_SystemProperty_s> & listSystemProperties)
225 return mDatabaseHandler->enterSystemProperties(listSystemProperties);
229 am_Error_e ControlReceiver::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const am_Route_s & route)
231 return mDatabaseHandler->changeMainConnectionRouteDB(mainconnectionID,route);
236 am_Error_e ControlReceiver::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState)
238 return mDatabaseHandler->changeMainConnectionStateDB(mainconnectionID,connectionState);
243 am_Error_e ControlReceiver::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID)
245 return mDatabaseHandler->changeSinkMainVolumeDB(mainVolume,sinkID);
250 am_Error_e ControlReceiver::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID)
252 return mDatabaseHandler->changeSinkAvailabilityDB(availability,sinkID);
257 am_Error_e ControlReceiver::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID)
259 return mDatabaseHandler->changDomainStateDB(domainState,domainID);
264 am_Error_e ControlReceiver::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID)
266 return mDatabaseHandler->changeSinkMuteStateDB(muteState,sinkID);
271 am_Error_e ControlReceiver::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID)
273 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sinkID);
278 am_Error_e ControlReceiver::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID)
280 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sourceID);
285 am_Error_e ControlReceiver::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID)
287 return mDatabaseHandler->changeSourceAvailabilityDB(availability,sourceID);
292 am_Error_e ControlReceiver::changeSystemPropertyDB(const am_SystemProperty_s & property)
294 return mDatabaseHandler->changeSystemPropertyDB(property);
299 am_Error_e ControlReceiver::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID)
301 return mDatabaseHandler->removeMainConnectionDB(mainConnectionID);
306 am_Error_e ControlReceiver::removeSinkDB(const am_sinkID_t sinkID)
308 return mDatabaseHandler->removeSinkDB(sinkID);
313 am_Error_e ControlReceiver::removeSourceDB(const am_sourceID_t sourceID)
315 return mDatabaseHandler->removeSourceDB(sourceID);
320 am_Error_e ControlReceiver::removeGatewayDB(const am_gatewayID_t gatewayID)
322 return mDatabaseHandler->removeGatewayDB(gatewayID);
327 am_Error_e ControlReceiver::removeCrossfaderDB(const am_crossfaderID_t crossfaderID)
329 return mDatabaseHandler->removeCrossfaderDB(crossfaderID);
334 am_Error_e ControlReceiver::removeDomainDB(const am_domainID_t domainID)
336 return mDatabaseHandler->removeDomainDB(domainID);
341 am_Error_e ControlReceiver::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const
343 return mDatabaseHandler->getSourceClassInfoDB(sourceID,classInfo);
347 am_Error_e ControlReceiver::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const
349 return mDatabaseHandler->getSinkClassInfoDB(sinkID,sinkClass);
354 am_Error_e ControlReceiver::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const
356 return mDatabaseHandler->getGatewayInfoDB(gatewayID,gatewayData);
361 am_Error_e ControlReceiver::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const
363 return mDatabaseHandler->getCrossfaderInfoDB(crossfaderID,crossfaderData);
368 am_Error_e ControlReceiver::getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t> & listSinkID) const
370 return mDatabaseHandler->getListSinksOfDomain(domainID,listSinkID);
375 am_Error_e ControlReceiver::getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t> & listSourceID) const
377 return mDatabaseHandler->getListSourcesOfDomain(domainID,listSourceID);
382 am_Error_e ControlReceiver::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listGatewaysID) const
384 return mDatabaseHandler->getListCrossfadersOfDomain(domainID,listGatewaysID);
389 am_Error_e ControlReceiver::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t> & listGatewaysID) const
391 return mDatabaseHandler->getListGatewaysOfDomain(domainID,listGatewaysID);
396 am_Error_e ControlReceiver::getListMainConnections(std::vector<am_MainConnection_s> & listMainConnections) const
398 return mDatabaseHandler->getListMainConnections(listMainConnections);
403 am_Error_e ControlReceiver::getListDomains(std::vector<am_Domain_s> & listDomains) const
405 return mDatabaseHandler->getListDomains(listDomains);
410 am_Error_e ControlReceiver::getListConnections(std::vector<am_Connection_s> & listConnections) const
412 return mDatabaseHandler->getListConnections(listConnections);
417 am_Error_e ControlReceiver::getListSinks(std::vector<am_Sink_s> & listSinks) const
419 return mDatabaseHandler->getListSinks(listSinks);
424 am_Error_e ControlReceiver::getListSources(std::vector<am_Source_s> & listSources) const
426 return mDatabaseHandler->getListSources(listSources);
431 am_Error_e ControlReceiver::getListSourceClasses(std::vector<am_SourceClass_s> & listSourceClasses) const
433 return mDatabaseHandler->getListSourceClasses(listSourceClasses);
438 am_Error_e ControlReceiver::getListHandles(std::vector<am_Handle_s> & listHandles) const
440 return mRoutingSender->getListHandles(listHandles);
445 am_Error_e ControlReceiver::getListCrossfaders(std::vector<am_Crossfader_s> & listCrossfaders) const
447 return mDatabaseHandler->getListCrossfaders(listCrossfaders);
452 am_Error_e ControlReceiver::getListGateways(std::vector<am_Gateway_s> & listGateways) const
454 return mDatabaseHandler->getListGateways(listGateways);
459 am_Error_e ControlReceiver::getListSinkClasses(std::vector<am_SinkClass_s> & listSinkClasses) const
461 return mDatabaseHandler->getListSinkClasses(listSinkClasses);
465 am_Error_e ControlReceiver::getListSystemProperties(std::vector<am_SystemProperty_s> & listSystemProperties) const
467 return mDatabaseHandler->getListSystemProperties(listSystemProperties);
471 am_Error_e ControlReceiver::changeSinkClassInfoDB(const am_SinkClass_s & classInfo)
473 mDatabaseHandler->changeSinkClassInfoDB(classInfo);
476 am_Error_e ControlReceiver::changeSourceClassInfoDB(const am_SourceClass_s & classInfo)
478 mDatabaseHandler->changeSourceClassInfoDB(classInfo);
481 am_Error_e ControlReceiver::removeSinkClassDB(const am_sinkClass_t sinkClassID)
483 mDatabaseHandler->removeSinkClassDB(sinkClassID);
486 am_Error_e ControlReceiver::removeSourceClassDB(const am_sourceClass_t sourceClassID)
488 mDatabaseHandler->removeSourceClassDB(sourceClassID);
491 void ControlReceiver::setCommandReady()
493 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setCommandReady got called"));
494 mCommandSender->cbCommunicationReady();
497 void ControlReceiver::setRoutingReady()
499 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setRoutingReady got called"));
500 mRoutingSender->routingInterfacesReady();