From e7d644b8742462f78f87dfb41c7e037ae4db8b48 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 18 Dec 2025 16:05:28 +0200 Subject: [PATCH] AudioServer: Fix rounding the number of samples when resampling If client tried to play a single sample at lower frequency as the kenrel, audio server would never play it leading to the client hanging This makes calculations round the number of samples always up to fix this --- userspace/programs/AudioServer/AudioServer.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/userspace/programs/AudioServer/AudioServer.cpp b/userspace/programs/AudioServer/AudioServer.cpp index 540cbc37..cb7dd96e 100644 --- a/userspace/programs/AudioServer/AudioServer.cpp +++ b/userspace/programs/AudioServer/AudioServer.cpp @@ -99,7 +99,7 @@ uint64_t AudioServer::update() { const sample_t sample_ratio = buffer.buffer->sample_rate / static_cast(m_sample_rate); const uint32_t buffer_sample_frames_played = BAN::Math::min( - sample_frames_played * sample_ratio, + BAN::Math::ceil(sample_frames_played * sample_ratio), sample_frames_queued ); buffer.buffer->tail = (buffer.buffer->tail + buffer_sample_frames_played * buffer.buffer->channels) % buffer.buffer->capacity; @@ -131,7 +131,10 @@ uint64_t AudioServer::update() const sample_t sample_ratio = buffer.buffer->sample_rate / static_cast(m_sample_rate); - const size_t sample_frames_to_queue = BAN::Math::min(max_sample_frames_to_queue, buffer.sample_frames_available() / sample_ratio); + const size_t sample_frames_to_queue = BAN::Math::min( + BAN::Math::ceil(buffer.sample_frames_available() / sample_ratio), + max_sample_frames_to_queue + ); if (sample_frames_to_queue == 0) continue; @@ -148,8 +151,11 @@ uint64_t AudioServer::update() m_samples[queued_samples_end + i * m_channels + j] += buffer.buffer->samples[(buffer_tail + buffer_frame * buffer.buffer->channels + j) % buffer.buffer->capacity]; } - const uint32_t buffer_sample_frames = sample_frames_to_queue * sample_ratio; - buffer.queued_head = (buffer_tail + buffer_sample_frames * buffer.buffer->channels) % buffer.buffer->capacity; + const uint32_t buffer_sample_frames_queued = BAN::Math::min( + BAN::Math::ceil(sample_frames_to_queue * sample_ratio), + buffer.sample_frames_available() + ); + buffer.queued_head = (buffer_tail + buffer_sample_frames_queued * buffer.buffer->channels) % buffer.buffer->capacity; } send_samples(); @@ -185,7 +191,7 @@ void AudioServer::reset_kernel_buffer() { const sample_t sample_ratio = buffer.buffer->sample_rate / static_cast(m_sample_rate); const uint32_t buffer_sample_frames_played = BAN::Math::min( - sample_frames_played * sample_ratio, + BAN::Math::ceil(sample_frames_played * sample_ratio), sample_frames_queued ); buffer.buffer->tail = (buffer.buffer->tail + buffer_sample_frames_played * buffer.buffer->channels) % buffer.buffer->capacity;