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.
26 #include "ControlReceiver.h"
30 DLT_IMPORT_CONTEXT(DLT_CONTEXT)
34 ControlReceiver::ControlReceiver(DatabaseHandler *iDatabaseHandler, RoutingSender *iRoutingSender, CommandSender *iCommandSender, SocketHandler *iSocketHandler)
35 : mDatabaseHandler(iDatabaseHandler),
36 mRoutingSender(iRoutingSender),
37 mCommandSender(iCommandSender),
38 mSocketHandler(iSocketHandler)
40 assert(mDatabaseHandler!=NULL);
41 assert(mRoutingSender!=NULL);
42 assert(mCommandSender!=NULL);
43 assert(mSocketHandler!=NULL);
46 ControlReceiver::ControlReceiver(DatabaseHandler *iDatabaseHandler, RoutingSender *iRoutingSender, CommandSender *iCommandSender)
47 : mDatabaseHandler(iDatabaseHandler),
48 mRoutingSender(iRoutingSender),
49 mCommandSender(iCommandSender)
51 assert(mDatabaseHandler!=NULL);
52 assert(mRoutingSender!=NULL);
53 assert(mCommandSender!=NULL);
57 ControlReceiver::~ControlReceiver()
61 am_Error_e ControlReceiver::getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s> & returnList)
63 //todo: implement routing algorithm
69 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)
71 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));
73 am_Connection_s tempConnection;
74 tempConnection.sinkID=sinkID;
75 tempConnection.sourceID=sourceID;
76 tempConnection.connectionFormat=format;
77 tempConnection.connectionID=0;
79 //todo: enter function to find out what happends if the same connection is in the course of being build up.
80 if (mDatabaseHandler->existConnection(tempConnection)) return E_ALREADY_EXISTS; //todo:enter the correct connectionID here?
82 mDatabaseHandler->enterConnectionDB(tempConnection,connectionID);
83 return mRoutingSender->asyncConnect(handle,connectionID,sourceID,sinkID,format);
88 am_Error_e ControlReceiver::disconnect(am_Handle_s & handle, const am_connectionID_t connectionID)
90 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::disconnect got called, connectionID="),DLT_INT(connectionID));
92 if (!mDatabaseHandler->existConnectionID(connectionID)) return E_NON_EXISTENT; //todo: check with EA model and correct
93 return mRoutingSender->asyncDisconnect(handle,connectionID);
98 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)
100 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));
102 if (!mDatabaseHandler->existcrossFader(crossfaderID)) return E_NON_EXISTENT;
103 return mRoutingSender->asyncCrossFade(handle,crossfaderID,hotSource,rampType,rampTime);
108 am_Error_e ControlReceiver::setSourceState(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SourceState_e state)
110 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setSourceState got called, sourceID="),DLT_INT(sourceID),DLT_STRING("state="),DLT_INT(state));
112 am_SourceState_e sourceState;
113 if(mDatabaseHandler->getSoureState(sourceID,sourceState)!=E_OK) return E_UNKNOWN;
114 if(sourceState==state) return E_NO_CHANGE;
115 return mRoutingSender->asyncSetSourceState(handle,sourceID,state);
120 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)
122 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));
124 am_volume_t tempVolume;
125 if(mDatabaseHandler->getSinkVolume(sinkID,tempVolume)!=E_OK) return E_UNKNOWN;
126 if(tempVolume==volume) return E_NO_CHANGE;
127 return mRoutingSender->asyncSetSinkVolume(handle,sinkID,volume,ramp,time);
132 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)
134 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));
136 am_volume_t tempVolume;
137 if(mDatabaseHandler->getSourceVolume(sourceID,tempVolume)!=E_OK) return E_UNKNOWN;
138 if(tempVolume==volume) return E_NO_CHANGE;
139 return mRoutingSender->asyncSetSourceVolume(handle,sourceID,volume,rampType,time);
144 am_Error_e ControlReceiver::setSinkSoundProperty(am_Handle_s & handle, const am_sinkID_t sinkID, const am_SoundProperty_s & soundProperty)
146 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));
149 if(mDatabaseHandler->getSinkSoundPropertyValue(sinkID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
150 if(value==soundProperty.value) return E_NO_CHANGE;
151 return mRoutingSender->asyncSetSinkSoundProperty(handle,sinkID,soundProperty);
156 am_Error_e ControlReceiver::setSourceSoundProperty(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SoundProperty_s & soundProperty)
158 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));
161 if(mDatabaseHandler->getSourceSoundPropertyValue(sourceID,soundProperty.type,value)!=E_OK) return E_UNKNOWN;
162 if(value==soundProperty.value) return E_NO_CHANGE;
163 return mRoutingSender->asyncSetSourceSoundProperty(handle,sourceID,soundProperty);
168 am_Error_e ControlReceiver::setDomainState(const am_domainID_t domainID, const am_DomainState_e domainState)
170 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setDomainState got called, domainID="),DLT_INT(domainID),DLT_STRING("domainState="),DLT_INT(domainState));
172 am_DomainState_e tempState=DS_MIN;
173 if(mDatabaseHandler->getDomainState(domainID,tempState)!=E_OK) return E_UNKNOWN;
174 if(tempState==domainState) return E_NO_CHANGE;
175 return mRoutingSender->setDomainState(domainID,domainState);
180 am_Error_e ControlReceiver::abortAction(const am_Handle_s handle)
182 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));
184 return mRoutingSender->asyncAbort(handle);
189 am_Error_e ControlReceiver::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID)
191 return mDatabaseHandler->enterDomainDB(domainData,domainID);
196 am_Error_e ControlReceiver::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID)
198 return mDatabaseHandler->enterMainConnectionDB(mainConnectionData,connectionID);
203 am_Error_e ControlReceiver::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
205 return mDatabaseHandler->enterSinkDB(sinkData,sinkID);
210 am_Error_e ControlReceiver::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
212 return mDatabaseHandler->enterCrossfaderDB(crossfaderData,crossfaderID);
217 am_Error_e ControlReceiver::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
219 return mDatabaseHandler->enterGatewayDB(gatewayData,gatewayID);
224 am_Error_e ControlReceiver::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID)
226 return mDatabaseHandler->enterSourceDB(sourceData,sourceID);
229 am_Error_e ControlReceiver::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID)
231 return mDatabaseHandler->enterSinkClassDB(sinkClass,sinkClassID);
234 am_Error_e ControlReceiver::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass)
236 return mDatabaseHandler->enterSourceClassDB(sourceClassID,sourceClass);
240 am_Error_e ControlReceiver::enterSystemPropertiesListDB(const std::vector<am_SystemProperty_s> & listSystemProperties)
242 return mDatabaseHandler->enterSystemProperties(listSystemProperties);
246 am_Error_e ControlReceiver::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const am_Route_s & route)
248 return mDatabaseHandler->changeMainConnectionRouteDB(mainconnectionID,route);
253 am_Error_e ControlReceiver::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState)
255 return mDatabaseHandler->changeMainConnectionStateDB(mainconnectionID,connectionState);
260 am_Error_e ControlReceiver::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID)
262 return mDatabaseHandler->changeSinkMainVolumeDB(mainVolume,sinkID);
267 am_Error_e ControlReceiver::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID)
269 return mDatabaseHandler->changeSinkAvailabilityDB(availability,sinkID);
274 am_Error_e ControlReceiver::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID)
276 return mDatabaseHandler->changDomainStateDB(domainState,domainID);
281 am_Error_e ControlReceiver::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID)
283 return mDatabaseHandler->changeSinkMuteStateDB(muteState,sinkID);
288 am_Error_e ControlReceiver::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID)
290 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sinkID);
295 am_Error_e ControlReceiver::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID)
297 return mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty,sourceID);
302 am_Error_e ControlReceiver::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID)
304 return mDatabaseHandler->changeSourceAvailabilityDB(availability,sourceID);
309 am_Error_e ControlReceiver::changeSystemPropertyDB(const am_SystemProperty_s & property)
311 return mDatabaseHandler->changeSystemPropertyDB(property);
316 am_Error_e ControlReceiver::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID)
318 return mDatabaseHandler->removeMainConnectionDB(mainConnectionID);
323 am_Error_e ControlReceiver::removeSinkDB(const am_sinkID_t sinkID)
325 return mDatabaseHandler->removeSinkDB(sinkID);
330 am_Error_e ControlReceiver::removeSourceDB(const am_sourceID_t sourceID)
332 return mDatabaseHandler->removeSourceDB(sourceID);
337 am_Error_e ControlReceiver::removeGatewayDB(const am_gatewayID_t gatewayID)
339 return mDatabaseHandler->removeGatewayDB(gatewayID);
344 am_Error_e ControlReceiver::removeCrossfaderDB(const am_crossfaderID_t crossfaderID)
346 return mDatabaseHandler->removeCrossfaderDB(crossfaderID);
351 am_Error_e ControlReceiver::removeDomainDB(const am_domainID_t domainID)
353 return mDatabaseHandler->removeDomainDB(domainID);
358 am_Error_e ControlReceiver::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const
360 return mDatabaseHandler->getSourceClassInfoDB(sourceID,classInfo);
364 am_Error_e ControlReceiver::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const
366 return mDatabaseHandler->getSinkClassInfoDB(sinkID,sinkClass);
371 am_Error_e ControlReceiver::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const
373 return mDatabaseHandler->getGatewayInfoDB(gatewayID,gatewayData);
378 am_Error_e ControlReceiver::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const
380 return mDatabaseHandler->getCrossfaderInfoDB(crossfaderID,crossfaderData);
385 am_Error_e ControlReceiver::getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t> & listSinkID) const
387 return mDatabaseHandler->getListSinksOfDomain(domainID,listSinkID);
392 am_Error_e ControlReceiver::getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t> & listSourceID) const
394 return mDatabaseHandler->getListSourcesOfDomain(domainID,listSourceID);
399 am_Error_e ControlReceiver::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listGatewaysID) const
401 return mDatabaseHandler->getListCrossfadersOfDomain(domainID,listGatewaysID);
406 am_Error_e ControlReceiver::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t> & listGatewaysID) const
408 return mDatabaseHandler->getListGatewaysOfDomain(domainID,listGatewaysID);
413 am_Error_e ControlReceiver::getListMainConnections(std::vector<am_MainConnection_s> & listMainConnections) const
415 return mDatabaseHandler->getListMainConnections(listMainConnections);
420 am_Error_e ControlReceiver::getListDomains(std::vector<am_Domain_s> & listDomains) const
422 return mDatabaseHandler->getListDomains(listDomains);
427 am_Error_e ControlReceiver::getListConnections(std::vector<am_Connection_s> & listConnections) const
429 return mDatabaseHandler->getListConnections(listConnections);
434 am_Error_e ControlReceiver::getListSinks(std::vector<am_Sink_s> & listSinks) const
436 return mDatabaseHandler->getListSinks(listSinks);
441 am_Error_e ControlReceiver::getListSources(std::vector<am_Source_s> & listSources) const
443 return mDatabaseHandler->getListSources(listSources);
448 am_Error_e ControlReceiver::getListSourceClasses(std::vector<am_SourceClass_s> & listSourceClasses) const
450 return mDatabaseHandler->getListSourceClasses(listSourceClasses);
455 am_Error_e ControlReceiver::getListHandles(std::vector<am_Handle_s> & listHandles) const
457 return mRoutingSender->getListHandles(listHandles);
462 am_Error_e ControlReceiver::getListCrossfaders(std::vector<am_Crossfader_s> & listCrossfaders) const
464 return mDatabaseHandler->getListCrossfaders(listCrossfaders);
469 am_Error_e ControlReceiver::getListGateways(std::vector<am_Gateway_s> & listGateways) const
471 return mDatabaseHandler->getListGateways(listGateways);
476 am_Error_e ControlReceiver::getListSinkClasses(std::vector<am_SinkClass_s> & listSinkClasses) const
478 return mDatabaseHandler->getListSinkClasses(listSinkClasses);
482 am_Error_e ControlReceiver::getListSystemProperties(std::vector<am_SystemProperty_s> & listSystemProperties) const
484 return mDatabaseHandler->getListSystemProperties(listSystemProperties);
488 am_Error_e ControlReceiver::changeSinkClassInfoDB(const am_SinkClass_s & classInfo)
490 return mDatabaseHandler->changeSinkClassInfoDB(classInfo);
493 am_Error_e ControlReceiver::changeSourceClassInfoDB(const am_SourceClass_s & classInfo)
495 return mDatabaseHandler->changeSourceClassInfoDB(classInfo);
498 am_Error_e ControlReceiver::removeSinkClassDB(const am_sinkClass_t sinkClassID)
500 return mDatabaseHandler->removeSinkClassDB(sinkClassID);
503 am_Error_e ControlReceiver::removeSourceClassDB(const am_sourceClass_t sourceClassID)
505 return mDatabaseHandler->removeSourceClassDB(sourceClassID);
508 void ControlReceiver::setCommandReady()
510 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setCommandReady got called"));
511 mCommandSender->cbCommunicationReady();
514 void ControlReceiver::setRoutingReady()
516 DLT_LOG(DLT_CONTEXT,DLT_LOG_INFO, DLT_STRING("ControlReceiver::setRoutingReady got called"));
517 mRoutingSender->routingInterfacesReady();
520 am_Error_e am::ControlReceiver::getSocketHandler(SocketHandler *& socketHandler)
522 #ifdef WITH_SOCKETHANDLER_LOOP
523 socketHandler=mSocketHandler;