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(), //
41 mWaitStartup(false), //
44 assert(mpDatabaseHandler!=NULL);
45 assert(mpRoutingSender!=NULL);
46 assert(mpControlSender!=NULL);
47 assert(mpSocketHandler!=NULL);
50 CAmRoutingReceiver::CAmRoutingReceiver(CAmDatabaseHandler *iDatabaseHandler, CAmRoutingSender *iRoutingSender, CAmControlSender *iControlSender, CAmSocketHandler *iSocketHandler, CAmDbusWrapper *iDBusWrapper) :
51 mpDatabaseHandler(iDatabaseHandler), //
52 mpRoutingSender(iRoutingSender), //
53 mpControlSender(iControlSender), //
54 mpSocketHandler(iSocketHandler), //
55 mpDBusWrapper(iDBusWrapper), //
56 mListStartupHandles(), //
57 mListRundownHandles(), //
58 mWaitStartup(false), //
61 assert(mpDatabaseHandler!=NULL);
62 assert(mpRoutingSender!=NULL);
63 assert(mpControlSender!=NULL);
64 assert(mpSocketHandler!=NULL);
65 assert(mpDBusWrapper!=NULL);
68 CAmRoutingReceiver::~CAmRoutingReceiver()
72 void CAmRoutingReceiver::ackConnect(const am_Handle_s handle, const am_connectionID_t connectionID, const am_Error_e error)
74 mpRoutingSender->removeHandle(handle);
77 mpDatabaseHandler->changeConnectionFinal(connectionID);
81 mpDatabaseHandler->removeConnection(connectionID);
83 mpControlSender->cbAckConnect(handle, error);
86 void CAmRoutingReceiver::ackDisconnect(const am_Handle_s handle, const am_connectionID_t connectionID, const am_Error_e error)
88 mpRoutingSender->removeHandle(handle);
91 mpDatabaseHandler->removeConnection(connectionID);
93 mpControlSender->cbAckDisconnect(handle, error);
96 void CAmRoutingReceiver::ackSetSinkVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error)
98 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
99 if (error == E_OK && handleData.sinkID != 0)
101 //todo: check if volume in handleData is same than volume. React to it.
102 mpDatabaseHandler->changeSinkVolume(handleData.sinkID, volume);
104 mpRoutingSender->removeHandle(handle);
105 mpControlSender->cbAckSetSinkVolumeChange(handle, volume, error);
108 void CAmRoutingReceiver::ackSetSourceVolumeChange(const am_Handle_s handle, const am_volume_t volume, const am_Error_e error)
110 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
111 if (error == E_OK && handleData.sourceID != 0)
113 //todo: check if volume in handleData is same than volume. React to it.
114 mpDatabaseHandler->changeSourceVolume(handleData.sourceID, volume);
116 mpRoutingSender->removeHandle(handle);
117 mpControlSender->cbAckSetSourceVolumeChange(handle, volume, error);
120 void CAmRoutingReceiver::ackSetSourceState(const am_Handle_s handle, const am_Error_e error)
122 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
123 if (error == E_OK && handleData.sourceID != 0)
125 //todo: check if volume in handleData is same than volume. React to it.
126 mpDatabaseHandler->changeSourceState(handleData.sourceID, handleData.sourceState);
128 mpRoutingSender->removeHandle(handle);
129 mpControlSender->cbAckSetSourceState(handle, error);
132 void CAmRoutingReceiver::ackSetSinkSoundProperty(const am_Handle_s handle, const am_Error_e error)
134 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
135 if (error == E_OK && handleData.sinkID != 0)
137 mpDatabaseHandler->changeSinkSoundPropertyDB(handleData.soundPropery, handleData.sinkID);
139 mpRoutingSender->removeHandle(handle);
140 mpControlSender->cbAckSetSinkSoundProperty(handle, error);
144 void am::CAmRoutingReceiver::ackSetSinkSoundProperties(const am_Handle_s handle, const am_Error_e error)
146 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
147 if (error == E_OK && handleData.sinkID != 0)
149 std::vector<am_SoundProperty_s>::const_iterator it = handleData.soundProperties->begin();
150 for (; it != handleData.soundProperties->end(); ++it)
152 mpDatabaseHandler->changeSinkSoundPropertyDB(*it, handleData.sinkID);
154 delete handleData.soundProperties;
156 mpRoutingSender->removeHandle(handle);
157 mpControlSender->cbAckSetSinkSoundProperties(handle, error);
160 void CAmRoutingReceiver::ackSetSourceSoundProperty(const am_Handle_s handle, const am_Error_e error)
162 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
163 if (error == E_OK && handleData.sourceID != 0)
165 mpDatabaseHandler->changeSourceSoundPropertyDB(handleData.soundPropery, handleData.sourceID);
167 mpRoutingSender->removeHandle(handle);
168 mpControlSender->cbAckSetSourceSoundProperty(handle, error);
171 void am::CAmRoutingReceiver::ackSetSourceSoundProperties(const am_Handle_s handle, const am_Error_e error)
173 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
174 if (error == E_OK && handleData.sourceID != 0)
176 std::vector<am_SoundProperty_s>::const_iterator it = handleData.soundProperties->begin();
177 for (; it != handleData.soundProperties->end(); ++it)
179 mpDatabaseHandler->changeSourceSoundPropertyDB(*it, handleData.sourceID);
181 delete handleData.soundProperties;
183 mpRoutingSender->removeHandle(handle);
184 mpControlSender->cbAckSetSourceSoundProperties(handle, error);
187 void CAmRoutingReceiver::ackCrossFading(const am_Handle_s handle, const am_HotSink_e hotSink, const am_Error_e error)
189 CAmRoutingSender::am_handleData_c handleData = mpRoutingSender->returnHandleData(handle);
190 if (error == E_OK && handleData.crossfaderID != 0)
192 //todo: check if volume in handleData is same than volume. React to it.
193 mpDatabaseHandler->changeCrossFaderHotSink(handleData.crossfaderID, hotSink);
195 mpRoutingSender->removeHandle(handle);
196 mpControlSender->cbAckCrossFade(handle, hotSink, error);
199 void CAmRoutingReceiver::ackSourceVolumeTick(const am_Handle_s handle, const am_sourceID_t sourceID, const am_volume_t volume)
201 mpControlSender->hookSystemSourceVolumeTick(handle, sourceID, volume);
204 void CAmRoutingReceiver::ackSinkVolumeTick(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume)
206 mpControlSender->hookSystemSinkVolumeTick(handle, sinkID, volume);
209 am_Error_e CAmRoutingReceiver::peekDomain(const std::string & name, am_domainID_t & domainID)
211 return (mpDatabaseHandler->peekDomain(name, domainID));
215 am_Error_e CAmRoutingReceiver::registerDomain(const am_Domain_s & domainData, am_domainID_t & domainID)
217 return (mpControlSender->hookSystemRegisterDomain(domainData, domainID));
220 am_Error_e CAmRoutingReceiver::deregisterDomain(const am_domainID_t domainID)
222 return (mpControlSender->hookSystemDeregisterDomain(domainID));
225 am_Error_e CAmRoutingReceiver::registerGateway(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
227 return (mpControlSender->hookSystemRegisterGateway(gatewayData, gatewayID));
230 am_Error_e CAmRoutingReceiver::deregisterGateway(const am_gatewayID_t gatewayID)
232 return (mpControlSender->hookSystemDeregisterGateway(gatewayID));
235 am_Error_e CAmRoutingReceiver::peekSink(const std::string& name, am_sinkID_t & sinkID)
237 return (mpDatabaseHandler->peekSink(name, sinkID));
240 am_Error_e CAmRoutingReceiver::registerSink(const am_Sink_s & sinkData, am_sinkID_t & sinkID)
242 return (mpControlSender->hookSystemRegisterSink(sinkData, sinkID));
245 am_Error_e CAmRoutingReceiver::deregisterSink(const am_sinkID_t sinkID)
247 return (mpControlSender->hookSystemDeregisterSink(sinkID));
250 am_Error_e CAmRoutingReceiver::peekSource(const std::string & name, am_sourceID_t & sourceID)
252 return (mpDatabaseHandler->peekSource(name, sourceID));
255 am_Error_e CAmRoutingReceiver::registerSource(const am_Source_s & sourceData, am_sourceID_t & sourceID)
257 return (mpControlSender->hookSystemRegisterSource(sourceData, sourceID));
260 am_Error_e CAmRoutingReceiver::deregisterSource(const am_sourceID_t sourceID)
262 return (mpControlSender->hookSystemDeregisterSource(sourceID));
265 am_Error_e CAmRoutingReceiver::registerCrossfader(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
267 return (mpControlSender->hookSystemRegisterCrossfader(crossfaderData, crossfaderID));
270 am_Error_e CAmRoutingReceiver::deregisterCrossfader(const am_crossfaderID_t crossfaderID)
272 return (mpControlSender->hookSystemDeregisterCrossfader(crossfaderID));
275 void CAmRoutingReceiver::hookInterruptStatusChange(const am_sourceID_t sourceID, const am_InterruptState_e interruptState)
277 return (mpControlSender->hookSystemInterruptStateChange(sourceID, interruptState));
280 void CAmRoutingReceiver::hookDomainRegistrationComplete(const am_domainID_t domainID)
282 mpControlSender->hookSystemDomainRegistrationComplete(domainID);
285 void CAmRoutingReceiver::hookSinkAvailablityStatusChange(const am_sinkID_t sinkID, const am_Availability_s & availability)
287 mpControlSender->hookSystemSinkAvailablityStateChange(sinkID, availability);
290 void CAmRoutingReceiver::hookSourceAvailablityStatusChange(const am_sourceID_t sourceID, const am_Availability_s & availability)
292 mpControlSender->hookSystemSourceAvailablityStateChange(sourceID, availability);
295 void CAmRoutingReceiver::hookDomainStateChange(const am_domainID_t domainID, const am_DomainState_e domainState)
297 mpControlSender->hookSystemDomainStateChange(domainID, domainState);
300 void CAmRoutingReceiver::hookTimingInformationChanged(const am_connectionID_t connectionID, const am_timeSync_t delay)
302 mpDatabaseHandler->changeConnectionTimingInformation(connectionID, delay);
305 void CAmRoutingReceiver::sendChangedData(const std::vector<am_EarlyData_s> & earlyData)
307 mpControlSender->hookSystemReceiveEarlyData(earlyData);
310 am_Error_e CAmRoutingReceiver::peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID)
312 return (mpDatabaseHandler->peekSinkClassID(name, sinkClassID));
315 am_Error_e CAmRoutingReceiver::peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID)
317 return (mpDatabaseHandler->peekSourceClassID(name, sourceClassID));
320 am_Error_e CAmRoutingReceiver::getDBusConnectionWrapper(CAmDbusWrapper *& dbusConnectionWrapper) const
322 #ifdef WITH_DBUS_WRAPPER
323 dbusConnectionWrapper = mpDBusWrapper;
330 am_Error_e CAmRoutingReceiver::getSocketHandler(CAmSocketHandler *& socketHandler) const
332 socketHandler = mpSocketHandler;
336 void CAmRoutingReceiver::getInterfaceVersion(std::string & version) const
338 version = RoutingReceiveVersion;
341 void CAmRoutingReceiver::confirmRoutingReady(const uint16_t handle)
343 mListStartupHandles.erase(std::remove(mListStartupHandles.begin(), mListStartupHandles.end(), handle), mListStartupHandles.end());
344 if (mWaitStartup && mListStartupHandles.empty())
345 mpControlSender->confirmRoutingReady();
348 void CAmRoutingReceiver::confirmRoutingRundown(const uint16_t handle)
350 mListRundownHandles.erase(std::remove(mListRundownHandles.begin(), mListRundownHandles.end(), handle), mListRundownHandles.end());
351 if (mWaitRundown && mListRundownHandles.empty())
352 mpControlSender->confirmCommandRundown();
355 uint16_t am::CAmRoutingReceiver::getStartupHandle()
357 uint16_t handle = ++handleCount; //todo: handle overflow
358 mListStartupHandles.push_back(handle);
362 uint16_t am::CAmRoutingReceiver::getRundownHandle()
364 uint16_t handle = ++handleCount; //todo: handle overflow
365 mListRundownHandles.push_back(handle);
369 void am::CAmRoutingReceiver::waitOnStartup(bool startup)
371 mWaitStartup = startup;
374 void am::CAmRoutingReceiver::waitOnRundown(bool rundown)
376 mWaitRundown = rundown;