From 10007c1ec0893034630f808e5e5050e87da52828 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Mon, 30 Sep 2024 23:24:10 +0200 Subject: [PATCH] Fix issue with audio conversion for o3ds --- include/audio_data.hpp | 1 + include/conversions.hpp | 4 ++-- source/audio_data.cpp | 4 ++++ source/cc3dsfs.cpp | 8 ++++++-- source/conversions.cpp | 29 ++++++++++++++++++++--------- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/include/audio_data.hpp b/include/audio_data.hpp index ba586bf..2a27cc1 100755 --- a/include/audio_data.hpp +++ b/include/audio_data.hpp @@ -14,6 +14,7 @@ public: 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(); std::string get_audio_output_name(); diff --git a/include/conversions.hpp b/include/conversions.hpp index 5f6b217..1125f89 100755 --- a/include/conversions.hpp +++ b/include/conversions.hpp @@ -4,6 +4,6 @@ #include "capture_structs.hpp" #include "display_structs.hpp" -void convertVideoToOutput(int index, VideoOutputData *p_out, CaptureData* capture_data); -void convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, const bool is_big_endian, CaptureData* capture_data); +bool convertVideoToOutput(int index, VideoOutputData *p_out, CaptureData* capture_data); +bool convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, const bool is_big_endian, CaptureData* capture_data); #endif diff --git a/source/audio_data.cpp b/source/audio_data.cpp index dc91cb8..2e4a908 100755 --- a/source/audio_data.cpp +++ b/source/audio_data.cpp @@ -54,6 +54,10 @@ void AudioData::request_audio_restart() { this->update_text("Restarting audio..."); } +void AudioData::signal_conversion_error() { + this->update_text("Audio conversion failed..."); +} + bool AudioData::check_audio_restart_request() { bool retval = this->restart_request; if(retval) diff --git a/source/cc3dsfs.cpp b/source/cc3dsfs.cpp index 1de3ecf..33469f0 100755 --- a/source/cc3dsfs.cpp +++ b/source/cc3dsfs.cpp @@ -238,7 +238,9 @@ static void soundCall(AudioData *audio_data, CaptureData* capture_data) { if((capture_data->read[curr_out] > get_video_in_size(capture_data)) && (loaded_samples < MAX_MAX_AUDIO_LATENCY)) { int n_samples = get_audio_n_samples(capture_data, capture_data->read[curr_out]); double out_time = capture_data->time_in_buf[curr_out]; - convertAudioToOutput(curr_out, out_buf[audio_buf_counter], n_samples, endianness, capture_data); + bool conversion_success = convertAudioToOutput(curr_out, out_buf[audio_buf_counter], n_samples, endianness, capture_data); + if(!conversion_success) + audio_data->signal_conversion_error(); audio.samples.emplace(out_buf[audio_buf_counter], n_samples, out_time); if(++audio_buf_counter == NUM_CONCURRENT_AUDIO_BUFFERS) { audio_buf_counter = 0; @@ -361,7 +363,9 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, if((!capture_data->status.cooldown_curr_in) && (curr_out != prev_out)) { last_frame_time = capture_data->time_in_buf[curr_out]; if(capture_data->read[curr_out] >= get_video_in_size(capture_data)) { - convertVideoToOutput(curr_out, out_buf, capture_data); + bool conversion_success = convertVideoToOutput(curr_out, out_buf, capture_data); + if(!conversion_success) + UpdateOutText(out_text_data, "", "Video conversion failed...", TEXT_KIND_NORMAL); num_allowed_blanks = MAX_ALLOWED_BLANKS; } else { diff --git a/source/conversions.cpp b/source/conversions.cpp index d66ee24..67f3d63 100755 --- a/source/conversions.cpp +++ b/source/conversions.cpp @@ -7,29 +7,39 @@ #include -void convertVideoToOutput(int index, VideoOutputData *p_out, CaptureData* capture_data) { +bool convertVideoToOutput(int index, VideoOutputData *p_out, CaptureData* capture_data) { CaptureReceived *p_in = &capture_data->capture_buf[index]; + bool converted = false; #ifdef USE_FTD3 - if(capture_data->status.device.cc_type == CAPTURE_CONN_FTD3) + if(capture_data->status.device.cc_type == CAPTURE_CONN_FTD3) { ftd3_convertVideoToOutput(p_in, p_out, capture_data->status.enabled_3d); + converted = true; + } #endif #ifdef USE_FTD2 - if(capture_data->status.device.cc_type == CAPTURE_CONN_FTD2) + if(capture_data->status.device.cc_type == CAPTURE_CONN_FTD2) { ftd2_convertVideoToOutput(p_in, p_out, capture_data->status.enabled_3d); + converted = true; + } #endif #ifdef USE_DS_3DS_USB - if(capture_data->status.device.cc_type == CAPTURE_CONN_USB) + if(capture_data->status.device.cc_type == CAPTURE_CONN_USB) { usb_convertVideoToOutput(p_in, p_out, &capture_data->status.device, capture_data->status.enabled_3d); + converted = true; + } #endif #ifdef USE_IS_NITRO_USB - if(capture_data->status.device.cc_type == CAPTURE_CONN_IS_NITRO) + if(capture_data->status.device.cc_type == CAPTURE_CONN_IS_NITRO) { usb_is_nitro_convertVideoToOutput(p_in, p_out, capture_data->capture_type[index]); + converted = true; + } #endif + return converted; } -void convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, const bool is_big_endian, CaptureData* capture_data) { +bool convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, const bool is_big_endian, CaptureData* capture_data) { if(!capture_data->status.device.has_audio) - return; + return true; CaptureReceived *p_in = &capture_data->capture_buf[index]; uint8_t* base_ptr = NULL; #ifdef USE_FTD3 @@ -44,7 +54,7 @@ void convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, co if(capture_data->status.device.cc_type == CAPTURE_CONN_FTD2) { } #endif - #ifdef USE_USB + #ifdef USE_DS_3DS_USB if(capture_data->status.device.cc_type == CAPTURE_CONN_USB) { if(!capture_data->status.enabled_3d) base_ptr = (uint8_t*)p_in->usb_received_3ds.audio_data; @@ -53,10 +63,11 @@ void convertAudioToOutput(int index, std::int16_t *p_out, uint64_t n_samples, co } #endif if(base_ptr == NULL) - return; + return false; if(!is_big_endian) memcpy(p_out, base_ptr, n_samples * 2); else for(int i = 0; i < n_samples; i += 2) p_out[i] = (base_ptr[i + 1] << 8) | base_ptr[i]; + return true; }