mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:17:34 +00:00
Audio: Add per-client volume
Note: While ClientAudioStream has had a volume property, it is only now used in the mixer.
This commit is contained in:
parent
5300c9e6b4
commit
bd17da9f9e
7 changed files with 33 additions and 1 deletions
|
@ -54,4 +54,10 @@ void ClientConnection::main_mix_volume_changed(double volume)
|
||||||
on_main_mix_volume_change(volume);
|
on_main_mix_volume_change(volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientConnection::client_volume_changed(double volume)
|
||||||
|
{
|
||||||
|
if (on_client_volume_change)
|
||||||
|
on_client_volume_change(volume);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,11 +28,13 @@ public:
|
||||||
Function<void(i32 buffer_id)> on_finish_playing_buffer;
|
Function<void(i32 buffer_id)> on_finish_playing_buffer;
|
||||||
Function<void(bool muted)> on_muted_state_change;
|
Function<void(bool muted)> on_muted_state_change;
|
||||||
Function<void(double volume)> on_main_mix_volume_change;
|
Function<void(double volume)> on_main_mix_volume_change;
|
||||||
|
Function<void(double volume)> on_client_volume_change;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void finished_playing_buffer(i32) override;
|
virtual void finished_playing_buffer(i32) override;
|
||||||
virtual void muted_state_changed(bool) override;
|
virtual void muted_state_changed(bool) override;
|
||||||
virtual void main_mix_volume_changed(double) override;
|
virtual void main_mix_volume_changed(double) override;
|
||||||
|
virtual void client_volume_changed(double) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,4 +5,5 @@ endpoint AudioClient
|
||||||
finished_playing_buffer(i32 buffer_id) =|
|
finished_playing_buffer(i32 buffer_id) =|
|
||||||
muted_state_changed(bool muted) =|
|
muted_state_changed(bool muted) =|
|
||||||
main_mix_volume_changed(double volume) =|
|
main_mix_volume_changed(double volume) =|
|
||||||
|
client_volume_changed(double volume) =|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@ endpoint AudioServer
|
||||||
get_muted() => (bool muted)
|
get_muted() => (bool muted)
|
||||||
get_main_mix_volume() => (double volume)
|
get_main_mix_volume() => (double volume)
|
||||||
set_main_mix_volume(double volume) => ()
|
set_main_mix_volume(double volume) => ()
|
||||||
|
get_self_volume() => (double volume)
|
||||||
|
set_self_volume(double volume) => ()
|
||||||
|
|
||||||
// Audio device
|
// Audio device
|
||||||
set_sample_rate(u16 sample_rate) => ()
|
set_sample_rate(u16 sample_rate) => ()
|
||||||
|
|
|
@ -53,6 +53,11 @@ void ClientConnection::did_change_main_mix_volume(Badge<Mixer>, double volume)
|
||||||
async_main_mix_volume_changed(volume);
|
async_main_mix_volume_changed(volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientConnection::did_change_client_volume(Badge<ClientAudioStream>, double volume)
|
||||||
|
{
|
||||||
|
async_client_volume_changed(volume);
|
||||||
|
}
|
||||||
|
|
||||||
Messages::AudioServer::GetMainMixVolumeResponse ClientConnection::get_main_mix_volume()
|
Messages::AudioServer::GetMainMixVolumeResponse ClientConnection::get_main_mix_volume()
|
||||||
{
|
{
|
||||||
return m_mixer.main_volume();
|
return m_mixer.main_volume();
|
||||||
|
@ -73,6 +78,17 @@ void ClientConnection::set_sample_rate(u16 sample_rate)
|
||||||
m_mixer.audiodevice_set_sample_rate(sample_rate);
|
m_mixer.audiodevice_set_sample_rate(sample_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Messages::AudioServer::GetSelfVolumeResponse ClientConnection::get_self_volume()
|
||||||
|
{
|
||||||
|
return m_queue->volume().target();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientConnection::set_self_volume(double volume)
|
||||||
|
{
|
||||||
|
if (m_queue)
|
||||||
|
m_queue->set_volume(volume);
|
||||||
|
}
|
||||||
|
|
||||||
Messages::AudioServer::EnqueueBufferResponse ClientConnection::enqueue_buffer(Core::AnonymousBuffer const& buffer, i32 buffer_id, int sample_count)
|
Messages::AudioServer::EnqueueBufferResponse ClientConnection::enqueue_buffer(Core::AnonymousBuffer const& buffer, i32 buffer_id, int sample_count)
|
||||||
{
|
{
|
||||||
if (!m_queue)
|
if (!m_queue)
|
||||||
|
|
|
@ -26,7 +26,8 @@ public:
|
||||||
explicit ClientConnection(NonnullRefPtr<Core::LocalSocket>, int client_id, Mixer& mixer);
|
explicit ClientConnection(NonnullRefPtr<Core::LocalSocket>, int client_id, Mixer& mixer);
|
||||||
~ClientConnection() override;
|
~ClientConnection() override;
|
||||||
|
|
||||||
void did_finish_playing_buffer(Badge<BufferQueue>, int buffer_id);
|
void did_finish_playing_buffer(Badge<ClientAudioStream>, int buffer_id);
|
||||||
|
void did_change_client_volume(Badge<ClientAudioStream>, double volume);
|
||||||
void did_change_muted_state(Badge<Mixer>, bool muted);
|
void did_change_muted_state(Badge<Mixer>, bool muted);
|
||||||
void did_change_main_mix_volume(Badge<Mixer>, double volume);
|
void did_change_main_mix_volume(Badge<Mixer>, double volume);
|
||||||
|
|
||||||
|
@ -37,6 +38,8 @@ public:
|
||||||
private:
|
private:
|
||||||
virtual Messages::AudioServer::GetMainMixVolumeResponse get_main_mix_volume() override;
|
virtual Messages::AudioServer::GetMainMixVolumeResponse get_main_mix_volume() override;
|
||||||
virtual void set_main_mix_volume(double) override;
|
virtual void set_main_mix_volume(double) override;
|
||||||
|
virtual Messages::AudioServer::GetSelfVolumeResponse get_self_volume() override;
|
||||||
|
virtual void set_self_volume(double) override;
|
||||||
virtual Messages::AudioServer::EnqueueBufferResponse enqueue_buffer(Core::AnonymousBuffer const&, i32, int) override;
|
virtual Messages::AudioServer::EnqueueBufferResponse enqueue_buffer(Core::AnonymousBuffer const&, i32, int) override;
|
||||||
virtual Messages::AudioServer::GetRemainingSamplesResponse get_remaining_samples() override;
|
virtual Messages::AudioServer::GetRemainingSamplesResponse get_remaining_samples() override;
|
||||||
virtual Messages::AudioServer::GetPlayedSamplesResponse get_played_samples() override;
|
virtual Messages::AudioServer::GetPlayedSamplesResponse get_played_samples() override;
|
||||||
|
|
|
@ -88,6 +88,7 @@ void Mixer::mix()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
++active_queues;
|
++active_queues;
|
||||||
|
queue->volume().advance_time();
|
||||||
|
|
||||||
for (int i = 0; i < mixed_buffer_length; ++i) {
|
for (int i = 0; i < mixed_buffer_length; ++i) {
|
||||||
auto& mixed_sample = mixed_buffer[i];
|
auto& mixed_sample = mixed_buffer[i];
|
||||||
|
@ -95,6 +96,7 @@ void Mixer::mix()
|
||||||
if (!queue->get_next_sample(sample))
|
if (!queue->get_next_sample(sample))
|
||||||
break;
|
break;
|
||||||
sample.log_multiply(SAMPLE_HEADROOM);
|
sample.log_multiply(SAMPLE_HEADROOM);
|
||||||
|
sample.log_multiply(queue->volume());
|
||||||
mixed_sample += sample;
|
mixed_sample += sample;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue