From f7f4adc19f17944349eeae2bcde8e5c98235e4e3 Mon Sep 17 00:00:00 2001 From: Maciej Gibowicz Date: Mon, 4 Dec 2023 14:51:24 +0100 Subject: [PATCH] [BH-1264] Add alarm sound fade in Adding a fade in for the alarm sound (main and power nap) according to the pattern (V): dt = 30[s] * V/10. --- harmony_changelog.md | 1 + image/system_a/data/lang/Deutsch.json | 1 + image/system_a/data/lang/English.json | 1 + image/system_a/data/lang/Espanol.json | 1 + image/system_a/data/lang/Francais.json | 1 + image/system_a/data/lang/Polski.json | 1 + module-audio/Audio/Audio.cpp | 6 +- module-audio/Audio/Audio.hpp | 4 +- module-audio/Audio/AudioCommon.hpp | 6 ++ .../alarms/src/actions/PlayAudioActions.cpp | 12 +++- .../presenter/PowerNapProgressPresenter.cpp | 7 +- .../ApplicationBellSettings.cpp | 2 + .../AlarmSettingsListItemProvider.cpp | 7 +- .../alarm_settings/AlarmSettingsModel.cpp | 12 ++++ .../models/AbstractAlarmSettingsModel.hpp | 12 +++- .../common/models/AbstractAudioModel.hpp | 7 +- .../common/models/AlarmSettingsModel.hpp | 13 +++- .../include/common/models/AudioModel.hpp | 7 +- .../BellHybrid/apps/common/src/AudioModel.cpp | 7 +- .../BellHybrid/services/audio/CMakeLists.txt | 2 + .../services/audio/ServiceAudio.cpp | 43 ++++++++--- .../services/audio/VolumeFadeIn.cpp | 71 +++++++++++++++++++ .../audio/include/audio/AudioMessage.hpp | 9 ++- .../audio/include/audio/ServiceAudio.hpp | 4 ++ .../audio/include/audio/VolumeFadeIn.hpp | 35 +++++++++ .../services/db/include/db/SystemSettings.hpp | 3 +- 26 files changed, 243 insertions(+), 32 deletions(-) create mode 100644 products/BellHybrid/services/audio/VolumeFadeIn.cpp create mode 100644 products/BellHybrid/services/audio/include/audio/VolumeFadeIn.hpp diff --git a/harmony_changelog.md b/harmony_changelog.md index d2c81e2c5f4eb3a10e50fd1e060503bf5e2ec996..fe42dd81f58c3f4a8acd4936acd065fea29d0e0a 100644 --- a/harmony_changelog.md +++ b/harmony_changelog.md @@ -11,6 +11,7 @@ * Added labels to Relaxation * Added date format setting * Added colors of noise to Relaxation +* Added gradual alarm volume increase ### Changed / Improved * Optimize the way Relaxation is loading music files diff --git a/image/system_a/data/lang/Deutsch.json b/image/system_a/data/lang/Deutsch.json index 37113d95548867d50b89d76aaaa5fd28ef57bdcc..4f16dce508404703462a9f644dd2e2df87b632cb 100644 --- a/image/system_a/data/lang/Deutsch.json +++ b/image/system_a/data/lang/Deutsch.json @@ -73,6 +73,7 @@ "app_bell_settings_alarm_settings": "Alarmeinstellungen", "app_bell_settings_alarm_settings_alarm_tone_and_light": "Hauptalarm", "app_bell_settings_alarm_settings_light": "Alarmleuchte", + "app_bell_settings_alarm_settings_fade": "Erhöht allmählich Alarmlautstärke", "app_bell_settings_alarm_settings_prewake_up": "Sanftes Wecken", "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "vor dem Alarm", "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Klang", diff --git a/image/system_a/data/lang/English.json b/image/system_a/data/lang/English.json index 1c8bec26cd900a973d63006083392c2906adf87b..f35a23d94eec4fdcc993e97f581b25eed7b89a3e 100644 --- a/image/system_a/data/lang/English.json +++ b/image/system_a/data/lang/English.json @@ -107,6 +107,7 @@ "app_bell_settings_alarm_settings": "Alarm", "app_bell_settings_alarm_settings_alarm_tone_and_light": "Main alarm", "app_bell_settings_alarm_settings_light": "Main alarm light", + "app_bell_settings_alarm_settings_fade": "Gradually raise the alarm volume", "app_bell_settings_alarm_settings_prewake_up": "Pre-wake up", "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "before the alarm", "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Pre-wake up chime tone", diff --git a/image/system_a/data/lang/Espanol.json b/image/system_a/data/lang/Espanol.json index 2c8aa34782fa7b565eab61a4c92864549173cb5c..293c42634fc895e191c6291674f8d0438f9066f6 100644 --- a/image/system_a/data/lang/Espanol.json +++ b/image/system_a/data/lang/Espanol.json @@ -72,6 +72,7 @@ "app_bell_settings_alarm_settings": "Ajustes de alarma", "app_bell_settings_alarm_settings_alarm_tone_and_light": "Alarma principal", "app_bell_settings_alarm_settings_light": "Luz de alarma", + "app_bell_settings_alarm_settings_fade": "Aumentar vol. alarma gradualmente", "app_bell_settings_alarm_settings_prewake_up": "Despertar gradual", "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "antes de la alarma", "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Tono", diff --git a/image/system_a/data/lang/Francais.json b/image/system_a/data/lang/Francais.json index 6d09f0738d45bba43b3a1c0ebb28a91a84e27a03..860b27c1f18096b27db15ca6764b1b2c2acbfb24 100644 --- a/image/system_a/data/lang/Francais.json +++ b/image/system_a/data/lang/Francais.json @@ -74,6 +74,7 @@ "app_bell_settings_alarm_settings": "Alarme", "app_bell_settings_alarm_settings_alarm_tone_and_light": "Alarme principale", "app_bell_settings_alarm_settings_light": "Lumi\u00e8re de r\u00e9veil", + "app_bell_settings_alarm_settings_fade": "Augmentation graduelle du volume", "app_bell_settings_alarm_settings_prewake_up": "Pr\u00e9-r\u00e9veil", "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "avant l'alarme", "app_bell_settings_alarm_settings_prewake_up_chime_tone": "M\u00e9lodie de pr\u00e9-r\u00e9veil", diff --git a/image/system_a/data/lang/Polski.json b/image/system_a/data/lang/Polski.json index c0eb70bed3923e894c0c5bbbfefc0fc20eabdfc8..6eae86284f98ef13dc56781c0287fa1286714c80 100644 --- a/image/system_a/data/lang/Polski.json +++ b/image/system_a/data/lang/Polski.json @@ -73,6 +73,7 @@ "app_bell_settings_alarm_settings": "Alarm", "app_bell_settings_alarm_settings_alarm_tone_and_light": "G\u0142\u00f3wny alarm", "app_bell_settings_alarm_settings_light": "\u015awiat\u0142o alarmu", + "app_bell_settings_alarm_settings_fade": "Stopniowo podnoś głośność alarmu", "app_bell_settings_alarm_settings_prewake_up": "Wst\u0119pne budzenie", "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "przed alarmem", "app_bell_settings_alarm_settings_prewake_up_chime_tone": "D\u017awi\u0119k wst\u0119pnego budzenia", diff --git a/module-audio/Audio/Audio.cpp b/module-audio/Audio/Audio.cpp index ff23b1fa9afa12b686a375b5d6bfb71912e5a882..e2e45303b201e9089bc770e8dd0cfca2b02056aa 100644 --- a/module-audio/Audio/Audio.cpp +++ b/module-audio/Audio/Audio.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "Audio.hpp" @@ -32,7 +32,7 @@ namespace audio return currentOperation->SendEvent(std::move(evt)); } - audio::RetCode Audio::SetOutputVolume(Volume vol) + audio::RetCode Audio::SetOutputVolume(float vol) { auto volToSet = vol; if (vol > maxVolume) { @@ -145,7 +145,7 @@ namespace audio audio::RetCode Audio::Mute() { muted = Muted::True; - return SetOutputVolume(0); + return SetOutputVolume(0.0f); } void Audio::SendUpdateEventsToCurrentOperation() diff --git a/module-audio/Audio/Audio.hpp b/module-audio/Audio/Audio.hpp index 1c438f5c221ea65aa2bc27f8f78da9311547eca4..2b0f7589fc4406e808fe8987c26818354085e977 100644 --- a/module-audio/Audio/Audio.hpp +++ b/module-audio/Audio/Audio.hpp @@ -47,8 +47,8 @@ namespace audio return currentState; } - // Range 0-1 - audio::RetCode SetOutputVolume(Volume vol); + // Range 0.0-10.0 + audio::RetCode SetOutputVolume(float vol); // Range 0-10 audio::RetCode SetInputGain(Gain gain); diff --git a/module-audio/Audio/AudioCommon.hpp b/module-audio/Audio/AudioCommon.hpp index 3e5c57884dc5f61903a1375cea6227a574eb692b..56f0815901c348d7d51146083faa97319126cdf5 100644 --- a/module-audio/Audio/AudioCommon.hpp +++ b/module-audio/Audio/AudioCommon.hpp @@ -81,6 +81,12 @@ namespace audio Other }; + enum class FadeIn + { + Disable, + Enable + }; + /// Used to describe audio operations using Context = std::pair; diff --git a/products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp b/products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp index 1800067ce52619ec1c79669972d17f834bc8a49e..2ad34bd884ce52d68d3d3fd82c3f05c99dc22e19 100644 --- a/products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp +++ b/products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PlayAudioActions.hpp" @@ -24,8 +24,14 @@ namespace alarms if (duration) { spawnTimer(*duration); } - return service.bus.sendUnicast(std::make_shared(path, playbackType), - service::audioServiceName); + const auto fadeInSettings = utils::getNumericValue( + settings.getValue(bell::settings::Alarm::fadeActive, settings::SettingsScope::Global)); + const auto fadeInEnabled = (fadeInSettings && (playbackType == audio::PlaybackType::Alarm)) + ? audio::FadeIn::Enable + : audio::FadeIn::Disable; + return service.bus.sendUnicast( + std::make_shared(path, playbackType, fadeInEnabled), + service::audioServiceName); } bool PlayAudioAction::turnOff() diff --git a/products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp b/products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp index 7c6c24da39aa23609f4dadb476b9889348a8fc76..96b0a9308da3926558facedf29f6bf1b04a98d30 100644 --- a/products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp +++ b/products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp @@ -89,8 +89,11 @@ namespace app::powernap const auto &filePath = soundsRepository->titleToPath( settings->getValue(bell::settings::Alarm::tone, settings::SettingsScope::Global)); - - audioModel.play(filePath.value_or(""), AbstractAudioModel::PlaybackType::Alarm, {}); + const auto fadeInActive = utils::getNumericValue(settings->getValue(bell::settings::Alarm::fadeActive, + settings::SettingsScope::Global)) + ? audio::FadeIn::Enable + : audio::FadeIn::Disable; + audioModel.play(filePath.value_or(""), AbstractAudioModel::PlaybackType::Alarm, {}, fadeInActive); napAlarmTimer.start(); napFinished = true; } diff --git a/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp b/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp index de990a133e86b77a5c37b50795ef348e4d502b8a..3accbdc2e31c95971526e0d6940845e9282a94a6 100644 --- a/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp +++ b/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp @@ -216,11 +216,13 @@ namespace app gui::BellSettingsAlarmSettingsWindow::name, [this](ApplicationCommon *app, const std::string &) { auto alarmToneModel = std::make_unique(this); auto alarmVolumeModel = std::make_unique(*audioModel); + auto alarmFadeOnOffModel = std::make_unique(this); auto alarmLightOnOffModel = std::make_unique(this); auto alarmFrontlightModel = std::make_unique(this); auto alarmSettingsModel = std::make_unique(std::move(alarmToneModel), std::move(alarmVolumeModel), + std::move(alarmFadeOnOffModel), std::move(alarmLightOnOffModel), std::move(alarmFrontlightModel)); auto soundsRepository = std::make_unique(paths::audio::proprietary() / paths::audio::alarm()); diff --git a/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsListItemProvider.cpp b/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsListItemProvider.cpp index 92e21020663b0c5be88c910ab8e944063847b62c..87f8e0da51e1e90242f23450771161ce919e2378 100644 --- a/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsListItemProvider.cpp +++ b/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsListItemProvider.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "BellSettingsStyle.hpp" @@ -73,6 +73,11 @@ namespace app::bell_settings internalData.emplace_back(alarmVolume); + auto onOffFade = new OnOffListItem(settingsModel.getAlarmFadeOnOff(), + utils::translate("app_bell_settings_alarm_settings_fade")); + + internalData.emplace_back(onOffFade); + auto onOffLight = new OnOffListItem(settingsModel.getAlarmLightOnOff(), utils::translate("app_bell_settings_alarm_settings_light")); diff --git a/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsModel.cpp b/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsModel.cpp index 7148fca9b9c0f6a2013e14ec895c561607063764..4ee440a24dc0d6df9da0fc4b317e19823ac8f826 100644 --- a/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsModel.cpp +++ b/products/BellHybrid/apps/application-bell-settings/models/alarm_settings/AlarmSettingsModel.cpp @@ -48,6 +48,18 @@ namespace app::bell_settings defaultValue = audioModel.getVolume(AbstractAudioModel::PlaybackType::Alarm).value_or(0); } + void AlarmFadeOnOffModel::setValue(bool value) + { + const auto valStr = std::to_string(static_cast(value)); + settings.setValue(bell::settings::Alarm::fadeActive, valStr, settings::SettingsScope::Global); + } + + bool AlarmFadeOnOffModel::getValue() const + { + const auto str = settings.getValue(bell::settings::Alarm::fadeActive, settings::SettingsScope::Global); + return (utils::toNumeric(str) != 0); + } + void AlarmLightOnOffModel::setValue(bool value) { const auto valStr = std::to_string(static_cast(value)); diff --git a/products/BellHybrid/apps/common/include/common/models/AbstractAlarmSettingsModel.hpp b/products/BellHybrid/apps/common/include/common/models/AbstractAlarmSettingsModel.hpp index 949e0a4e7f9e14342cb35085fa55a27228567ff0..27542c8f1392c0f7a7d013e4dd443bbd76a41851 100644 --- a/products/BellHybrid/apps/common/include/common/models/AbstractAlarmSettingsModel.hpp +++ b/products/BellHybrid/apps/common/include/common/models/AbstractAlarmSettingsModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -17,10 +17,12 @@ namespace app::bell_settings AbstractAlarmSettingsModel( std::unique_ptr> alarmTone, std::unique_ptr> alarmVolume, + std::unique_ptr> alarmFadeOnOff, std::unique_ptr> alarmLightOnOff, std::unique_ptr> alarmFrontlight) : alarmTone(std::move(alarmTone)), alarmVolume(std::move(alarmVolume)), - alarmLightOnOff(std::move(alarmLightOnOff)), alarmFrontlight(std::move(alarmFrontlight)) + alarmFadeOnOff(std::move(alarmFadeOnOff)), alarmLightOnOff(std::move(alarmLightOnOff)), + alarmFrontlight(std::move(alarmFrontlight)) {} virtual ~AbstractAlarmSettingsModel() = default; @@ -35,6 +37,11 @@ namespace app::bell_settings return *alarmVolume; } + gui::AbstractSettingsModel &getAlarmFadeOnOff() + { + return *alarmFadeOnOff; + } + gui::AbstractSettingsModel &getAlarmLightOnOff() { return *alarmLightOnOff; @@ -48,6 +55,7 @@ namespace app::bell_settings private: std::unique_ptr> alarmTone; std::unique_ptr> alarmVolume; + std::unique_ptr> alarmFadeOnOff; std::unique_ptr> alarmLightOnOff; std::unique_ptr> alarmFrontlight; }; diff --git a/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp b/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp index 1fd28a3e5624b93b04821165c4e28aa0eb6f52ee..367d930d6a3b5e18444ba2e09da2129f1379a3c2 100644 --- a/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp +++ b/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -36,7 +36,10 @@ namespace app virtual void setVolume(Volume volume, PlaybackType playbackType, OnStateChangeCallback &&callback) = 0; virtual std::optional getVolume(PlaybackType playbackType) = 0; virtual void getVolume(PlaybackType playbackType, OnGetValueCallback &&callback) = 0; - virtual void play(const std::string &filePath, PlaybackType type, OnStateChangeCallback &&callback) = 0; + virtual void play(const std::string &filePath, + PlaybackType type, + OnStateChangeCallback &&callback, + audio::FadeIn fadeIn = audio::FadeIn::Disable) = 0; virtual void stopAny(OnStateChangeCallback &&callback) = 0; virtual void stopPlayedByThis(OnStateChangeCallback &&callback) = 0; virtual void pause(OnStateChangeCallback &&callback) = 0; diff --git a/products/BellHybrid/apps/common/include/common/models/AlarmSettingsModel.hpp b/products/BellHybrid/apps/common/include/common/models/AlarmSettingsModel.hpp index 64d858d70ccd543125f7d0a0679149fcdcf36ad7..836f21948394db8baf6f6523e5f97fae6335b92b 100644 --- a/products/BellHybrid/apps/common/include/common/models/AlarmSettingsModel.hpp +++ b/products/BellHybrid/apps/common/include/common/models/AlarmSettingsModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -32,6 +32,15 @@ namespace app::bell_settings std::uint8_t defaultValue; }; + class AlarmFadeOnOffModel : public gui::SettingsModel + { + public: + using SettingsModel::SettingsModel; + + void setValue(bool value) override; + bool getValue() const override; + }; + class AlarmLightOnOffModel : public gui::SettingsModel { public: @@ -55,10 +64,12 @@ namespace app::bell_settings public: AlarmSettingsModel(std::unique_ptr alarmToneModel, std::unique_ptr alarmVolumeModel, + std::unique_ptr alarmFadeOnOffModel, std::unique_ptr alarmLightOnOffModel, std::unique_ptr alarmFrontlightModel) : AbstractAlarmSettingsModel(std::move(alarmToneModel), std::move(alarmVolumeModel), + std::move(alarmFadeOnOffModel), std::move(alarmLightOnOffModel), std::move(alarmFrontlightModel)) {} diff --git a/products/BellHybrid/apps/common/include/common/models/AudioModel.hpp b/products/BellHybrid/apps/common/include/common/models/AudioModel.hpp index 56d65b3f66e327e27a902ef105d74acb6473a8fd..8a93a1ff46671d03de68ecde40a3dc8a3d15cee0 100644 --- a/products/BellHybrid/apps/common/include/common/models/AudioModel.hpp +++ b/products/BellHybrid/apps/common/include/common/models/AudioModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -17,7 +17,10 @@ namespace app void setVolume(Volume volume, PlaybackType playbackType, OnStateChangeCallback &&callback) override; std::optional getVolume(PlaybackType playbackType) override; void getVolume(PlaybackType playbackType, OnGetValueCallback &&callback) override; - void play(const std::string &filePath, PlaybackType type, OnStateChangeCallback &&callback) override; + void play(const std::string &filePath, + PlaybackType type, + OnStateChangeCallback &&callback, + audio::FadeIn fadeIn = audio::FadeIn::Disable) override; void stopAny(OnStateChangeCallback &&callback) override; void stopPlayedByThis(OnStateChangeCallback &&callback) override; void pause(OnStateChangeCallback &&callback) override; diff --git a/products/BellHybrid/apps/common/src/AudioModel.cpp b/products/BellHybrid/apps/common/src/AudioModel.cpp index dded89582ea31c1527739b6847015373262b5768..1c2da57bdb8b0c4478388eac24a8f4bda1877ae9 100644 --- a/products/BellHybrid/apps/common/src/AudioModel.cpp +++ b/products/BellHybrid/apps/common/src/AudioModel.cpp @@ -73,10 +73,13 @@ namespace app app->disconnect(typeid(service::AudioEOFNotification)); } - void AudioModel::play(const std::string &filePath, PlaybackType type, OnStateChangeCallback &&callback) + void AudioModel::play(const std::string &filePath, + PlaybackType type, + OnStateChangeCallback &&callback, + audio::FadeIn fadeIn) { playbackFinishedFlag = false; - auto msg = std::make_unique(filePath, convertPlaybackType(type)); + auto msg = std::make_unique(filePath, convertPlaybackType(type), fadeIn); auto task = app::AsyncRequest::createFromMessage(std::move(msg), service::audioServiceName); auto cb = [_callback = callback, this](auto response) { diff --git a/products/BellHybrid/services/audio/CMakeLists.txt b/products/BellHybrid/services/audio/CMakeLists.txt index b3afe181cbd954c26b4950403fb7bbbc036d4707..541375becbf2535eeec9d3ee62f5c8e40d1fbc46 100644 --- a/products/BellHybrid/services/audio/CMakeLists.txt +++ b/products/BellHybrid/services/audio/CMakeLists.txt @@ -13,10 +13,12 @@ target_include_directories(bell-audio target_sources(bell-audio PRIVATE ServiceAudio.cpp + VolumeFadeIn.cpp PUBLIC include/audio/AudioMessage.hpp include/audio/ServiceAudio.hpp + include/audio/VolumeFadeIn.hpp ) diff --git a/products/BellHybrid/services/audio/ServiceAudio.cpp b/products/BellHybrid/services/audio/ServiceAudio.cpp index d9049e58fb2c73c7f4023062fdb3936c351ef5d5..780650e64ab8c42d7dcdd0c83cabf8e9a5f454c8 100644 --- a/products/BellHybrid/services/audio/ServiceAudio.cpp +++ b/products/BellHybrid/services/audio/ServiceAudio.cpp @@ -16,9 +16,11 @@ namespace constexpr auto defaultVolume = "5"; constexpr auto defaultSnoozeVolume = "4"; constexpr auto defaultBedtimeVolume = "6"; - constexpr audio::Volume maxInVolume = 10; - constexpr audio::Volume minVolume = 0; + constexpr auto maxVolumeToSet = 10.0f; + constexpr auto minVolumeToSet = 0.0f; constexpr auto profileType = audio::Profile::Type::PlaybackLoudspeaker; + constexpr auto volumeSetting = audio::Setting::Volume; + namespace initializer { using namespace audio; @@ -69,9 +71,19 @@ namespace service auto sentinelRegistrationMsg = std::make_shared(cpuSentinel); bus.sendUnicast(std::move(sentinelRegistrationMsg), service::name::system_manager); + auto callback = [this](float volumeToSet) { + const auto clampedValue = std::clamp(volumeToSet, minVolumeToSet, maxVolumeToSet); + if (const auto activeInput = audioMux.GetActiveInput(); activeInput) { + if (activeInput.value()) { + activeInput.value()->audio->SetOutputVolume(clampedValue); + } + } + }; + volumeFadeIn = std::make_unique(this, std::move(callback)); + connect(typeid(AudioStartPlaybackRequest), [this](sys::Message *msg) -> sys::MessagePointer { auto *msgl = static_cast(msg); - return handleStart(audio::Operation::Type::Playback, msgl->fileName, msgl->playbackType); + return handleStart(audio::Operation::Type::Playback, msgl->fadeIn, msgl->fileName, msgl->playbackType); }); connect(typeid(AudioInternalEOFNotificationMessage), [this](sys::Message *msg) -> sys::MessagePointer { @@ -81,6 +93,7 @@ namespace service }); connect(typeid(AudioStopRequest), [this](sys::Message *msg) -> sys::MessagePointer { + volumeFadeIn->Stop(); auto *msgl = static_cast(msg); return handleStop(msgl->stopVec, msgl->token); }); @@ -134,7 +147,8 @@ namespace service } } - auto Audio::handleStart(const audio::Operation::Type opType, + auto Audio::handleStart(audio::Operation::Type opType, + audio::FadeIn fadeIn, const std::string &fileName, const audio::PlaybackType &playbackType) -> std::unique_ptr { @@ -159,6 +173,9 @@ namespace service auto input = audioMux.GetPlaybackInput(playbackType); AudioStart(input); manageCpuSentinel(); + if (fadeIn == audio::FadeIn::Enable) { + volumeFadeIn->Start(getVolume(playbackType), minVolumeToSet, maxVolumeToSet); + } return std::make_unique(retCode, retToken); } @@ -226,6 +243,10 @@ namespace service if (const auto input = audioMux.GetInput(token); input) { if (shouldLoop((*input)->audio->GetCurrentOperationPlaybackType())) { (*input)->audio->Start(); + if (volumeFadeIn->IsActive()) { + volumeFadeIn->Restart(); + } + if ((*input)->audio->IsMuted()) { (*input)->audio->Mute(); } @@ -263,7 +284,7 @@ namespace service { constexpr auto setting = audio::Setting::Volume; auto retCode = audio::RetCode::Success; - const auto clampedValue = std::clamp(utils::getNumericValue(value), minVolume, maxInVolume); + const auto clampedValue = std::clamp(utils::getNumericValue(value), minVolumeToSet, maxVolumeToSet); if (const auto activeInput = audioMux.GetActiveInput(); activeInput) { if (activeInput.value()) { @@ -279,9 +300,7 @@ namespace service auto Audio::handleGetVolume(const audio::PlaybackType &playbackType) -> std::unique_ptr { - constexpr auto setting = audio::Setting::Volume; - - const auto path = dbPath(setting, playbackType, profileType); + const auto path = dbPath(volumeSetting, playbackType, profileType); if (const auto value = settingsProvider->getValue(path); not value.empty()) { return std::make_unique(audio::RetCode::Success, value); } @@ -289,6 +308,14 @@ namespace service return std::make_unique(audio::RetCode::Failed); } + auto Audio::getVolume(const audio::PlaybackType &playbackType) -> audio::Volume + { + const auto path = dbPath(volumeSetting, playbackType, profileType); + const auto value = settingsProvider->getValue(path); + return value.empty() ? utils::getNumericValue(defaultVolume) + : utils::getNumericValue(value); + } + sys::ReturnCodes Audio::SwitchPowerModeHandler([[maybe_unused]] const sys::ServicePowerMode mode) { return sys::ReturnCodes::Success; diff --git a/products/BellHybrid/services/audio/VolumeFadeIn.cpp b/products/BellHybrid/services/audio/VolumeFadeIn.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9849caca405ba1f89bfa261409f7a07ae9b54cde --- /dev/null +++ b/products/BellHybrid/services/audio/VolumeFadeIn.cpp @@ -0,0 +1,71 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "VolumeFadeIn.hpp" +#include + +namespace audio +{ + namespace + { + constexpr auto timerName{"volumeFadeTimer"}; + constexpr std::chrono::milliseconds fadeInterval{300}; + constexpr auto fadeStep{0.1f}; + } // namespace + + VolumeFadeIn::VolumeFadeIn(sys::Service *parent, SetCallback callback) : setVolumeCallback(callback) + { + timerHandle = sys::TimerFactory::createPeriodicTimer( + parent, timerName, fadeInterval, [this]([[maybe_unused]] sys::Timer &timer) { PerformNextFadeStep(); }); + } + + VolumeFadeIn::~VolumeFadeIn() + { + Stop(); + } + + void VolumeFadeIn::Start(float targetVolume, float minVolume, float maxVolume) + { + if (targetVolume > maxVolume || minVolume > maxVolume) { + LOG_ERROR("Incorrect parameters for audio fade in!"); + return; + } + this->targetVolume = targetVolume; + this->minVolume = minVolume; + this->maxVolume = maxVolume; + currentVolume = minVolume + fadeStep; + Restart(); + timerHandle.start(); + } + + void VolumeFadeIn::Restart() + { + if (setVolumeCallback != nullptr) { + setVolumeCallback(currentVolume); + } + } + + void VolumeFadeIn::Stop() + { + timerHandle.stop(); + } + + bool VolumeFadeIn::IsActive() + { + return timerHandle.isActive(); + } + + void VolumeFadeIn::PerformNextFadeStep() + { + if (currentVolume < targetVolume) { + currentVolume = std::clamp(std::min(currentVolume + fadeStep, targetVolume), minVolume, maxVolume); + if (setVolumeCallback != nullptr) { + setVolumeCallback(currentVolume); + } + } + else { + Stop(); + } + } + +} // namespace audio diff --git a/products/BellHybrid/services/audio/include/audio/AudioMessage.hpp b/products/BellHybrid/services/audio/include/audio/AudioMessage.hpp index 0046c53690b451de9de22126ff174f788897b961..7d0f633b3252a609480d2e0c2164e7d7e801ecf0 100644 --- a/products/BellHybrid/services/audio/include/audio/AudioMessage.hpp +++ b/products/BellHybrid/services/audio/include/audio/AudioMessage.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -107,12 +107,15 @@ namespace service class AudioStartPlaybackRequest : public AudioMessage { public: - AudioStartPlaybackRequest(const std::string &fileName, const audio::PlaybackType &playbackType) - : AudioMessage(), fileName(fileName), playbackType(playbackType) + AudioStartPlaybackRequest(const std::string &fileName, + const audio::PlaybackType &playbackType, + const audio::FadeIn fadeIn = audio::FadeIn::Disable) + : AudioMessage(), fileName(fileName), playbackType(playbackType), fadeIn(fadeIn) {} const std::string fileName; const audio::PlaybackType playbackType; + const audio::FadeIn fadeIn; }; class AudioStartPlaybackResponse : public AudioResponseMessage diff --git a/products/BellHybrid/services/audio/include/audio/ServiceAudio.hpp b/products/BellHybrid/services/audio/include/audio/ServiceAudio.hpp index 4e3a370ec4859f33877041c7d35bfe608e0000b5..17b95d3db86f3cc5b771e6edf04f0cdc9f278007 100644 --- a/products/BellHybrid/services/audio/include/audio/ServiceAudio.hpp +++ b/products/BellHybrid/services/audio/include/audio/ServiceAudio.hpp @@ -4,6 +4,7 @@ #pragma once #include "AudioMessage.hpp" +#include "VolumeFadeIn.hpp" #include