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();