diff options
Diffstat (limited to 'components/script/dom/audioscheduledsourcenode.rs')
-rw-r--r-- | components/script/dom/audioscheduledsourcenode.rs | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/components/script/dom/audioscheduledsourcenode.rs b/components/script/dom/audioscheduledsourcenode.rs index 8c8240fdf67..da284e02910 100644 --- a/components/script/dom/audioscheduledsourcenode.rs +++ b/components/script/dom/audioscheduledsourcenode.rs @@ -5,14 +5,17 @@ use dom::audionode::AudioNode; use dom::baseaudiocontext::BaseAudioContext; use dom::bindings::codegen::Bindings::AudioScheduledSourceNodeBinding::AudioScheduledSourceNodeMethods; use dom::bindings::codegen::Bindings::AudioNodeBinding::AudioNodeOptions; +use dom::bindings::error::{Error, Fallible}; use dom::bindings::num::Finite; use dom_struct::dom_struct; -use servo_media::audio::graph::NodeId; use servo_media::audio::node::{AudioNodeMessage, AudioNodeType, AudioScheduledSourceNodeMessage}; +use std::cell::Cell; #[dom_struct] pub struct AudioScheduledSourceNode { node: AudioNode, + started: Cell<bool>, + stopped: Cell<bool>, } impl AudioScheduledSourceNode { @@ -24,11 +27,17 @@ impl AudioScheduledSourceNode { AudioScheduledSourceNode { node: AudioNode::new_inherited(node_type, None /* node_id */, context, options, number_of_inputs, number_of_outputs), + started: Cell::new(false), + stopped: Cell::new(false), } } - pub fn node_id(&self) -> NodeId { - self.node.node_id() + pub fn node(&self) -> &AudioNode { + &self.node + } + + pub fn started(&self) -> bool { + self.started.get() } } @@ -37,16 +46,26 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode { event_handler!(ended, GetOnended, SetOnended); // https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-start - fn Start(&self, when: Finite<f64>) { + fn Start(&self, when: Finite<f64>) -> Fallible<()> { + if self.started.get() || self.stopped.get() { + return Err(Error::InvalidState); + } + self.started.set(true); self.node.message( AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Start(*when)) ); + Ok(()) } // https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-stop - fn Stop(&self, when: Finite<f64>) { + fn Stop(&self, when: Finite<f64>) -> Fallible<()> { + if !self.started.get() { + return Err(Error::InvalidState); + } + self.stopped.set(true); self.node.message( AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Stop(*when)) ); + Ok(()) } } |