mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 01:07:34 +00:00
AudioServer: Allow muting the system audio
This patch adds muting to ASMixer, which works by substituting what we would normally send to the sound card with zero-filled memory instead. We do it this way to ensure that the queued sample buffers keep getting played (silently.) This is obviously not the perfect way of doing this, and in the future we should improve on this, and also find a way to utilize any hardware mixing functions in the sound card.
This commit is contained in:
parent
2b9ec22576
commit
107011f119
8 changed files with 72 additions and 15 deletions
|
@ -15,6 +15,8 @@ ASMixer::ASMixer()
|
|||
return;
|
||||
}
|
||||
|
||||
m_zero_filled_buffer = (u8*)malloc(4096);
|
||||
bzero(m_zero_filled_buffer, 4096);
|
||||
m_sound_thread.start();
|
||||
}
|
||||
|
||||
|
@ -66,33 +68,42 @@ void ASMixer::mix()
|
|||
}
|
||||
}
|
||||
|
||||
bool muted = m_muted;
|
||||
|
||||
// output the mixed stuff to the device
|
||||
u8 raw_buffer[4096];
|
||||
auto buffer = ByteBuffer::wrap(raw_buffer, sizeof(raw_buffer));
|
||||
auto buffer = ByteBuffer::wrap(muted ? m_zero_filled_buffer : raw_buffer, sizeof(raw_buffer));
|
||||
|
||||
BufferStream stream(buffer);
|
||||
if (!muted) {
|
||||
for (int i = 0; i < mixed_buffer_length; ++i) {
|
||||
auto& mixed_sample = mixed_buffer[i];
|
||||
|
||||
for (int i = 0; i < mixed_buffer_length; ++i) {
|
||||
auto& mixed_sample = mixed_buffer[i];
|
||||
mixed_sample.scale(m_main_volume);
|
||||
mixed_sample.clip();
|
||||
|
||||
mixed_sample.scale(m_main_volume);
|
||||
mixed_sample.clip();
|
||||
i16 out_sample;
|
||||
out_sample = mixed_sample.left * std::numeric_limits<i16>::max();
|
||||
stream << out_sample;
|
||||
|
||||
i16 out_sample;
|
||||
out_sample = mixed_sample.left * std::numeric_limits<i16>::max();
|
||||
stream << out_sample;
|
||||
|
||||
ASSERT(!stream.at_end()); // we should have enough space for both channels in one buffer!
|
||||
out_sample = mixed_sample.right * std::numeric_limits<i16>::max();
|
||||
stream << out_sample;
|
||||
ASSERT(!stream.at_end()); // we should have enough space for both channels in one buffer!
|
||||
out_sample = mixed_sample.right * std::numeric_limits<i16>::max();
|
||||
stream << out_sample;
|
||||
}
|
||||
}
|
||||
|
||||
if (stream.offset() != 0) {
|
||||
buffer.trim(stream.offset());
|
||||
m_device->write(buffer);
|
||||
}
|
||||
m_device->write(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void ASMixer::set_muted(bool muted)
|
||||
{
|
||||
m_muted = muted;
|
||||
}
|
||||
|
||||
ASBufferQueue::ASBufferQueue(ASClientConnection& client)
|
||||
: m_client(client.make_weak_ptr())
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue