aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock10
-rw-r--r--components/script/dom/bindings/trace.rs3
-rw-r--r--components/script/dom/pannernode.rs111
-rw-r--r--components/script/dom/webidls/PannerNode.webidl16
4 files changed, 125 insertions, 15 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 17f87a0fdb8..34893fb3da8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3197,7 +3197,7 @@ dependencies = [
[[package]]
name = "servo-media"
version = "0.1.0"
-source = "git+https://github.com/servo/media#a3d25355acac0fe6f7f8b7af18e6fe1f910431ab"
+source = "git+https://github.com/servo/media#6ecac1c6259b3995e8d6a368e49777e5c2d398ae"
dependencies = [
"servo-media-audio 0.1.0 (git+https://github.com/servo/media)",
"servo-media-gstreamer 0.1.0 (git+https://github.com/servo/media)",
@@ -3207,7 +3207,7 @@ dependencies = [
[[package]]
name = "servo-media-audio"
version = "0.1.0"
-source = "git+https://github.com/servo/media#a3d25355acac0fe6f7f8b7af18e6fe1f910431ab"
+source = "git+https://github.com/servo/media#6ecac1c6259b3995e8d6a368e49777e5c2d398ae"
dependencies = [
"byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3220,7 +3220,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer"
version = "0.1.0"
-source = "git+https://github.com/servo/media#a3d25355acac0fe6f7f8b7af18e6fe1f910431ab"
+source = "git+https://github.com/servo/media#6ecac1c6259b3995e8d6a368e49777e5c2d398ae"
dependencies = [
"byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3238,7 +3238,7 @@ dependencies = [
[[package]]
name = "servo-media-player"
version = "0.1.0"
-source = "git+https://github.com/servo/media#a3d25355acac0fe6f7f8b7af18e6fe1f910431ab"
+source = "git+https://github.com/servo/media#6ecac1c6259b3995e8d6a368e49777e5c2d398ae"
dependencies = [
"ipc-channel 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3324,7 +3324,7 @@ dependencies = [
[[package]]
name = "servo_media_derive"
version = "0.1.0"
-source = "git+https://github.com/servo/media#a3d25355acac0fe6f7f8b7af18e6fe1f910431ab"
+source = "git+https://github.com/servo/media#6ecac1c6259b3995e8d6a368e49777e5c2d398ae"
dependencies = [
"quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index fd0d346414c..41d1231a580 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -92,6 +92,7 @@ use servo_media::Backend;
use servo_media::audio::buffer_source_node::AudioBuffer;
use servo_media::audio::context::AudioContext;
use servo_media::audio::graph::NodeId;
+use servo_media::audio::panner_node::{DistanceModel, PanningModel};
use servo_media::audio::param::ParamType;
use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
use smallvec::SmallVec;
@@ -434,7 +435,7 @@ unsafe_no_jsmanaged_fields!(SourceSet);
unsafe_no_jsmanaged_fields!(AudioBuffer);
unsafe_no_jsmanaged_fields!(AudioContext<Backend>);
unsafe_no_jsmanaged_fields!(NodeId);
-unsafe_no_jsmanaged_fields!(ParamType);
+unsafe_no_jsmanaged_fields!(DistanceModel, PanningModel, ParamType);
unsafe impl<'a> JSTraceable for &'a str {
#[inline]
diff --git a/components/script/dom/pannernode.rs b/components/script/dom/pannernode.rs
index cfb59578f31..558b5a005de 100644
--- a/components/script/dom/pannernode.rs
+++ b/components/script/dom/pannernode.rs
@@ -11,13 +11,17 @@ use dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate;
use dom::bindings::codegen::Bindings::PannerNodeBinding::{self, PannerNodeMethods, PannerOptions};
use dom::bindings::codegen::Bindings::PannerNodeBinding::{DistanceModelType, PanningModelType};
use dom::bindings::error::Fallible;
+use dom::bindings::inheritance::Castable;
+use dom::bindings::num::Finite;
use dom::bindings::reflector::reflect_dom_object;
use dom::bindings::root::{Dom, DomRoot};
use dom::window::Window;
use dom_struct::dom_struct;
use servo_media::audio::panner_node::{DistanceModel, PannerNodeOptions, PanningModel};
-use servo_media::audio::node::AudioNodeInit;
+use servo_media::audio::panner_node::PannerNodeMessage;
+use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage};
use servo_media::audio::param::{ParamDir, ParamType};
+use std::cell::Cell;
use std::f32;
#[dom_struct]
@@ -29,6 +33,16 @@ pub struct PannerNode {
orientation_x: Dom<AudioParam>,
orientation_y: Dom<AudioParam>,
orientation_z: Dom<AudioParam>,
+ #[ignore_malloc_size_of = "servo_media"]
+ panning_model: Cell<PanningModel>,
+ #[ignore_malloc_size_of = "servo_media"]
+ distance_model: Cell<DistanceModel>,
+ ref_distance: Cell<f64>,
+ max_distance: Cell<f64>,
+ rolloff_factor: Cell<f64>,
+ cone_inner_angle: Cell<f64>,
+ cone_outer_angle: Cell<f64>,
+ cone_outer_gain: Cell<f64>,
}
impl PannerNode {
@@ -119,6 +133,14 @@ impl PannerNode {
orientation_x: Dom::from_ref(&orientation_x),
orientation_y: Dom::from_ref(&orientation_y),
orientation_z: Dom::from_ref(&orientation_z),
+ panning_model: Cell::new(options.panning_model),
+ distance_model: Cell::new(options.distance_model),
+ ref_distance: Cell::new(options.ref_distance),
+ max_distance: Cell::new(options.max_distance),
+ rolloff_factor: Cell::new(options.rolloff_factor),
+ cone_inner_angle: Cell::new(options.cone_inner_angle),
+ cone_outer_angle: Cell::new(options.cone_outer_angle),
+ cone_outer_gain: Cell::new(options.cone_outer_gain),
}
}
@@ -167,6 +189,93 @@ impl PannerNodeMethods for PannerNode {
fn OrientationZ(&self) -> DomRoot<AudioParam> {
DomRoot::from_ref(&self.orientation_z)
}
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-distancemodel
+ fn DistanceModel(&self) -> DistanceModelType {
+ match self.distance_model.get() {
+ DistanceModel::Linear => DistanceModelType::Linear,
+ DistanceModel::Inverse => DistanceModelType::Inverse,
+ DistanceModel::Exponential => DistanceModelType::Exponential,
+ }
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-distancemodel
+ fn SetDistanceModel(&self, model: DistanceModelType) {
+ self.distance_model.set(model.into());
+ let msg = PannerNodeMessage::SetDistanceModel(self.distance_model.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-panningmodel
+ fn PanningModel(&self) -> PanningModelType {
+ match self.panning_model.get() {
+ PanningModel::EqualPower => PanningModelType::Equalpower,
+ PanningModel::HRTF => PanningModelType::HRTF,
+ }
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-panningmodel
+ fn SetPanningModel(&self, model: PanningModelType) {
+ self.panning_model.set(model.into());
+ let msg = PannerNodeMessage::SetPanningModel(self.panning_model.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-refdistance
+ fn RefDistance(&self) -> Finite<f64> {
+ Finite::wrap(self.ref_distance.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-refdistance
+ fn SetRefDistance(&self, val: Finite<f64>) {
+ self.ref_distance.set(*val);
+ let msg = PannerNodeMessage::SetRefDistance(self.ref_distance.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-maxdistance
+ fn MaxDistance(&self) -> Finite<f64> {
+ Finite::wrap(self.max_distance.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-maxdistance
+ fn SetMaxDistance(&self, val: Finite<f64>) {
+ self.max_distance.set(*val);
+ let msg = PannerNodeMessage::SetMaxDistance(self.max_distance.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-rollofffactor
+ fn RolloffFactor(&self) -> Finite<f64> {
+ Finite::wrap(self.rolloff_factor.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-rollofffactor
+ fn SetRolloffFactor(&self, val: Finite<f64>) {
+ self.rolloff_factor.set(*val);
+ let msg = PannerNodeMessage::SetRolloff(self.rolloff_factor.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneinnerangle
+ fn ConeInnerAngle(&self) -> Finite<f64> {
+ Finite::wrap(self.cone_inner_angle.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneinnerangle
+ fn SetConeInnerAngle(&self, val: Finite<f64>) {
+ self.cone_inner_angle.set(*val);
+ let msg = PannerNodeMessage::SetConeInner(self.cone_inner_angle.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneouterangle
+ fn ConeOuterAngle(&self) -> Finite<f64> {
+ Finite::wrap(self.cone_outer_angle.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneouterangle
+ fn SetConeOuterAngle(&self, val: Finite<f64>) {
+ self.cone_outer_angle.set(*val);
+ let msg = PannerNodeMessage::SetConeOuter(self.cone_outer_angle.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneoutergain
+ fn ConeOuterGain(&self) -> Finite<f64> {
+ Finite::wrap(self.cone_outer_gain.get())
+ }
+ // https://webaudio.github.io/web-audio-api/#dom-pannernode-coneoutergain
+ fn SetConeOuterGain(&self, val: Finite<f64>) {
+ self.cone_outer_gain.set(*val);
+ let msg = PannerNodeMessage::SetConeGain(self.cone_outer_gain.get());
+ self.upcast::<AudioNode>().message(AudioNodeMessage::PannerNode(msg));
+ }
}
impl<'a> From<&'a PannerOptions> for PannerNodeOptions {
diff --git a/components/script/dom/webidls/PannerNode.webidl b/components/script/dom/webidls/PannerNode.webidl
index 625f6172409..8429005887e 100644
--- a/components/script/dom/webidls/PannerNode.webidl
+++ b/components/script/dom/webidls/PannerNode.webidl
@@ -37,20 +37,20 @@ enum PanningModelType {
[Exposed=Window,
Constructor (BaseAudioContext context, optional PannerOptions options)]
interface PannerNode : AudioNode {
- // attribute PanningModelType panningModel;
+ attribute PanningModelType panningModel;
readonly attribute AudioParam positionX;
readonly attribute AudioParam positionY;
readonly attribute AudioParam positionZ;
readonly attribute AudioParam orientationX;
readonly attribute AudioParam orientationY;
readonly attribute AudioParam orientationZ;
- // attribute DistanceModelType distanceModel;
- // attribute double refDistance;
- // attribute double maxDistance;
- // attribute double rolloffFactor;
- // attribute double coneInnerAngle;
- // attribute double coneOuterAngle;
- // attribute double coneOuterGain;
+ attribute DistanceModelType distanceModel;
+ attribute double refDistance;
+ attribute double maxDistance;
+ attribute double rolloffFactor;
+ attribute double coneInnerAngle;
+ attribute double coneOuterAngle;
+ attribute double coneOuterGain;
// void setPosition (float x, float y, float z);
// void setOrientation (float x, float y, float z);
}; \ No newline at end of file