diff options
Diffstat (limited to 'src/audio/devices.cpp')
-rw-r--r-- | src/audio/devices.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/audio/devices.cpp b/src/audio/devices.cpp new file mode 100644 index 0000000..dfb7164 --- /dev/null +++ b/src/audio/devices.cpp @@ -0,0 +1,121 @@ +#ifdef WITH_VOICE + +// clang-format off + +#include "devices.hpp" +#include <cstring> +#include <spdlog/spdlog.h> + +// clang-format on + +AudioDevices::AudioDevices() + : m_playback(Gtk::ListStore::create(m_playback_columns)) + , m_capture(Gtk::ListStore::create(m_capture_columns)) { +} + +Glib::RefPtr<Gtk::ListStore> AudioDevices::GetPlaybackDeviceModel() { + return m_playback; +} + +Glib::RefPtr<Gtk::ListStore> AudioDevices::GetCaptureDeviceModel() { + return m_capture; +} + +void AudioDevices::SetDevices(ma_device_info *pPlayback, ma_uint32 playback_count, ma_device_info *pCapture, ma_uint32 capture_count) { + m_playback->clear(); + + for (ma_uint32 i = 0; i < playback_count; i++) { + auto &d = pPlayback[i]; + + auto row = *m_playback->append(); + row[m_playback_columns.Name] = d.name; + row[m_playback_columns.DeviceID] = d.id; + + if (d.isDefault) { + m_default_playback_iter = row; + SetActivePlaybackDevice(row); + } + } + + m_capture->clear(); + + for (ma_uint32 i = 0; i < capture_count; i++) { + auto &d = pCapture[i]; + + auto row = *m_capture->append(); + row[m_capture_columns.Name] = d.name; + row[m_capture_columns.DeviceID] = d.id; + + if (d.isDefault) { + m_default_capture_iter = row; + SetActiveCaptureDevice(row); + } + } + + if (!m_default_playback_iter) { + spdlog::get("audio")->warn("No default playback device found"); + } + + if (!m_default_capture_iter) { + spdlog::get("audio")->warn("No default capture device found"); + } +} + +std::optional<ma_device_id> AudioDevices::GetPlaybackDeviceIDFromModel(const Gtk::TreeModel::iterator &iter) const { + if (iter) { + return static_cast<ma_device_id>((*iter)[m_playback_columns.DeviceID]); + } + + return std::nullopt; +} + +std::optional<ma_device_id> AudioDevices::GetCaptureDeviceIDFromModel(const Gtk::TreeModel::iterator &iter) const { + if (iter) { + return static_cast<ma_device_id>((*iter)[m_capture_columns.DeviceID]); + } + + return std::nullopt; +} + +std::optional<ma_device_id> AudioDevices::GetDefaultPlayback() const { + if (m_default_playback_iter) { + return static_cast<ma_device_id>((*m_default_playback_iter)[m_playback_columns.DeviceID]); + } + + return std::nullopt; +} + +std::optional<ma_device_id> AudioDevices::GetDefaultCapture() const { + if (m_default_capture_iter) { + return static_cast<ma_device_id>((*m_default_capture_iter)[m_capture_columns.DeviceID]); + } + + return std::nullopt; +} + +void AudioDevices::SetActivePlaybackDevice(const Gtk::TreeModel::iterator &iter) { + m_active_playback_iter = iter; +} + +void AudioDevices::SetActiveCaptureDevice(const Gtk::TreeModel::iterator &iter) { + m_active_capture_iter = iter; +} + +Gtk::TreeModel::iterator AudioDevices::GetActivePlaybackDevice() { + return m_active_playback_iter; +} + +Gtk::TreeModel::iterator AudioDevices::GetActiveCaptureDevice() { + return m_active_capture_iter; +} + +AudioDevices::PlaybackColumns::PlaybackColumns() { + add(Name); + add(DeviceID); +} + +AudioDevices::CaptureColumns::CaptureColumns() { + add(Name); + add(DeviceID); +} +#endif |