mirror of
https://github.com/fergalmoran/ladybird.git
synced 2025-12-30 13:19:47 +00:00
Use CLocalServer to listen for connections in WindowServer and AudioServer. This allows us to accept incoming CLocalSocket objects from the CLocalServer and construct client connections based on those. Removed COpenedSocket since it's replaced by CLocalSocket.
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
#include "ASClientConnection.h"
|
|
#include "ASMixer.h"
|
|
|
|
#include <LibCore/CEventLoop.h>
|
|
#include <LibAudio/ASAPI.h>
|
|
#include <LibAudio/ABuffer.h>
|
|
#include <SharedBuffer.h>
|
|
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <sys/uio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <stdio.h>
|
|
|
|
ASClientConnection::ASClientConnection(CLocalSocket& client_socket, int client_id, ASMixer& mixer)
|
|
: Connection(client_socket, client_id)
|
|
, m_mixer(mixer)
|
|
{
|
|
}
|
|
|
|
ASClientConnection::~ASClientConnection()
|
|
{
|
|
}
|
|
|
|
void ASClientConnection::send_greeting()
|
|
{
|
|
ASAPI_ServerMessage message;
|
|
message.type = ASAPI_ServerMessage::Type::Greeting;
|
|
message.greeting.server_pid = getpid();
|
|
message.greeting.your_client_id = client_id();
|
|
post_message(message);
|
|
}
|
|
|
|
bool ASClientConnection::handle_message(const ASAPI_ClientMessage& message, const ByteBuffer&&)
|
|
{
|
|
switch (message.type) {
|
|
case ASAPI_ClientMessage::Type::Greeting:
|
|
set_client_pid(message.greeting.client_pid);
|
|
break;
|
|
case ASAPI_ClientMessage::Type::PlayBuffer: {
|
|
// ### ensure that the size is that of a Vector<ASample>
|
|
Vector<ASample> samples;
|
|
|
|
{
|
|
const auto& shared_buf = SharedBuffer::create_from_shared_buffer_id(message.play_buffer.buffer_id);
|
|
if (!shared_buf) {
|
|
did_misbehave();
|
|
return false;
|
|
}
|
|
|
|
if (shared_buf->size() / sizeof(ASample) > 441000) {
|
|
did_misbehave();
|
|
return false;
|
|
}
|
|
samples.resize(shared_buf->size() / sizeof(ASample));
|
|
memcpy(samples.data(), shared_buf->data(), shared_buf->size());
|
|
}
|
|
|
|
// we no longer need the buffer, so acknowledge that it's playing
|
|
// TODO: rate limit playback here somehow
|
|
ASAPI_ServerMessage reply;
|
|
reply.type = ASAPI_ServerMessage::Type::PlayingBuffer;
|
|
reply.playing_buffer.buffer_id = message.play_buffer.buffer_id;
|
|
post_message(reply);
|
|
|
|
m_mixer.queue(*this, adopt(*new ABuffer(move(samples))));
|
|
break;
|
|
}
|
|
case ASAPI_ClientMessage::Type::Invalid:
|
|
default:
|
|
dbgprintf("ASClientConnection: Unexpected message ID %d\n", int(message.type));
|
|
did_misbehave();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|