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 = [¤tOperation]() -> 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 ¤tPlaybackType,
+ const audio::Volume ¤tVolume) -> 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 = [¤tOperation, &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,