aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/audiobuffersourcenode.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-07-05 11:43:31 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-07-30 14:21:43 +0200
commit356d7fd7a678c63477c0d53263e0fd7f05bd7bf8 (patch)
tree4cd1fd7e3c5550b5ba48e2bd86ecdcdcc9521a15 /components/script/dom/audiobuffersourcenode.rs
parent25a74a75eaca196b1bd7a999aba42f8ac54202f4 (diff)
downloadservo-356d7fd7a678c63477c0d53263e0fd7f05bd7bf8.tar.gz
servo-356d7fd7a678c63477c0d53263e0fd7f05bd7bf8.zip
createBufferSource and buffer setter on buffer source node
Diffstat (limited to 'components/script/dom/audiobuffersourcenode.rs')
-rw-r--r--components/script/dom/audiobuffersourcenode.rs59
1 files changed, 48 insertions, 11 deletions
diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs
index 931e86ad21c..6eefe8c9ad5 100644
--- a/components/script/dom/audiobuffersourcenode.rs
+++ b/components/script/dom/audiobuffersourcenode.rs
@@ -12,10 +12,12 @@ use dom::bindings::codegen::Bindings::AudioBufferSourceNodeBinding::AudioBufferS
use dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate;
use dom::bindings::codegen::Bindings::AudioNodeBinding::AudioNodeOptions;
use dom::bindings::codegen::Bindings::AudioNodeBinding::{ChannelCountMode, ChannelInterpretation};
-use dom::bindings::error::Fallible;
+use dom::bindings::codegen::Bindings::AudioScheduledSourceNodeBinding::AudioScheduledSourceNodeBinding::AudioScheduledSourceNodeMethods;
+use dom::bindings::error::{Error, Fallible};
+use dom::bindings::inheritance::Castable;
use dom::bindings::num::Finite;
use dom::bindings::reflector::reflect_dom_object;
-use dom::bindings::root::DomRoot;
+use dom::bindings::root::{DomRoot, MutNullableDom};
use dom::window::Window;
use dom_struct::dom_struct;
use servo_media::audio::buffer_source_node::AudioBufferSourceNodeMessage;
@@ -33,8 +35,8 @@ audio_param_impl!(Detune, AudioBufferSourceNode, AudioBufferSourceNodeMessage, S
#[dom_struct]
pub struct AudioBufferSourceNode {
- node: AudioScheduledSourceNode,
- // buffer: Option<DomRoot<AudioBuffer>>,
+ source_node: AudioScheduledSourceNode,
+ buffer: MutNullableDom<AudioBuffer>,
playback_rate: DomRoot<AudioParam>,
detune: DomRoot<AudioParam>,
loop_enabled: Cell<bool>,
@@ -54,28 +56,29 @@ impl AudioBufferSourceNode {
node_options.channelCount = Some(2);
node_options.channelCountMode = Some(ChannelCountMode::Max);
node_options.channelInterpretation = Some(ChannelInterpretation::Speakers);
- let node = AudioScheduledSourceNode::new_inherited(
+ let source_node = AudioScheduledSourceNode::new_inherited(
AudioNodeType::AudioBufferSourceNode(options.into()),
context,
&node_options,
0 /* inputs */,
1 /* outputs */,
);
- let playback_rate = PlaybackRate::new(context.audio_context_impl(), node.node_id());
+ let node_id = source_node.node().node_id();
+ let playback_rate = PlaybackRate::new(context.audio_context_impl(), node_id);
let playback_rate = AudioParam::new(&window,
Box::new(playback_rate),
AutomationRate::K_rate,
*options.playbackRate,
f32::MIN, f32::MAX);
- let detune = Detune::new(context.audio_context_impl(), node.node_id());
+ let detune = Detune::new(context.audio_context_impl(), node_id);
let detune = AudioParam::new(&window,
Box::new(detune),
AutomationRate::K_rate,
*options.detune,
f32::MIN, f32::MAX);
AudioBufferSourceNode {
- node,
- // buffer: options.buffer,
+ source_node,
+ buffer: Default::default(),
playback_rate,
detune,
loop_enabled: Cell::new(options.loop_),
@@ -104,6 +107,31 @@ impl AudioBufferSourceNode {
}
impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer
+ fn GetBuffer(&self) -> Fallible<Option<DomRoot<AudioBuffer>>> {
+ Ok(self.buffer.get())
+ }
+
+ /// https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer
+ fn SetBuffer(&self, new_buffer: Option<&AudioBuffer>) -> Fallible<()> {
+ if new_buffer.is_some() && self.buffer.get().is_some() {
+ return Err(Error::InvalidState);
+ }
+
+ self.buffer.set(new_buffer);
+
+ if self.source_node.started() {
+ if let Some(buffer) = self.buffer.get() {
+ let buffer = buffer.acquire_contents();
+ self.source_node.node().message(
+ AudioNodeMessage::AudioBufferSourceNode(
+ AudioBufferSourceNodeMessage::SetBuffer(buffer)));
+ }
+ }
+
+ Ok(())
+ }
+
fn PlaybackRate(&self) -> DomRoot<AudioParam> {
DomRoot::from_ref(&self.playback_rate)
}
@@ -136,8 +164,17 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
self.loop_end.set(*loop_end)
}
- fn Start(&self, when: Finite<f64>, offset: Option<Finite<f64>>, duration: Option<Finite<f64>>) {
- // XXX
+ fn Start(&self,
+ when: Finite<f64>,
+ _offset: Option<Finite<f64>>,
+ _duration: Option<Finite<f64>>) -> Fallible<()> {
+ if let Some(buffer) = self.buffer.get() {
+ let buffer = buffer.acquire_contents();
+ self.source_node.node().message(
+ AudioNodeMessage::AudioBufferSourceNode(
+ AudioBufferSourceNodeMessage::SetBuffer(buffer)));
+ }
+ self.source_node.upcast::<AudioScheduledSourceNode>().Start(when)
}
}