From 82698d337695ad412bc956185d67e2f91899c5f5 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Sat, 15 Mar 2025 22:51:37 +0100 Subject: [PATCH] Add option to choose between low latency and stable audio --- include/Menus/AudioMenu.hpp | 2 ++ include/audio_data.hpp | 7 ++++++ source/Menus/AudioMenu.cpp | 13 ++++++++-- source/WindowScreen_Menu.cpp | 6 +++++ source/audio.cpp | 33 ++++++++++++++++--------- source/audio_data.cpp | 47 +++++++++++++++++++++++++++++++++++- 6 files changed, 93 insertions(+), 15 deletions(-) diff --git a/include/Menus/AudioMenu.hpp b/include/Menus/AudioMenu.hpp index 9657e92..c9775e5 100755 --- a/include/Menus/AudioMenu.hpp +++ b/include/Menus/AudioMenu.hpp @@ -20,6 +20,8 @@ enum AudioMenuOutAction{ AUDIO_MENU_OUTPUT_INC, AUDIO_MENU_RESTART, AUDIO_MENU_CHANGE_DEVICE, + AUDIO_MENU_MODE_DEC, + AUDIO_MENU_MODE_INC, }; class AudioMenu : public OptionSelectionMenu { diff --git a/include/audio_data.hpp b/include/audio_data.hpp index 7c61694..a9828c5 100755 --- a/include/audio_data.hpp +++ b/include/audio_data.hpp @@ -6,6 +6,7 @@ #define MAX_MAX_AUDIO_LATENCY 10 enum AudioOutputType {AUDIO_OUTPUT_STEREO, AUDIO_OUTPUT_MONO, AUDIO_OUTPUT_END}; +enum AudioMode {AUDIO_MODE_LOW_LATENCY, AUDIO_MODE_STABLE, AUDIO_MODE_END}; struct audio_output_device_data { bool preference_requested = false; @@ -19,13 +20,16 @@ public: void reset(); void change_max_audio_latency(bool is_change_positive); void change_audio_output_type(bool is_change_positive); + void change_audio_mode_output(bool is_change_positive); void change_audio_volume(bool is_change_positive); void change_audio_mute(); void request_audio_restart(); void signal_conversion_error(); bool check_audio_restart_request(); AudioOutputType get_audio_output_type(); + AudioMode get_audio_mode_output(); std::string get_audio_output_name(); + std::string get_audio_mode_name(); int get_max_audio_latency(); int get_final_volume(); bool has_text_to_print(); @@ -44,13 +48,16 @@ private: bool mute; AudioOutputType output_type; audio_output_device_data output_device; + AudioMode mode_output; bool restart_request = false; bool text_updated; std::string text; void set_max_audio_latency(int new_value); void set_audio_output_type(int new_value); + void set_audio_mode_output(int new_value); void set_audio_mute(bool new_mute); 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"; const std::string volume_str = "volume"; const std::string mute_str = "mute"; diff --git a/source/Menus/AudioMenu.cpp b/source/Menus/AudioMenu.cpp index f262f6b..991ea58 100755 --- a/source/Menus/AudioMenu.cpp +++ b/source/Menus/AudioMenu.cpp @@ -30,10 +30,15 @@ static const AudioMenuOptionInfo audio_max_latency_option = { .out_action = AUDIO_MENU_MAX_LATENCY_DEC}; static const AudioMenuOptionInfo audio_output_type_option = { -.base_name = "Audio Output", .false_name = "", +.base_name = "Sound", .false_name = "", .is_inc = true, .dec_str = "<", .inc_str = ">", .inc_out_action = AUDIO_MENU_OUTPUT_INC, .out_action = AUDIO_MENU_OUTPUT_DEC}; +static const AudioMenuOptionInfo audio_mode_output_option = { +.base_name = "Priority", .false_name = "", +.is_inc = true, .dec_str = "<", .inc_str = ">", .inc_out_action = AUDIO_MENU_MODE_INC, +.out_action = AUDIO_MENU_MODE_DEC}; + static const AudioMenuOptionInfo audio_restart_option = { .base_name = "Restart Audio", .false_name = "", .is_inc = false, .dec_str = "", .inc_str = "", .inc_out_action = AUDIO_MENU_NO_ACTION, @@ -48,8 +53,9 @@ static const AudioMenuOptionInfo audio_next_device_option = { static const AudioMenuOptionInfo* pollable_options[] = { &audio_volume_option, &audio_mute_option, -&audio_max_latency_option, &audio_output_type_option, +&audio_max_latency_option, +&audio_mode_output_option, &audio_next_device_option, &audio_restart_option, }; @@ -141,6 +147,9 @@ void AudioMenu::prepare(float menu_scaling_factor, int view_size_x, int view_siz case AUDIO_MENU_OUTPUT_DEC: this->labels[index]->setText(this->setTextOptionString(real_index, audio_data->get_audio_output_name())); break; + case AUDIO_MENU_MODE_DEC: + this->labels[index]->setText(this->setTextOptionString(real_index, audio_data->get_audio_mode_name())); + break; case AUDIO_MENU_MUTE: this->labels[index]->setText(this->setTextOptionBool(real_index, audio_data->get_mute())); break; diff --git a/source/WindowScreen_Menu.cpp b/source/WindowScreen_Menu.cpp index 4c21014..7b991c2 100755 --- a/source/WindowScreen_Menu.cpp +++ b/source/WindowScreen_Menu.cpp @@ -1493,6 +1493,12 @@ void WindowScreen::poll(bool do_everything) { case AUDIO_MENU_OUTPUT_INC: this->audio_data->change_audio_output_type(true); break; + case AUDIO_MENU_MODE_DEC: + this->audio_data->change_audio_mode_output(false); + break; + case AUDIO_MENU_MODE_INC: + this->audio_data->change_audio_mode_output(true); + break; case AUDIO_MENU_MUTE: this->audio_data->change_audio_mute(); break; diff --git a/source/audio.cpp b/source/audio.cpp index a923070..f450d6f 100755 --- a/source/audio.cpp +++ b/source/audio.cpp @@ -87,18 +87,27 @@ bool Audio::onGetData(sf::SoundStream::Chunk &data) { inside_onGetData = true; int loaded_samples = samples.size(); while(loaded_samples <= 0) { - samples_wait.timed_lock(); - if(terminate) { - inside_onGetData = false; - return false; - } - loaded_samples = samples.size(); - if((loaded_samples <= 0) && this->hasTooMuchTimeElapsedInside()) { - // This is needed by MacOS... - // But it also causes some trailing noise when - // closing the lid on the devices. - inside_onGetData = false; - return false; + switch(this->audio_data->get_audio_mode_output()) { + case AUDIO_MODE_STABLE: + inside_onGetData = false; + return false; + case AUDIO_MODE_LOW_LATENCY: + samples_wait.timed_lock(); + if(terminate) { + inside_onGetData = false; + return false; + } + loaded_samples = samples.size(); + if((loaded_samples <= 0) && this->hasTooMuchTimeElapsedInside()) { + // This is needed by MacOS... + // But it also causes some trailing noise when + // closing the lid on the devices. + inside_onGetData = false; + return false; + } + break; + default: + break; } } data.samples = (const std::int16_t*)buffer; diff --git a/source/audio_data.cpp b/source/audio_data.cpp index 93f9c2d..05a1801 100755 --- a/source/audio_data.cpp +++ b/source/audio_data.cpp @@ -15,6 +15,7 @@ void AudioData::reset() { this->mute = false; this->max_audio_latency = 2; this->output_type = AUDIO_OUTPUT_STEREO; + this->mode_output = AUDIO_MODE_LOW_LATENCY; this->restart_request = false; this->text_updated = false; this->output_device.preference_requested = false; @@ -38,7 +39,17 @@ void AudioData::change_audio_output_type(bool is_change_positive) { AudioOutputType initial_audio_output_type = this->output_type; this->set_audio_output_type(this->output_type + change); if(this->output_type != initial_audio_output_type) - this->update_text("Audio Output: " + this->get_audio_output_name()); + this->update_text("Sound: " + this->get_audio_output_name()); +} + +void AudioData::change_audio_mode_output(bool is_change_positive) { + int change = 1; + if(!is_change_positive) + change = -1; + AudioMode initial_audio_mode_output = this->mode_output; + this->set_audio_mode_output(this->mode_output + change); + if(this->mode_output != initial_audio_mode_output) + this->update_text("Audio Priority: " + this->get_audio_mode_name()); } void AudioData::change_audio_volume(bool is_change_positive) { @@ -110,6 +121,10 @@ AudioOutputType AudioData::get_audio_output_type() { return this->output_type; } +AudioMode AudioData::get_audio_mode_output() { + return this->mode_output; +} + std::string AudioData::get_audio_output_name() { std::string chosen_str = ""; switch(this->output_type) { @@ -127,6 +142,23 @@ std::string AudioData::get_audio_output_name() { return chosen_str; } +std::string AudioData::get_audio_mode_name() { + std::string chosen_str = ""; + switch(this->mode_output) { + case AUDIO_MODE_LOW_LATENCY: + chosen_str = "Low Latency"; + break; + case AUDIO_MODE_STABLE: + chosen_str = "Stability"; + break; + default: + this->mode_output = AUDIO_MODE_LOW_LATENCY; + chosen_str = "Low Latency"; + break; + } + return chosen_str; +} + int AudioData::get_max_audio_latency() { return this->max_audio_latency; } @@ -172,6 +204,10 @@ bool AudioData::load_audio_data(std::string key, std::string value) { this->set_audio_output_type(std::stoi(value)); return true; } + if (key == this->audio_mode_output_str) { + this->set_audio_mode_output(std::stoi(value)); + return true; + } if (key == this->device_request_str) { this->output_device.preference_requested = std::stoi(value); return true; @@ -189,6 +225,7 @@ std::string AudioData::save_audio_data() { 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"; + out_str += this->audio_mode_output_str + "=" + std::to_string(this->mode_output) + "\n"; out_str += this->device_request_str + "=" + std::to_string(this->output_device.preference_requested) + "\n"; out_str += this->device_name_str + "=" + this->output_device.preferred + "\n"; return out_str; @@ -210,6 +247,14 @@ void AudioData::set_audio_output_type(int new_value) { this->output_type = static_cast(new_value); } +void AudioData::set_audio_mode_output(int new_value) { + if(new_value >= AUDIO_MODE_END) + new_value = 0; + if(new_value < 0) + new_value = AUDIO_MODE_END - 1; + this->mode_output = static_cast(new_value); +} + void AudioData::set_audio_volume(int new_volume) { if(new_volume < 0) new_volume = 0;