use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use crate::common::audiobuffer::AudioBuffer;
use crate::common::clientport::ClientPort;
use crate::server::portmanager::PortManager;
pub struct Client {
pub id: i32,
pub receive_port: u16,
pub send_port: u16,
pub queued_incoming_buffers: Vec<AudioBuffer>,
}
impl Client {
pub fn get_next_buffer(&mut self) -> Option<AudioBuffer> {
if self.queued_incoming_buffers.len() > 0 {
Some(self.queued_incoming_buffers.remove(0))
} else {
None
}
}
pub fn enqueue_buffer(&mut self, buffer: AudioBuffer) {
self.queued_incoming_buffers.push(buffer);
}
}
pub struct ClientManager {
clients: HashMap<i32, Client>,
send_ports: Arc<Mutex< Vec<Arc<Mutex<ClientPort>>> >>,
receive_ports: Arc<Mutex< Vec<Arc<Mutex<ClientPort>>> >>
}
impl ClientManager {
pub fn new() -> ClientManager {
ClientManager {
clients: HashMap::new(),
send_ports: Arc::new(Mutex::new(vec![])),
receive_ports: Arc::new(Mutex::new(vec![]))
}
}
pub fn get_by_id(&mut self, id: i32) -> Option<&mut Client> {
self.clients.get_mut(&id)
}
pub fn add(&mut self, id: i32, receive_port: u16, send_port: u16) {
self.clients.insert(id, Client {
id,
receive_port,
send_port,
queued_incoming_buffers: Vec::new(),
});
}
pub fn remove(&mut self, id: i32) {
self.clients.remove(&id);
}
}