From 1bdc829588783af83eb48512eb62d8997df9c102 Mon Sep 17 00:00:00 2001 From: Hubert Chrzaniuk Date: Thu, 7 Jan 2021 12:17:18 +0100 Subject: [PATCH] [EGD-5086] Change audio device switching logic Upon hardware change event, audio profile had been switched multiple times forcing redundant initializations of all related objects. Logic has been optimized and prepared for further refactor. Now upon hardware event objects are initialized exactly once. --- .../Audio/Operation/PlaybackOperation.cpp | 12 +++++++++--- module-audio/Audio/Operation/RouterOperation.cpp | 15 ++++----------- module-audio/Audio/decoder/Decoder.cpp | 8 ++++++++ module-audio/Audio/decoder/Decoder.hpp | 1 + .../board/rt1051/bsp/audio/RT1051Audiocodec.cpp | 4 ++-- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/module-audio/Audio/Operation/PlaybackOperation.cpp b/module-audio/Audio/Operation/PlaybackOperation.cpp index df31c58b33b5360456dea18f1c9196688cfd0914..92edb433c326839ed692dc18941f3591bcae1651 100644 --- a/module-audio/Audio/Operation/PlaybackOperation.cpp +++ b/module-audio/Audio/Operation/PlaybackOperation.cpp @@ -57,7 +57,7 @@ namespace audio } operationToken = token; - assert(dataStreamOut); + assert(dataStreamOut != nullptr); dec->startDecodingWorker(*dataStreamOut, endOfFileCallback); @@ -89,17 +89,19 @@ namespace audio if (!audioDevice) { return audio::RetCode::DeviceFailure; } + + dec->stopDecodingWorker(); return GetDeviceError(audioDevice->Stop()); } audio::RetCode PlaybackOperation::Pause() { - if (state == State::Paused || state == State::Idle) { return RetCode::InvokedInIncorrectState; } - state = State::Paused; + + dec->stopDecodingWorker(); return GetDeviceError(audioDevice->Stop()); } @@ -110,6 +112,9 @@ namespace audio return RetCode::InvokedInIncorrectState; } state = State::Active; + + assert(dataStreamOut != nullptr); + dec->startDecodingWorker(*dataStreamOut, endOfFileCallback); auto ret = audioDevice->Start(currentProfile->GetAudioFormat()); return GetDeviceError(ret); } @@ -196,6 +201,7 @@ namespace audio PlaybackOperation::~PlaybackOperation() { + dec->stopDecodingWorker(); Stop(); dataStreamOut->reset(); dataStreamIn->reset(); diff --git a/module-audio/Audio/Operation/RouterOperation.cpp b/module-audio/Audio/Operation/RouterOperation.cpp index 8fa8f716a0209f9bee4e6badb607d081ffe56fea..8297c79b0568116a829309a401f244f96c5aa823 100644 --- a/module-audio/Audio/Operation/RouterOperation.cpp +++ b/module-audio/Audio/Operation/RouterOperation.cpp @@ -25,17 +25,6 @@ namespace audio AddProfile(Profile::Type::RoutingHeadphones, PlaybackType::None, false); AddProfile(Profile::Type::RoutingEarspeaker, PlaybackType::None, true); AddProfile(Profile::Type::RoutingLoudspeaker, PlaybackType::None, true); - - auto defaultProfile = GetProfile(Profile::Type::RoutingEarspeaker); - if (!defaultProfile) { - throw AudioInitException("Error during initializing profile", RetCode::ProfileNotSet); - } - currentProfile = defaultProfile; - - auto retCode = SwitchToPriorityProfile(); - if (retCode != RetCode::Success) { - throw AudioInitException("Failed to switch audio profile", retCode); - } } audio::RetCode RouterOperation::SetOutputVolume(float vol) @@ -153,7 +142,11 @@ namespace audio audio::RetCode RouterOperation::SwitchProfile(const audio::Profile::Type type) { auto ret = GetProfile(type); + if (ret) { + if (currentProfile && currentProfile->GetType() == ret->GetType()) { + return RetCode::Success; + } currentProfile = ret; } else { diff --git a/module-audio/Audio/decoder/Decoder.cpp b/module-audio/Audio/decoder/Decoder.cpp index 2ea6c029201f1430c606e97824d5398f7dd442c4..05d0abea5472a794c6f45615eb3405d7018a49fd 100644 --- a/module-audio/Audio/decoder/Decoder.cpp +++ b/module-audio/Audio/decoder/Decoder.cpp @@ -133,4 +133,12 @@ namespace audio } } + void Decoder::stopDecodingWorker() + { + if (audioWorker) { + audioWorker->close(); + } + audioWorker = nullptr; + } + } // namespace audio diff --git a/module-audio/Audio/decoder/Decoder.hpp b/module-audio/Audio/decoder/Decoder.hpp index 09ea174e6d12cb8d2e6d58e253f97636f0dd5a42..e4191ece1c1c90cab4257feebf93951f62453b62 100644 --- a/module-audio/Audio/decoder/Decoder.hpp +++ b/module-audio/Audio/decoder/Decoder.hpp @@ -81,6 +81,7 @@ namespace audio virtual uint32_t decode(uint32_t samplesToRead, int16_t *pcmData) = 0; void startDecodingWorker(Stream &audioStream, DecoderWorker::EndOfFileCallback endOfFileCallback); + void stopDecodingWorker(); std::unique_ptr fetchTags(); diff --git a/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp b/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp index fef3c532bec56bfad2d83f167f26d6c95185f55f..8eb5abc9c148d318f8916934632c013fcd1436d7 100644 --- a/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp +++ b/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp @@ -99,11 +99,11 @@ namespace bsp return AudioDevice::RetCode::Failure; } - codec.Stop(); - InStop(); OutStop(); + codec.Stop(); + state = State::Stopped; vTaskDelay(codecSettleTime);