From 492faa31053cc80cc428977c48bc821043191616 Mon Sep 17 00:00:00 2001 From: Shamir Khodzha Date: Mon, 4 May 2020 00:38:35 +0300 Subject: [PATCH] fixed channels indexing in progress callback in BaseAudioContext.DecodeAudioData Gstreamer backend returns channel as single bit mask (ie 1, 2, 4, 8, 32 etc). Progress callback was using this mask as plain channel index, thus storing decoded audio in wrong channel. --- components/script/dom/baseaudiocontext.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index 14c6bc94e1c..42836dd61f0 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -481,14 +481,17 @@ impl BaseAudioContextMethods for BaseAudioContext { .unwrap() .resize(channel_count as usize, Vec::new()); }) - .progress(move |buffer, channel_pos| { + .progress(move |buffer, channel_pos_mask| { let mut decoded_audio = decoded_audio_.lock().unwrap(); let mut channels = channels.lock().unwrap(); - let channel = match channels.entry(channel_pos) { + let channel = match channels.entry(channel_pos_mask) { Entry::Occupied(entry) => *entry.get(), - Entry::Vacant(entry) => *entry.insert(decoded_audio.len()), + Entry::Vacant(entry) => { + let x = (channel_pos_mask as f32).log2() as usize; + *entry.insert(x) + }, }; - decoded_audio[(channel - 1) as usize].extend_from_slice((*buffer).as_ref()); + decoded_audio[channel].extend_from_slice((*buffer).as_ref()); }) .eos(move || { let _ = task_source.queue_with_canceller(