diff --git a/Libraries/LibAudio/AClientConnection.cpp b/Libraries/LibAudio/AClientConnection.cpp index 0ff43ec198..de1e368657 100644 --- a/Libraries/LibAudio/AClientConnection.cpp +++ b/Libraries/LibAudio/AClientConnection.cpp @@ -41,3 +41,8 @@ void AClientConnection::set_main_mix_volume(int volume) { send_sync(volume); } + +int AClientConnection::get_remaining_samples() +{ + return send_sync()->remaining_samples(); +} diff --git a/Libraries/LibAudio/AClientConnection.h b/Libraries/LibAudio/AClientConnection.h index 95e406fd20..c1d2523340 100644 --- a/Libraries/LibAudio/AClientConnection.h +++ b/Libraries/LibAudio/AClientConnection.h @@ -16,4 +16,6 @@ public: int get_main_mix_volume(); void set_main_mix_volume(int); + + int get_remaining_samples(); }; diff --git a/Servers/AudioServer/ASClientConnection.cpp b/Servers/AudioServer/ASClientConnection.cpp index 0ec2b0d13c..43e2e5e813 100644 --- a/Servers/AudioServer/ASClientConnection.cpp +++ b/Servers/AudioServer/ASClientConnection.cpp @@ -71,3 +71,12 @@ OwnPtr ASClientConnection::handle(const Audi m_queue->enqueue(ABuffer::create_with_shared_buffer(*shared_buffer, message.sample_count())); return make(true); } + +OwnPtr ASClientConnection::handle(const AudioServer::GetRemainingSamples&) +{ + int remaining = 0; + if(m_queue) + remaining = m_queue->get_remaining_samples(); + + return make(remaining); +} diff --git a/Servers/AudioServer/ASClientConnection.h b/Servers/AudioServer/ASClientConnection.h index e4d440fcf6..a50fbd270e 100644 --- a/Servers/AudioServer/ASClientConnection.h +++ b/Servers/AudioServer/ASClientConnection.h @@ -22,6 +22,7 @@ private: virtual OwnPtr handle(const AudioServer::GetMainMixVolume&) override; virtual OwnPtr handle(const AudioServer::SetMainMixVolume&) override; virtual OwnPtr handle(const AudioServer::EnqueueBuffer&) override; + virtual OwnPtr handle(const AudioServer::GetRemainingSamples&) override; ASMixer& m_mixer; RefPtr m_queue; diff --git a/Servers/AudioServer/ASMixer.cpp b/Servers/AudioServer/ASMixer.cpp index 7ca7839bf6..15a317e4a4 100644 --- a/Servers/AudioServer/ASMixer.cpp +++ b/Servers/AudioServer/ASMixer.cpp @@ -100,5 +100,6 @@ ASBufferQueue::ASBufferQueue(ASClientConnection& client) void ASBufferQueue::enqueue(NonnullRefPtr&& buffer) { + m_remaining_samples += buffer->sample_count(); m_queue.enqueue(move(buffer)); } diff --git a/Servers/AudioServer/ASMixer.h b/Servers/AudioServer/ASMixer.h index 7a6b032715..cd086d0da7 100644 --- a/Servers/AudioServer/ASMixer.h +++ b/Servers/AudioServer/ASMixer.h @@ -24,9 +24,13 @@ public: { while (!m_current && !m_queue.is_empty()) m_current = m_queue.dequeue(); + if (!m_current) return false; + sample = m_current->samples()[m_position++]; + m_remaining_samples--; + if (m_position >= m_current->sample_count()) { m_current = nullptr; m_position = 0; @@ -35,16 +39,20 @@ public: } ASClientConnection* client() { return m_client.ptr(); } + void clear() { m_queue.clear(); m_position = 0; } + int get_remaining_samples() const { return m_remaining_samples; } + private: RefPtr m_current; Queue> m_queue; int m_position { 0 }; + int m_remaining_samples { 0 }; WeakPtr m_client; }; diff --git a/Servers/AudioServer/AudioServer.ipc b/Servers/AudioServer/AudioServer.ipc index dfad1dd7fa..a68beef39a 100644 --- a/Servers/AudioServer/AudioServer.ipc +++ b/Servers/AudioServer/AudioServer.ipc @@ -9,4 +9,6 @@ endpoint AudioServer // Buffer playback EnqueueBuffer(i32 buffer_id, int sample_count) => (bool success) + + GetRemainingSamples() => (int remaining_samples) }