~aleteoryx/muditaos

d7617b2f3c006cbfdc4eecdd0e537f4b0b0ce9d9 — Jakub Pyszczak 5 years ago 4942167
[EGD-3487] Volume buttons
M changelog.md => changelog.md +1 -0
@@ 5,6 5,7 @@
### Added

* `[GUI]` Added rich text parsing for full text styling needs
* `[Audio]` New volume buttons features

### Other


M module-apps/Application.cpp => module-apps/Application.cpp +6 -4
@@ 513,12 513,14 @@ namespace app

    bool Application::adjustCurrentVolume(const int step)
    {
        audio::Volume vol;
        auto ret = AudioServiceAPI::GetOutputVolume(this, vol);
        audio::Volume volume;
        auto ret = AudioServiceAPI::GetSetting(this, audio::Setting::Volume, volume);
        if (ret == audio::RetCode::Success) {
            ret = ((static_cast<int>(vol) + step) < 0) ? audio::RetCode::Success
                                                       : AudioServiceAPI::SetOutputVolume(this, vol + step);
            ret = ((static_cast<int>(volume) + step) < 0)
                      ? audio::RetCode::Success
                      : AudioServiceAPI::SetSetting(this, audio::Setting::Volume, volume + step);
        }

        return ret == audio::RetCode::Success;
    }


M module-apps/Application.hpp => module-apps/Application.hpp +1 -1
@@ 254,7 254,7 @@ namespace app
        }
        auto getCurrentVolume(audio::Volume &volume)
        {
            return AudioServiceAPI::GetOutputVolume(this, volume);
            return AudioServiceAPI::GetSetting(this, audio::Setting::Volume, volume);
        }

        void toggleTorchAndColourTemps()

M module-audio/Audio/Audio.cpp => module-audio/Audio/Audio.cpp +5 -0
@@ 149,4 149,9 @@ namespace audio
        return currentOperation->Resume();
    }

    audio::RetCode Audio::Mute()
    {
        return SetOutputVolume(0);
    }

} // namespace audio

M module-audio/Audio/Audio.hpp => module-audio/Audio/Audio.hpp +2 -0
@@ 75,6 75,8 @@ namespace audio

        audio::RetCode Resume();

        audio::RetCode Mute();

      private:
        bool headphonesInserted = false;
        State currentState = State::Idle;

M module-audio/Audio/Operation/Operation.hpp => module-audio/Audio/Operation/Operation.hpp +1 -1
@@ 116,7 116,7 @@ namespace audio
            return currentProfile;
        }

        audio::PlaybackType GetplaybackType() const noexcept
        audio::PlaybackType GetPlaybackType() const noexcept
        {
            return playbackType;
        }

M module-audio/Audio/Operation/PlaybackOperation.hpp => module-audio/Audio/Operation/PlaybackOperation.hpp +6 -0
@@ 4,6 4,12 @@

#include <bsp/audio/bsp_audio.hpp>

namespace audio::playbackDefaults
{
    constexpr audio::Volume defaultLoudspeakerVolume = 10;
    constexpr audio::Volume defaultHeadphonesVolume  = 2;
} // namespace audio::playbackDefaults

