livekit_client: Always use output device's reported channels num (#51276)

Fixes a panic in livekit's process_reverse_stream for non-matching
channel counts, e.g., upmixing 2->4, or downmixing 2->1.

Release Notes:

- Fixed a panic in livekit when joining a channel using legacy audio
using a device with less or more than 2 channels.
This commit is contained in:
Jakub Konka authored and GitHub committed 2026-03-11 13:09:08 +01:00
1 parent 10893d02af
commit 21cecfc219
1 file changed
+8 -2
@@ -258,7 +258,7 @@ impl AudioStack {
apm: Arc<Mutex<apm::AudioProcessingModule>>,
mixer: Arc<Mutex<audio_mixer::AudioMixer>>,
sample_rate: u32,
num_channels: u32,
_num_channels: u32,
output_audio_device: Option<DeviceId>,
) -> Result<()> {
// Prevent App Nap from throttling audio playback on macOS.
@@ -270,6 +270,7 @@ impl AudioStack {
let mut device_change_listener = DeviceChangeListener::new(false)?;
let (output_device, output_config) =
crate::default_device(false, output_audio_device.as_ref())?;
info!("Output config: {output_config:?}");
let (end_on_drop_tx, end_on_drop_rx) = std::sync::mpsc::channel::<()>();
let mixer = mixer.clone();
let apm = apm.clone();
@@ -300,7 +301,12 @@ impl AudioStack {
let sampled = resampler.remix_and_resample(
mixed,
sample_rate / 100,
num_channels,
// We need to assume output number of channels as otherwise we will
// crash in process_reverse_stream otherwise as livekit's audio resampler
// does not seem to support non-matching channel counts.
// NOTE: you can verify this by debug printing buf.len() after this stage.
// For 2->4 channel upmix, we should see buf.len=1920, buf we get only 960.
output_config.channels() as u32,
sample_rate,
output_config.channels() as u32,
output_config.sample_rate(),