Serenity Operating System
at master 137 lines 3.4 kB view raw
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}