namespace audio
{
    class decoder;

M module-services/service-audio/ServiceAudio.cpp => module-services/service-audio/ServiceAudio.cpp +114 -15
@@ 9,11 9,20 @@

#include "ServiceAudio.hpp"
#include "messages/AudioMessage.hpp"
#include "Audio/Operation/IdleOperation.hpp"
#include "Audio/Operation/PlaybackOperation.hpp"

const char *ServiceAudio::serviceName = "ServiceAudio";

using namespace audio;

namespace audio::notifications
{
    constexpr std::array<audio::PlaybackType, 3> typesToMute = {audio::PlaybackType::Notifications,
                                                                audio::PlaybackType::CallRingtone,
                                                                audio::PlaybackType::TextMessageRingtone};
}

ServiceAudio::ServiceAudio()
    : sys::Service(serviceName, "", 4096 * 2, sys::ServicePriority::Idle),
      audio(


@@ 88,14 97,12 @@ sys::Message_t ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::Re
        }
    }
    else if (auto *msg = dynamic_cast<AudioGetSetting *>(msgl)) {
        const auto path = audio::str(msg->profileType, audio::Setting::Volume, msg->playbackType);
        const auto vol  = fetchAudioSettingFromDb<audio::Volume>(path, 0);
        responseMsg     = std::make_shared<AudioResponseMessage>(RetCode::Success, vol);
        auto value  = getSetting(msg->setting, msg->profileType, msg->playbackType);
        responseMsg = std::make_shared<AudioResponseMessage>(RetCode::Success, value);
    }
    else if (auto *msg = dynamic_cast<AudioSetSetting *>(msgl)) {
        setSetting(msg->setting, msg->val, msg->profileType, msg->playbackType);
        responseMsg     = std::make_shared<AudioResponseMessage>(RetCode::Success);
        const auto path = audio::str(msg->profileType, audio::Setting::Volume, msg->playbackType);
        updateDbValue(path, audio::Setting::Volume, msg->val);
    }
    else if (auto *msg = dynamic_cast<AudioRequestMessage *>(msgl)) {
        switch (msg->type) {


@@ 161,20 168,11 @@ sys::Message_t ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::Re
                audio.SendEvent(msg->enable ? Operation::Event::HeadphonesPlugin : Operation::Event::HeadphonesUnplug));
        } break;

        case MessageType::AudioSetOutputVolume: {
            responseMsg = std::make_shared<AudioResponseMessage>(audio.SetOutputVolume(msg->val));
            updateDbValue(audio.GetCurrentOperation(), audio::Setting::Volume, audio.GetOutputVolume());
        } break;

        case MessageType::AudioSetInputGain: {
            responseMsg = std::make_shared<AudioResponseMessage>(audio.SetInputGain(msg->val));
            updateDbValue(audio.GetCurrentOperation(), audio::Setting::Gain, audio.GetInputGain());
        } break;

        case MessageType::AudioGetOutputVolume: {
            responseMsg = std::make_shared<AudioResponseMessage>(RetCode::Success, audio.GetOutputVolume());
        } break;

        case MessageType::AudioGetInputGain: {
            responseMsg = std::make_shared<AudioResponseMessage>(RetCode::Success, audio.GetInputGain());
        } break;


@@ 216,6 214,107 @@ void ServiceAudio::updateDbValue(const audio::Operation *currentOperation,
        return;
    }

    auto dbPath = audio::str(currentProfile->GetType(), setting, currentOperation->GetplaybackType());
    auto dbPath = audio::str(currentProfile->GetType(), setting, currentOperation->GetPlaybackType());
    updateDbValue(dbPath, setting, value);
}

void ServiceAudio::setSetting(const audio::Setting &setting,
                              const uint32_t value,
                              const audio::Profile::Type &profileType,
                              const audio::PlaybackType &playbackType)
{
    if (profileType == Profile::Type::Idle) {
        setCurrentSetting(setting, value);
    }
    const auto path = audio::str(profileType, audio::Setting::Volume, playbackType);
    updateDbValue(path, audio::Setting::Volume, value);
}

uint32_t ServiceAudio::getSetting(const audio::Setting &setting,
                                  const audio::Profile::Type &profileType,
                                  const audio::PlaybackType &playbackType)
{
    if (profileType == audio::Profile::Type::Idle) {
        return getCurrentVolume();
    }
    const auto path = audio::str(profileType, setting, playbackType);
    return fetchAudioSettingFromDb<audio::Volume>(path, 0);
}

uint32_t ServiceAudio::getCurrentSetting(const audio::Setting &setting)
{
    switch (setting) {
    case audio::Setting::Volume:
        return getCurrentVolume();
    default:
        return {};
    }
}

audio::Volume ServiceAudio::getCurrentVolume()
{
    const auto currentOperation   = audio.GetCurrentOperation();
    const auto noOngoingOperation = [&currentOperation]() -> bool {
        return currentOperation == nullptr || currentOperation->GetState() == audio::Operation::State::Idle;
    };

    if (noOngoingOperation()) {
        const auto path =
            audio::str(audio::PlaybackType::CallRingtone, audio::Setting::Volume, audio.GetHeadphonesInserted());
        return fetchAudioSettingFromDb<audio::Volume>(path, 0);
    }
    else {
        const auto path = audio::str(
            currentOperation->GetProfile()->GetType(), audio::Setting::Volume, currentOperation->GetPlaybackType());
        return fetchAudioSettingFromDb<audio::Volume>(path, 0);
    }
}

void ServiceAudio::setCurrentSetting(const audio::Setting &setting, const int &step)
{
    switch (setting) {
    case audio::Setting::Volume:
        setCurrentVolume(step);
    default:
        break;
    }
}

