diff --git a/module-apps/application-music-player/ApplicationMusicPlayer.cpp b/module-apps/application-music-player/ApplicationMusicPlayer.cpp index a7f8aa692..5e4560761 100644 --- a/module-apps/application-music-player/ApplicationMusicPlayer.cpp +++ b/module-apps/application-music-player/ApplicationMusicPlayer.cpp @@ -14,10 +14,12 @@ namespace app { + constexpr std::size_t applicationMusicPlayerStackSize = 4 * 1024; + ApplicationMusicPlayer::ApplicationMusicPlayer(std::string name, std::string parent, StartInBackground startInBackground) - : Application(std::move(name), std::move(parent), startInBackground, 4096) + : Application(std::move(name), std::move(parent), startInBackground, applicationMusicPlayerStackSize) { LOG_INFO("ApplicationMusicPlayer::create"); connect(typeid(AudioStartPlaybackResponse), [&](sys::Message *msg) { diff --git a/module-audio/Audio/AudioCommon.cpp b/module-audio/Audio/AudioCommon.cpp index ab4d4c1f6..049c89133 100644 --- a/module-audio/Audio/AudioCommon.cpp +++ b/module-audio/Audio/AudioCommon.cpp @@ -61,6 +61,11 @@ namespace audio return false; } + const std::string dbPath(const DbPathElement &element) + { + return dbPath(element.setting, element.playbackType, element.profileType, element.phoneMode); + } + const std::string dbPath(const Setting &setting, const PlaybackType &playbackType, const Profile::Type &profileType, diff --git a/module-audio/Audio/AudioCommon.hpp b/module-audio/Audio/AudioCommon.hpp index 53af48db3..cc59e80c3 100644 --- a/module-audio/Audio/AudioCommon.hpp +++ b/module-audio/Audio/AudioCommon.hpp @@ -61,10 +61,20 @@ namespace audio Last = Alarm, }; + struct DbPathElement + { + Setting setting; + PlaybackType playbackType; + Profile::Type profileType; + std::optional phoneMode = std::nullopt; + }; + [[nodiscard]] const std::string str(const PlaybackType &playbackType) noexcept; [[nodiscard]] const std::string str(const Setting &setting) noexcept; + [[nodiscard]] const std::string dbPath(const DbPathElement &element); + [[nodiscard]] const std::string dbPath(const Setting &setting, const PlaybackType &playbackType, const Profile::Type &profileType, diff --git a/module-audio/Audio/decoder/DecoderWorker.cpp b/module-audio/Audio/decoder/DecoderWorker.cpp index 8275c1c54..f8c275457 100644 --- a/module-audio/Audio/decoder/DecoderWorker.cpp +++ b/module-audio/Audio/decoder/DecoderWorker.cpp @@ -5,7 +5,7 @@ #include "Audio/decoder/Decoder.hpp" audio::DecoderWorker::DecoderWorker(Stream *audioStreamOut, Decoder *decoder, EndOfFileCallback endOfFileCallback) - : sys::Worker(DecoderWorker::workerName, DecoderWorker::workerPriority), audioStreamOut(audioStreamOut), + : sys::Worker(DecoderWorker::workerName, DecoderWorker::workerPriority, stackDepth), audioStreamOut(audioStreamOut), decoder(decoder), endOfFileCallback(endOfFileCallback), bufferSize(audioStreamOut->getBlockSize() / sizeof(BufferInternalType)) {} diff --git a/module-audio/Audio/decoder/DecoderWorker.hpp b/module-audio/Audio/decoder/DecoderWorker.hpp index c2556e31a..1b5a232f4 100644 --- a/module-audio/Audio/decoder/DecoderWorker.hpp +++ b/module-audio/Audio/decoder/DecoderWorker.hpp @@ -30,6 +30,8 @@ namespace audio auto disablePlayback() -> bool; private: + static constexpr std::size_t stackDepth = 2 * 1024; + virtual auto handleMessage(uint32_t queueID) -> bool override; void pushAudioData(); bool stateChangeWait(); diff --git a/module-audio/Audio/decoder/dr_flac.h b/module-audio/Audio/decoder/dr_flac.h index 9f82c1006..cbf01138d 100644 --- a/module-audio/Audio/decoder/dr_flac.h +++ b/module-audio/Audio/decoder/dr_flac.h @@ -4877,8 +4877,13 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, drflac__init_cpu_caps(); #endif - drflac_init_info init; - if (!drflac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { + drflac_init_info *init = (drflac_init_info *)DRFLAC_MALLOC(sizeof(drflac_init_info)); + if (init == NULL) { + return NULL; + } + + if (!drflac__init_private(init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { + DRFLAC_FREE(init); return NULL; } @@ -4894,40 +4899,40 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, // The allocation size for decoded frames depends on the number of 32-bit integers that fit inside the largest SIMD // vector we are supporting. drflac_uint32 wholeSIMDVectorCountPerChannel; - if ((init.maxBlockSize % (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) == 0) { - wholeSIMDVectorCountPerChannel = (init.maxBlockSize / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))); + if ((init->maxBlockSize % (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) == 0) { + wholeSIMDVectorCountPerChannel = (init->maxBlockSize / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))); } else { - wholeSIMDVectorCountPerChannel = (init.maxBlockSize / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) + 1; + wholeSIMDVectorCountPerChannel = (init->maxBlockSize / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) + 1; } drflac_uint32 decodedSamplesAllocationSize = - wholeSIMDVectorCountPerChannel * DRFLAC_MAX_SIMD_VECTOR_SIZE * init.channels; + wholeSIMDVectorCountPerChannel * DRFLAC_MAX_SIMD_VECTOR_SIZE * init->channels; allocationSize += decodedSamplesAllocationSize; allocationSize += DRFLAC_MAX_SIMD_VECTOR_SIZE; // Allocate extra bytes to ensure we have enough for alignment. #ifndef DR_FLAC_NO_OGG // There's additional data required for Ogg streams. - if (init.container == drflac_container_ogg) { + if (init->container == drflac_container_ogg) { allocationSize += sizeof(drflac_oggbs); } #endif drflac *pFlac = (drflac *)DRFLAC_MALLOC(allocationSize); - drflac__init_from_info(pFlac, &init); + drflac__init_from_info(pFlac, init); pFlac->pDecodedSamples = (drflac_int32 *)drflac_align((size_t)pFlac->pExtraData, DRFLAC_MAX_SIMD_VECTOR_SIZE); #ifndef DR_FLAC_NO_OGG - if (init.container == drflac_container_ogg) { + if (init->container == drflac_container_ogg) { drflac_oggbs *oggbs = (drflac_oggbs *)((drflac_uint8 *)pFlac->pDecodedSamples + decodedSamplesAllocationSize); oggbs->onRead = onRead; oggbs->onSeek = onSeek; oggbs->pUserData = pUserData; - oggbs->currentBytePos = init.oggFirstBytePos; - oggbs->firstBytePos = init.oggFirstBytePos; - oggbs->serialNumber = init.oggSerial; - oggbs->bosPageHeader = init.oggBosHeader; + oggbs->currentBytePos = init->oggFirstBytePos; + oggbs->firstBytePos = init->oggFirstBytePos; + oggbs->serialNumber = init->oggSerial; + oggbs->bosPageHeader = init->oggBosHeader; oggbs->bytesRemainingInPage = 0; // The Ogg bistream needs to be layered on top of the original bitstream. @@ -4939,8 +4944,9 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, #endif // Decode metadata before returning. - if (init.hasMetadataBlocks) { + if (init->hasMetadataBlocks) { if (!drflac__read_and_decode_metadata(pFlac)) { + DRFLAC_FREE(init); DRFLAC_FREE(pFlac); return NULL; } @@ -4948,8 +4954,8 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, // If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to // decode the first frame. - if (!init.hasStreamInfoBlock) { - pFlac->currentFrame.header = init.firstFrameHeader; + if (!init->hasStreamInfoBlock) { + pFlac->currentFrame.header = init->firstFrameHeader; do { drflac_result result = drflac__decode_frame(pFlac); if (result == DRFLAC_SUCCESS) { @@ -4960,11 +4966,13 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, if (!drflac__read_next_frame_header( &pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { DRFLAC_FREE(pFlac); + DRFLAC_FREE(init); return NULL; } continue; } else { + DRFLAC_FREE(init); DRFLAC_FREE(pFlac); return NULL; } @@ -4972,7 +4980,7 @@ drflac *drflac_open_with_metadata_private(drflac_read_proc onRead, } while (1); } - // M.P: Preallocated scratch buffer used during decoding in order to save on stack usage + DRFLAC_FREE(init); pFlac->scratchBuffer = (drflac_int32 *)DRFLAC_MALLOC(4096 * sizeof(drflac_int32)); return pFlac; @@ -5656,7 +5664,7 @@ drflac_bool32 drflac_seek_to_sample(drflac *pFlac, drflac_uint64 sampleIndex) } \ \ /* At this point everything should be decoded, but we just want to fill the unused part buffer with \ - silence - need to protect those ears from random noise! */ \ + silence - need to protect those ears from random noise! */ \ drflac_zero_memory(pSampleData + totalSampleCount, \ (size_t)(sampleDataBufferSize - totalSampleCount * sizeof(type))); \ } \ diff --git a/module-services/service-audio/ServiceAudio.cpp b/module-services/service-audio/ServiceAudio.cpp index 52e93f14d..038694c14 100644 --- a/module-services/service-audio/ServiceAudio.cpp +++ b/module-services/service-audio/ServiceAudio.cpp @@ -12,11 +12,146 @@ #include #include +#include +#include +#include #include +#include using namespace audio; +using namespace sys::phone_modes; -inline constexpr auto audioServiceStackSize = 1024 * 13; +inline constexpr auto audioServiceStackSize = 1024 * 4; + +static constexpr auto defaultVolumeHigh = "10"; +static constexpr auto defaultVolumeLow = "2"; +static constexpr auto defaultVolumeMuted = "0"; +static constexpr auto defaultTrue = "1"; +static constexpr auto defaultFalse = "0"; + +static constexpr std::initializer_list> cacheInitializer{ + + // PLAYBACK + {DbPathElement{Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackHeadphones}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackBluetoothA2DP}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackLoudspeaker}, defaultVolumeHigh}, + + {DbPathElement{Setting::Volume, PlaybackType::System, Profile::Type::PlaybackHeadphones}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::System, Profile::Type::PlaybackBluetoothA2DP}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::System, Profile::Type::PlaybackLoudspeaker}, defaultVolumeHigh}, + + {DbPathElement{Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackHeadphones}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackBluetoothA2DP}, defaultVolumeLow}, + {DbPathElement{Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackLoudspeaker}, defaultVolumeHigh}, + + // ROUTING + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RoutingBluetoothHSP}, "20"}, + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RoutingEarspeaker}, "3"}, + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RoutingLoudspeaker}, "10"}, + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RoutingHeadphones}, "0"}, + + {DbPathElement{Setting::Volume, PlaybackType::None, Profile::Type::RoutingBluetoothHSP}, defaultVolumeHigh}, + {DbPathElement{Setting::Volume, PlaybackType::None, Profile::Type::RoutingEarspeaker}, defaultVolumeHigh}, + {DbPathElement{Setting::Volume, PlaybackType::None, Profile::Type::RoutingHeadphones}, defaultVolumeHigh}, + {DbPathElement{Setting::Volume, PlaybackType::None, Profile::Type::RoutingLoudspeaker}, defaultVolumeHigh}, + + // RECORDING + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RecordingBuiltInMic}, "200"}, + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RecordingHeadphones}, "100"}, + {DbPathElement{Setting::Gain, PlaybackType::None, Profile::Type::RecordingBluetoothHSP}, "100"}, + + // MISC + {DbPathElement{Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Connected}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Connected}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{ + Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Connected}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle}, defaultTrue}, + + {DbPathElement{Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{ + Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultTrue}, + + {DbPathElement{Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{ + Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Offline}, + defaultTrue}, + + {DbPathElement{Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Connected}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Connected}, defaultTrue}, + + {DbPathElement{Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{ + Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::DoNotDisturb}, + defaultTrue}, + + {DbPathElement{Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Offline}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Offline}, + defaultFalse}, + {DbPathElement{Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Offline}, + defaultTrue}, + {DbPathElement{Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Offline}, defaultTrue}, +}; ServiceAudio::ServiceAudio() : sys::Service(service::name::audio, "", audioServiceStackSize, sys::ServicePriority::Idle), @@ -41,130 +176,10 @@ ServiceAudio::~ServiceAudio() sys::ReturnCodes ServiceAudio::InitHandler() { - static const std::string defaultVolumeHigh = "10"; - static const std::string defaultVolumeLow = "2"; - static const std::string defaultVolumeMuted = "0"; - static const std::string defaultTrue = "1"; - static const std::string defaultFalse = "0"; - - using namespace sys::phone_modes; - - settingsCache = { - - // PLAYBACK - {dbPath(Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackHeadphones), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackBluetoothA2DP), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::Multimedia, Profile::Type::PlaybackLoudspeaker), defaultVolumeHigh}, - - {dbPath(Setting::Volume, PlaybackType::System, Profile::Type::PlaybackHeadphones), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::System, Profile::Type::PlaybackBluetoothA2DP), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::System, Profile::Type::PlaybackLoudspeaker), defaultVolumeHigh}, - - {dbPath(Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackHeadphones), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackBluetoothA2DP), defaultVolumeLow}, - {dbPath(Setting::Volume, PlaybackType::Alarm, Profile::Type::PlaybackLoudspeaker), defaultVolumeHigh}, - - // ROUTING - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RoutingBluetoothHSP), "20"}, - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RoutingEarspeaker), "3"}, - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RoutingLoudspeaker), "10"}, - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RoutingHeadphones), "0"}, - - {dbPath(Setting::Volume, PlaybackType::None, Profile::Type::RoutingBluetoothHSP), defaultVolumeHigh}, - {dbPath(Setting::Volume, PlaybackType::None, Profile::Type::RoutingEarspeaker), defaultVolumeHigh}, - {dbPath(Setting::Volume, PlaybackType::None, Profile::Type::RoutingHeadphones), defaultVolumeHigh}, - {dbPath(Setting::Volume, PlaybackType::None, Profile::Type::RoutingLoudspeaker), defaultVolumeHigh}, - - // RECORDING - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RecordingBuiltInMic), "200"}, - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RecordingHeadphones), "100"}, - {dbPath(Setting::Gain, PlaybackType::None, Profile::Type::RecordingBluetoothHSP), "100"}, - - // MISC - {dbPath(Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Connected), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Connected), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Connected), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle), defaultTrue}, - - {dbPath(Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath( - Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultTrue}, - - {dbPath(Setting::EnableVibration, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableVibration, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Offline), defaultTrue}, - - {dbPath(Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Connected), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Connected), defaultTrue}, - - {dbPath(Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::DoNotDisturb), - defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::DoNotDisturb), defaultTrue}, - - {dbPath(Setting::EnableSound, PlaybackType::Multimedia, Profile::Type::Idle, PhoneMode::Offline), defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Notifications, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::KeypadSound, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::CallRingtone, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::TextMessageRingtone, Profile::Type::Idle, PhoneMode::Offline), - defaultFalse}, - {dbPath(Setting::EnableSound, PlaybackType::Meditation, Profile::Type::Idle, PhoneMode::Offline), defaultTrue}, - {dbPath(Setting::EnableSound, PlaybackType::Alarm, Profile::Type::Idle, PhoneMode::Offline), defaultTrue}, - }; + std::transform(std::begin(cacheInitializer), + std::end(cacheInitializer), + std::inserter(settingsCache, std::end(settingsCache)), + [](auto &el) { return std::make_pair(dbPath(el.first), el.second); }); for (const auto &setting : settingsCache) { settingsProvider->registerValueChange( @@ -479,8 +494,8 @@ auto ServiceAudio::HandleKeyPressed(const int step) -> std::unique_ptr(getSetting(Setting::Volume, Profile::Type::Idle, PlaybackType::None));