瀏覽代碼

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.
kleines Filmröllchen 4 年之前
父節點
當前提交
9880a5c481

+ 4 - 0
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) => ()

+ 10 - 0
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)

+ 2 - 0
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<BufferQueue> m_queue;

+ 19 - 0
Userland/Services/AudioServer/Mixer.cpp

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

+ 3 - 0
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();