~aleteoryx/muditaos

cf75cfc01250ea019aabfa22f59d9c2bb8c1afb7 — Marcin Smoczyński 4 years ago 0f41447
[EGD-5973] Reduce audio stack usage

Verify stack usage of:
 - ServiceAudio
 - application music player
 - decoder worker
Change if possible to a realistic value keeping a 30% margin.
Stack usage reduction is limited due to an extensive stack usage of
every call to the filesystem, which uses around 2 kB of stack.

Signed-off-by: Marcin Smoczyński <smoczynski.marcin@gmail.com>
M module-apps/application-music-player/ApplicationMusicPlayer.cpp => module-apps/application-music-player/ApplicationMusicPlayer.cpp +3 -1
@@ 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) {

M module-audio/Audio/AudioCommon.cpp => module-audio/Audio/AudioCommon.cpp +5 -0
@@ 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,

M module-audio/Audio/AudioCommon.hpp => module-audio/Audio/AudioCommon.hpp +10 -0
@@ 61,10 61,20 @@ namespace audio
        Last = Alarm,
    };

    struct DbPathElement
    {
        Setting setting;
        PlaybackType playbackType;
        Profile::Type profileType;
        std::optional<sys::phone_modes::PhoneMode> 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,

M module-audio/Audio/decoder/DecoderWorker.cpp => module-audio/Audio/decoder/DecoderWorker.cpp +1 -1
@@ 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))
{}

M module-audio/Audio/decoder/DecoderWorker.hpp => module-audio/Audio/decoder/DecoderWorker.hpp +2 -0
@@ 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();

M module-audio/Audio/decoder/dr_flac.h => module-audio/Audio/decoder/dr_flac.h +26 -18
@@ 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)));                      \
        }                                                                                                              \

M module-services/service-audio/ServiceAudio.cpp => module-services/service-audio/ServiceAudio.cpp +143 -128
@@ 12,11 12,146 @@
#include <service-db/Settings.hpp>
#include <service-evtmgr/EventManagerServiceAPI.hpp>

#include <algorithm>
#include <initializer_list>
#include <iterator>
#include <type_traits>
#include <utility>

using namespace audio;

inline constexpr auto audioServiceStackSize = 1024 * 13;
using namespace sys::phone_modes;

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<std::pair<audio::DbPathElement, const char *>> 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<AudioKeyP
{

    // mute if 0 and return with parameter shouldn't popup
    bool muted         = false;
    auto context       = getCurrentContext();
    bool muted   = false;
    auto context = getCurrentContext();

    const auto currentVolume =
        utils::getNumericValue<int>(getSetting(Setting::Volume, Profile::Type::Idle, PlaybackType::None));