From 44b68f27873c5ff2aebfd728f4f7dd42278f7938 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Fri, 2 May 2025 19:16:41 +0200 Subject: [PATCH] Add option for enabling/disabling automatic device scan --- include/Menus/AudioMenu.hpp | 1 + include/audio_data.hpp | 5 +++++ source/Menus/AudioMenu.cpp | 9 +++++++++ source/WindowScreen_Menu.cpp | 3 +++ source/audio_data.cpp | 23 +++++++++++++++++++++++ source/cc3dsfs.cpp | 13 +------------ 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/include/Menus/AudioMenu.hpp b/include/Menus/AudioMenu.hpp index 163760e..32cc2ea 100755 --- a/include/Menus/AudioMenu.hpp +++ b/include/Menus/AudioMenu.hpp @@ -22,6 +22,7 @@ enum AudioMenuOutAction{ AUDIO_MENU_CHANGE_DEVICE, AUDIO_MENU_MODE_DEC, AUDIO_MENU_MODE_INC, + AUDIO_MENU_AUTO_SCAN, }; class AudioMenu : public OptionSelectionMenu { diff --git a/include/audio_data.hpp b/include/audio_data.hpp index 2b09869..dae338c 100755 --- a/include/audio_data.hpp +++ b/include/audio_data.hpp @@ -23,6 +23,7 @@ public: void change_audio_mode_output(bool is_change_positive); void change_audio_volume(bool is_change_positive); void change_audio_mute(); + void change_auto_device_scan(); void request_audio_restart(); void signal_conversion_error(); bool check_audio_restart_request(); @@ -35,6 +36,7 @@ public: bool has_text_to_print(); std::string text_to_print(); bool get_mute(); + bool get_auto_device_scan(); int get_real_volume(); bool load_audio_data(std::string key, std::string value); std::string save_audio_data(); @@ -49,6 +51,7 @@ private: AudioOutputType output_type; audio_output_device_data output_device; AudioMode mode_output; + bool periodic_output_audio_device_scan; bool restart_request = false; bool text_updated; std::string text; @@ -56,6 +59,7 @@ private: void set_audio_output_type(int new_value); void set_audio_mode_output(int new_value); void set_audio_mute(bool new_mute); + void set_auto_device_scan(bool new_value); void update_text(std::string text); const std::string audio_mode_output_str = "audio_mode"; const std::string max_audio_latency_str = "max_audio_latency"; @@ -64,6 +68,7 @@ private: const std::string output_type_str = "audio_output_type"; const std::string device_request_str = "audio_output_device_requested"; const std::string device_name_str = "audio_output_device_name"; + const std::string auto_device_scan_str = "audio_auto_device_scan"; }; #endif diff --git a/source/Menus/AudioMenu.cpp b/source/Menus/AudioMenu.cpp index bfed111..5918e84 100755 --- a/source/Menus/AudioMenu.cpp +++ b/source/Menus/AudioMenu.cpp @@ -49,6 +49,11 @@ static const AudioMenuOptionInfo audio_next_device_option = { .is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = AUDIO_MENU_NO_ACTION, .out_action = AUDIO_MENU_CHANGE_DEVICE}; +static const AudioMenuOptionInfo audio_auto_scan_option = { +.base_name = "Disable Automatic Device Scan", .false_name = "Enable Automatic Device Scan", +.is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = AUDIO_MENU_NO_ACTION, +.out_action = AUDIO_MENU_AUTO_SCAN}; + static const AudioMenuOptionInfo* pollable_options[] = { &audio_volume_option, @@ -56,6 +61,7 @@ static const AudioMenuOptionInfo* pollable_options[] = { &audio_output_type_option, &audio_max_latency_option, &audio_mode_output_option, +&audio_auto_scan_option, &audio_next_device_option, &audio_restart_option, }; @@ -153,6 +159,9 @@ void AudioMenu::prepare(float menu_scaling_factor, int view_size_x, int view_siz case AUDIO_MENU_MUTE: this->labels[index]->setText(this->setTextOptionBool(real_index, audio_data->get_mute())); break; + case AUDIO_MENU_AUTO_SCAN: + this->labels[index]->setText(this->setTextOptionBool(real_index, audio_data->get_auto_device_scan())); + break; default: break; } diff --git a/source/WindowScreen_Menu.cpp b/source/WindowScreen_Menu.cpp index 1f05bfe..70c0114 100755 --- a/source/WindowScreen_Menu.cpp +++ b/source/WindowScreen_Menu.cpp @@ -1594,6 +1594,9 @@ void WindowScreen::poll(bool do_everything) { case AUDIO_MENU_RESTART: this->audio_data->request_audio_restart(); break; + case AUDIO_MENU_AUTO_SCAN: + this->audio_data->change_auto_device_scan(); + break; case AUDIO_MENU_CHANGE_DEVICE: this->setup_audio_devices_menu(); done = true; diff --git a/source/audio_data.cpp b/source/audio_data.cpp index 5a3d01d..20902bc 100755 --- a/source/audio_data.cpp +++ b/source/audio_data.cpp @@ -1,4 +1,5 @@ #include "audio_data.hpp" +#include "utils.hpp" int searchAudioDevice(std::string device_name, std::vector &audio_devices) { int index = -1; @@ -20,6 +21,11 @@ void AudioData::reset() { this->mode_output = AUDIO_MODE_LOW_LATENCY; this->restart_request = false; this->text_updated = false; + #if (defined(RASPI) || defined(ANDROID_COMPILATION)) + this->periodic_output_audio_device_scan = false; + #else + this->periodic_output_audio_device_scan = true; + #endif this->output_device.preference_requested = false; this->output_device.preferred = ""; } @@ -74,6 +80,10 @@ void AudioData::change_audio_mute() { this->update_text("Volume: " + std::to_string(this->get_final_volume()) + "%"); } +void AudioData::change_auto_device_scan() { + this->set_auto_device_scan(!this->periodic_output_audio_device_scan); +} + void AudioData::request_audio_restart() { this->restart_request = true; this->update_text("Restarting audio..."); @@ -189,11 +199,19 @@ bool AudioData::get_mute() { return this->mute; } +bool AudioData::get_auto_device_scan() { + return this->periodic_output_audio_device_scan; +} + bool AudioData::load_audio_data(std::string key, std::string value) { if (key == this->mute_str) { this->set_audio_mute(std::stoi(value)); return true; } + if (key == this->auto_device_scan_str) { + this->set_auto_device_scan(std::stoi(value)); + return true; + } if (key == this->volume_str) { this->set_audio_volume(std::stoi(value)); return true; @@ -224,6 +242,7 @@ bool AudioData::load_audio_data(std::string key, std::string value) { std::string AudioData::save_audio_data() { std::string out_str = ""; out_str += this->mute_str + "=" + std::to_string(this->mute) + "\n"; + out_str += this->auto_device_scan_str + "=" + std::to_string(this->periodic_output_audio_device_scan) + "\n"; out_str += this->volume_str + "=" + std::to_string(this->volume) + "\n"; out_str += this->max_audio_latency_str + "=" + std::to_string(this->max_audio_latency) + "\n"; out_str += this->output_type_str + "=" + std::to_string(this->output_type) + "\n"; @@ -268,3 +287,7 @@ void AudioData::set_audio_volume(int new_volume) { void AudioData::set_audio_mute(bool new_mute) { this->mute = new_mute; } + +void AudioData::set_auto_device_scan(bool new_value) { + this->periodic_output_audio_device_scan = new_value; +} diff --git a/source/cc3dsfs.cpp b/source/cc3dsfs.cpp index 9a1f778..087646b 100755 --- a/source/cc3dsfs.cpp +++ b/source/cc3dsfs.cpp @@ -28,17 +28,6 @@ #define NO_DATA_CONSECUTIVE_THRESHOLD 4 #define TIME_AUDIO_DEVICE_CHECK 0.25 -#ifdef PERIODIC_AUDIO_DEVICE_RESCANNING - #undef PERIODIC_AUDIO_DEVICE_RESCANNING -#endif - -#if (defined(RASPI) || defined(ANDROID_COMPILATION)) - #define PERIODIC_AUDIO_DEVICE_RESCANNING false -#else - #define PERIODIC_AUDIO_DEVICE_RESCANNING true -#endif - - struct override_all_data { override_win_data override_top_bot_data; override_win_data override_top_data; @@ -396,7 +385,7 @@ static bool handleAudioDeviceChanges(Audio &audio, AudioData *audio_data, std::o int index = -1; bool success = false; bool preference_requested = in_use_audio_output_device_data.preference_requested; - bool check_audio_device = PERIODIC_AUDIO_DEVICE_RESCANNING; + bool check_audio_device = audio_data->get_auto_device_scan(); check_audio_device = check_audio_device || ((old_in_use_audio_output_device_data.preference_requested != in_use_audio_output_device_data.preference_requested) || (old_in_use_audio_output_device_data.preferred != in_use_audio_output_device_data.preferred)); if(check_audio_device && preference_requested) { std::vector audio_devices = sf::PlaybackDevice::getAvailableDevices();