use std::{sync::{Arc, Mutex}, net::TcpStream, io::{Write, Read}, thread};
use crate::{common::audiobuffer::AudioBuffer, config::BUFFER_SIZE};
pub struct ResonatorClient {
send_port: u16, receive_port: u16, outgoing_buffers: Arc<Mutex<Vec<AudioBuffer>>>, incoming_buffers: Arc<Mutex<Vec<AudioBuffer>>>, id: i32, reciever_id: i32 }
impl ResonatorClient {
pub fn new(send_port: u16, receive_port: u16, id: i32, reciever_id: i32, external_buffer_input: Option<Arc<Mutex<Vec<AudioBuffer>>>>, external_buffer_output: Option<Arc<Mutex<Vec<AudioBuffer>>>>) -> ResonatorClient {
ResonatorClient {
send_port,
receive_port,
outgoing_buffers: external_buffer_input.unwrap_or(Arc::new(Mutex::new(Vec::new()))), incoming_buffers: external_buffer_output.unwrap_or(Arc::new(Mutex::new(Vec::new()))), id,
reciever_id
}
}
pub fn get_incoming_buffers(&self) -> Arc<Mutex<Vec<AudioBuffer>>> {
self.incoming_buffers.clone()
}
pub fn process_buffer(&self) -> Option<AudioBuffer> {
if self.incoming_buffers.lock().unwrap().len() > 0 {
return Some(self.incoming_buffers.lock().unwrap().remove(0));
}
None
}
pub fn push_buffer(&self, audio_buffer: AudioBuffer) {
self.outgoing_buffers.lock().unwrap().push(audio_buffer);
}
pub fn begin(&self) {
println!("Starting client on ports {} and {}", self.send_port, self.receive_port);
{
let receive_port = self.receive_port.clone();
let incoming_buffers = self.incoming_buffers.clone();
let id = self.id.clone();
thread::spawn(move || {
ResonatorClient::_reciever_thread(receive_port.clone(), incoming_buffers.clone(), id.clone());
loop {}
});
}
{
let send_port = self.send_port.clone();
let outgoning_buffers = self.outgoing_buffers.clone();
let id = self.id.clone();
let receiver_id = self.reciever_id.clone();
thread::spawn(move || {
ResonatorClient::_sender_thread(send_port.clone(), outgoning_buffers.clone(), id.clone(), receiver_id.clone());
loop {}
});
}
}
fn _reciever_thread(port: u16, incoming_buffers: Arc<Mutex<Vec<AudioBuffer>>>, id: i32) {
let mut stream = TcpStream::connect(format!("127.0.0.1:{}", port)).unwrap();
stream.write_all(&id.to_le_bytes()).unwrap();
let mut buffer = [0; BUFFER_SIZE];
loop {
match stream.read(&mut buffer) {
Ok(size) if size == 0 => {
println!("Client closed connection");
break;
}
Ok(size) => size,
Err(_) => {
println!("Client error");
break;
}
};
let audio_buffer = AudioBuffer::from_bytes(&buffer);
incoming_buffers.lock().unwrap().push(audio_buffer.clone());
println!("Received buffer!");
}
}
fn _sender_thread(port: u16, outgoning_buffers: Arc<Mutex<Vec<AudioBuffer>>>, id: i32, reciever_id: i32) {
let mut stream = TcpStream::connect(format!("127.0.0.1:{}", port)).unwrap();
loop {
if outgoning_buffers.lock().unwrap().len() == 0 {
continue;
}
println!("Sending buffer from client");
let audio_buffer = outgoning_buffers.lock().unwrap().remove(0);
let raw_buffer = audio_buffer.as_buffer().unwrap().raw_buffer_with_header(id, reciever_id);
stream.write_all(&raw_buffer).unwrap();
}
}
}