From 3726b0ae224e6b4817cccffc6562cba5afc1e82f Mon Sep 17 00:00:00 2001 From: nmzik Date: Fri, 17 Jul 2026 06:59:40 +0200 Subject: [PATCH] libAudio2: fix regression --- src/libs/audio.cpp | 32 +++++++++++++++++--------------- src/libs/audio_internal.h | 2 +- src/libs/libAudio2.cpp | 7 ++++--- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/libs/audio.cpp b/src/libs/audio.cpp index c7a3eb294..cb98778a9 100644 --- a/src/libs/audio.cpp +++ b/src/libs/audio.cpp @@ -83,7 +83,7 @@ public: bool AudioOutClose(Id handle); bool AudioOutValid(Id handle); bool AudioOutSetVolume(Id handle, uint32_t bitflag, const int* volume); - uint32_t AudioOutOutputs(OutputParam* params, uint32_t num); + uint32_t AudioOutOutputs(OutputParam* params, uint32_t num, bool blocking = true); bool AudioOutGetStatus(Id handle, int* type, int* channels_num); Id AudioInOpen(uint32_t type, uint32_t samples_num, uint32_t freq, Format format); @@ -130,7 +130,7 @@ private: static void CloseSdlDevice(PortOut* port); static const void* PrepareOutputBuffer(const PortOut& port, const void* data, std::vector* buffer); - static bool QueueSdlAudio(PortOut* port, const void* data); + static bool QueueSdlAudio(PortOut* port, const void* data, bool blocking); }; static Audio* g_audio = nullptr; @@ -152,7 +152,7 @@ void AudioOutClose(int handle) { } } -uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num) { +uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num, bool blocking) { if (g_audio == nullptr || params == nullptr || num == 0) { return 0; } @@ -171,7 +171,7 @@ uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num) { } return g_audio->AudioOutOutputs(output_params.data(), - static_cast(output_params.size())); + static_cast(output_params.size()), blocking); } } // namespace AudioInternal @@ -321,7 +321,7 @@ const void* Audio::PrepareOutputBuffer(const PortOut& port, const void* data, return buffer->data(); } -bool Audio::QueueSdlAudio(PortOut* port, const void* data) { +bool Audio::QueueSdlAudio(PortOut* port, const void* data, bool blocking) { EXIT_IF(port == nullptr); if (port->audio_device == 0 || data == nullptr) { @@ -363,14 +363,16 @@ bool Audio::QueueSdlAudio(PortOut* port, const void* data) { queue_size = static_cast(cvt.len_cvt); } - const auto min_queued_size = queue_size * 2u; - const auto wait_start = LibKernel::KernelGetProcessTime(); - while (SDL_GetQueuedAudioSize(port->audio_device) > min_queued_size) { - if (LibKernel::KernelGetProcessTime() - wait_start > 200000) { - SDL_ClearQueuedAudio(port->audio_device); - break; + if (blocking) { + const auto min_queued_size = queue_size * 2u; + const auto wait_start = LibKernel::KernelGetProcessTime(); + while (SDL_GetQueuedAudioSize(port->audio_device) > min_queued_size) { + if (LibKernel::KernelGetProcessTime() - wait_start > 200000) { + SDL_ClearQueuedAudio(port->audio_device); + break; + } + Common::Thread::SleepMicro(1000); } - Common::Thread::SleepMicro(1000); } if (SDL_QueueAudio(port->audio_device, queue_data, queue_size) < 0) { @@ -492,7 +494,7 @@ bool Audio::AudioOutSetVolume(Id handle, uint32_t bitflag, const int* volume) { return false; } -uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num) { +uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num, bool blocking) { EXIT_NOT_IMPLEMENTED(num == 0); EXIT_NOT_IMPLEMENTED(!AudioOutValid(params[0].handle)); @@ -509,14 +511,14 @@ uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num) { max_wait_time = (wait_time > max_wait_time ? wait_time : max_wait_time); } - if (max_wait_time != 0) { + if (blocking && max_wait_time != 0) { Common::Thread::SleepMicro(max_wait_time); } for (uint32_t i = 0; i < num; i++) { auto& port = m_out_ports[params[i].handle.GetId()]; - QueueSdlAudio(&port, params[i].data); + QueueSdlAudio(&port, params[i].data, blocking); } for (uint32_t i = 0; i < num; i++) { diff --git a/src/libs/audio_internal.h b/src/libs/audio_internal.h index ed7c4a8ef..9bf58ce2d 100644 --- a/src/libs/audio_internal.h +++ b/src/libs/audio_internal.h @@ -26,7 +26,7 @@ static constexpr int OUT_PORTS_MAX = 32; int AudioOutOpen(int type, uint32_t samples_num, uint32_t freq, Format format); void AudioOutClose(int handle); -uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num); +uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num, bool blocking = true); } // namespace Libs::Audio::AudioInternal diff --git a/src/libs/libAudio2.cpp b/src/libs/libAudio2.cpp index 04fac4d85..24a51060c 100644 --- a/src/libs/libAudio2.cpp +++ b/src/libs/libAudio2.cpp @@ -348,7 +348,7 @@ static uint32_t audioout2_context_grains(AudioOut2ContextHandle ctx) { return samples_num; } -static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx) { +static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx, bool blocking) { std::vector params; params.reserve(AudioInternal::OUT_PORTS_MAX); @@ -365,7 +365,8 @@ static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx) { return; } - (void)AudioInternal::AudioOutOutputs(params.data(), static_cast(params.size())); + (void)AudioInternal::AudioOutOutputs(params.data(), static_cast(params.size()), + blocking); } static void audioout2_close_audio_handle(int audio_handle) { @@ -514,7 +515,7 @@ int KYTY_SYSV_ABI AudioOut2ContextPush(AudioOut2ContextHandle ctx, uint32_t bloc } state->queued++; g_audioout2_context_mutex.Unlock(); - audioout2_queue_context_audio(ctx); + audioout2_queue_context_audio(ctx, blocking != 0); return OK; } }