A multiplayer VR framework w/voice chat
at main 1.3 kB view raw
1use std::{collections::VecDeque, sync::{Arc, Mutex, RwLock, mpsc::{Sender, channel}}, thread}; 2 3use opus::{Channels, Decoder}; 4 5use crate::{MONO_20MS, SAMPLE_RATE}; 6 7pub struct VoiceChatDecoder{ 8 stream_in: Sender<Vec<u8>>, 9 last_rms: Arc<RwLock<f32>> 10} 11 12impl VoiceChatDecoder{ 13 pub fn new( queue: Arc<Mutex<VecDeque<f32>>> ) -> Self{ 14 let mut decoder = Decoder::new(SAMPLE_RATE as u32, Channels::Mono).unwrap(); 15 let ( stream_in, stream_out ) = channel(); 16 17 let set_rms = Arc::new(RwLock::new(0.0)); 18 let set_rms_1 = set_rms.clone(); 19 20 thread::spawn(move || { 21 let mut buffer = [0.0; MONO_20MS]; 22 23 loop { 24 let packet: Vec<u8> = stream_out.recv().unwrap(); 25 decoder.decode_float(&packet, &mut buffer, false).unwrap(); 26 27 let mut total = 0.0; 28 for sample in buffer{ total += sample.powi(2) } 29 *set_rms.write().unwrap() = 20.0 * ( total / buffer.len() as f32 ).sqrt().log10(); 30 31 let mut voice = queue.lock().unwrap(); 32 for sample in buffer{ voice.push_back(sample); } 33 } 34 }); 35 36 Self { 37 stream_in, 38 last_rms: set_rms_1 39 } 40 } 41 42 pub fn decode( &self, packet: Vec<u8> ){ 43 self.stream_in.send(packet).unwrap(); 44 } 45 46 pub fn get_last_rms( &self ) -> f32{ 47 *self.last_rms.read().unwrap() 48 } 49}