diff options
Diffstat (limited to 'components/script/dom/baseaudiocontext.rs')
-rw-r--r-- | components/script/dom/baseaudiocontext.rs | 209 |
1 files changed, 123 insertions, 86 deletions
diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index c09fe9971f5..1dbf8bbaf7a 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -86,10 +86,7 @@ pub struct BaseAudioContext { impl BaseAudioContext { #[allow(unrooted_must_root)] - pub fn new_inherited( - _: &GlobalScope, - options: BaseAudioContextOptions, - ) -> BaseAudioContext { + pub fn new_inherited(_: &GlobalScope, options: BaseAudioContextOptions) -> BaseAudioContext { let options = match options { BaseAudioContextOptions::AudioContext(options) => options, BaseAudioContextOptions::OfflineAudioContext(_) => unimplemented!(), @@ -99,7 +96,11 @@ impl BaseAudioContext { let context = BaseAudioContext { eventtarget: EventTarget::new_inherited(), - audio_context_impl: Rc::new(ServoMedia::get().unwrap().create_audio_context(options.into())), + audio_context_impl: Rc::new( + ServoMedia::get() + .unwrap() + .create_audio_context(options.into()), + ), destination: Default::default(), in_flight_resume_promises_queue: Default::default(), pending_resume_promises: Default::default(), @@ -126,7 +127,9 @@ impl BaseAudioContext { #[allow(unrooted_must_root)] fn push_pending_resume_promise(&self, promise: &Rc<Promise>) { - self.pending_resume_promises.borrow_mut().push(promise.clone()); + self.pending_resume_promises + .borrow_mut() + .push(promise.clone()); } /// Takes the pending resume promises. @@ -141,14 +144,11 @@ impl BaseAudioContext { /// which were taken and moved to the in-flight queue. #[allow(unrooted_must_root)] fn take_pending_resume_promises(&self, result: ErrorResult) { - let pending_resume_promises = mem::replace( - &mut *self.pending_resume_promises.borrow_mut(), - vec![], - ); - self.in_flight_resume_promises_queue.borrow_mut().push_back(( - pending_resume_promises.into(), - result, - )); + let pending_resume_promises = + mem::replace(&mut *self.pending_resume_promises.borrow_mut(), vec![]); + self.in_flight_resume_promises_queue + .borrow_mut() + .push_back((pending_resume_promises.into(), result)); } /// Fulfills the next in-flight resume promises queue after running a closure. @@ -161,21 +161,22 @@ impl BaseAudioContext { /// hiding actual safety bugs. #[allow(unrooted_must_root)] fn fulfill_in_flight_resume_promises<F>(&self, f: F) - where - F: FnOnce(), - { - let (promises, result) = self.in_flight_resume_promises_queue - .borrow_mut() - .pop_front() - .expect("there should be at least one list of in flight resume promises"); - f(); - for promise in &*promises { - match result { - Ok(ref value) => promise.resolve_native(value), - Err(ref error) => promise.reject_error(error.clone()), - } + where + F: FnOnce(), + { + let (promises, result) = self + .in_flight_resume_promises_queue + .borrow_mut() + .pop_front() + .expect("there should be at least one list of in flight resume promises"); + f(); + for promise in &*promises { + match result { + Ok(ref value) => promise.resolve_native(value), + Err(ref error) => promise.reject_error(error.clone()), } } + } /// Control thread processing state pub fn control_thread_state(&self) -> ProcessingState { @@ -197,7 +198,8 @@ impl BaseAudioContext { match self.audio_context_impl.resume() { Ok(()) => { self.take_pending_resume_promises(Ok(())); - let _ = task_source.queue(task!(resume_success: move || { + let _ = task_source.queue( + task!(resume_success: move || { let this = this.root(); this.fulfill_in_flight_resume_promises(|| { if this.state.get() != AudioContextState::Running { @@ -210,14 +212,21 @@ impl BaseAudioContext { ); } }); - }), window.upcast()); + }), + window.upcast(), + ); }, Err(()) => { - self.take_pending_resume_promises(Err(Error::Type("Something went wrong".to_owned()))); - let _ = task_source.queue(task!(resume_error: move || { + self.take_pending_resume_promises(Err(Error::Type( + "Something went wrong".to_owned(), + ))); + let _ = task_source.queue( + task!(resume_error: move || { this.root().fulfill_in_flight_resume_promises(|| {}) - }), window.upcast()); - } + }), + window.upcast(), + ); + }, } } } @@ -288,7 +297,11 @@ impl BaseAudioContextMethods for BaseAudioContext { /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createoscillator fn CreateOscillator(&self) -> DomRoot<OscillatorNode> { - OscillatorNode::new(&self.global().as_window(), &self, &OscillatorOptions::empty()) + OscillatorNode::new( + &self.global().as_window(), + &self, + &OscillatorOptions::empty(), + ) } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-creategain @@ -297,56 +310,74 @@ impl BaseAudioContextMethods for BaseAudioContext { } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer - fn CreateBuffer(&self, - number_of_channels: u32, - length: u32, - sample_rate: Finite<f32>) -> Fallible<DomRoot<AudioBuffer>> { + fn CreateBuffer( + &self, + number_of_channels: u32, + length: u32, + sample_rate: Finite<f32>, + ) -> Fallible<DomRoot<AudioBuffer>> { if number_of_channels <= 0 || number_of_channels > MAX_CHANNEL_COUNT || - length <= 0 || - *sample_rate <= 0. { - return Err(Error::NotSupported); - } - Ok(AudioBuffer::new(&self.global().as_window(), number_of_channels, length, *sample_rate, None)) + length <= 0 || + *sample_rate <= 0. + { + return Err(Error::NotSupported); + } + Ok(AudioBuffer::new( + &self.global().as_window(), + number_of_channels, + length, + *sample_rate, + None, + )) } fn CreateBufferSource(&self) -> DomRoot<AudioBufferSourceNode> { - AudioBufferSourceNode::new(&self.global().as_window(), &self, &AudioBufferSourceOptions::empty()) + AudioBufferSourceNode::new( + &self.global().as_window(), + &self, + &AudioBufferSourceOptions::empty(), + ) } #[allow(unrooted_must_root)] - fn DecodeAudioData(&self, - audio_data: CustomAutoRooterGuard<ArrayBuffer>, - decode_success_callback: Option<Rc<DecodeSuccessCallback>>, - decode_error_callback: Option<Rc<DecodeErrorCallback>>) - -> Rc<Promise> { - // Step 1. - let promise = Promise::new(&self.global()); - let global = self.global(); - let window = global.as_window(); - - if audio_data.len() > 0 { - // Step 2. - // XXX detach array buffer. - let uuid = Uuid::new_v4().simple().to_string(); - let uuid_ = uuid.clone(); - self.decode_resolvers.borrow_mut().insert(uuid.clone(), DecodeResolver { + fn DecodeAudioData( + &self, + audio_data: CustomAutoRooterGuard<ArrayBuffer>, + decode_success_callback: Option<Rc<DecodeSuccessCallback>>, + decode_error_callback: Option<Rc<DecodeErrorCallback>>, + ) -> Rc<Promise> { + // Step 1. + let promise = Promise::new(&self.global()); + let global = self.global(); + let window = global.as_window(); + + if audio_data.len() > 0 { + // Step 2. + // XXX detach array buffer. + let uuid = Uuid::new_v4().simple().to_string(); + let uuid_ = uuid.clone(); + self.decode_resolvers.borrow_mut().insert( + uuid.clone(), + DecodeResolver { promise: promise.clone(), success_callback: decode_success_callback, error_callback: decode_error_callback, - }); - let audio_data = audio_data.to_vec(); - let decoded_audio = Arc::new(Mutex::new(Vec::new())); - let decoded_audio_ = decoded_audio.clone(); - let this = Trusted::new(self); - let this_ = this.clone(); - let task_source = window.dom_manipulation_task_source(); - let task_source_ = window.dom_manipulation_task_source(); - let canceller = window.task_canceller(); - let canceller_ = window.task_canceller(); - let callbacks = AudioDecoderCallbacks::new() - .eos(move || { - let _ = task_source.queue_with_canceller(task!(audio_decode_eos: move || { + }, + ); + let audio_data = audio_data.to_vec(); + let decoded_audio = Arc::new(Mutex::new(Vec::new())); + let decoded_audio_ = decoded_audio.clone(); + let this = Trusted::new(self); + let this_ = this.clone(); + let task_source = window.dom_manipulation_task_source(); + let task_source_ = window.dom_manipulation_task_source(); + let canceller = window.task_canceller(); + let canceller_ = window.task_canceller(); + let callbacks = AudioDecoderCallbacks::new() + .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 buffer = AudioBuffer::new( @@ -362,10 +393,13 @@ impl BaseAudioContextMethods for BaseAudioContext { let _ = callback.Call__(&buffer, ExceptionHandling::Report); } resolver.promise.resolve_native(&buffer); - }), &canceller); - }) + }), + &canceller, + ); + }) .error(move || { - let _ = task_source_.queue_with_canceller(task!(audio_decode_eos: move || { + let _ = task_source_.queue_with_canceller( + task!(audio_decode_eos: move || { let this = this_.root(); let mut resolvers = this.decode_resolvers.borrow_mut(); assert!(resolvers.contains_key(&uuid)); @@ -376,7 +410,9 @@ impl BaseAudioContextMethods for BaseAudioContext { ExceptionHandling::Report); } resolver.promise.reject_error(Error::Type("Audio decode error".to_owned())); - }), &canceller_); + }), + &canceller_, + ); }) .progress(move |buffer| { decoded_audio_ @@ -385,16 +421,17 @@ impl BaseAudioContextMethods for BaseAudioContext { .extend_from_slice((*buffer).as_ref()); }) .build(); - self.audio_context_impl.decode_audio_data(audio_data, callbacks); - } else { - // Step 3. - promise.reject_error(Error::DataClone); - return promise; - } - - // Step 4. - promise + self.audio_context_impl + .decode_audio_data(audio_data, callbacks); + } else { + // Step 3. + promise.reject_error(Error::DataClone); + return promise; } + + // Step 4. + promise + } } impl From<ProcessingState> for AudioContextState { |