1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 21:37:35 +00:00

AudioServer: Broadcast muted state changes to all clients

This commit is contained in:
Andreas Kling 2019-11-23 17:21:12 +01:00
parent 00ab9488ad
commit 84cb91de38
6 changed files with 37 additions and 1 deletions

View file

@ -13,6 +13,15 @@
static HashMap<int, RefPtr<ASClientConnection>> s_connections;
void ASClientConnection::for_each(Function<void(ASClientConnection&)> callback)
{
NonnullRefPtrVector<ASClientConnection> connections;
for (auto& it : s_connections)
connections.append(*it.value);
for (auto& connection : connections)
callback(connection);
}
ASClientConnection::ASClientConnection(CLocalSocket& client_socket, int client_id, ASMixer& mixer)
: ConnectionNG(*this, client_socket, client_id)
, m_mixer(mixer)
@ -34,6 +43,11 @@ void ASClientConnection::did_finish_playing_buffer(Badge<ASBufferQueue>, int buf
post_message(AudioClient::FinishedPlayingBuffer(buffer_id));
}
void ASClientConnection::did_change_muted_state(Badge<ASMixer>, bool muted)
{
post_message(AudioClient::MutedStateChanged(muted));
}
OwnPtr<AudioServer::GreetResponse> ASClientConnection::handle(const AudioServer::Greet& message)
{
set_client_pid(message.client_pid());

View file

@ -13,10 +13,14 @@ class ASClientConnection final : public IPC::Server::ConnectionNG<AudioServerEnd
public:
explicit ASClientConnection(CLocalSocket&, int client_id, ASMixer& mixer);
~ASClientConnection() override;
void did_finish_playing_buffer(Badge<ASBufferQueue>, int buffer_id);
void did_change_muted_state(Badge<ASMixer>, bool muted);
virtual void die() override;
static void for_each(Function<void(ASClientConnection&)>);
private:
virtual OwnPtr<AudioServer::GreetResponse> handle(const AudioServer::Greet&) override;
virtual OwnPtr<AudioServer::GetMainMixVolumeResponse> handle(const AudioServer::GetMainMixVolume&) override;

View file

@ -101,7 +101,12 @@ void ASMixer::mix()
void ASMixer::set_muted(bool muted)
{
if (m_muted == muted)
return;
m_muted = muted;
ASClientConnection::for_each([muted](ASClientConnection& client) {
client.did_change_muted_state({}, muted);
});
}
ASBufferQueue::ASBufferQueue(ASClientConnection& client)

View file

@ -1,4 +1,5 @@
endpoint AudioClient = 82
{
FinishedPlayingBuffer(i32 buffer_id) =|
MutedStateChanged(bool muted) =|
}