Show warning when adding output device and application audio at the same time

This commit is contained in:
dec05eba
2026-01-18 16:05:37 +01:00
parent 86424607b7
commit aa717a95ec
3 changed files with 58 additions and 4 deletions

2
TODO
View File

@@ -256,6 +256,4 @@ Add kick streaming option (add /app at the end of the url).
The flatpak version can for some get stuck at shutdown when instant replay is running. It only happens in the flatpak version and only when instant replay is running and it happens always. Manual SIGINT on gsr-ui stops gsr-ui properly, so why does it fail when shutting down the computer when the systemd stop signal is SIGINT? Maybe its related to the flatpak version being launched through gsr-gtk. I cant personally reproduce it.
Show warning in the UI (with a warning icon) when adding audio output device and application audio in the same audio track.
Redesign the UI to allow capturing multiple video sources. Move webcam to capture sources as well then. Maybe design the UI to work more like obs studio then, where you start recording and then add sources at capture time, with a preview.

View File

@@ -76,6 +76,7 @@ namespace gsr {
std::unique_ptr<Button> create_remove_audio_device_button(List *audio_input_list_ptr, List *audio_device_list_ptr);
std::unique_ptr<List> create_audio_device(AudioDeviceType device_type, List *audio_input_list_ptr);
std::unique_ptr<Button> create_add_audio_track_button();
void update_application_audio_warning_visibility();
std::unique_ptr<Button> create_add_audio_output_device_button(List *audio_input_list_ptr);
std::unique_ptr<Button> create_add_audio_input_device_button(List *audio_input_list_ptr);
std::unique_ptr<ComboBox> create_application_audio_selection_combobox(List *application_audio_row);
@@ -85,6 +86,7 @@ namespace gsr {
std::unique_ptr<List> create_add_audio_buttons(List *audio_input_list_ptr);
std::unique_ptr<List> create_audio_input_section();
std::unique_ptr<CheckBox> create_application_audio_invert_checkbox();
std::unique_ptr<Widget> create_application_audio_warning();
std::unique_ptr<List> create_audio_track_title_and_remove(Subsection *audio_track_subsection, const char *title);
std::unique_ptr<Subsection> create_audio_track_section(Widget *parent_widget);
std::unique_ptr<List> create_audio_track_section_list();

View File

@@ -460,8 +460,9 @@ namespace gsr {
auto remove_audio_track_button = std::make_unique<Button>(&get_theme().body_font, "", mgl::vec2f(0.0f, 0.0f), mgl::Color(0, 0, 0, 0));
remove_audio_track_button->set_icon(&get_theme().trash_texture);
remove_audio_track_button->set_icon_padding_scale(0.75f);
remove_audio_track_button->on_click = [audio_input_list_ptr, audio_device_list_ptr]() {
remove_audio_track_button->on_click = [this, audio_input_list_ptr, audio_device_list_ptr]() {
audio_input_list_ptr->remove_widget(audio_device_list_ptr);
update_application_audio_warning_visibility();
};
return remove_audio_track_button;
}
@@ -484,11 +485,47 @@ namespace gsr {
return button;
}
void SettingsPage::update_application_audio_warning_visibility() {
audio_track_section_list_ptr->for_each_child_widget([](std::unique_ptr<Widget> &child_widget) {
Subsection *audio_subsection = dynamic_cast<Subsection*>(child_widget.get());
List *audio_track_section_items_list_ptr = dynamic_cast<List*>(audio_subsection->get_inner_widget());
List *audio_input_list_ptr = dynamic_cast<List*>(audio_track_section_items_list_ptr->get_child_widget_by_index(2));
List *application_audio_warning_list_ptr = dynamic_cast<List*>(audio_track_section_items_list_ptr->get_child_widget_by_index(4));
int num_output_devices = 0;
int num_application_audio = 0;
audio_input_list_ptr->for_each_child_widget([&num_output_devices, &num_application_audio](std::unique_ptr<Widget> &child_widget){
List *audio_track_line = dynamic_cast<List*>(child_widget.get());
const AudioTrackType audio_track_type = (AudioTrackType)(uintptr_t)audio_track_line->userdata;
switch(audio_track_type) {
case AudioTrackType::DEVICE: {
Label *label = dynamic_cast<Label*>(audio_track_line->get_child_widget_by_index(0));
const bool is_output_device = starts_with(label->get_text().c_str(), "Output device");
if(is_output_device)
num_output_devices++;
break;
}
case AudioTrackType::APPLICATION:
case AudioTrackType::APPLICATION_CUSTOM: {
num_application_audio++;
break;
}
}
return true;
});
application_audio_warning_list_ptr->set_visible(num_output_devices > 0 && num_application_audio > 0);
return true;
});
}
std::unique_ptr<Button> SettingsPage::create_add_audio_output_device_button(List *audio_input_list_ptr) {
auto button = std::make_unique<Button>(&get_theme().body_font, "Add output device", mgl::vec2f(0.0f, 0.0f), mgl::Color(0, 0, 0, 120));
button->on_click = [this, audio_input_list_ptr]() {
audio_devices = get_audio_devices();
audio_input_list_ptr->add_widget(create_audio_device(AudioDeviceType::OUTPUT, audio_input_list_ptr));
update_application_audio_warning_visibility();
};
return button;
}
@@ -547,6 +584,8 @@ namespace gsr {
audio_input_list_ptr->add_widget(create_custom_application_audio(audio_input_list_ptr));
else
audio_input_list_ptr->add_widget(create_application_audio(audio_input_list_ptr));
update_application_audio_warning_visibility();
};
return add_audio_track_button;
}
@@ -571,6 +610,18 @@ namespace gsr {
return application_audio_invert_checkbox;
}
std::unique_ptr<Widget> SettingsPage::create_application_audio_warning() {
auto list = std::make_unique<List>(List::Orientation::HORIZONTAL);
list->set_spacing(0.003f);
list->set_visible(false);
const int font_character_size = get_theme().body_font.get_character_size();
list->add_widget(std::make_unique<Image>(&get_theme().warning_texture, mgl::vec2f(font_character_size, font_character_size), Image::ScaleBehavior::SCALE));
list->add_widget(std::make_unique<Label>(&get_theme().body_font, "Recording output devices and application audio may record all output audio, which is likely\nnot what you want to do. Remove the output devices.", get_color_theme().text_color));
return list;
}
static void update_audio_track_titles(List *audio_track_section_list_ptr) {
int index = 0;
audio_track_section_list_ptr->for_each_child_widget([&index](std::unique_ptr<Widget> &widget) {
@@ -618,6 +669,7 @@ namespace gsr {
list_ptr->add_widget(create_add_audio_buttons(audio_input_section_ptr));
list_ptr->add_widget(std::move(audio_input_section));
list_ptr->add_widget(create_application_audio_invert_checkbox());
list_ptr->add_widget(create_application_audio_warning());
set_application_audio_options_visible(subsection.get(), view_radio_button_ptr->get_selected_id() == "advanced", *gsr_info);
return subsection;
@@ -1097,7 +1149,7 @@ namespace gsr {
}
std::unique_ptr<Widget> SettingsPage::create_low_power_mode() {
auto list = std::make_unique<List>(List::Orientation::HORIZONTAL);
auto list = std::make_unique<List>(List::Orientation::HORIZONTAL, List::Alignment::CENTER);
auto checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Record in low-power mode");
checkbox->set_visible(gsr_info->gpu_info.vendor == GpuVendor::AMD);
@@ -1450,6 +1502,8 @@ namespace gsr {
auto audio_track_section = create_audio_track_section(audio_section_ptr);
audio_track_section_list_ptr->add_widget(std::move(audio_track_section));
}
update_application_audio_warning_visibility();
}
void SettingsPage::load_common(RecordOptions &record_options) {