diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-03-06 00:55:37 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-03-06 00:55:37 -0500 |
commit | 3ace5d26e91c6158f99398c7d7dc8b7cd219eb4f (patch) | |
tree | b3fb6cf2029271fcd5b78bdd5454e10b82029268 /src/audio | |
parent | 223181e74562a2322650d4c5fa2257a70ad6b3a3 (diff) | |
download | abaddon-portaudio-3ace5d26e91c6158f99398c7d7dc8b7cd219eb4f.tar.gz abaddon-portaudio-3ace5d26e91c6158f99398c7d7dc8b7cd219eb4f.zip |
add runtime option for selecting audio backend priority (voice only)
Diffstat (limited to 'src/audio')
-rw-r--r-- | src/audio/manager.cpp | 38 | ||||
-rw-r--r-- | src/audio/manager.hpp | 4 |
2 files changed, 39 insertions, 3 deletions
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 8f2a5a3..eaac3bf 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -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; diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp index f5b433f..5716fc5 100644 --- a/src/audio/manager.hpp +++ b/src/audio/manager.hpp @@ -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; |