diff --git a/audio/iir_filter_node.rs b/audio/iir_filter_node.rs index 54641f3d..f31698d9 100644 --- a/audio/iir_filter_node.rs +++ b/audio/iir_filter_node.rs @@ -115,7 +115,7 @@ impl IIRFilterNode { let filter = IIRFilter::new(options.feedforward.clone(), options.feedback.clone()); Self { - filters: vec![filter; channel_info.count as usize], + filters: vec![filter; channel_info.computed_number_of_channels() as usize], channel_info, } } diff --git a/audio/node.rs b/audio/node.rs index 0f60d220..ef4c8960 100644 --- a/audio/node.rs +++ b/audio/node.rs @@ -10,6 +10,7 @@ use oscillator_node::{OscillatorNodeMessage, OscillatorNodeOptions}; use panner_node::{PannerNodeMessage, PannerNodeOptions}; use param::{Param, ParamRate, ParamType, UserAutomationEvent}; use servo_media_streams::{MediaSocket, MediaStreamId}; +use std::cmp::min; use std::sync::mpsc::Sender; use stereo_panner::StereoPannerOptions; use wave_shaper_node::{WaveShaperNodeMessage, WaveShaperNodeOptions}; @@ -100,6 +101,7 @@ pub struct ChannelInfo { pub count: u8, pub mode: ChannelCountMode, pub interpretation: ChannelInterpretation, + pub context_channel_count: u8, } impl Default for ChannelInfo { @@ -108,6 +110,18 @@ impl Default for ChannelInfo { count: 2, mode: ChannelCountMode::Max, interpretation: ChannelInterpretation::Speakers, + context_channel_count: 2, + } + } +} + +impl ChannelInfo { + /// + pub fn computed_number_of_channels(&self) -> u8 { + match self.mode { + ChannelCountMode::Max => self.context_channel_count, + ChannelCountMode::ClampedMax => min(self.count, self.context_channel_count), + ChannelCountMode::Explicit => self.count, } } }