From fb6922458416b4517dbe3e0a312c38de579b6817 Mon Sep 17 00:00:00 2001 From: Hubert Chrzaniuk Date: Thu, 29 Oct 2020 15:17:43 +0100 Subject: [PATCH] [EGD-4176] Audio state notifications (#937) --- changelog.md | 1 + module-services/service-audio/ServiceAudio.cpp | 18 ++++++++++++++++++ module-services/service-audio/ServiceAudio.hpp | 1 + .../service-audio/messages/AudioMessage.hpp | 6 ++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index dae35ed2c08cc0412bc1e2240c74cce0bdeeae33..41c4d756ace095731624d2584e30b23f820e1cd4 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,7 @@ * `[gui]` Add "ButtonOnOff" widget. * `[cellular]` Add support for modem reset * `[cellular]` Obtain time zone through network +* `[audio]` Add state notifications * `[antenna]` Service-antenna enabled. ### Changed diff --git a/module-services/service-audio/ServiceAudio.cpp b/module-services/service-audio/ServiceAudio.cpp index 813fa662c2fea11e4f463c672c25bf8a28440177..8be97212d5136c4f4fa69b98a9786216795d964b 100644 --- a/module-services/service-audio/ServiceAudio.cpp +++ b/module-services/service-audio/ServiceAudio.cpp @@ -440,9 +440,20 @@ auto ServiceAudio::HandleKeyPressed(const int step) -> std::unique_ptr(audio::RetCode::Success, newVolume, muted, context); } +bool ServiceAudio::IsBusy() +{ + for (auto &input : audioMux.GetAllInputs()) { + if (input.audio->GetCurrentState() != Audio::State::Idle) { + return true; + } + } + return false; +} + sys::Message_t ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) { sys::Message_t responseMsg; + bool isBusy = IsBusy(); auto &msgType = typeid(*msgl); LOG_DEBUG("msgType %d %s", static_cast(msgl->messageType), msgType.name()); @@ -509,6 +520,13 @@ sys::Message_t ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::Re LOG_DEBUG("Unhandled message"); } + auto curIsBusy = IsBusy(); + if (isBusy != curIsBusy) { + auto broadMsg = std::make_shared( + curIsBusy ? AudioNotificationMessage::Type::ServiceWakeUp : AudioNotificationMessage::Type::ServiceSleep); + sys::Bus::SendMulticast(broadMsg, sys::BusChannels::ServiceAudioNotifications, this); + } + if (responseMsg) { return responseMsg; } diff --git a/module-services/service-audio/ServiceAudio.hpp b/module-services/service-audio/ServiceAudio.hpp index 7336bcfeaa5c9c7235f862343368e4f582a4670b..875628c0658935d7e0ba59bef5443f83675d96e1 100644 --- a/module-services/service-audio/ServiceAudio.hpp +++ b/module-services/service-audio/ServiceAudio.hpp @@ -77,6 +77,7 @@ class ServiceAudio : public sys::Service auto IsOperationEnabled(const audio::PlaybackType &plType, const audio::Operation::Type &opType) -> bool; constexpr auto IsResumable(const audio::PlaybackType &type) const -> bool; constexpr auto ShouldLoop(const std::optional &type) const -> bool; + auto IsBusy() -> bool; void addOrIgnoreEntry(const std::string &profilePath, const std::string &defaultValue); diff --git a/module-services/service-audio/messages/AudioMessage.hpp b/module-services/service-audio/messages/AudioMessage.hpp index f770dc40613dc8705c7913feb9a4f98df627e828..7bf225ff37f9846153550892ea2051116847cab6 100644 --- a/module-services/service-audio/messages/AudioMessage.hpp +++ b/module-services/service-audio/messages/AudioMessage.hpp @@ -46,10 +46,12 @@ class AudioNotificationMessage : public AudioMessage enum class Type { EndOfFile, - Stop + Stop, + ServiceWakeUp, + ServiceSleep, }; - explicit AudioNotificationMessage(Type type, audio::Token token) : type(type), token(token) + explicit AudioNotificationMessage(Type type, audio::Token token = audio::Token()) : type(type), token(token) {} const Type type;