Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "ConnectionFromClient.h"
8#include "Mixer.h"
9#include <AudioServer/AudioClientEndpoint.h>
10#include <LibAudio/Queue.h>
11
12namespace AudioServer {
13
14static HashMap<int, RefPtr<ConnectionFromClient>> s_connections;
15
16void ConnectionFromClient::for_each(Function<void(ConnectionFromClient&)> callback)
17{
18 Vector<NonnullRefPtr<ConnectionFromClient>> connections;
19 for (auto& it : s_connections)
20 connections.append(*it.value);
21 for (auto& connection : connections)
22 callback(connection);
23}
24
25ConnectionFromClient::ConnectionFromClient(NonnullOwnPtr<Core::LocalSocket> client_socket, int client_id, Mixer& mixer)
26 : IPC::ConnectionFromClient<AudioClientEndpoint, AudioServerEndpoint>(*this, move(client_socket), client_id)
27 , m_mixer(mixer)
28{
29 s_connections.set(client_id, *this);
30}
31
32void ConnectionFromClient::die()
33{
34 s_connections.remove(client_id());
35}
36
37void ConnectionFromClient::set_buffer(Audio::AudioQueue const& buffer)
38{
39 if (!buffer.is_valid()) {
40 did_misbehave("Received an invalid buffer");
41 return;
42 }
43 if (!m_queue)
44 m_queue = m_mixer.create_queue(*this);
45
46 // This is ugly but we know nobody uses the buffer afterwards anyways.
47 m_queue->set_buffer(make<Audio::AudioQueue>(move(const_cast<Audio::AudioQueue&>(buffer))));
48}
49
50void ConnectionFromClient::did_change_main_mix_muted_state(Badge<Mixer>, bool muted)
51{
52 async_main_mix_muted_state_changed(muted);
53}
54
55void ConnectionFromClient::did_change_main_mix_volume(Badge<Mixer>, double volume)
56{
57 async_main_mix_volume_changed(volume);
58}
59
60void ConnectionFromClient::did_change_client_volume(Badge<ClientAudioStream>, double volume)
61{
62 async_client_volume_changed(volume);
63}
64
65Messages::AudioServer::GetMainMixVolumeResponse ConnectionFromClient::get_main_mix_volume()
66{
67 return m_mixer.main_volume();
68}
69
70void ConnectionFromClient::set_main_mix_volume(double volume)
71{
72 m_mixer.set_main_volume(volume);
73}
74
75Messages::AudioServer::GetSampleRateResponse ConnectionFromClient::get_sample_rate()
76{
77 return { m_mixer.audiodevice_get_sample_rate() };
78}
79
80void ConnectionFromClient::set_sample_rate(u32 sample_rate)
81{
82 m_mixer.audiodevice_set_sample_rate(sample_rate);
83}
84
85Messages::AudioServer::GetSelfVolumeResponse ConnectionFromClient::get_self_volume()
86{
87 return m_queue->volume().target();
88}
89
90void ConnectionFromClient::set_self_volume(double volume)
91{
92 if (m_queue)
93 m_queue->set_volume(volume);
94}
95
96void ConnectionFromClient::start_playback()
97{
98 if (m_queue)
99 m_queue->set_paused(false);
100}
101
102void ConnectionFromClient::pause_playback()
103{
104 if (m_queue)
105 m_queue->set_paused(true);
106}
107
108void ConnectionFromClient::clear_buffer()
109{
110 if (m_queue)
111 m_queue->clear();
112}
113
114Messages::AudioServer::IsMainMixMutedResponse ConnectionFromClient::is_main_mix_muted()
115{
116 return m_mixer.is_muted();
117}
118
119void ConnectionFromClient::set_main_mix_muted(bool muted)
120{
121 m_mixer.set_muted(muted);
122}
123
124Messages::AudioServer::IsSelfMutedResponse ConnectionFromClient::is_self_muted()
125{
126 if (m_queue)
127 return m_queue->is_muted();
128
129 return false;
130}
131
132void ConnectionFromClient::set_self_muted(bool muted)
133{
134 if (m_queue)
135 m_queue->set_muted(muted);
136}
137}