netsound_recv/
network.rs

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}