AudioServer: Queue more than 4k bytes per write

Before this I was writing audio data to kernel in ~20 ms chuncks. This
feels like way too many syscalls, so now we allow sending upto 1 second
per syscall :D
This commit is contained in:
2026-08-17 04:44:15 +03:00
parent 7aa8eb1778
commit b6f922895f
2 changed files with 4 additions and 3 deletions
@@ -1,5 +1,6 @@
#include "AudioServer.h" #include "AudioServer.h"
#include <alloca.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <sys/socket.h> #include <sys/socket.h>
@@ -306,9 +307,10 @@ void AudioServer::send_samples()
while (m_samples_sent < m_samples.size()) while (m_samples_sent < m_samples.size())
{ {
const size_t samples_to_send = BAN::Math::min(m_send_buffer.size() / sizeof(kernel_sample_t), m_samples.size() - m_samples_sent); const auto channels = device().channels;
const size_t samples_to_send = BAN::Math::min<size_t>(device().sample_rate * channels, m_samples.size() - m_samples_sent) / channels * channels;
auto buffer = BAN::ByteSpan(m_send_buffer.data(), samples_to_send * sizeof(kernel_sample_t)); auto buffer = BAN::ByteSpan(static_cast<uint8_t*>(alloca(samples_to_send * sizeof(kernel_sample_t))), samples_to_send * sizeof(kernel_sample_t));
{ {
auto sample_buffer = buffer.as_span<kernel_sample_t>(); auto sample_buffer = buffer.as_span<kernel_sample_t>();
@@ -68,7 +68,6 @@ private:
size_t m_current_audio_device { 0 }; size_t m_current_audio_device { 0 };
size_t m_samples_sent { 0 }; size_t m_samples_sent { 0 };
BAN::Array<uint8_t, 4 * 1024> m_send_buffer;
BAN::CircularQueue<sample_t, 64 * 1024> m_samples; BAN::CircularQueue<sample_t, 64 * 1024> m_samples;
BAN::HashMap<int, ClientInfo> m_audio_buffers; BAN::HashMap<int, ClientInfo> m_audio_buffers;