aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorShamir Khodzha <khodzha.sh@gmail.com>2024-02-28 22:24:08 +0100
committerGitHub <noreply@github.com>2024-02-28 21:24:08 +0000
commit201cdbab17a450887867b7cb68f83b222099a5e2 (patch)
treec13587b8244270801631ebbdd9bee17e7ba3e087 /components
parent5c87fe940e74c286d7b7d11257407e4a1ed1917f (diff)
downloadservo-201cdbab17a450887867b7cb68f83b222099a5e2.tar.gz
servo-201cdbab17a450887867b7cb68f83b222099a5e2.zip
webaudio: Throw when setting invalid automationRate on AudioBufferSourceNode (#26469)
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/audiobuffersourcenode.rs4
-rw-r--r--components/script/dom/audiolistener.rs10
-rw-r--r--components/script/dom/audioparam.rs23
-rw-r--r--components/script/dom/biquadfilternode.rs6
-rw-r--r--components/script/dom/constantsourcenode.rs3
-rw-r--r--components/script/dom/gainnode.rs3
-rw-r--r--components/script/dom/oscillatornode.rs4
-rw-r--r--components/script/dom/pannernode.rs8
-rw-r--r--components/script/dom/stereopannernode.rs3
-rw-r--r--components/script/dom/webidls/AudioParam.webidl2
10 files changed, 56 insertions, 10 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;