From 9880a5c48150fd03e516c6f74ff0bd0cea5768d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Thu, 19 Aug 2021 00:07:29 +0200 Subject: [PATCH] AudioServer: Expose the ability to get and set the sample rate Two new IPC calls allow audio clients to get and set the sample rate. The AudioServer calls into the new ioctl of the sound card. --- Userland/Services/AudioServer/AudioServer.ipc | 4 ++++ .../Services/AudioServer/ClientConnection.cpp | 10 ++++++++++ .../Services/AudioServer/ClientConnection.h | 2 ++ Userland/Services/AudioServer/Mixer.cpp | 19 +++++++++++++++++++ Userland/Services/AudioServer/Mixer.h | 3 +++ 5 files changed, 38 insertions(+) diff --git a/Userland/Services/AudioServer/AudioServer.ipc b/Userland/Services/AudioServer/AudioServer.ipc index 4c23e47d0c..d48a50c4cf 100644 --- a/Userland/Services/AudioServer/AudioServer.ipc +++ b/Userland/Services/AudioServer/AudioServer.ipc @@ -8,6 +8,10 @@ endpoint AudioServer get_main_mix_volume() => (i32 volume) set_main_mix_volume(i32 volume) => () + // Audio device + set_sample_rate(u16 sample_rate) => () + get_sample_rate() => (u16 sample_rate) + // Buffer playback enqueue_buffer(Core::AnonymousBuffer buffer, i32 buffer_id, int sample_count) => (bool success) set_paused(bool paused) => () diff --git a/Userland/Services/AudioServer/ClientConnection.cpp b/Userland/Services/AudioServer/ClientConnection.cpp index b272c42b6f..dc151b8ce5 100644 --- a/Userland/Services/AudioServer/ClientConnection.cpp +++ b/Userland/Services/AudioServer/ClientConnection.cpp @@ -63,6 +63,16 @@ void ClientConnection::set_main_mix_volume(i32 volume) m_mixer.set_main_volume(volume); } +Messages::AudioServer::GetSampleRateResponse ClientConnection::get_sample_rate() +{ + return { m_mixer.audiodevice_get_sample_rate() }; +} + +void ClientConnection::set_sample_rate(u16 sample_rate) +{ + m_mixer.audiodevice_set_sample_rate(sample_rate); +} + Messages::AudioServer::EnqueueBufferResponse ClientConnection::enqueue_buffer(Core::AnonymousBuffer const& buffer, i32 buffer_id, int sample_count) { if (!m_queue) diff --git a/Userland/Services/AudioServer/ClientConnection.h b/Userland/Services/AudioServer/ClientConnection.h index fd965b6cd6..96b4d3fdbf 100644 --- a/Userland/Services/AudioServer/ClientConnection.h +++ b/Userland/Services/AudioServer/ClientConnection.h @@ -45,6 +45,8 @@ private: virtual Messages::AudioServer::GetPlayingBufferResponse get_playing_buffer() override; virtual Messages::AudioServer::GetMutedResponse get_muted() override; virtual void set_muted(bool) override; + virtual void set_sample_rate(u16 sample_rate) override; + virtual Messages::AudioServer::GetSampleRateResponse get_sample_rate() override; Mixer& m_mixer; RefPtr m_queue; diff --git a/Userland/Services/AudioServer/Mixer.cpp b/Userland/Services/AudioServer/Mixer.cpp index 66d978c62f..8911018748 100644 --- a/Userland/Services/AudioServer/Mixer.cpp +++ b/Userland/Services/AudioServer/Mixer.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include namespace AudioServer { @@ -150,6 +152,23 @@ void Mixer::set_muted(bool muted) }); } +int Mixer::audiodevice_set_sample_rate(u16 sample_rate) +{ + int code = ioctl(m_device->fd(), SOUNDCARD_IOCTL_SET_SAMPLE_RATE, sample_rate); + if (code != 0) + dbgln("Error while setting sample rate to {}: ioctl returned with {}", sample_rate, strerror(code)); + return code; +} + +u16 Mixer::audiodevice_get_sample_rate() const +{ + u16 sample_rate = 0; + int code = ioctl(m_device->fd(), SOUNDCARD_IOCTL_GET_SAMPLE_RATE, &sample_rate); + if (code != 0) + dbgln("Error while getting sample rate: ioctl returned with {}", strerror(code)); + return sample_rate; +} + void Mixer::request_setting_sync() { if (m_config_write_timer.is_null() || !m_config_write_timer->is_active()) { diff --git a/Userland/Services/AudioServer/Mixer.h b/Userland/Services/AudioServer/Mixer.h index 4465760062..33549fca3c 100644 --- a/Userland/Services/AudioServer/Mixer.h +++ b/Userland/Services/AudioServer/Mixer.h @@ -106,6 +106,9 @@ public: bool is_muted() const { return m_muted; } void set_muted(bool); + int audiodevice_set_sample_rate(u16 sample_rate); + u16 audiodevice_get_sample_rate() const; + private: void request_setting_sync();