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

Client-side connection objects must now provide both client and server endpoint types. When a message is received from the server side, we try to decode it using both endpoint types and then send it to the right place for handling. This now makes it possible for AudioServer to send unsolicited messages to its clients. This opens up a ton of possibilities :^)
82 lines
2 KiB
C++
82 lines
2 KiB
C++
#include <LibAudio/ABuffer.h>
|
|
#include <LibAudio/AClientConnection.h>
|
|
#include <SharedBuffer.h>
|
|
|
|
AClientConnection::AClientConnection()
|
|
: ConnectionNG(*this, "/tmp/asportal")
|
|
{
|
|
}
|
|
|
|
void AClientConnection::handshake()
|
|
{
|
|
auto response = send_sync<AudioServer::Greet>(getpid());
|
|
set_server_pid(response->server_pid());
|
|
set_my_client_id(response->client_id());
|
|
}
|
|
|
|
void AClientConnection::enqueue(const ABuffer& buffer)
|
|
{
|
|
for (;;) {
|
|
const_cast<ABuffer&>(buffer).shared_buffer().share_with(server_pid());
|
|
auto response = send_sync<AudioServer::EnqueueBuffer>(buffer.shared_buffer_id(), buffer.sample_count());
|
|
if (response->success())
|
|
break;
|
|
sleep(1);
|
|
}
|
|
}
|
|
|
|
bool AClientConnection::try_enqueue(const ABuffer& buffer)
|
|
{
|
|
const_cast<ABuffer&>(buffer).shared_buffer().share_with(server_pid());
|
|
auto response = send_sync<AudioServer::EnqueueBuffer>(buffer.shared_buffer_id(), buffer.sample_count());
|
|
return response->success();
|
|
}
|
|
|
|
bool AClientConnection::get_muted()
|
|
{
|
|
return send_sync<AudioServer::GetMuted>()->muted();
|
|
}
|
|
|
|
void AClientConnection::set_muted(bool muted)
|
|
{
|
|
send_sync<AudioServer::SetMuted>(muted);
|
|
}
|
|
|
|
int AClientConnection::get_main_mix_volume()
|
|
{
|
|
return send_sync<AudioServer::GetMainMixVolume>()->volume();
|
|
}
|
|
|
|
void AClientConnection::set_main_mix_volume(int volume)
|
|
{
|
|
send_sync<AudioServer::SetMainMixVolume>(volume);
|
|
}
|
|
|
|
int AClientConnection::get_remaining_samples()
|
|
{
|
|
return send_sync<AudioServer::GetRemainingSamples>()->remaining_samples();
|
|
}
|
|
|
|
int AClientConnection::get_played_samples()
|
|
{
|
|
return send_sync<AudioServer::GetPlayedSamples>()->played_samples();
|
|
}
|
|
|
|
void AClientConnection::set_paused(bool paused)
|
|
{
|
|
send_sync<AudioServer::SetPaused>(paused);
|
|
}
|
|
|
|
void AClientConnection::clear_buffer(bool paused)
|
|
{
|
|
send_sync<AudioServer::ClearBuffer>(paused);
|
|
}
|
|
|
|
int AClientConnection::get_playing_buffer()
|
|
{
|
|
return send_sync<AudioServer::GetPlayingBuffer>()->buffer_id();
|
|
}
|
|
|
|
void AClientConnection::handle(const AudioClient::FinishedPlayingBuffer&)
|
|
{
|
|
}
|