diff options
author | Shamir Khodzha <khodzha.sh@gmail.com> | 2024-02-28 22:24:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-28 21:24:08 +0000 |
commit | 201cdbab17a450887867b7cb68f83b222099a5e2 (patch) | |
tree | c13587b8244270801631ebbdd9bee17e7ba3e087 | |
parent | 5c87fe940e74c286d7b7d11257407e4a1ed1917f (diff) | |
download | servo-201cdbab17a450887867b7cb68f83b222099a5e2.tar.gz servo-201cdbab17a450887867b7cb68f83b222099a5e2.zip |
webaudio: Throw when setting invalid automationRate on AudioBufferSourceNode (#26469)
12 files changed, 56 insertions, 22 deletions
diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs index c7df916db5a..5525078a852 100644 --- a/components/script/dom/audiobuffersourcenode.rs +++ b/components/script/dom/audiobuffersourcenode.rs @@ -10,7 +10,7 @@ use js::rust::HandleObject; use servo_media::audio::buffer_source_node::{ AudioBufferSourceNodeMessage, AudioBufferSourceNodeOptions, }; -use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; +use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage, AudioNodeType}; use servo_media::audio::param::ParamType; use crate::dom::audiobuffer::AudioBuffer; @@ -61,6 +61,7 @@ impl AudioBufferSourceNode { &window, context, node_id, + AudioNodeType::AudioBufferSourceNode, ParamType::PlaybackRate, AutomationRate::K_rate, *options.playbackRate, @@ -71,6 +72,7 @@ impl AudioBufferSourceNode { &window, context, node_id, + AudioNodeType::AudioBufferSourceNode, ParamType::Detune, AutomationRate::K_rate, *options.detune, diff --git a/components/script/dom/audiolistener.rs b/components/script/dom/audiolistener.rs index e26389b0c8c..ad8bdb071ba 100644 --- a/components/script/dom/audiolistener.rs +++ b/components/script/dom/audiolistener.rs @@ -5,6 +5,7 @@ use std::f32; use dom_struct::dom_struct; +use servo_media::audio::node::AudioNodeType; use servo_media::audio::param::{ParamDir, ParamType}; use crate::dom::audioparam::AudioParam; @@ -41,6 +42,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Position(ParamDir::X), AutomationRate::A_rate, 0., // default value @@ -51,6 +53,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Position(ParamDir::Y), AutomationRate::A_rate, 0., // default value @@ -61,6 +64,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Position(ParamDir::Z), AutomationRate::A_rate, 0., // default value @@ -71,6 +75,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Forward(ParamDir::X), AutomationRate::A_rate, 0., // default value @@ -81,6 +86,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Forward(ParamDir::Y), AutomationRate::A_rate, 0., // default value @@ -91,6 +97,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Forward(ParamDir::Z), AutomationRate::A_rate, -1., // default value @@ -101,6 +108,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Up(ParamDir::X), AutomationRate::A_rate, 0., // default value @@ -111,6 +119,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Up(ParamDir::Y), AutomationRate::A_rate, 1., // default value @@ -121,6 +130,7 @@ impl AudioListener { window, context, node, + AudioNodeType::AudioListenerNode, ParamType::Up(ParamDir::Z), AutomationRate::A_rate, 0., // default value diff --git a/components/script/dom/audioparam.rs b/components/script/dom/audioparam.rs index 509252c1485..b8e434bd528 100644 --- a/components/script/dom/audioparam.rs +++ b/components/script/dom/audioparam.rs @@ -7,7 +7,7 @@ use std::sync::mpsc; use dom_struct::dom_struct; use servo_media::audio::graph::NodeId; -use servo_media::audio::node::AudioNodeMessage; +use servo_media::audio::node::{AudioNodeMessage, AudioNodeType}; use servo_media::audio::param::{ParamRate, ParamType, RampKind, UserAutomationEvent}; use crate::dom::baseaudiocontext::BaseAudioContext; @@ -29,6 +29,9 @@ pub struct AudioParam { node: NodeId, #[ignore_malloc_size_of = "servo_media"] #[no_trace] + node_type: AudioNodeType, + #[ignore_malloc_size_of = "servo_media"] + #[no_trace] param: ParamType, automation_rate: Cell<AutomationRate>, default_value: f32, @@ -40,6 +43,7 @@ impl AudioParam { pub fn new_inherited( context: &BaseAudioContext, node: NodeId, + node_type: AudioNodeType, param: ParamType, automation_rate: AutomationRate, default_value: f32, @@ -50,6 +54,7 @@ impl AudioParam { reflector_: Reflector::new(), context: Dom::from_ref(context), node, + node_type, param, automation_rate: Cell::new(automation_rate), default_value, @@ -63,6 +68,7 @@ impl AudioParam { window: &Window, context: &BaseAudioContext, node: NodeId, + node_type: AudioNodeType, param: ParamType, automation_rate: AutomationRate, default_value: f32, @@ -72,6 +78,7 @@ impl AudioParam { let audio_param = AudioParam::new_inherited( context, node, + node_type, param, automation_rate, default_value, @@ -109,12 +116,24 @@ impl AudioParamMethods for AudioParam { } // https://webaudio.github.io/web-audio-api/#dom-audioparam-automationrate - fn SetAutomationRate(&self, automation_rate: AutomationRate) { + fn SetAutomationRate(&self, automation_rate: AutomationRate) -> Fallible<()> { + // > AudioBufferSourceNode + // > The AudioParams playbackRate and detune MUST be "k-rate". An InvalidStateError must be + // > thrown if the rate is changed to "a-rate". + if automation_rate == AutomationRate::A_rate && + self.node_type == AudioNodeType::AudioBufferSourceNode && + (self.param == ParamType::Detune || self.param == ParamType::PlaybackRate) + { + return Err(Error::InvalidState); + } + self.automation_rate.set(automation_rate); self.message_node(AudioNodeMessage::SetParamRate( self.param, automation_rate.into(), )); + + Ok(()) } // https://webaudio.github.io/web-audio-api/#dom-audioparam-value diff --git a/components/script/dom/biquadfilternode.rs b/components/script/dom/biquadfilternode.rs index 53daa65c2df..385b002277a 100644 --- a/components/script/dom/biquadfilternode.rs +++ b/components/script/dom/biquadfilternode.rs @@ -10,7 +10,7 @@ use js::rust::HandleObject; use servo_media::audio::biquad_filter_node::{ BiquadFilterNodeMessage, BiquadFilterNodeOptions, FilterType, }; -use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; +use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage, AudioNodeType}; use servo_media::audio::param::ParamType; use crate::dom::audionode::AudioNode; @@ -62,6 +62,7 @@ impl BiquadFilterNode { window, context, node.node_id(), + AudioNodeType::BiquadFilterNode, ParamType::Gain, AutomationRate::A_rate, options.gain, // default value @@ -72,6 +73,7 @@ impl BiquadFilterNode { window, context, node.node_id(), + AudioNodeType::BiquadFilterNode, ParamType::Q, AutomationRate::A_rate, options.q, // default value @@ -82,6 +84,7 @@ impl BiquadFilterNode { window, context, node.node_id(), + AudioNodeType::BiquadFilterNode, ParamType::Frequency, AutomationRate::A_rate, options.frequency, // default value @@ -92,6 +95,7 @@ impl BiquadFilterNode { window, context, node.node_id(), + AudioNodeType::BiquadFilterNode, ParamType::Detune, AutomationRate::A_rate, options.detune, // default value diff --git a/components/script/dom/constantsourcenode.rs b/components/script/dom/constantsourcenode.rs index 88a4d5eaabc..1285ead095e 100644 --- a/components/script/dom/constantsourcenode.rs +++ b/components/script/dom/constantsourcenode.rs @@ -7,7 +7,7 @@ use std::f32; use dom_struct::dom_struct; use js::rust::HandleObject; use servo_media::audio::constant_source_node::ConstantSourceNodeOptions as ServoMediaConstantSourceOptions; -use servo_media::audio::node::AudioNodeInit; +use servo_media::audio::node::{AudioNodeInit, AudioNodeType}; use servo_media::audio::param::ParamType; use crate::dom::audioparam::AudioParam; @@ -48,6 +48,7 @@ impl ConstantSourceNode { window, context, node_id, + AudioNodeType::ConstantSourceNode, ParamType::Offset, AutomationRate::A_rate, *options.offset, diff --git a/components/script/dom/gainnode.rs b/components/script/dom/gainnode.rs index e05a5d0f24c..29f2587164f 100644 --- a/components/script/dom/gainnode.rs +++ b/components/script/dom/gainnode.rs @@ -7,7 +7,7 @@ use std::f32; use dom_struct::dom_struct; use js::rust::HandleObject; use servo_media::audio::gain_node::GainNodeOptions; -use servo_media::audio::node::AudioNodeInit; +use servo_media::audio::node::{AudioNodeInit, AudioNodeType}; use servo_media::audio::param::ParamType; use crate::dom::audionode::AudioNode; @@ -51,6 +51,7 @@ impl GainNode { window, context, node.node_id(), + AudioNodeType::GainNode, ParamType::Gain, AutomationRate::A_rate, *options.gain, // default value diff --git a/components/script/dom/oscillatornode.rs b/components/script/dom/oscillatornode.rs index 6037cc779bd..c067dc42011 100644 --- a/components/script/dom/oscillatornode.rs +++ b/components/script/dom/oscillatornode.rs @@ -7,7 +7,7 @@ use std::f32; use dom_struct::dom_struct; use js::rust::HandleObject; -use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; +use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage, AudioNodeType}; use servo_media::audio::oscillator_node::{ OscillatorNodeMessage, OscillatorNodeOptions as ServoMediaOscillatorOptions, OscillatorType as ServoMediaOscillatorType, @@ -60,6 +60,7 @@ impl OscillatorNode { window, context, node_id, + AudioNodeType::OscillatorNode, ParamType::Frequency, AutomationRate::A_rate, 440., @@ -70,6 +71,7 @@ impl OscillatorNode { window, context, node_id, + AudioNodeType::OscillatorNode, ParamType::Detune, AutomationRate::A_rate, 0., diff --git a/components/script/dom/pannernode.rs b/components/script/dom/pannernode.rs index 4517bd1cf31..98a5b62bf85 100644 --- a/components/script/dom/pannernode.rs +++ b/components/script/dom/pannernode.rs @@ -7,7 +7,7 @@ use std::f32; use dom_struct::dom_struct; use js::rust::HandleObject; -use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; +use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage, AudioNodeType}; use servo_media::audio::panner_node::{ DistanceModel, PannerNodeMessage, PannerNodeOptions, PanningModel, }; @@ -98,6 +98,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Position(ParamDir::X), AutomationRate::A_rate, options.position_x, // default value @@ -108,6 +109,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Position(ParamDir::Y), AutomationRate::A_rate, options.position_y, // default value @@ -118,6 +120,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Position(ParamDir::Z), AutomationRate::A_rate, options.position_z, // default value @@ -128,6 +131,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Orientation(ParamDir::X), AutomationRate::A_rate, options.orientation_x, // default value @@ -138,6 +142,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Orientation(ParamDir::Y), AutomationRate::A_rate, options.orientation_y, // default value @@ -148,6 +153,7 @@ impl PannerNode { window, context, id, + AudioNodeType::PannerNode, ParamType::Orientation(ParamDir::Z), AutomationRate::A_rate, options.orientation_z, // default value diff --git a/components/script/dom/stereopannernode.rs b/components/script/dom/stereopannernode.rs index 77761a49e42..e3b6f5b71ee 100644 --- a/components/script/dom/stereopannernode.rs +++ b/components/script/dom/stereopannernode.rs @@ -4,7 +4,7 @@ use dom_struct::dom_struct; use js::rust::HandleObject; -use servo_media::audio::node::AudioNodeInit; +use servo_media::audio::node::{AudioNodeInit, AudioNodeType}; use servo_media::audio::param::ParamType; use servo_media::audio::stereo_panner::StereoPannerOptions as ServoMediaStereoPannerOptions; @@ -59,6 +59,7 @@ impl StereoPannerNode { window, context, node_id, + AudioNodeType::StereoPannerNode, ParamType::Pan, AutomationRate::A_rate, *options.pan, diff --git a/components/script/dom/webidls/AudioParam.webidl b/components/script/dom/webidls/AudioParam.webidl index 42f1012539c..4f44d54224c 100644 --- a/components/script/dom/webidls/AudioParam.webidl +++ b/components/script/dom/webidls/AudioParam.webidl @@ -14,7 +14,7 @@ enum AutomationRate { [Exposed=Window] interface AudioParam { attribute float value; - attribute AutomationRate automationRate; + [SetterThrows] attribute AutomationRate automationRate; readonly attribute float defaultValue; readonly attribute float minValue; readonly attribute float maxValue; diff --git a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini index e8b876936e0..ae39f1281e3 100644 --- a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini +++ b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini @@ -2,12 +2,6 @@ [< [AudioBufferSourceNode\] 2 out of 4 assertions were failed.] expected: FAIL - [X Set AudioBufferSourceNode.detune.automationRate to "a-rate" did not throw an exception.] - expected: FAIL - - [X Set AudioBufferSourceNode.playbackRate.automationRate to "a-rate" did not throw an exception.] - expected: FAIL - [Executing "DelayNode"] expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini index 28bbf3cd10b..4e6bf7d8736 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/automation-rate.html.ini @@ -5,12 +5,6 @@ [Executing "DynamicsCompressorNode"] expected: FAIL - [X Set AudioBufferSourceNode.detune.automationRate to "a-rate" did not throw an exception.] - expected: FAIL - - [X Set AudioBufferSourceNode.playbackRate.automationRate to "a-rate" did not throw an exception.] - expected: FAIL - [< [AudioBufferSourceNode\] 2 out of 4 assertions were failed.] expected: FAIL |