From fc255616c46dab653615d587d50d7d5e6e1af00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Monnom?= Date: Mon, 22 May 2023 16:37:22 +0200 Subject: [PATCH] fix: multiple audio channels (#73) --- examples/wgpu_room/src/sine_track.rs | 15 ++++++++++----- livekit-webrtc/src/native/audio_source.rs | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/wgpu_room/src/sine_track.rs b/examples/wgpu_room/src/sine_track.rs index de581c0..ba5e606 100644 --- a/examples/wgpu_room/src/sine_track.rs +++ b/examples/wgpu_room/src/sine_track.rs @@ -98,16 +98,18 @@ impl SineTrack { let mut samples_10ms = Vec::::new(); loop { + const NUM_CHANNELS: usize = 2; + interval.tick().await; let mut data = frame_options.lock(); - let samples_count_10ms = (data.sample_rate / 100) as usize; + let samples_count_10ms = (data.sample_rate / 100) as usize * NUM_CHANNELS; if samples_10ms.capacity() != samples_count_10ms { samples_10ms.resize(samples_count_10ms, 0i16); } - for i in 0..samples_count_10ms { + for i in (0..samples_count_10ms).step_by(NUM_CHANNELS) { let val = data.amplitude * f64::sin( std::f64::consts::PI @@ -117,14 +119,17 @@ impl SineTrack { ); data.phase += 1; - // WebRTC uses 16-bit signed PCM - samples_10ms[i] = (val * 32768.0) as i16; + + for c in 0..NUM_CHANNELS { + // WebRTC uses 16-bit signed PCM + samples_10ms[i + c] = (val * 32768.0) as i16; + } } rtc_source.capture_frame(&AudioFrame { data: samples_10ms.clone(), sample_rate: data.sample_rate as u32, - num_channels: 1, + num_channels: NUM_CHANNELS as u32, samples_per_channel: samples_count_10ms as u32, }); } diff --git a/livekit-webrtc/src/native/audio_source.rs b/livekit-webrtc/src/native/audio_source.rs index 7a85caf..8c1c398 100644 --- a/livekit-webrtc/src/native/audio_source.rs +++ b/livekit-webrtc/src/native/audio_source.rs @@ -72,7 +72,7 @@ impl NativeAudioSource { data.as_ptr(), frame.sample_rate as i32, frame.num_channels as usize, - samples_10ms, + samples_10ms / frame.num_channels as usize, ) }