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
This commit is contained in:
Bananymous 2025-12-18 16:05:28 +02:00
parent c64159d5c3
commit e7d644b874
1 changed files with 11 additions and 5 deletions

View File

@ -99,7 +99,7 @@ uint64_t AudioServer::update()
{
const sample_t sample_ratio = buffer.buffer->sample_rate / static_cast<sample_t>(m_sample_rate);
const uint32_t buffer_sample_frames_played = BAN::Math::min<size_t>(
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<sample_t>(m_sample_rate);
const size_t sample_frames_to_queue = BAN::Math::min<size_t>(max_sample_frames_to_queue, buffer.sample_frames_available() / sample_ratio);
const size_t sample_frames_to_queue = BAN::Math::min<size_t>(
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<uint32_t>(
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<sample_t>(m_sample_rate);
const uint32_t buffer_sample_frames_played = BAN::Math::min<size_t>(
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;