Initial commit

+ Working with tap!
This commit is contained in:
joeyahines committed 2025-08-30 18:54:50 -06:00
commit 2d621929e3
12 files changed
+5019

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
use crate::stream::Stream;
use audiopus::coder::Decoder;
use audiopus::{Channels, MutSignals, SampleRate};
use std::io::Write;
use tokio::net::UdpSocket;
pub const SAMPLE_RATE: SampleRate = SampleRate::Hz48000;
pub const SAMPLE_RATE_RAW: usize = 48_000;
pub const AUDIO_FRAME_RATE: usize = 50;
pub const MONO_FRAME_SIZE: usize = SAMPLE_RATE_RAW / AUDIO_FRAME_RATE;
pub const STEREO_FRAME_SIZE: usize = 2 * MONO_FRAME_SIZE;
pub struct UdpSource {
udp: UdpSocket,
stream: Stream,
decoder: Decoder,
}
impl UdpSource {
pub fn new(udp_socket: UdpSocket, stream: Stream) -> Self {
Self {
udp: udp_socket,
stream,
decoder: Decoder::new(SAMPLE_RATE, Channels::Stereo).unwrap(),
}
}
pub async fn worker(&mut self) {
let mut buffer = vec![0; 1024 * 32];
loop {
let len = self.udp.recv(&mut buffer).await.unwrap();
let packet = audiopus::packet::Packet::try_from(&buffer[12..len]).unwrap();
let mut samples = vec![0.0; STEREO_FRAME_SIZE];
let signals = MutSignals::try_from(&mut samples).unwrap();
let sample_size = self
.decoder
.decode_float(Some(packet), signals, false)
.unwrap()
* 2;
let mut sample_bytes = Vec::with_capacity(sample_size * std::mem::size_of::<f32>());
for sample in &samples[0..sample_size] {
let bytes = sample.to_le_bytes();
sample_bytes.extend_from_slice(bytes.as_slice());
}
self.stream.write_all(&sample_bytes).unwrap();
}
}
}