#pragma once #include #include #include #include #include class AudioServer { BAN_NON_MOVABLE(AudioServer); BAN_NON_COPYABLE(AudioServer); public: AudioServer(int audio_device_fd); BAN::ErrorOr 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 m_send_buffer; BAN::CircularQueue m_samples; BAN::HashMap m_audio_buffers; };