1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:57:44 +00:00

Audio: Make basic streaming WAV playback work.

I had to solve a bunch of things simultaneously to make this work.
Refactor AWavLoader to be a streaming loader rather than a one-shot one.
The constructor parses the header, and if everything looks good, you can
repeatedly ask the AWavLoader for sample buffers until it runs out.

Also send a message from AudioServer when a buffer has finished playing.
That allows us to implement a blocking variant of play().

Use all of this in aplay to play WAV files chunk-at-a-time.
This is definitely not perfect and it's a little glitchy and skippy,
but I think it's a step in the right direction.
This commit is contained in:
Andreas Kling 2019-07-27 17:20:41 +02:00
parent a292d8cd5a
commit 426248098c
10 changed files with 88 additions and 64 deletions

View file

@ -17,7 +17,7 @@ void AClientConnection::handshake()
set_my_client_id(response.greeting.your_client_id);
}
void AClientConnection::play(const ABuffer& buffer)
void AClientConnection::play(const ABuffer& buffer, bool block)
{
auto shared_buf = SharedBuffer::create_with_size(buffer.size_in_bytes());
if (!shared_buf) {
@ -31,5 +31,5 @@ void AClientConnection::play(const ABuffer& buffer)
ASAPI_ClientMessage request;
request.type = ASAPI_ClientMessage::Type::PlayBuffer;
request.play_buffer.buffer_id = shared_buf->shared_buffer_id();
sync_request(request, ASAPI_ServerMessage::Type::PlayingBuffer);
sync_request(request, block ? ASAPI_ServerMessage::Type::FinishedPlayingBuffer : ASAPI_ServerMessage::Type::PlayingBuffer);
}