From f1f2a7cfc59ba455247b3b478ce0e2a77bdae54c Mon Sep 17 00:00:00 2001 From: Lefucjusz Date: Tue, 19 Sep 2023 12:07:52 +0200 Subject: [PATCH] [MOS-1038] Fix CPU frequency hanging after SMS received Fix of the issue that in some cases (e.g. after text message was received) ServiceAudio would not release CPU sentinel, what resulted in quick battery discharge. --- .../service-audio/ServiceAudio.cpp | 24 +++++++++++++------ .../include/service-audio/ServiceAudio.hpp | 12 ++++++++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/module-services/service-audio/ServiceAudio.cpp b/module-services/service-audio/ServiceAudio.cpp index 71cc9f751d72a3cce31489104732f7cbed4db8aa..6413da357aacfd7dca1d6aa57c1b02c01b238b4c 100644 --- a/module-services/service-audio/ServiceAudio.cpp +++ b/module-services/service-audio/ServiceAudio.cpp @@ -623,14 +623,23 @@ void ServiceAudio::MuteCurrentOperation() } } -Operation::State ServiceAudio::GetOperationState() +ServiceAudio::InternalOperationState ServiceAudio::GetOperationState() { for (const auto &input : audioMux.GetAllInputs()) { if (input.audio->GetCurrentState() != Audio::State::Idle) { - return input.audio->GetCurrentOperation().GetState(); + switch (input.audio->GetCurrentOperation().GetState()) { + case audio::Operation::State::Idle: + return ServiceAudio::InternalOperationState::OperationIdle; + case audio::Operation::State::Paused: + return ServiceAudio::InternalOperationState::Paused; + case audio::Operation::State::Active: + return ServiceAudio::InternalOperationState::Active; + default: + break; + } } } - return Operation::State::Idle; + return ServiceAudio::InternalOperationState::AudioIdle; } sys::MessagePointer ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) @@ -918,17 +927,18 @@ void ServiceAudio::notifyAboutNewRoutingIfRouterAvailable() } } -void ServiceAudio::updateMinimumCpuFrequency(Operation::State operationState) +void ServiceAudio::updateMinimumCpuFrequency(ServiceAudio::InternalOperationState operationState) { switch (operationState) { - case audio::Operation::State::Idle: + case ServiceAudio::InternalOperationState::AudioIdle: cpuSentinel->ReleaseMinimumFrequency(); break; - case audio::Operation::State::Paused: + case ServiceAudio::InternalOperationState::OperationIdle: + case ServiceAudio::InternalOperationState::Paused: cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyMHz::Level_2); // Required to keep PLL2 running, so that // bandgap used also by PLL4 remains turned on break; - case audio::Operation::State::Active: + case ServiceAudio::InternalOperationState::Active: cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyMHz::Level_5); break; } diff --git a/module-services/service-audio/include/service-audio/ServiceAudio.hpp b/module-services/service-audio/include/service-audio/ServiceAudio.hpp index b9225fd51d3ba2eedc54273ab85f6468d6e10460..3202adc69959adf6bb1c089ec4229aa1f74a55c3 100644 --- a/module-services/service-audio/include/service-audio/ServiceAudio.hpp +++ b/module-services/service-audio/include/service-audio/ServiceAudio.hpp @@ -39,6 +39,14 @@ class ServiceAudio : public sys::Service Continuous }; + enum class InternalOperationState + { + AudioIdle, + OperationIdle, + Paused, + Active + }; + audio::AudioMux audioMux; std::shared_ptr cpuSentinel; audio::AudioMux::VibrationStatus vibrationMotorStatus = audio::AudioMux::VibrationStatus::Off; @@ -96,7 +104,7 @@ class ServiceAudio : public sys::Service std::string GetSound(const audio::PlaybackType &plType); constexpr auto IsResumable(const audio::PlaybackType &type) const -> bool; constexpr auto ShouldLoop(const std::optional &type) const -> bool; - auto GetOperationState() -> audio::Operation::State; + auto GetOperationState() -> InternalOperationState; auto IsSystemSound(const audio::PlaybackType &type) -> bool; audio::PlaybackType generatePlayback(const audio::PlaybackType &type, const audio::Setting &setting = audio::Setting::Volume); @@ -128,7 +136,7 @@ class ServiceAudio : public sys::Service auto handleSingleVibrationStart() -> sys::MessagePointer; void notifyAboutNewRoutingIfRouterAvailable(); - void updateMinimumCpuFrequency(audio::Operation::State operationState); + void updateMinimumCpuFrequency(ServiceAudio::InternalOperationState operationState); }; namespace sys