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}