2 * Copyright (C) 2012, BMW AG
4 * This file is part of GENIVI Project AudioManager.
6 * Contributions are licensed to the GENIVI Alliance under one or more
7 * Contribution License Agreements.
10 * This Source Code Form is subject to the terms of the
11 * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
12 * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 * \author Christian Mueller, christian.ei.mueller@bmw.de BMW 2011,2012
17 * \file CAmControlReceiver.cpp
18 * For further information see http://www.genivi.org/.
22 #include "CAmControlReceiver.h"
25 #include "CAmDatabaseHandler.h"
26 #include "CAmRoutingSender.h"
27 #include "CAmCommandSender.h"
28 #include "CAmRouter.h"
29 #include "shared/CAmDltWrapper.h"
30 #include "shared/CAmSocketHandler.h"
34 CAmControlReceiver::CAmControlReceiver(CAmDatabaseHandler *iDatabaseHandler, CAmRoutingSender *iRoutingSender, CAmCommandSender *iCommandSender, CAmSocketHandler *iSocketHandler, CAmRouter* iRouter) :
35 mDatabaseHandler(iDatabaseHandler), //
36 mRoutingSender(iRoutingSender), //
37 mCommandSender(iCommandSender), //
38 mSocketHandler(iSocketHandler), //
41 assert(mDatabaseHandler!=NULL);
42 assert(mRoutingSender!=NULL);
43 assert(mCommandSender!=NULL);
44 assert(mSocketHandler!=NULL);
45 assert(mRouter!=NULL);
48 CAmControlReceiver::~CAmControlReceiver()
52 am_Error_e CAmControlReceiver::getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s> & returnList)
54 return (mRouter->getRoute(onlyfree, sourceID, sinkID, returnList));
57 am_Error_e CAmControlReceiver::connect(am_Handle_s & handle, am_connectionID_t & connectionID, const am_ConnectionFormat_e format, const am_sourceID_t sourceID, const am_sinkID_t sinkID)
59 logInfo("CAmControlReceiver::connect got called, connectionFormat=", format, "sourceID=", sourceID, "sinkID=", sinkID);
61 am_Connection_s tempConnection;
62 tempConnection.sinkID = sinkID;
63 tempConnection.sourceID = sourceID;
64 tempConnection.connectionFormat = format;
65 tempConnection.connectionID = 0;
66 tempConnection.delay=-1;
68 //todo: enter function to find out what happends if the same connection is in the course of being build up.
69 if (mDatabaseHandler->existConnection(tempConnection))
70 return (E_ALREADY_EXISTS); //todo:enter the correct connectionID here?
72 mDatabaseHandler->enterConnectionDB(tempConnection, connectionID);
73 return (mRoutingSender->asyncConnect(handle, connectionID, sourceID, sinkID, format));
76 am_Error_e CAmControlReceiver::disconnect(am_Handle_s & handle, const am_connectionID_t connectionID)
78 logInfo("CAmControlReceiver::disconnect got called, connectionID=", connectionID);
80 if (!mDatabaseHandler->existConnectionID(connectionID))
81 return (E_NON_EXISTENT); //todo: check with EA model and correct
82 return (mRoutingSender->asyncDisconnect(handle, connectionID));
85 am_Error_e CAmControlReceiver::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)
87 logInfo("CAmControlReceiver::crossfade got called, hotSource=", hotSource, "crossfaderID=", crossfaderID, "rampType=", rampType, "rampTime=", rampTime);
89 if (!mDatabaseHandler->existcrossFader(crossfaderID))
90 return (E_NON_EXISTENT);
91 return (mRoutingSender->asyncCrossFade(handle, crossfaderID, hotSource, rampType, rampTime));
94 am_Error_e CAmControlReceiver::setSourceState(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SourceState_e state)
96 logInfo("CAmControlReceiver::setSourceState got called, sourceID=", sourceID, "state=", state);
98 am_SourceState_e sourceState;
99 if (mDatabaseHandler->getSoureState(sourceID, sourceState) != E_OK)
101 if (sourceState == state)
102 return (E_NO_CHANGE);
103 return (mRoutingSender->asyncSetSourceState(handle, sourceID, state));
106 am_Error_e CAmControlReceiver::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 logInfo("CAmControlReceiver::setSinkVolume got called, sinkID=", sinkID, "volume=", volume, "ramp=", ramp, "time=", time);
110 am_volume_t tempVolume;
111 if (mDatabaseHandler->getSinkVolume(sinkID, tempVolume) != E_OK)
113 if (tempVolume == volume)
114 return (E_NO_CHANGE);
115 return (mRoutingSender->asyncSetSinkVolume(handle, sinkID, volume, ramp, time));
118 am_Error_e CAmControlReceiver::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 logInfo("CAmControlReceiver::setSourceVolume got called, sourceID=", sourceID, "volume=", volume, "ramp=", rampType, "time=", time);
122 am_volume_t tempVolume;
123 if (mDatabaseHandler->getSourceVolume(sourceID, tempVolume) != E_OK)
125 if (tempVolume == volume)
126 return (E_NO_CHANGE);
127 return (mRoutingSender->asyncSetSourceVolume(handle, sourceID, volume, rampType, time));
130 am_Error_e CAmControlReceiver::setSinkSoundProperty(am_Handle_s & handle, const am_sinkID_t sinkID, const am_SoundProperty_s & soundProperty)
132 logInfo("CAmControlReceiver::setSinkSoundProperty got called, sinkID=", sinkID, "soundProperty.Type=", soundProperty.type, "soundProperty.value=", soundProperty.value);
135 if (mDatabaseHandler->getSinkSoundPropertyValue(sinkID, soundProperty.type, value) != E_OK)
137 if (value == soundProperty.value)
138 return (E_NO_CHANGE);
139 return (mRoutingSender->asyncSetSinkSoundProperty(handle, sinkID, soundProperty));
142 am_Error_e CAmControlReceiver::setSinkSoundProperties(am_Handle_s & handle, const am_sinkID_t sinkID, const std::vector<am_SoundProperty_s> & listSoundProperties)
144 logInfo("CAmControlReceiver::setSinkSoundProperties got called, sinkID=", sinkID);
147 bool noChange = true;
148 std::vector<am_SoundProperty_s>::const_iterator it = listSoundProperties.begin();
149 for (; it != listSoundProperties.end(); ++it)
151 if (mDatabaseHandler->getSinkSoundPropertyValue(sinkID, it->type, value) != E_OK)
153 if (value != it->value)
157 return (E_NO_CHANGE);
158 return (mRoutingSender->asyncSetSinkSoundProperties(handle, listSoundProperties, sinkID));
161 am_Error_e CAmControlReceiver::setSourceSoundProperty(am_Handle_s & handle, const am_sourceID_t sourceID, const am_SoundProperty_s & soundProperty)
163 logInfo("CAmControlReceiver::setSourceSoundProperty got called, sourceID=", sourceID, "soundProperty.Type=", soundProperty.type, "soundProperty.value=", soundProperty.value);
166 if (mDatabaseHandler->getSourceSoundPropertyValue(sourceID, soundProperty.type, value) != E_OK)
168 if (value == soundProperty.value)
169 return (E_NO_CHANGE);
170 return (mRoutingSender->asyncSetSourceSoundProperty(handle, sourceID, soundProperty));
173 am_Error_e CAmControlReceiver::setSourceSoundProperties(am_Handle_s & handle, const am_sourceID_t sourceID, const std::vector<am_SoundProperty_s> & listSoundProperties)
175 logInfo("CAmControlReceiver::setSourceSoundProperties got called, sourceID=", sourceID);
178 bool noChange = true;
179 std::vector<am_SoundProperty_s>::const_iterator it = listSoundProperties.begin();
180 for (; it != listSoundProperties.end(); ++it)
182 if (mDatabaseHandler->getSourceSoundPropertyValue(sourceID, it->type, value) != E_OK)
184 if (value != it->value)
188 return (E_NO_CHANGE);
189 return (mRoutingSender->asyncSetSourceSoundProperties(handle, listSoundProperties, sourceID));
192 am_Error_e CAmControlReceiver::setDomainState(const am_domainID_t domainID, const am_DomainState_e domainState)
194 logInfo("CAmControlReceiver::setDomainState got called, domainID=", domainID, "domainState=", domainState);
196 am_DomainState_e tempState = DS_UNKNOWN;
197 if (mDatabaseHandler->getDomainState(domainID, tempState) != E_OK)
199 if (tempState == domainState)
200 return (E_NO_CHANGE);
201 return (mRoutingSender->setDomainState(domainID, domainState));
204 am_Error_e CAmControlReceiver::abortAction(const am_Handle_s handle)
206 logInfo("CAmControlReceiver::abortAction got called, handle.type=", handle.handle, "handle.handleType=", handle.handleType);
208 return (mRoutingSender->asyncAbort(handle));
211 am_Error_e CAmControlReceiver::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID)
213 return (mDatabaseHandler->enterDomainDB(domainData, domainID));
216 am_Error_e CAmControlReceiver::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID)
218 return (mDatabaseHandler->enterMainConnectionDB(mainConnectionData, connectionID));
221 am_Error_e CAmControlReceiver::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
223 return (mDatabaseHandler->enterSinkDB(sinkData, sinkID));
226 am_Error_e CAmControlReceiver::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
228 return (mDatabaseHandler->enterCrossfaderDB(crossfaderData, crossfaderID));
231 am_Error_e CAmControlReceiver::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
233 return (mDatabaseHandler->enterGatewayDB(gatewayData, gatewayID));
236 am_Error_e CAmControlReceiver::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID)
238 return (mDatabaseHandler->enterSourceDB(sourceData, sourceID));
241 am_Error_e CAmControlReceiver::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID)
243 return (mDatabaseHandler->enterSinkClassDB(sinkClass, sinkClassID));
246 am_Error_e CAmControlReceiver::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass)
248 return (mDatabaseHandler->enterSourceClassDB(sourceClassID, sourceClass));
251 am_Error_e CAmControlReceiver::enterSystemPropertiesListDB(const std::vector<am_SystemProperty_s> & listSystemProperties)
253 return (mDatabaseHandler->enterSystemProperties(listSystemProperties));
256 am_Error_e CAmControlReceiver::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector<am_connectionID_t>& listConnectionID)
258 return (mDatabaseHandler->changeMainConnectionRouteDB(mainconnectionID, listConnectionID));
261 am_Error_e CAmControlReceiver::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState)
263 return (mDatabaseHandler->changeMainConnectionStateDB(mainconnectionID, connectionState));
266 am_Error_e CAmControlReceiver::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID)
268 return (mDatabaseHandler->changeSinkMainVolumeDB(mainVolume, sinkID));
271 am_Error_e CAmControlReceiver::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID)
273 return (mDatabaseHandler->changeSinkAvailabilityDB(availability, sinkID));
276 am_Error_e CAmControlReceiver::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID)
278 return (mDatabaseHandler->changDomainStateDB(domainState, domainID));
281 am_Error_e CAmControlReceiver::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID)
283 return (mDatabaseHandler->changeSinkMuteStateDB(muteState, sinkID));
286 am_Error_e CAmControlReceiver::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID)
288 return (mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty, sinkID));
291 am_Error_e CAmControlReceiver::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID)
293 return (mDatabaseHandler->changeMainSinkSoundPropertyDB(soundProperty, sourceID));
296 am_Error_e CAmControlReceiver::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID)
298 return (mDatabaseHandler->changeSourceAvailabilityDB(availability, sourceID));
301 am_Error_e CAmControlReceiver::changeSystemPropertyDB(const am_SystemProperty_s & property)
303 return (mDatabaseHandler->changeSystemPropertyDB(property));
306 am_Error_e CAmControlReceiver::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID)
308 return (mDatabaseHandler->removeMainConnectionDB(mainConnectionID));
311 am_Error_e CAmControlReceiver::removeSinkDB(const am_sinkID_t sinkID)
313 return (mDatabaseHandler->removeSinkDB(sinkID));
316 am_Error_e CAmControlReceiver::removeSourceDB(const am_sourceID_t sourceID)
318 return (mDatabaseHandler->removeSourceDB(sourceID));
321 am_Error_e CAmControlReceiver::removeGatewayDB(const am_gatewayID_t gatewayID)
323 return (mDatabaseHandler->removeGatewayDB(gatewayID));
326 am_Error_e CAmControlReceiver::removeCrossfaderDB(const am_crossfaderID_t crossfaderID)
328 return (mDatabaseHandler->removeCrossfaderDB(crossfaderID));
331 am_Error_e CAmControlReceiver::removeDomainDB(const am_domainID_t domainID)
333 return (mDatabaseHandler->removeDomainDB(domainID));
336 am_Error_e CAmControlReceiver::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const
338 return (mDatabaseHandler->getSourceClassInfoDB(sourceID, classInfo));
341 am_Error_e CAmControlReceiver::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const
343 return (mDatabaseHandler->getSinkClassInfoDB(sinkID, sinkClass));
346 am_Error_e CAmControlReceiver::getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s & sinkData) const
348 return (mDatabaseHandler->getSinkInfoDB(sinkID, sinkData));
351 am_Error_e CAmControlReceiver::getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s & sourceData) const
353 return (mDatabaseHandler->getSourceInfoDB(sourceID, sourceData));
356 am_Error_e CAmControlReceiver::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s & mainConnectionData) const
358 return (mDatabaseHandler->getMainConnectionInfoDB(mainConnectionID, mainConnectionData));
361 am_Error_e CAmControlReceiver::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const
363 return (mDatabaseHandler->getGatewayInfoDB(gatewayID, gatewayData));
366 am_Error_e CAmControlReceiver::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const
368 return (mDatabaseHandler->getCrossfaderInfoDB(crossfaderID, crossfaderData));
371 am_Error_e CAmControlReceiver::getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t> & listSinkID) const
373 return (mDatabaseHandler->getListSinksOfDomain(domainID, listSinkID));
376 am_Error_e CAmControlReceiver::getListSourcesOfDomain(const am_domainID_t domainID, std::vector<am_sourceID_t> & listSourceID) const
378 return (mDatabaseHandler->getListSourcesOfDomain(domainID, listSourceID));
381 am_Error_e CAmControlReceiver::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listGatewaysID) const
383 return (mDatabaseHandler->getListCrossfadersOfDomain(domainID, listGatewaysID));
386 am_Error_e CAmControlReceiver::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector<am_gatewayID_t> & listGatewaysID) const
388 return (mDatabaseHandler->getListGatewaysOfDomain(domainID, listGatewaysID));
391 am_Error_e CAmControlReceiver::getListMainConnections(std::vector<am_MainConnection_s> & listMainConnections) const
393 return (mDatabaseHandler->getListMainConnections(listMainConnections));
396 am_Error_e CAmControlReceiver::getListDomains(std::vector<am_Domain_s> & listDomains) const
398 return (mDatabaseHandler->getListDomains(listDomains));
401 am_Error_e CAmControlReceiver::getListConnections(std::vector<am_Connection_s> & listConnections) const
403 return (mDatabaseHandler->getListConnections(listConnections));
406 am_Error_e CAmControlReceiver::getListSinks(std::vector<am_Sink_s> & listSinks) const
408 return (mDatabaseHandler->getListSinks(listSinks));
411 am_Error_e CAmControlReceiver::getListSources(std::vector<am_Source_s> & listSources) const
413 return (mDatabaseHandler->getListSources(listSources));
416 am_Error_e CAmControlReceiver::getListSourceClasses(std::vector<am_SourceClass_s> & listSourceClasses) const
418 return (mDatabaseHandler->getListSourceClasses(listSourceClasses));
421 am_Error_e CAmControlReceiver::getListHandles(std::vector<am_Handle_s> & listHandles) const
423 return (mRoutingSender->getListHandles(listHandles));
426 am_Error_e CAmControlReceiver::getListCrossfaders(std::vector<am_Crossfader_s> & listCrossfaders) const
428 return (mDatabaseHandler->getListCrossfaders(listCrossfaders));
431 am_Error_e CAmControlReceiver::getListGateways(std::vector<am_Gateway_s> & listGateways) const
433 return (mDatabaseHandler->getListGateways(listGateways));
436 am_Error_e CAmControlReceiver::getListSinkClasses(std::vector<am_SinkClass_s> & listSinkClasses) const
438 return (mDatabaseHandler->getListSinkClasses(listSinkClasses));
441 am_Error_e CAmControlReceiver::getListSystemProperties(std::vector<am_SystemProperty_s> & listSystemProperties) const
443 return (mDatabaseHandler->getListSystemProperties(listSystemProperties));
446 am_Error_e CAmControlReceiver::changeSinkClassInfoDB(const am_SinkClass_s & classInfo)
448 return (mDatabaseHandler->changeSinkClassInfoDB(classInfo));
451 am_Error_e CAmControlReceiver::changeSourceClassInfoDB(const am_SourceClass_s & classInfo)
453 return(mDatabaseHandler->changeSourceClassInfoDB(classInfo));
456 am_Error_e CAmControlReceiver::removeSinkClassDB(const am_sinkClass_t sinkClassID)
458 return (mDatabaseHandler->removeSinkClassDB(sinkClassID));
461 am_Error_e CAmControlReceiver::removeSourceClassDB(const am_sourceClass_t sourceClassID)
463 return (mDatabaseHandler->removeSourceClassDB(sourceClassID));
466 void CAmControlReceiver::setCommandReady()
468 logInfo("CAmControlReceiver::setCommandReady got called");
469 mCommandSender->setCommandReady();
472 void CAmControlReceiver::setRoutingReady()
474 logInfo("CAmControlReceiver::setRoutingReady got called");
475 mRoutingSender->setRoutingReady();
478 void CAmControlReceiver::confirmControllerReady()
480 //todo: one time implement here system interaction with NSM
483 void CAmControlReceiver::confirmControllerRundown()
485 //todo: one time implement here system interaction with NSM
488 am_Error_e CAmControlReceiver::getSocketHandler(CAmSocketHandler *& socketHandler)
490 socketHandler = mSocketHandler;
494 void CAmControlReceiver::setCommandRundown()
496 logInfo("CAmControlReceiver::setCommandRundown got called");
497 mCommandSender->setCommandRundown();
500 void CAmControlReceiver::setRoutingRundown()
502 logInfo("CAmControlReceiver::setRoutingRundown got called");
503 mRoutingSender->setRoutingRundown();
506 void CAmControlReceiver::getInterfaceVersion(std::string & version) const
508 version = ControlReceiveVersion;