aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/audio.rs
diff options
context:
space:
mode:
authorEskil Queseth <eskilq@kth.se>2020-10-11 21:46:54 +0200
committerEskil Queseth <eskilq@kth.se>2020-10-11 21:46:54 +0200
commit5b2bc17a053674fe57f85a99e5dc61d031a553af (patch)
tree7245fab51977b3a8635e05d23d84de993ac94012 /mumd/src/audio.rs
parent5f27ead2214950e43ccc729c6dd9d6b92c8cc14a (diff)
parent7a665dc029046353ab131f19a43849479340fb6f (diff)
downloadmum-5b2bc17a053674fe57f85a99e5dc61d031a553af.tar.gz
Merge branch 'main' of github.com:sornas/mum into main
Diffstat (limited to 'mumd/src/audio.rs')
-rw-r--r--mumd/src/audio.rs34
1 files changed, 27 insertions, 7 deletions
diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs
index 7fe45e2..c52de85 100644
--- a/mumd/src/audio.rs
+++ b/mumd/src/audio.rs
@@ -103,17 +103,26 @@ impl Audio {
let input_stream = match input_supported_sample_format {
SampleFormat::F32 => input_device.build_input_stream(
&input_config,
- input_callback::<f32>(input_encoder, input_sender),
+ input_callback::<f32>(input_encoder,
+ input_sender,
+ input_config.sample_rate.0,
+ 10.0),
err_fn,
),
SampleFormat::I16 => input_device.build_input_stream(
&input_config,
- input_callback::<i16>(input_encoder, input_sender),
+ input_callback::<i16>(input_encoder,
+ input_sender,
+ input_config.sample_rate.0,
+ 10.0),
err_fn,
),
SampleFormat::U16 => input_device.build_input_stream(
&input_config,
- input_callback::<u16>(input_encoder, input_sender),
+ input_callback::<u16>(input_encoder,
+ input_sender,
+ input_config.sample_rate.0,
+ 10.0),
err_fn,
),
}
@@ -185,7 +194,7 @@ impl ClientStream {
match channels {
1 => Channels::Mono,
2 => Channels::Stereo,
- _ => unimplemented!("only 1 or 2 channels supported, got {})", channels),
+ _ => unimplemented!("only 1 or 2 channels supported, got {}", channels),
},
)
.unwrap(),
@@ -260,15 +269,26 @@ fn output_curry_callback<T: Sample + AddAssign + SaturatingAdd>(
fn input_callback<T: Sample>(
mut opus_encoder: opus::Encoder,
mut input_sender: Sender<VoicePacketPayload>,
+ sample_rate: u32,
+ opus_frame_size_ms: f32,
) -> impl FnMut(&[T], &InputCallbackInfo) + Send + 'static {
+ if ! ( opus_frame_size_ms == 2.5
+ || opus_frame_size_ms == 5.0
+ || opus_frame_size_ms == 10.0
+ || opus_frame_size_ms == 20.0) {
+ panic!("Unsupported opus frame size {}", opus_frame_size_ms);
+ }
+ let opus_frame_size = (opus_frame_size_ms * sample_rate as f32) as u32 / 1000;
+
+
let buf = Arc::new(Mutex::new(VecDeque::new()));
move |data: &[T], _info: &InputCallbackInfo| {
let mut buf = buf.lock().unwrap();
let out: Vec<f32> = data.iter().map(|e| e.to_f32()).collect();
buf.extend(out);
- while buf.len() >= 2880 {
- let tail = buf.split_off(2880);
- let mut opus_buf: Vec<u8> = vec![0; 100_000];
+ while buf.len() >= opus_frame_size as usize {
+ let tail = buf.split_off(opus_frame_size as usize);
+ let mut opus_buf: Vec<u8> = vec![0; opus_frame_size as usize];
let result = opus_encoder
.encode_float(&Vec::from(buf.clone()), &mut opus_buf)
.unwrap();