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 CAmRoutingReceiver.cpp
18 * For further information see http://www.genivi.org/.
22 #include "CAmRoutingReceiver.h"
25 #include "CAmDatabaseHandler.h"
26 #include "CAmRoutingSender.h"
27 #include "CAmControlSender.h"
28 #include "shared/CAmDltWrapper.h"
29 #include "shared/CAmSocketHandler.h"
34 CAmRoutingReceiver::CAmRoutingReceiver(CAmDatabaseHandler *iDatabaseHandler, CAmRoutingSender *iRoutingSender, CAmControlSender *iControlSender, CAmSocketHandler *iSocketHandler) :
35 mpDatabaseHandler(iDatabaseHandler), //
36 mpRoutingSender(iRoutingSender), //
37 mpControlSender(iControlSender), //
38 mpSocketHandler(iSocketHandler), //
39 mListStartupHandles(), //
40 mListRundownHandles(), //
42 mWaitStartup(false), //
45 assert(mpDatabaseHandler!=NULL);
46 assert(mpRoutingSender!=NULL);
47 assert(mpControlSender!=NULL);
48 assert(mpSocketHandler!=NULL);
51 CAmRoutingReceiver::CAmRoutingReceiver(CAmDatabaseHandler *iDatabaseHandler, CAmRoutingSender *iRoutingSender, CAmControlSender *iControlSender, CAmSocketHandler *iSocketHandler, CAmDbusWrapper *iDBusWrapper) :
52 mpDatabaseHandler(iDatabaseHandler), //
53 mpRoutingSender(iRoutingSender), //
54 mpControlSender(iControlSender), //
55 mpSocketHandler(iSocketHandler), //
56 mpDBusWrapper(iDBusWrapper), //
57 mListStartupHandles(), //
58 mListRundownHandles(), //
60 mWaitStartup(false), //
63 assert(mpDatabaseHandler!=NULL);
64 assert(mpRoutingSender!=NULL);
65 assert(mpControlSender!=NULL);
66 assert(mpSocketHandler!=NULL);
67 assert(mpDBusWrapper!=NULL);
70 CAmRoutingReceiver::~CAmRoutingReceiver()
74 void CAmRoutingReceiver::ackConnect(const am_Handle_s handle, const am_connectionID_t connectionID, const am_Error_e error)
76 mpRoutingSender->removeHandle(handle);
79 mpDatabaseHandler->changeConnectionFinal(connectionID);
83 mpDatabaseHandler->removeConnection(connectionID);
85 mpControlSender->cbAckConnect(handle, error);
88 void CAmRoutingReceiver::ackDisconnect(const am_Handle_s handle, const am_connectionID_t connectionID, const am_Error_e error)
90 mpRoutingSender->removeHandle(handle);
93 mpDatabaseHandler->removeConnection(connectionID);
95 mpControlSender->cbAckDisconnect(handle, error);
98 void CAmRoutingReceiver::ackSetSinkVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error)
100 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
101 if (error == E_OK && handleData.sinkID != 0)
103 //todo: check if volume in handleData is same than volume. React to it.
104 mpDatabaseHandler->changeSinkVolume(handleData.sinkID, volume);
106 mpRoutingSender->removeHandle(handle);
107 mpControlSender->cbAckSetSinkVolumeChange(handle, volume, error);
110 void CAmRoutingReceiver::ackSetSourceVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error)
112 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
113 if (error == E_OK && handleData.sourceID != 0)
115 //todo: check if volume in handleData is same than volume. React to it.
116 mpDatabaseHandler->changeSourceVolume(handleData.sourceID, volume);
118 mpRoutingSender->removeHandle(handle);
119 mpControlSender->cbAckSetSourceVolumeChange(handle, volume, error);
122 void CAmRoutingReceiver::ackSetSourceState(const am_Handle_s handle, const am_Error_e error)
124 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
125 if (error == E_OK && handleData.sourceID != 0)
127 //todo: check if volume in handleData is same than volume. React to it.
128 mpDatabaseHandler->changeSourceState(handleData.sourceID, handleData.sourceState);
130 mpRoutingSender->removeHandle(handle);
131 mpControlSender->cbAckSetSourceState(handle, error);
134 void CAmRoutingReceiver::ackSetSinkSoundProperty(const am_Handle_s handle, const am_Error_e error)
136 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
137 if (error == E_OK && handleData.sinkID != 0)
139 mpDatabaseHandler->changeSinkSoundPropertyDB(handleData.soundPropery, handleData.sinkID);
141 mpRoutingSender->removeHandle(handle);
142 mpControlSender->cbAckSetSinkSoundProperty(handle, error);
146 void am::CAmRoutingReceiver::ackSetSinkSoundProperties(const am_Handle_s handle, const am_Error_e error)
148 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
149 if (error == E_OK && handleData.sinkID != 0)
151 std::vector<am_SoundProperty_s>::const_iterator it = handleData.soundProperties->begin();
152 for (; it != handleData.soundProperties->end(); ++it)
154 mpDatabaseHandler->changeSinkSoundPropertyDB(*it, handleData.sinkID);
156 delete handleData.soundProperties;
158 mpRoutingSender->removeHandle(handle);
159 mpControlSender->cbAckSetSinkSoundProperties(handle, error);
162 void CAmRoutingReceiver::ackSetSourceSoundProperty(const am_Handle_s handle, const am_Error_e error)
164 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
165 if (error == E_OK && handleData.sourceID != 0)
167 mpDatabaseHandler->changeSourceSoundPropertyDB(handleData.soundPropery, handleData.sourceID);
169 mpRoutingSender->removeHandle(handle);
170 mpControlSender->cbAckSetSourceSoundProperty(handle, error);
173 void am::CAmRoutingReceiver::ackSetSourceSoundProperties(const am_Handle_s handle, const am_Error_e error)
175 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
176 if (error == E_OK && handleData.sourceID != 0)
178 std::vector<am_SoundProperty_s>::const_iterator it = handleData.soundProperties->begin();
179 for (; it != handleData.soundProperties->end(); ++it)
181 mpDatabaseHandler->changeSourceSoundPropertyDB(*it, handleData.sourceID);
183 delete handleData.soundProperties;
185 mpRoutingSender->removeHandle(handle);
186 mpControlSender->cbAckSetSourceSoundProperties(handle, error);
189 void CAmRoutingReceiver::ackCrossFading(const am_Handle_s handle, const am_HotSink_e hotSink, const am_Error_e error)
191 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
192 if (error == E_OK && handleData.crossfaderID != 0)
194 //todo: check if volume in handleData is same than volume. React to it.
195 mpDatabaseHandler->changeCrossFaderHotSink(handleData.crossfaderID, hotSink);
197 mpRoutingSender->removeHandle(handle);
198 mpControlSender->cbAckCrossFade(handle, hotSink, error);
201 void CAmRoutingReceiver::ackSourceVolumeTick(const am_Handle_s handle, const am_sourceID_t sourceID, const am_volume_t volume)
203 mpControlSender->hookSystemSourceVolumeTick(handle, sourceID, volume);
206 void CAmRoutingReceiver::ackSinkVolumeTick(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume)
208 mpControlSender->hookSystemSinkVolumeTick(handle, sinkID, volume);
211 am_Error_e CAmRoutingReceiver::peekDomain(const std::string & name, am_domainID_t & domainID)
213 return (mpDatabaseHandler->peekDomain(name, domainID));
217 am_Error_e CAmRoutingReceiver::registerDomain(const am_Domain_s & domainData, am_domainID_t & domainID)
219 return (mpControlSender->hookSystemRegisterDomain(domainData, domainID));
222 am_Error_e CAmRoutingReceiver::deregisterDomain(const am_domainID_t domainID)
224 return (mpControlSender->hookSystemDeregisterDomain(domainID));
227 am_Error_e CAmRoutingReceiver::registerGateway(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
229 return (mpControlSender->hookSystemRegisterGateway(gatewayData, gatewayID));
232 am_Error_e CAmRoutingReceiver::deregisterGateway(const am_gatewayID_t gatewayID)
234 return (mpControlSender->hookSystemDeregisterGateway(gatewayID));
237 am_Error_e CAmRoutingReceiver::peekSink(const std::string& name, am_sinkID_t & sinkID)
239 return (mpDatabaseHandler->peekSink(name, sinkID));
242 am_Error_e CAmRoutingReceiver::registerSink(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
244 return (mpControlSender->hookSystemRegisterSink(sinkData, sinkID));
247 am_Error_e CAmRoutingReceiver::deregisterSink(const am_sinkID_t sinkID)
249 return (mpControlSender->hookSystemDeregisterSink(sinkID));
252 am_Error_e CAmRoutingReceiver::peekSource(const std::string & name, am_sourceID_t & sourceID)
254 return (mpDatabaseHandler->peekSource(name, sourceID));
257 am_Error_e CAmRoutingReceiver::registerSource(const am_Source_s & sourceData, am_sourceID_t & sourceID)
259 return (mpControlSender->hookSystemRegisterSource(sourceData, sourceID));
262 am_Error_e CAmRoutingReceiver::deregisterSource(const am_sourceID_t sourceID)
264 return (mpControlSender->hookSystemDeregisterSource(sourceID));
267 am_Error_e CAmRoutingReceiver::registerCrossfader(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
269 return (mpControlSender->hookSystemRegisterCrossfader(crossfaderData, crossfaderID));
272 am_Error_e CAmRoutingReceiver::deregisterCrossfader(const am_crossfaderID_t crossfaderID)
274 return (mpControlSender->hookSystemDeregisterCrossfader(crossfaderID));
277 void CAmRoutingReceiver::hookInterruptStatusChange(const am_sourceID_t sourceID, const am_InterruptState_e interruptState)
279 return (mpControlSender->hookSystemInterruptStateChange(sourceID, interruptState));
282 void CAmRoutingReceiver::hookDomainRegistrationComplete(const am_domainID_t domainID)
284 mpControlSender->hookSystemDomainRegistrationComplete(domainID);
287 void CAmRoutingReceiver::hookSinkAvailablityStatusChange(const am_sinkID_t sinkID, const am_Availability_s & availability)
289 mpControlSender->hookSystemSinkAvailablityStateChange(sinkID, availability);
292 void CAmRoutingReceiver::hookSourceAvailablityStatusChange(const am_sourceID_t sourceID, const am_Availability_s & availability)
294 mpControlSender->hookSystemSourceAvailablityStateChange(sourceID, availability);
297 void CAmRoutingReceiver::hookDomainStateChange(const am_domainID_t domainID, const am_DomainState_e domainState)
299 mpControlSender->hookSystemDomainStateChange(domainID, domainState);
302 void CAmRoutingReceiver::hookTimingInformationChanged(const am_connectionID_t connectionID, const am_timeSync_t delay)
304 mpDatabaseHandler->changeConnectionTimingInformation(connectionID, delay);
307 void CAmRoutingReceiver::sendChangedData(const std::vector<am_EarlyData_s> & earlyData)
309 mpControlSender->hookSystemReceiveEarlyData(earlyData);
312 am_Error_e CAmRoutingReceiver::peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID)
314 return (mpDatabaseHandler->peekSinkClassID(name, sinkClassID));
317 am_Error_e CAmRoutingReceiver::peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID)
319 return (mpDatabaseHandler->peekSourceClassID(name, sourceClassID));
322 am_Error_e CAmRoutingReceiver::getDBusConnectionWrapper(CAmDbusWrapper *& dbusConnectionWrapper) const
324 #ifdef WITH_DBUS_WRAPPER
325 dbusConnectionWrapper = mpDBusWrapper;
332 am_Error_e CAmRoutingReceiver::getSocketHandler(CAmSocketHandler *& socketHandler) const
334 socketHandler = mpSocketHandler;
338 void CAmRoutingReceiver::getInterfaceVersion(std::string & version) const
340 version = RoutingReceiveVersion;
343 void CAmRoutingReceiver::confirmRoutingReady(const uint16_t handle)
345 mListStartupHandles.erase(std::remove(mListStartupHandles.begin(), mListStartupHandles.end(), handle), mListStartupHandles.end());
346 if (mWaitStartup && mListStartupHandles.empty())
347 mpControlSender->confirmRoutingReady();
350 void CAmRoutingReceiver::confirmRoutingRundown(const uint16_t handle)
352 mListRundownHandles.erase(std::remove(mListRundownHandles.begin(), mListRundownHandles.end(), handle), mListRundownHandles.end());
353 if (mWaitRundown && mListRundownHandles.empty())
354 mpControlSender->confirmCommandRundown();
357 uint16_t am::CAmRoutingReceiver::getStartupHandle()
359 uint16_t handle = ++handleCount; //todo: handle overflow
360 mListStartupHandles.push_back(handle);
364 uint16_t am::CAmRoutingReceiver::getRundownHandle()
366 uint16_t handle = ++handleCount; //todo: handle overflow
367 mListRundownHandles.push_back(handle);
371 void am::CAmRoutingReceiver::waitOnStartup(bool startup)
373 mWaitStartup = startup;
376 void am::CAmRoutingReceiver::waitOnRundown(bool rundown)
378 mWaitRundown = rundown;