2 * Copyright (C) 2011, BMW AG
6 * \file AudioManagerCore.cpp
9 * \author Christian Müller (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 Müller 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 "AudioManagerCore.h"
34 Task::Task(AudioManagerCore* core) {
38 TaskAsyncConnect::TaskAsyncConnect(AudioManagerCore* core, sink_t sink,
40 Task(core), m_ParamSink(sink), m_ParamSource(source) {
43 TaskAsyncConnect::~TaskAsyncConnect() {
46 void TaskAsyncConnect::executeTask(Queue* queue) {
48 * \todo remove signals and slots, change to non QT timers
50 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
51 // (const QObject*) queue, SLOT(slot_nextTask()));
52 // QObject::connect((const QObject*) m_core->returnReceiver(),
53 // SIGNAL(signal_ackConnect(genHandle_t, genError_t)),
54 // (const QObject*) this,
55 // SLOT(slot_connect_finished(genHandle_t, genError_t)));
56 // m_timer = new QTimer();
57 // m_timer->setSingleShot(true);
58 // QObject::connect(m_timer, SIGNAL(timeout()), (const QObject*) this,
59 // SLOT(slot_timeout()));
60 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Started Connect"));
61 // m_timer->start(CONNECT_TIMEOUT);
62 m_core->connect(m_ParamSource, m_ParamSink, &m_handle);
65 void TaskAsyncConnect::setSink(sink_t sink) {
69 void TaskAsyncConnect::setSource(source_t source) {
70 m_ParamSource = source;
73 sink_t TaskAsyncConnect::getSink() {
77 source_t TaskAsyncConnect::getSource() {
81 void TaskAsyncConnect::slot_connect_finished(genHandle_t handle,
83 // if (handle == m_handle && error == GEN_OK) {
87 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Connect returned"));
88 // emit signal_nextTask();
90 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Somethings wrong with the connection"));
95 * \todo handle this event better.
97 void TaskAsyncConnect::slot_timeout() {
98 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Connection timed out"));
101 TaskConnect::TaskConnect(AudioManagerCore* core, sink_t sink, source_t source) :
102 Task(core), m_ParamSink(sink), m_ParamSource(source) {
105 TaskConnect::~TaskConnect() {
108 void TaskConnect::executeTask(Queue* queue) {
109 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
110 // (const QObject*) queue, SLOT(slot_nextTask()));
111 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Started Syncronous Connect"));
112 m_core->connect(m_ParamSource, m_ParamSink);
113 //emit signal_nextTask();
116 TaskDisconnect::TaskDisconnect(AudioManagerCore* core, connection_t ID) :
117 Task(core), m_ParamConnectionID(ID) {
120 TaskDisconnect::~TaskDisconnect() {
123 void TaskDisconnect::executeTask(Queue* queue) {
124 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
125 // (const QObject*) queue, SLOT(slot_nextTask()));
126 m_core->disconnect(m_ParamConnectionID);
127 // emit signal_nextTask();
130 TaskInterruptWait::TaskInterruptWait(AudioManagerCore* core,
131 genInt_t interruptID) :
132 Task(core), m_interruptID(interruptID) {
135 TaskInterruptWait::~TaskInterruptWait() {
139 void TaskInterruptWait::executeTask(Queue* queue) {
140 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
141 // (const QObject*) queue, SLOT(slot_nextTask()));
142 // QObject::connect((const QObject*) m_core->returnCommandInterface(),
143 // SIGNAL(signal_interruptResume(genInt_t)), (const QObject*) this,
144 // SLOT(slot_interrupt_ready(genInt_t)));
147 void TaskInterruptWait::slot_interrupt_ready(genInt_t ID) {
148 if (ID == m_interruptID) {
149 //emit signal_nextTask();
153 TaskSetVolume::TaskSetVolume(AudioManagerCore* core, volume_t newVolume,
155 Task(core), m_volume(newVolume), m_sink(sink) {
159 TaskSetVolume::~TaskSetVolume() {
162 void TaskSetVolume::setVolume(volume_t newVolume) {
163 m_volume = newVolume;
166 void TaskSetVolume::setSink(sink_t sink) {
170 volume_t TaskSetVolume::getVolume() {
174 sink_t TaskSetVolume::getSink() {
178 void TaskSetVolume::executeTask(Queue* queue) {
179 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
180 // (const QObject*) queue, SLOT(slot_nextTask()));
181 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Started Changed Volume"));
182 m_core->setVolume(m_sink, m_volume);
183 // emit signal_nextTask();
186 TaskSetSourceVolume::TaskSetSourceVolume(AudioManagerCore* core,
187 volume_t newVolume, source_t source) :
188 Task(core), m_volume(newVolume), m_source(source) {
192 TaskSetSourceVolume::~TaskSetSourceVolume() {
196 void TaskSetSourceVolume::setVolume(volume_t newVolume) {
197 m_volume = newVolume;
200 void TaskSetSourceVolume::setSource(source_t source) {
204 volume_t TaskSetSourceVolume::getVolume() {
207 source_t TaskSetSourceVolume::getSource() {
211 void TaskSetSourceVolume::executeTask(Queue* queue) {
212 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
213 // (const QObject*) queue, SLOT(slot_nextTask()));
214 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Started Changed Source Volume"));
215 m_core->setSourceVolume(m_source, m_volume);
216 // emit signal_nextTask();
219 TaskWait::TaskWait(AudioManagerCore* core, int mseconds) :
220 Task(core), m_ParamMSeconds(mseconds) {
223 TaskWait::~TaskWait() {
226 void TaskWait::setTime(int mseconds) {
227 m_ParamMSeconds = mseconds;
230 int TaskWait::getTime() {
231 return m_ParamMSeconds;
234 void TaskWait::executeTask(Queue* queue) {
235 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
236 // (const QObject*) queue, SLOT(slot_nextTask()));
237 // m_timer = new QTimer();
238 // m_timer->setSingleShot(true);
239 // QObject::connect(m_timer, SIGNAL(timeout()), (const QObject*) this,
240 // SLOT(slot_timeIsup()));
241 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Start Sleep "));
242 // m_timer->start(m_ParamMSeconds);
245 void TaskWait::slot_timeIsup() {
246 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Stop Sleep "));
248 // emit signal_nextTask();
251 TaskEnterUserConnect::TaskEnterUserConnect(AudioManagerCore* core,
252 genRoute_t route, connection_t connID) :
253 Task(core), m_route(route), m_connectionID(connID) {
256 TaskEnterUserConnect::~TaskEnterUserConnect() {
259 void TaskEnterUserConnect::setConnection(genRoute_t route, connection_t connID) {
261 m_connectionID = connID;
264 genRoute_t TaskEnterUserConnect::returnConnection() {
268 void TaskEnterUserConnect::executeTask(Queue* queue) {
269 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
270 // (const QObject*) queue, SLOT(slot_nextTask()));
271 m_core->returnDatabaseHandler()->updateMainConnection(m_connectionID,
273 // emit signal_nextTask();
276 TaskRemoveUserConnect::TaskRemoveUserConnect(AudioManagerCore* core,
277 connection_t connID) :
278 Task(core), m_connectionID(connID) {
281 TaskRemoveUserConnect::~TaskRemoveUserConnect() {
285 void TaskRemoveUserConnect::setConnectionID(connection_t connID) {
286 m_connectionID = connID;
289 connection_t TaskRemoveUserConnect::returnConnectionID() {
290 return m_connectionID;
293 void TaskRemoveUserConnect::executeTask(Queue* queue) {
294 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
295 // (const QObject*) queue, SLOT(slot_nextTask()));
296 m_core->returnDatabaseHandler()->removeMainConnection(m_connectionID);
297 // emit signal_nextTask();
300 TaskEnterInterrupt::TaskEnterInterrupt(AudioManagerCore* core, genInt_t ID,
301 bool mixed, connection_t connID, std::list<source_t> listInterruptedSources) :
302 Task(core), m_intID(ID), m_mixed(mixed), m_connectionID(connID),
303 m_interruptedSourcesList(listInterruptedSources) {
306 TaskEnterInterrupt::~TaskEnterInterrupt() {
309 void TaskEnterInterrupt::executeTask(Queue* queue) {
310 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
311 // (const QObject*) queue, SLOT(slot_nextTask()));
312 m_core->returnDatabaseHandler()->updateInterrupt(m_intID, m_connectionID,
313 m_mixed, m_interruptedSourcesList);
314 // emit signal_nextTask();
317 TaskRemoveInterrupt::TaskRemoveInterrupt(AudioManagerCore* core, genInt_t ID) :
318 Task(core), m_intID(ID) {
321 TaskRemoveInterrupt::~TaskRemoveInterrupt() {
324 void TaskRemoveInterrupt::executeTask(Queue* queue) {
325 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
326 // (const QObject*) queue, SLOT(slot_nextTask()));
327 m_core->returnDatabaseHandler()->removeInterrupt(m_intID);
328 // emit signal_nextTask();
331 TaskSetSourceMute::TaskSetSourceMute(AudioManagerCore* core, source_t source) :
332 Task(core), m_source(source) {
335 TaskSetSourceMute::~TaskSetSourceMute() {
338 void TaskSetSourceMute::executeTask(Queue* queue) {
339 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
340 // (const QObject*) queue, SLOT(slot_nextTask()));
341 m_core->setSourceMute(m_source);
342 // emit signal_nextTask();
345 TaskSetSourceUnmute::TaskSetSourceUnmute(AudioManagerCore* core,
347 Task(core), m_source(source) {
350 TaskSetSourceUnmute::~TaskSetSourceUnmute() {
353 void TaskSetSourceUnmute::executeTask(Queue* queue) {
354 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
355 // (const QObject*) queue, SLOT(slot_nextTask()));
356 m_core->setSourceUnMute(m_source);
357 // emit signal_nextTask();
360 TaskEmitSignalConnect::TaskEmitSignalConnect(AudioManagerCore* core) :
364 TaskEmitSignalConnect::~TaskEmitSignalConnect() {
367 void TaskEmitSignalConnect::executeTask(Queue* queue) {
368 // QObject::connect((const QObject*) this, SIGNAL(signal_nextTask()),
369 // (const QObject*) queue, SLOT(slot_nextTask()));
370 m_core->emitSignalConnect();
371 // emit signal_nextTask();
374 Queue::Queue(AudioManagerCore* core, std::string name) :
375 m_core(core), m_currentIndex(0), m_name(name), m_taskList(std::list<Task*> ()) {
376 m_core->addQueue(this);
380 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("shoot all tasks"));
381 // foreach (Task* task, m_taskList) {
384 m_core->removeQueue(this);
388 if (m_taskList.empty() == false) {
389 Task* task = m_taskList.front();
390 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Started to execute Task"));
391 task->executeTask(this);
393 DLT_LOG(AudioManager,DLT_LOG_ERROR, DLT_STRING("empty tasklist was attempted to run "));
398 void Queue::slot_nextTask() {
400 // if (m_currentIndex < m_taskList.size()) {
401 // //m_currentIndex->executeTask(*this);
403 // DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Finished all Tasks"));
408 void Queue::addTask(Task* task) {
409 m_taskList.push_back(task);
412 genError_t Queue::removeTask(Task* task) {
413 // if (m_taskList.remove(task) > 0) {
416 return GEN_OUTOFRANGE;
417 void addQueue(Queue* queue);
421 std::list<Task*> Queue::getTaskList() {
425 std::string Queue::returnName() {
429 AudioManagerCore::AudioManagerCore() :
430 m_queueList(std::list<Queue*> ()) {
433 AudioManagerCore::~AudioManagerCore() {
434 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("delete all running queues"));
435 std::list<Queue*>::iterator qIterator;
436 for(qIterator=m_queueList.begin();qIterator!=m_queueList.end();qIterator++) {
441 Router* AudioManagerCore::returnRouter() {
445 DataBaseHandler* AudioManagerCore::returnDatabaseHandler() {
446 return m_databaseHandler;
449 RoutingReceiver* AudioManagerCore::returnReceiver() {
453 DBusCommandInterface* AudioManagerCore::returnCommandInterface() {
457 void AudioManagerCore::registerBushandler(Bushandler* handler) {
458 m_busHandler = handler;
461 void AudioManagerCore::registerDatabasehandler(DataBaseHandler* handler) {
462 m_databaseHandler = handler;
465 void AudioManagerCore::registerRouter(Router* router) {
469 void AudioManagerCore::registerHookEngine(HookHandler* handler) {
470 m_hookHandler = handler;
473 void AudioManagerCore::registerReceiver(RoutingReceiver* receiver) {
474 m_receiver = receiver;
477 void AudioManagerCore::registerCommandInterface(DBusCommandInterface* command) {
481 genError_t AudioManagerCore::UserConnect(source_t source, sink_t sink) {
482 Queue* userConnectionRequestQ = new Queue(this, "User Connect");
483 m_hookHandler->fireHookUserConnectionRequest(userConnectionRequestQ,
485 userConnectionRequestQ->run();
489 genError_t AudioManagerCore::UserDisconnect(connection_t connID) {
490 Queue* userDisconnectionRequestQ = new Queue(this, "User Disconnect");
491 m_hookHandler->fireHookUserDisconnectionRequest(userDisconnectionRequestQ,
493 userDisconnectionRequestQ->run();
497 genError_t AudioManagerCore::UserSetVolume(sink_t sink, volume_t volume) {
498 m_hookHandler->fireHookVolumeChange(volume, sink);
502 std::list<ConnectionType> AudioManagerCore::getListConnections() {
503 return m_databaseHandler->getListAllMainConnections();
506 std::list<SinkType> AudioManagerCore::getListSinks() {
507 std::list<SinkType> sinkList;
508 m_databaseHandler->getListofSinks(&sinkList);
512 std::list<SourceType> AudioManagerCore::getListSources() {
513 std::list<SourceType> sourceList;
514 m_databaseHandler->getListofSources(&sourceList);
518 void AudioManagerCore::emitSignalConnect() {
519 // emit signal_connecionChanged();
522 genError_t AudioManagerCore::connect(source_t source, sink_t sink,
523 genHandle_t* handle) {
524 genHandle_t localhandle;
525 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Connect"), DLT_INT(source), DLT_STRING(" to "), DLT_INT(sink));
526 domain_t domainID = m_databaseHandler->get_Domain_ID_from_Source_ID(source);
527 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
528 m_databaseHandler->get_Bus_from_Domain_ID(domainID));
529 localhandle = m_databaseHandler->insertConnection(source, sink);
532 *handle = localhandle;
534 iface->connect(source, sink, localhandle);
535 DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Connect finished"));
538 * \todo implement error handling
542 genError_t AudioManagerCore::disconnect(connection_t ID) {
543 domain_t domainID = m_databaseHandler->get_Domain_ID_from_Connection_ID(ID);
544 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
545 m_databaseHandler->get_Bus_from_Domain_ID(domainID));
546 iface->disconnect(ID);
547 m_databaseHandler->removeConnection(ID);
550 * \todo failure handling
554 genError_t AudioManagerCore::setVolume(sink_t sink, volume_t volume) {
555 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
556 m_databaseHandler->get_Bus_from_Domain_ID(
557 m_databaseHandler->get_Domain_ID_from_Sink_ID(sink)));
558 iface->setSinkVolume(volume, sink);
561 * \todo failure handling
565 genError_t AudioManagerCore::interruptRequest(source_t interruptSource,
566 sink_t sink, genInt_t* interrupt) {
567 Queue* interruptRequestQ = new Queue(this, "Interrupt Request");
568 m_hookHandler->fireHookInterruptRequest(interruptRequestQ, interruptSource,
570 interruptRequestQ->run();
574 genError_t AudioManagerCore::setSourceVolume(source_t source, volume_t volume) {
575 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
576 m_databaseHandler->get_Bus_from_Domain_ID(
577 m_databaseHandler->get_Domain_ID_from_Source_ID(source)));
578 iface->setSourceVolume(volume, source);
582 genError_t AudioManagerCore::setSourceMute(source_t source) {
583 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
584 m_databaseHandler->get_Bus_from_Domain_ID(
585 m_databaseHandler->get_Domain_ID_from_Source_ID(source)));
586 iface->muteSource(source);
590 genError_t AudioManagerCore::setSourceUnMute(source_t source) {
591 RoutingSendInterface* iface = m_busHandler->getInterfaceforBus(
592 m_databaseHandler->get_Bus_from_Domain_ID(
593 m_databaseHandler->get_Domain_ID_from_Source_ID(source)));
594 iface->unmuteSource(source);
598 genError_t AudioManagerCore::getRoute(const bool onlyfree,
599 const source_t source, const sink_t sink, std::list<genRoute_t>* ReturnList) {
600 m_hookHandler->fireHookRoutingRequest(onlyfree, source, sink, ReturnList);
604 connection_t AudioManagerCore::returnConnectionIDforSinkSource(sink_t sink,
606 return m_databaseHandler->getConnectionID(source, sink);
609 genError_t AudioManagerCore::removeQueue(Queue* queue) {
610 // if (m_queueList.remove(*queue)) {
613 // return GEN_OUTOFRANGE;
617 source_t AudioManagerCore::returnSourceIDfromName(const std::string name) {
618 return m_databaseHandler->get_Source_ID_from_Name(name);
621 sink_t AudioManagerCore::returnSinkIDfromName(const std::string name) {
622 return m_databaseHandler->get_Sink_ID_from_Name(name);
625 void AudioManagerCore::addQueue(Queue* queue) {
626 m_queueList.push_back(queue);