49 lines
891 B
C++
49 lines
891 B
C++
#pragma once
|
|
|
|
#include <BAN/Array.h>
|
|
#include <BAN/ByteSpan.h>
|
|
#include <BAN/CircularQueue.h>
|
|
#include <BAN/HashMap.h>
|
|
|
|
#include <LibAudio/Audio.h>
|
|
|
|
class AudioServer
|
|
{
|
|
BAN_NON_MOVABLE(AudioServer);
|
|
BAN_NON_COPYABLE(AudioServer);
|
|
|
|
public:
|
|
AudioServer(int audio_device_fd);
|
|
|
|
BAN::ErrorOr<void> on_new_client(int fd);
|
|
void on_client_disconnect(int fd);
|
|
bool on_client_packet(int fd, long smo_key);
|
|
|
|
void update();
|
|
|
|
private:
|
|
struct ClientInfo
|
|
{
|
|
LibAudio::AudioBuffer* buffer;
|
|
size_t sample_frames_queued { 0 };
|
|
};
|
|
|
|
private:
|
|
enum class AddOrRemove { Add, Remove };
|
|
|
|
void reset_kernel_buffer();
|
|
|
|
void send_samples();
|
|
|
|
private:
|
|
const int m_audio_device_fd;
|
|
uint32_t m_sample_rate;
|
|
uint32_t m_channels;
|
|
|
|
size_t m_samples_sent { 0 };
|
|
BAN::Array<uint8_t, 1024> m_send_buffer;
|
|
BAN::CircularQueue<double, 64 * 1024> m_samples;
|
|
|
|
BAN::HashMap<int, ClientInfo> m_audio_buffers;
|
|
};
|