mirror of
https://github.com/RGBCube/serenity
synced 2025-05-19 00:15:08 +00:00

Each client connection now sets up an ASBufferQueue, which is basically a queue of ABuffers. This allows us to immediately start streaming the next pending buffer whenever our current buffer runs out of samples. This makes the majority of the skippiness go away for me. :^) Also get rid of the old PlayBuffer API, since we don't need it anymore.
32 lines
1 KiB
C++
32 lines
1 KiB
C++
#include <LibAudio/ABuffer.h>
|
|
#include <LibAudio/AClientConnection.h>
|
|
#include <SharedBuffer.h>
|
|
|
|
AClientConnection::AClientConnection()
|
|
: Connection("/tmp/asportal")
|
|
{
|
|
}
|
|
|
|
void AClientConnection::handshake()
|
|
{
|
|
ASAPI_ClientMessage request;
|
|
request.type = ASAPI_ClientMessage::Type::Greeting;
|
|
request.greeting.client_pid = getpid();
|
|
auto response = sync_request(request, ASAPI_ServerMessage::Type::Greeting);
|
|
set_server_pid(response.greeting.server_pid);
|
|
set_my_client_id(response.greeting.your_client_id);
|
|
}
|
|
|
|
void AClientConnection::enqueue(const ABuffer& buffer)
|
|
{
|
|
for (;;) {
|
|
const_cast<ABuffer&>(buffer).shared_buffer().share_with(server_pid());
|
|
ASAPI_ClientMessage request;
|
|
request.type = ASAPI_ClientMessage::Type::EnqueueBuffer;
|
|
request.play_buffer.buffer_id = buffer.shared_buffer_id();
|
|
auto response = sync_request(request, ASAPI_ServerMessage::Type::EnqueueBufferResponse);
|
|
if (response.success)
|
|
break;
|
|
sleep(1);
|
|
}
|
|
}
|