1use std::net::{TcpListener, TcpStream};
2use std::io::Read;
3use std::time::Duration;
4use std::thread;
5use rodio::{OutputStream, Sink, source::Source};
6
7pub fn start_tcp_listener() {
8 let listener = TcpListener::bind("0.0.0.0:20233");
9 for stream in listener.expect("REASON").incoming() {
10 match stream {
11 Ok(mut stream) => {
12 thread::spawn(move || {
13 handle_client(&mut stream);
14 });
15 },
16 Err(e) => println!("connection failed: {}", e),
17 }
18 }
19}
20
21fn handle_client(stream: &mut TcpStream) {
22 let (_stream, stream_handle) = OutputStream::try_default().unwrap();
23 let sink = Sink::try_new(&stream_handle).unwrap();
24 let mut buf = vec![0u8; 65536];
25
26 loop {
27 let n = match stream.read(&mut buf) {
28 Ok(0) => break,
29 Ok(n) => n,
30 Err(e) => {
31 eprintln!("failed {}", e);
32 break;
33 }
34 };
35
36 buf.truncate(n);
37
38 let i16_buf: Vec<i16> = buf
39 .chunks_exact(2)
40 .map(|chunk| i16::from_le_bytes([chunk[0], chunk[1]]))
41 .collect();
42
43 let samples = rodio::buffer::SamplesBuffer::new(2, 44100, i16_buf)
44 .amplify(1.0)
45 .delay(Duration::from_millis(0));
46
47 sink.append(samples);
48 thread::sleep(Duration::from_millis(1));
49 }
50}