void ServiceAudio::setCurrentVolume(const uint32_t &value)
{
    const auto currentOperation  = audio.GetCurrentOperation();
    const audio::Volume volToSet = std::clamp(value, minVolume, maxVolume);
    auto idleOperation           = dynamic_cast<const IdleOperation *>(currentOperation);

    const auto needsMuting = [&value](const audio::PlaybackType &currentPlaybackType,
                                      const audio::Volume &currentVolume) -> bool {
        auto res = std::find(std::begin(audio::notifications::typesToMute),
                             std::end(audio::notifications::typesToMute),
                             currentPlaybackType);
        return value < currentVolume && res != std::end(audio::notifications::typesToMute);
    };

    const auto noOngoingOperation = [&currentOperation, &idleOperation]() -> bool {
        return currentOperation == nullptr || idleOperation != nullptr ||
               currentOperation->GetState() == audio::Operation::State::Idle;
    };

    if (noOngoingOperation()) {
        const auto path =
            audio::str(audio::PlaybackType::CallRingtone, audio::Setting::Volume, audio.GetHeadphonesInserted());
        addOrIgnoreEntry(path, audio::playbackDefaults::defaultLoudspeakerVolume);
        updateDbValue(path, Setting::Volume, volToSet);
    }
    else {
        const auto currentPlaybackType = currentOperation->GetPlaybackType();
        const auto currentVolume       = currentOperation->GetOutputVolume();

        if (needsMuting(currentPlaybackType, currentVolume)) {
            audio.Mute();
        }
        else {
            audio.SetOutputVolume(volToSet);
            updateDbValue(currentOperation, audio::Setting::Volume, volToSet);
        }
    }
}

M module-services/service-audio/ServiceAudio.hpp => module-services/service-audio/ServiceAudio.hpp +11 -0
@@ 89,6 89,17 @@ class ServiceAudio : public sys::Service
        return defaultValue;
    }

    void setCurrentSetting(const audio::Setting &setting, const int &step);
    void setCurrentVolume(const uint32_t &value);
    void setSetting(const audio::Setting &setting,
                    const uint32_t value,
                    const audio::Profile::Type &profileType,
                    const audio::PlaybackType &playbackType);
    [[nodiscard]] uint32_t getSetting(const audio::Setting &setting,
                                      const audio::Profile::Type &profileType,
                                      const audio::PlaybackType &playbackType);
    [[nodiscard]] uint32_t getCurrentSetting(const audio::Setting &setting);
    [[nodiscard]] uint32_t getCurrentVolume();
    void updateDbValue(const std::string &path, const audio::Setting &setting, const uint32_t &value);
    void updateDbValue(const audio::Operation *currentOperation, const audio::Setting &setting, const uint32_t &value);
};

M module-services/service-audio/api/AudioServiceAPI.cpp => module-services/service-audio/api/AudioServiceAPI.cpp +23 -19
@@ 139,11 139,28 @@ namespace AudioServiceAPI
        return resp->retCode;
    }

    RetCode SetOutputVolume(sys::Service *serv, const Volume vol)
    audio::RetCode GetSetting(sys::Service *serv,
                              const audio::Setting &setting,
                              uint32_t &value,
                              const audio::Profile::Type &profileType,
                              const audio::PlaybackType &playbackType)
    {
        std::shared_ptr<AudioRequestMessage> msg =
            std::make_shared<AudioRequestMessage>(MessageType::AudioSetOutputVolume);
        msg->val = vol;
        auto msg  = std::make_shared<AudioGetSetting>(profileType, playbackType, setting);
        auto resp = SendAudioRequest(serv, msg);
        if (resp->retCode == RetCode::Success) {
            value = resp->val;
        }

        return resp->retCode;
    }

    audio::RetCode SetSetting(sys::Service *serv,
                              const audio::Setting &setting,
                              const uint32_t value,
                              const audio::Profile::Type &profileType,
                              const audio::PlaybackType &playbackType)
    {
        auto msg = std::make_shared<AudioSetSetting>(profileType, playbackType, setting, value);

        return SendAudioRequest(serv, msg)->retCode;
    }


@@ 153,7 170,7 @@ namespace AudioServiceAPI
                             const Profile::Type &profileType,
                             const audio::PlaybackType &playbackType)
    {
        auto msg = std::make_shared<AudioSetSetting>(profileType, playbackType, vol);
        auto msg = std::make_shared<AudioSetSetting>(profileType, playbackType, audio::Setting::Volume, vol);

        return SendAudioRequest(serv, msg)->retCode;
    }


