diff options
Diffstat (limited to 'components/script/dom/baseaudiocontext.rs')
-rw-r--r-- | components/script/dom/baseaudiocontext.rs | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index 9513a0b22d1..dbd821b64fe 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -16,6 +16,7 @@ use dom::bindings::codegen::Bindings::BaseAudioContextBinding::AudioContextState use dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextMethods; use dom::bindings::codegen::Bindings::BaseAudioContextBinding::DecodeErrorCallback; use dom::bindings::codegen::Bindings::BaseAudioContextBinding::DecodeSuccessCallback; +use dom::bindings::codegen::Bindings::ChannelMergerNodeBinding::ChannelMergerOptions; use dom::bindings::codegen::Bindings::GainNodeBinding::GainOptions; use dom::bindings::codegen::Bindings::OscillatorNodeBinding::OscillatorOptions; use dom::bindings::codegen::Bindings::PannerNodeBinding::PannerOptions; @@ -25,6 +26,7 @@ use dom::bindings::num::Finite; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; use dom::bindings::root::{DomRoot, MutNullableDom}; +use dom::channelmergernode::ChannelMergerNode; use dom::domexception::{DOMErrorName, DOMException}; use dom::eventtarget::EventTarget; use dom::gainnode::GainNode; @@ -317,7 +319,7 @@ impl BaseAudioContextMethods for BaseAudioContext { event_handler!(statechange, GetOnstatechange, SetOnstatechange); /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createoscillator - fn CreateOscillator(&self) -> DomRoot<OscillatorNode> { + fn CreateOscillator(&self) -> Fallible<DomRoot<OscillatorNode>> { OscillatorNode::new( &self.global().as_window(), &self, @@ -326,7 +328,7 @@ impl BaseAudioContextMethods for BaseAudioContext { } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-creategain - fn CreateGain(&self) -> DomRoot<GainNode> { + fn CreateGain(&self) -> Fallible<DomRoot<GainNode>> { GainNode::new(&self.global().as_window(), &self, &GainOptions::empty()) } @@ -335,6 +337,12 @@ impl BaseAudioContextMethods for BaseAudioContext { PannerNode::new(&self.global().as_window(), &self, &PannerOptions::empty()) } + /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createchannelmerger + fn CreateChannelMerger(&self, count: u32) -> Fallible<DomRoot<ChannelMergerNode>> { + let mut opts = ChannelMergerOptions::empty(); + opts.numberOfInputs = count; + ChannelMergerNode::new(&self.global().as_window(), &self, &opts) + } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer fn CreateBuffer( @@ -360,7 +368,7 @@ impl BaseAudioContextMethods for BaseAudioContext { } // https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffersource - fn CreateBufferSource(&self) -> DomRoot<AudioBufferSourceNode> { + fn CreateBufferSource(&self) -> Fallible<DomRoot<AudioBufferSourceNode>> { AudioBufferSourceNode::new( &self.global().as_window(), &self, @@ -397,6 +405,7 @@ impl BaseAudioContextMethods for BaseAudioContext { let audio_data = audio_data.to_vec(); let decoded_audio = Arc::new(Mutex::new(Vec::new())); let decoded_audio_ = decoded_audio.clone(); + let decoded_audio__ = decoded_audio.clone(); let this = Trusted::new(self); let this_ = this.clone(); let task_source = window.dom_manipulation_task_source(); @@ -404,15 +413,30 @@ impl BaseAudioContextMethods for BaseAudioContext { let canceller = window.task_canceller(TaskSourceName::DOMManipulation); let canceller_ = window.task_canceller(TaskSourceName::DOMManipulation); let callbacks = AudioDecoderCallbacks::new() + .ready(move |channel_count| { + decoded_audio + .lock() + .unwrap() + .resize(channel_count as usize, Vec::new()); + }) + .progress(move |buffer, channel| { + let mut decoded_audio = decoded_audio_.lock().unwrap(); + decoded_audio[(channel - 1) as usize].extend_from_slice((*buffer).as_ref()); + }) .eos(move || { let _ = task_source.queue_with_canceller( task!(audio_decode_eos: move || { let this = this.root(); - let decoded_audio = decoded_audio.lock().unwrap(); + let decoded_audio = decoded_audio__.lock().unwrap(); + let length = if decoded_audio.len() >= 1 { + decoded_audio[0].len() + } else { + 0 + }; let buffer = AudioBuffer::new( &this.global().as_window(), - 1, // XXX servo-media should provide this info - decoded_audio.len() as u32, + decoded_audio.len() as u32 /* number of channels */, + length as u32, this.sample_rate, Some(decoded_audio.as_slice())); let mut resolvers = this.decode_resolvers.borrow_mut(); @@ -443,12 +467,6 @@ impl BaseAudioContextMethods for BaseAudioContext { &canceller_, ); }) - .progress(move |buffer| { - decoded_audio_ - .lock() - .unwrap() - .extend_from_slice((*buffer).as_ref()); - }) .build(); self.audio_context_impl .decode_audio_data(audio_data, callbacks); |