forked from Bananymous/banan-os
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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user