From 1c23a222b23f5598b041c84277a166cd0ac5f860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Wed, 15 Jun 2022 21:43:07 +0200 Subject: [PATCH] AudioServer: Make hardware write buffer size flexible This removes some old cruft to refactor the hardware buffer-related datastructures into depending on a single constant, which determines the number of samples per hardware buffer that the audio server mixes. This is set to 1024 as before, so there are no functional changes. --- Userland/Services/AudioServer/Mixer.cpp | 17 ++++++----------- Userland/Services/AudioServer/Mixer.h | 6 +++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Userland/Services/AudioServer/Mixer.cpp b/Userland/Services/AudioServer/Mixer.cpp index 240e493cd9..89474d5873 100644 --- a/Userland/Services/AudioServer/Mixer.cpp +++ b/Userland/Services/AudioServer/Mixer.cpp @@ -20,8 +20,6 @@ namespace AudioServer { -u8 Mixer::m_zero_filled_buffer[4096]; - Mixer::Mixer(NonnullRefPtr config) // FIXME: Allow AudioServer to use other audio channels as well : m_device(Core::File::construct("/dev/audio/0", this)) @@ -74,8 +72,7 @@ void Mixer::mix() active_mix_queues.remove_all_matching([&](auto& entry) { return !entry->client(); }); - Audio::Sample mixed_buffer[1024]; - auto mixed_buffer_length = (int)(sizeof(mixed_buffer) / sizeof(Audio::Sample)); + Array mixed_buffer; m_main_volume.advance_time(); @@ -89,8 +86,7 @@ void Mixer::mix() ++active_queues; queue->volume().advance_time(); - for (int i = 0; i < mixed_buffer_length; ++i) { - auto& mixed_sample = mixed_buffer[i]; + for (auto& mixed_sample : mixed_buffer) { Audio::Sample sample; if (!queue->get_next_sample(sample)) break; @@ -103,13 +99,12 @@ void Mixer::mix() } if (m_muted) { - m_device->write(m_zero_filled_buffer, sizeof(m_zero_filled_buffer)); + m_device->write(m_zero_filled_buffer.data(), static_cast(m_zero_filled_buffer.size())); } else { - Array buffer; + Array buffer; OutputMemoryStream stream { buffer }; - for (int i = 0; i < mixed_buffer_length; ++i) { - auto& mixed_sample = mixed_buffer[i]; + for (auto& mixed_sample : mixed_buffer) { // Even though it's not realistic, the user expects no sound at 0%. if (m_main_volume < 0.01) @@ -128,7 +123,7 @@ void Mixer::mix() VERIFY(stream.is_end()); VERIFY(!stream.has_any_error()); - m_device->write(stream.data(), stream.size()); + m_device->write(stream.data(), static_cast(stream.size())); } } } diff --git a/Userland/Services/AudioServer/Mixer.h b/Userland/Services/AudioServer/Mixer.h index 840952b8f1..7647550b77 100644 --- a/Userland/Services/AudioServer/Mixer.h +++ b/Userland/Services/AudioServer/Mixer.h @@ -29,6 +29,10 @@ namespace AudioServer { // Headroom, i.e. fixed attenuation for all audio streams. // This is to prevent clipping when two streams with low headroom (e.g. normalized & compressed) are playing. constexpr double SAMPLE_HEADROOM = 0.95; +// The size of the buffer in samples that the hardware receives through write() calls to the audio device. +constexpr size_t HARDWARE_BUFFER_SIZE = 1024; +// The hardware buffer size in bytes; there's two channels of 16-bit samples. +constexpr size_t HARDWARE_BUFFER_SIZE_BYTES = HARDWARE_BUFFER_SIZE * 2 * sizeof(i16); class ConnectionFromClient; @@ -129,7 +133,7 @@ private: NonnullRefPtr m_config; RefPtr m_config_write_timer; - static u8 m_zero_filled_buffer[4096]; + Array m_zero_filled_buffer; void mix(); };