From 61f8c666fea0ccd6c2637be4d1bd6aa875b65926 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 4 May 2025 23:23:36 +0200 Subject: Separate audio into output and input --- src/Utils.cpp | 5 +++++ src/gui/ComboBox.cpp | 2 +- src/gui/SettingsPage.cpp | 57 +++++++++++++++++++++++++++++++++--------------- 3 files changed, 46 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/Utils.cpp b/src/Utils.cpp index bc7b1f2..f23a330 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -27,6 +27,11 @@ namespace gsr { return str.size() >= len && memcmp(str.data(), substr, len) == 0; } + bool ends_with(std::string_view str, const char *substr) { + size_t len = strlen(substr); + return str.size() >= len && memcmp(str.data() + str.size() - len, substr, len) == 0; + } + std::string get_home_dir() { const char *home_dir = getenv("HOME"); if(!home_dir) { diff --git a/src/gui/ComboBox.cpp b/src/gui/ComboBox.cpp index dbe9aa0..4287a53 100644 --- a/src/gui/ComboBox.cpp +++ b/src/gui/ComboBox.cpp @@ -85,7 +85,7 @@ namespace gsr { void ComboBox::add_item(const std::string &text, const std::string &id) { items.push_back({mgl::Text(text, *font), id, {0.0f, 0.0f}}); - items.back().text.set_max_width(font->get_character_size() * 22); // TODO: Make a proper solution + items.back().text.set_max_width(font->get_character_size() * 20); // TODO: Make a proper solution //items.back().text.set_max_rows(1); dirty = true; } diff --git a/src/gui/SettingsPage.cpp b/src/gui/SettingsPage.cpp index b457ab4..38e43cc 100644 --- a/src/gui/SettingsPage.cpp +++ b/src/gui/SettingsPage.cpp @@ -196,10 +196,20 @@ namespace gsr { return std::make_unique("Record area", std::move(ll), mgl::vec2f(settings_scrollable_page_ptr->get_inner_size().x, 0.0f)); } - std::unique_ptr SettingsPage::create_audio_device_selection_combobox() { + static bool audio_device_is_output(const std::string &audio_device_id) { + return audio_device_id == "default_output" || ends_with(audio_device_id, ".monitor"); + } + + std::unique_ptr SettingsPage::create_audio_device_selection_combobox(AudioDeviceType device_type) { auto audio_device_box = std::make_unique(&get_theme().body_font); for(const auto &audio_device : audio_devices) { - audio_device_box->add_item(audio_device.description, audio_device.name); + const bool device_is_output = audio_device_is_output(audio_device.name); + if((device_type == AudioDeviceType::OUTPUT && device_is_output) || (device_type == AudioDeviceType::INPUT && !device_is_output)) { + std::string description = audio_device.description; + if(starts_with(description, "Monitor of ")) + description.erase(0, 11); + audio_device_box->add_item(description, audio_device.name); + } } return audio_device_box; } @@ -211,7 +221,7 @@ namespace gsr { List *audio_track_items_list = dynamic_cast(audio_track_subsection->get_inner_widget()); List *buttons_list = dynamic_cast(audio_track_items_list->get_child_widget_by_index(1)); - Button *add_application_audio_button = dynamic_cast(buttons_list->get_child_widget_by_index(1)); + Button *add_application_audio_button = dynamic_cast(buttons_list->get_child_widget_by_index(2)); add_application_audio_button->set_visible(visible); CheckBox *invert_app_audio_checkbox = dynamic_cast(audio_track_items_list->get_child_widget_by_index(3)); @@ -236,11 +246,11 @@ namespace gsr { return remove_audio_track_button; } - std::unique_ptr SettingsPage::create_audio_device(List *audio_input_list_ptr) { + std::unique_ptr SettingsPage::create_audio_device(AudioDeviceType device_type, List *audio_input_list_ptr) { auto audio_device_list = std::make_unique(List::Orientation::HORIZONTAL, List::Alignment::CENTER); audio_device_list->userdata = (void*)(uintptr_t)AudioTrackType::DEVICE; - audio_device_list->add_widget(std::make_unique