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.
This commit is contained in:
kleines Filmröllchen 2021-08-19 00:07:29 +02:00 committed by Ali Mohammad Pur
parent d0ceaa24a6
commit 9880a5c481
Notes: sideshowbarker 2024-07-18 05:12:49 +09:00
5 changed files with 38 additions and 0 deletions

View file

@ -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) => ()

View file

@ -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)

View file

@ -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<BufferQueue> m_queue;

View file

@ -14,6 +14,8 @@
#include <LibCore/ConfigFile.h>
#include <LibCore/Timer.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/ioctl.h>
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()) {

View file

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