From 27d9826f57bf1fd629712f792d54ea8abab69f0d Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Tue, 22 Jul 2025 12:52:19 +0200 Subject: [PATCH] Switch to improved code for default audio device selection --- docker-scripts/docker_build_android | 4 +-- include/audio_data.hpp | 2 ++ source/Menus/AudioMenu.cpp | 2 +- source/cc3dsfs.cpp | 51 ++++++++++++++++++++--------- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/docker-scripts/docker_build_android b/docker-scripts/docker_build_android index 1b8400d..9d891a2 100644 --- a/docker-scripts/docker_build_android +++ b/docker-scripts/docker_build_android @@ -2,7 +2,7 @@ SFML_EXTRACTED_TO_FOLDER=~ LIBUSB_EXTRACTED_TO_FOLDER=~ -SFML_BRANCH_NAME=android_fullscreen_stuff +SFML_BRANCH_NAME=master LIBUSB_BRANCH_NAME=android-rebase-2022-07 SFML_EXTRACTED_FOLDER=${SFML_EXTRACTED_TO_FOLDER}/SFML-${SFML_BRANCH_NAME} LIBUSB_EXTRACTED_FOLDER=${LIBUSB_EXTRACTED_TO_FOLDER}/libusb-${LIBUSB_BRANCH_NAME} @@ -16,7 +16,7 @@ ANDROID_FOLDER=android export LANG=C.UTF-8 -(cd ${SFML_EXTRACTED_TO_FOLDER} ; rm -f ${SFML_BRANCH_NAME}.zip ; wget https://github.com/Lorenzooone/SFML/archive/refs/heads/${SFML_BRANCH_NAME}.zip ; unzip ${SFML_BRANCH_NAME}.zip) +(cd ${SFML_EXTRACTED_TO_FOLDER} ; rm -f ${SFML_BRANCH_NAME}.zip ; wget https://github.com/SFML/SFML/archive/refs/heads/${SFML_BRANCH_NAME}.zip ; unzip ${SFML_BRANCH_NAME}.zip) (cd ${LIBUSB_EXTRACTED_TO_FOLDER} ; rm -f ${LIBUSB_BRANCH_NAME}.zip ; wget https://github.com/jagheterfredrik/libusb/archive/refs/heads/${LIBUSB_BRANCH_NAME}.zip ; unzip ${LIBUSB_BRANCH_NAME}.zip) ${BUILD_LIBS_COMMAND} ${LIBUSB_EXTRACTED_FOLDER} ${SFML_EXTRACTED_FOLDER} ${STL_CHOSEN} ${RELEASE_TYPE} diff --git a/include/audio_data.hpp b/include/audio_data.hpp index dae338c..2ada0b2 100755 --- a/include/audio_data.hpp +++ b/include/audio_data.hpp @@ -13,6 +13,8 @@ struct audio_output_device_data { std::string preferred = ""; }; +const std::string default_sfml_audio_device_name = "DEFAULT_DEVICE_SFML"; + int searchAudioDevice(std::string device_name, std::vector &audio_devices); class AudioData { diff --git a/source/Menus/AudioMenu.cpp b/source/Menus/AudioMenu.cpp index 5918e84..6cffe1f 100755 --- a/source/Menus/AudioMenu.cpp +++ b/source/Menus/AudioMenu.cpp @@ -61,7 +61,7 @@ static const AudioMenuOptionInfo* pollable_options[] = { &audio_output_type_option, &audio_max_latency_option, &audio_mode_output_option, -&audio_auto_scan_option, +//&audio_auto_scan_option, &audio_next_device_option, &audio_restart_option, }; diff --git a/source/cc3dsfs.cpp b/source/cc3dsfs.cpp index 7a861cc..4894aec 100755 --- a/source/cc3dsfs.cpp +++ b/source/cc3dsfs.cpp @@ -368,26 +368,47 @@ static void executeSoundRestart(Audio &audio, AudioData* audio_data, bool do_res audio.play(); } -static bool setDefaultAudioDevice(Audio &audio) { - bool success = false; - std::optional default_device = sf::PlaybackDevice::getDefaultDevice(); - if(default_device) { +static bool setDefaultAudioDevice(Audio &audio, std::optional &curr_device) { + bool success = true; + std::string curr_device_default = default_sfml_audio_device_name; + if(curr_device != curr_device_default) { audio.stop_audio(); audio.stop(); - success = sf::PlaybackDevice::setDevice(default_device.value()); + success = sf::PlaybackDevice::setDeviceToDefault(); + curr_device = curr_device_default; } return success; } -static bool handleAudioDeviceChanges(Audio &audio, AudioData *audio_data, std::optional &curr_device, audio_output_device_data &in_use_audio_output_device_data) { +static void audioDeviceNotificationCallback(bool& requestAudioResearch, bool resetting, sf::PlaybackDevice::Notification notification) { + if(resetting) + return; + switch (notification) + { + case sf::PlaybackDevice::Notification::DeviceStopped: + { + if(sf::PlaybackDevice::isDefaultDevice()) + break; + requestAudioResearch = true; + break; + } + default: + break; + } +} + +static bool handleAudioDeviceChanges(Audio &audio, AudioData *audio_data, std::optional &curr_device, audio_output_device_data &in_use_audio_output_device_data, bool &requestAudioResearch, bool &resetting) { // Code for audio device selection audio_output_device_data old_in_use_audio_output_device_data = in_use_audio_output_device_data; in_use_audio_output_device_data = audio_data->get_audio_output_device_data(); int index = -1; bool success = false; bool preference_requested = in_use_audio_output_device_data.preference_requested; - 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)); + bool requestedAudioResearch = requestAudioResearch; + requestAudioResearch = false; + bool check_audio_device = requestedAudioResearch || ((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) + resetting = true; if(check_audio_device && preference_requested) { std::vector audio_devices = sf::PlaybackDevice::getAvailableDevices(); index = searchAudioDevice(in_use_audio_output_device_data.preferred, audio_devices); @@ -398,12 +419,9 @@ static bool handleAudioDeviceChanges(Audio &audio, AudioData *audio_data, std::o curr_device = audio_devices[index]; } } - if(check_audio_device && ((!preference_requested) || (index == -1))) { - std::optional default_device = sf::PlaybackDevice::getDefaultDevice(); - if(default_device != curr_device) - success = setDefaultAudioDevice(audio); - curr_device = default_device; - } + if(check_audio_device && ((!preference_requested) || (index == -1))) + success = setDefaultAudioDevice(audio, curr_device); + resetting = false; return success; } @@ -417,6 +435,9 @@ static void soundCall(AudioData *audio_data, CaptureData* capture_data, volatile audio_output_device_data in_use_audio_output_device_data; std::optional curr_device = sf::PlaybackDevice::getDevice(); std::chrono::time_point last_device_check_time = std::chrono::high_resolution_clock::now(); + bool requestAudioResearch = false; + bool resetting = false; + sf::PlaybackDevice::setNotificationCallback([&requestAudioResearch, &resetting](sf::PlaybackDevice::Notification notification){audioDeviceNotificationCallback(requestAudioResearch, resetting, notification);}); while(capture_data->status.running) { if(capture_data->status.connected && capture_data->status.device.has_audio && (*can_do_output)) { @@ -478,7 +499,7 @@ static void soundCall(AudioData *audio_data, CaptureData* capture_data, volatile const std::chrono::duration diff = curr_time - last_device_check_time; if(diff.count() >= TIME_AUDIO_DEVICE_CHECK) { last_device_check_time = curr_time; - handleAudioDeviceChanges(audio, audio_data, curr_device, in_use_audio_output_device_data); + handleAudioDeviceChanges(audio, audio_data, curr_device, in_use_audio_output_device_data, requestAudioResearch, resetting); } }