mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-10-26 16:38:31 -04:00
229 lines
5.7 KiB
C++
229 lines
5.7 KiB
C++
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <bsp_audio.hpp>
|
|
|
|
#include "Profiles/Profile.hpp"
|
|
|
|
namespace audio
|
|
{
|
|
class AudioMux;
|
|
}
|
|
|
|
namespace audio
|
|
{
|
|
constexpr Volume defaultVolumeStep = 1;
|
|
constexpr Gain defaultGainStep = 10;
|
|
constexpr Volume defaultVolume = 5;
|
|
constexpr Gain defaultGain = 5;
|
|
|
|
constexpr Volume maxVolume = 10;
|
|
constexpr Volume minVolume = 0;
|
|
|
|
constexpr Gain maxGain = 100;
|
|
constexpr Gain minGain = 0;
|
|
|
|
constexpr uint32_t audioOperationTimeout = 1000;
|
|
|
|
static const std::string audioDbPrefix = "audio/";
|
|
|
|
enum class Setting
|
|
{
|
|
Volume,
|
|
Gain,
|
|
EnableVibration,
|
|
EnableSound
|
|
};
|
|
|
|
enum class PlaybackType
|
|
{
|
|
None,
|
|
Multimedia,
|
|
Notifications,
|
|
KeypadSound,
|
|
CallRingtone,
|
|
TextMessageRingtone,
|
|
Last = TextMessageRingtone,
|
|
};
|
|
|
|
const static std::map<PlaybackType, uint8_t> PlaybackTypePriority = {
|
|
{PlaybackType::CallRingtone, 2},
|
|
{PlaybackType::TextMessageRingtone, 3},
|
|
{PlaybackType::Notifications, 3},
|
|
{PlaybackType::Multimedia, 4},
|
|
{PlaybackType::KeypadSound, 5},
|
|
{PlaybackType::None, static_cast<uint8_t>(PlaybackType::Last)},
|
|
};
|
|
|
|
[[nodiscard]] const std::string str(const PlaybackType &playbackType) noexcept;
|
|
|
|
[[nodiscard]] const std::string str(const Setting &setting) noexcept;
|
|
|
|
[[nodiscard]] const std::string dbPath(const Setting &setting,
|
|
const PlaybackType &playbackType,
|
|
const Profile::Type &profileType);
|
|
|
|
enum class EventType
|
|
{
|
|
HeadphonesPlugin,
|
|
HeadphonesUnplug,
|
|
BTHeadsetOn,
|
|
BTHeadsetOff,
|
|
BTA2DPOn,
|
|
BTA2DPOff,
|
|
CallMute,
|
|
CallUnmute,
|
|
CallSpeakerphoneOn,
|
|
CallSpeakerphoneOff,
|
|
};
|
|
|
|
class Event
|
|
{
|
|
public:
|
|
explicit Event(EventType eType) : eventType(eType)
|
|
{}
|
|
virtual ~Event() = default;
|
|
|
|
EventType getType() const
|
|
{
|
|
return eventType;
|
|
}
|
|
|
|
private:
|
|
const EventType eventType;
|
|
};
|
|
|
|
enum class RetCode
|
|
{
|
|
Success = 0,
|
|
InvokedInIncorrectState,
|
|
UnsupportedProfile,
|
|
UnsupportedEvent,
|
|
InvalidFormat,
|
|
OperationCreateFailed,
|
|
FileDoesntExist,
|
|
FailedToAllocateMemory,
|
|
OperationNotSet,
|
|
ProfileNotSet,
|
|
DeviceFailure,
|
|
TokenNotFound,
|
|
Failed
|
|
};
|
|
|
|
class Token
|
|
{
|
|
using TokenType = int16_t;
|
|
|
|
public:
|
|
explicit Token(TokenType initValue = tokenUninitialized) : t(initValue)
|
|
{}
|
|
|
|
bool operator==(const Token &other) const noexcept
|
|
{
|
|
return other.t == t;
|
|
}
|
|
|
|
bool operator!=(const Token &other) const noexcept
|
|
{
|
|
return !(other.t == t);
|
|
}
|
|
|
|
/**
|
|
* Valid token is one connected with existing sequence of operations
|
|
* @return True if valid, false otherwise
|
|
*/
|
|
bool IsValid() const
|
|
{
|
|
return t > tokenUninitialized;
|
|
}
|
|
/**
|
|
* Bad token cannot be used anymore
|
|
* @return True if token is flagged bad
|
|
*/
|
|
bool IsBad() const
|
|
{
|
|
return t == tokenBad;
|
|
}
|
|
/**
|
|
* Uninitialized token can be used but it is not connected to any sequence of operations
|
|
* @return True if token is flagged uninitialized
|
|
*/
|
|
bool IsUninitialized() const
|
|
{
|
|
return t == tokenUninitialized;
|
|
}
|
|
/**
|
|
* Helper - returns bad Token
|
|
* @return Unusable bad Token
|
|
*/
|
|
static inline Token MakeBadToken()
|
|
{
|
|
return Token(tokenBad);
|
|
}
|
|
|
|
private:
|
|
static constexpr auto maxToken = std::numeric_limits<TokenType>::max();
|
|
Token IncrementToken()
|
|
{
|
|
t = (t == maxToken) ? 0 : t + 1;
|
|
return *this;
|
|
}
|
|
|
|
constexpr static TokenType tokenUninitialized = -1;
|
|
constexpr static TokenType tokenBad = -2;
|
|
|
|
TokenType t;
|
|
friend class ::audio::AudioMux;
|
|
};
|
|
|
|
class Handle
|
|
{
|
|
public:
|
|
Handle(const RetCode &retCode = RetCode::Failed, const Token &token = Token())
|
|
: lastRetCode(retCode), token(token)
|
|
{}
|
|
auto GetLastRetCode() -> RetCode
|
|
{
|
|
return lastRetCode;
|
|
}
|
|
auto GetToken() const -> const Token &
|
|
{
|
|
return token;
|
|
}
|
|
|
|
private:
|
|
RetCode lastRetCode;
|
|
Token token;
|
|
};
|
|
|
|
enum class PlaybackEventType
|
|
{
|
|
Empty,
|
|
EndOfFile,
|
|
FileSystemNoSpace
|
|
};
|
|
|
|
struct PlaybackEvent
|
|
{
|
|
PlaybackEventType event = PlaybackEventType::Empty;
|
|
audio::Token token = audio::Token::MakeBadToken();
|
|
};
|
|
|
|
typedef std::function<int32_t(PlaybackEvent e)> AsyncCallback;
|
|
typedef std::function<uint32_t(const std::string &path, const uint32_t &defaultValue)> DbCallback;
|
|
|
|
RetCode GetDeviceError(bsp::AudioDevice::RetCode retCode);
|
|
const std::string str(RetCode retcode);
|
|
[[nodiscard]] auto GetVolumeText(const audio::Volume &volume) -> const std::string;
|
|
} // namespace audio
|
|
|
|
namespace audio::notifications
|
|
{
|
|
const std::vector<audio::PlaybackType> typesToMute = {audio::PlaybackType::Notifications,
|
|
audio::PlaybackType::CallRingtone,
|
|
audio::PlaybackType::TextMessageRingtone};
|
|
} // namespace audio::notifications
|