@@ 163,20 180,7 @@ namespace AudioServiceAPI
                             const Profile::Type &profileType,
                             const audio::PlaybackType &playbackType)
    {
        auto msg  = std::make_shared<AudioGetSetting>(profileType, playbackType);
        auto resp = SendAudioRequest(serv, msg);
        if (resp->retCode == RetCode::Success) {
            vol = resp->val;
        }

        return resp->retCode;
    }

    RetCode GetOutputVolume(sys::Service *serv, Volume &vol)
    {
        std::shared_ptr<AudioRequestMessage> msg =
            std::make_shared<AudioRequestMessage>(MessageType::AudioGetOutputVolume);

        auto msg  = std::make_shared<AudioGetSetting>(profileType, playbackType, audio::Setting::Volume);
        auto resp = SendAudioRequest(serv, msg);
        if (resp->retCode == RetCode::Success) {
            vol = resp->val;

M module-services/service-audio/api/AudioServiceAPI.hpp => module-services/service-audio/api/AudioServiceAPI.hpp +30 -2
@@ 30,7 30,36 @@ namespace AudioServiceAPI
    audio::RetCode Pause(sys::Service *serv);
    audio::RetCode Resume(sys::Service *serv);
    std::optional<audio::Tags> GetFileTags(sys::Service *serv, const std::string &fileName);
    audio::RetCode SetOutputVolume(sys::Service *serv, const audio::Volume vol);
    // audio::RetCode AdjustVolume(sys::Service *serv, const int &step = 0);
    /*! @brief Gets settings. Current profile is taken by default.
     *
     * @param serv - requesting service.
     * @param setting - setting to be set eg. Gain, volume etc.
     * @param value - requested value.
     * @param profileType - selected profile type.
     * @param playbackType -  type of playback. Not used when profileType is different than playback.
     * @return           Standard service-api return code. Success if suitable.
     */
    audio::RetCode GetSetting(sys::Service *serv,
                              const audio::Setting &setting,
                              uint32_t &value,
                              const audio::Profile::Type &profileType = audio::Profile::Type::Idle,
                              const audio::PlaybackType &playbackType = audio::PlaybackType::None);
    /*! @brief Sets settings. Current profile is taken by default.
     *
     * @param serv - requesting service.
     * @param setting - setting to be set eg. Gain, volume etc.
     * @param value - value to be set.
     * @param profileType - selected profile type.
     * @param playbackType -  type of playback. Not used when profileType is different than playback.
     * @return           Standard service-api return code. Success if suitable.
     */
    audio::RetCode SetSetting(sys::Service *serv,
                              const audio::Setting &setting,
                              const uint32_t value,
                              const audio::Profile::Type &profileType = audio::Profile::Type::Idle,
                              const audio::PlaybackType &playbackType = audio::PlaybackType::None);

    /*! @brief Sets volume.
     *
     * @param serv - requesting service.


@@ 55,7 84,6 @@ namespace AudioServiceAPI
                             audio::Volume &vol,
                             const audio::Profile::Type &profileType,
                             const audio::PlaybackType &playbackType = audio::PlaybackType::None);
    audio::RetCode GetOutputVolume(sys::Service *serv, audio::Volume &vol);
    audio::RetCode SetInputGain(sys::Service *serv, const audio::Gain gain);
    audio::RetCode GetInputGain(sys::Service *serv, audio::Gain &gain);
}; // namespace AudioServiceAPI

M module-services/service-audio/messages/AudioMessage.hpp => module-services/service-audio/messages/AudioMessage.hpp +9 -4
@@ 55,22 55,26 @@ class AudioSettingsMessage : public AudioMessage
  public:
    AudioSettingsMessage(const audio::Profile::Type &profileType,
                         const audio::PlaybackType &playbackType,
                         const audio::Setting &setting,
                         const uint32_t &val = 0)
        : AudioMessage{}, profileType{profileType}, playbackType{playbackType}, val{val}
        : AudioMessage{}, profileType{profileType}, playbackType{playbackType}, setting{setting}, val{val}
    {}

    ~AudioSettingsMessage() override = default;

    audio::Profile::Type profileType = audio::Profile::Type::Idle;
    audio::PlaybackType playbackType = audio::PlaybackType::None;
    const audio::Setting setting;
    uint32_t val{};
};

class AudioGetSetting : public AudioSettingsMessage
{
  public:
    AudioGetSetting(const audio::Profile::Type &profileType, const audio::PlaybackType &playbackType)
        : AudioSettingsMessage{profileType, playbackType}
    AudioGetSetting(const audio::Profile::Type &profileType,
                    const audio::PlaybackType &playbackType,
                    const audio::Setting &setting)
        : AudioSettingsMessage{profileType, playbackType, setting}
    {}

    ~AudioGetSetting() override = default;


@@ 81,8 85,9 @@ class AudioSetSetting : public AudioSettingsMessage
  public:
    AudioSetSetting(const audio::Profile::Type &profileType,
                    const audio::PlaybackType &playbackType,
                    const audio::Setting &setting,
                    const uint32_t &val)
        : AudioSettingsMessage{profileType, playbackType, val}
        : AudioSettingsMessage{profileType, playbackType, setting, val}
    {}

    ~AudioSetSetting() override = default;

M source/MessageType.hpp => source/MessageType.hpp +0 -2
@@ 137,9 137,7 @@ enum class MessageType
    AudioRoutingSpeakerhone,
    AudioRoutingHeadset,

    AudioSetOutputVolume,
    AudioSetInputGain,
    AudioGetOutputVolume,
    AudioGetInputGain,
    AudioGetFileTags,