1
0
mirror of https://github.com/uowuo/abaddon.git synced 2025-03-04 03:03:16 -05:00

add runtime option for selecting audio backend priority (voice only)

This commit is contained in:
ouwou 2024-03-06 00:55:37 -05:00
parent 223181e745
commit 3ace5d26e9
5 changed files with 43 additions and 4 deletions

View File

@ -36,7 +36,8 @@
Abaddon::Abaddon()
: m_settings(Platform::FindConfigFile())
, m_discord(GetSettings().UseMemoryDB) // stupid but easy
, m_emojis(GetResPath("/emojis.bin")) {
, m_emojis(GetResPath("/emojis.bin"))
, m_audio(GetSettings().Backends) {
LoadFromSettings();
// todo: set user agent for non-client(?)

View File

@ -85,7 +85,7 @@ void mgr_log_callback(void *pUserData, ma_uint32 level, const char *pMessage) {
g_free(msg);
}
AudioManager::AudioManager()
AudioManager::AudioManager(const Glib::ustring &backends_string)
: m_log(spdlog::stdout_color_mt("miniaudio")) {
m_ok = true;
@ -107,7 +107,19 @@ AudioManager::AudioManager()
auto ctx_cfg = ma_context_config_init();
ctx_cfg.pLog = &m_ma_log;
if (ma_context_init(nullptr, 0, &ctx_cfg, &m_context) != MA_SUCCESS) {
ma_backend *pBackends = nullptr;
ma_uint32 backendCount = 0;
std::vector<ma_backend> backends_vec;
if (!backends_string.empty()) {
spdlog::get("audio")->debug("Using backends list: {}", std::string(backends_string));
backends_vec = ParseBackendsList(backends_string);
pBackends = backends_vec.data();
backendCount = static_cast<ma_uint32>(backends_vec.size());
}
if (ma_context_init(pBackends, backendCount, &ctx_cfg, &m_context) != MA_SUCCESS) {
spdlog::get("audio")->error("failed to initialize context");
m_ok = false;
return;
@ -647,6 +659,28 @@ AudioManager::VADMethod AudioManager::GetVADMethod() const {
return m_vad_method;
}
std::vector<ma_backend> AudioManager::ParseBackendsList(const Glib::ustring &list) {
auto regex = Glib::Regex::create(";");
const std::vector<Glib::ustring> split = regex->split(list);
std::vector<ma_backend> backends;
for (const auto &s : split) {
if (s == "wasapi") backends.push_back(ma_backend_wasapi);
else if (s == "dsound") backends.push_back(ma_backend_dsound);
else if (s == "winmm") backends.push_back(ma_backend_winmm);
else if (s == "coreaudio") backends.push_back(ma_backend_coreaudio);
else if (s == "sndio") backends.push_back(ma_backend_sndio);
else if (s == "audio4") backends.push_back(ma_backend_audio4);
else if (s == "oss") backends.push_back(ma_backend_oss);
else if (s == "pulseaudio") backends.push_back(ma_backend_pulseaudio);
else if (s == "alsa") backends.push_back(ma_backend_alsa);
else if (s == "jack") backends.push_back(ma_backend_jack);
}
backends.push_back(ma_backend_null);
return backends;
}
#ifdef WITH_RNNOISE
float AudioManager::GetCurrentVADProbability() const {
return m_vad_prob;

View File

@ -25,7 +25,7 @@
class AudioManager {
public:
AudioManager();
AudioManager(const Glib::ustring &backends_string);
~AudioManager();
void AddSSRC(uint32_t ssrc);
@ -80,6 +80,8 @@ public:
void SetVADMethod(VADMethod method);
VADMethod GetVADMethod() const;
static std::vector<ma_backend> ParseBackendsList(const Glib::ustring &list);
#ifdef WITH_RNNOISE
float GetCurrentVADProbability() const;
double GetRNNProbThreshold() const;

View File

@ -126,6 +126,7 @@ void SettingsManager::DefineSettings() {
#else
AddSetting("voice", "vad", "gate"s, &Settings::VAD);
#endif
AddSetting("voice", "backends", ""s, &Settings::Backends);
}
void SettingsManager::ReadSettings() {

View File

@ -48,6 +48,7 @@ public:
// [voice]
std::string VAD;
std::string Backends;
// [windows]
bool HideConsole;