diff --git a/servo-media/src/audio/decoder.rs b/servo-media/src/audio/decoder.rs index 39ce81e5..d82689be 100644 --- a/servo-media/src/audio/decoder.rs +++ b/servo-media/src/audio/decoder.rs @@ -1,6 +1,8 @@ +use std::boxed::FnBox; +use std::sync::Mutex; pub struct AudioDecoderCallbacks { - pub eos: Option>, - pub error: Option>, + pub eos: Mutex>>, + pub error: Mutex>>, pub progress: Option>) + Send + Sync + 'static>>, } @@ -14,16 +16,18 @@ impl AudioDecoderCallbacks { } pub fn eos(&self) { - match self.eos { + let eos = self.eos.lock().unwrap().take(); + match eos { None => return, - Some(ref callback) => callback(), + Some(callback) => callback(), }; } pub fn error(&self) { - match self.error { + let error = self.error.lock().unwrap().take(); + match error { None => return, - Some(ref callback) => callback(), + Some(callback) => callback(), }; } @@ -39,20 +43,20 @@ unsafe impl Send for AudioDecoderCallbacks {} unsafe impl Sync for AudioDecoderCallbacks {} pub struct AudioDecoderCallbacksBuilder { - eos: Option>, - error: Option>, + eos: Option>, + error: Option>, progress: Option>) + Send + Sync + 'static>>, } impl AudioDecoderCallbacksBuilder { - pub fn eos(self, eos: F) -> Self { + pub fn eos(self, eos: F) -> Self { Self { eos: Some(Box::new(eos)), ..self } } - pub fn error(self, error: F) -> Self { + pub fn error(self, error: F) -> Self { Self { error: Some(Box::new(error)), ..self @@ -68,8 +72,8 @@ impl AudioDecoderCallbacksBuilder { pub fn build(self) -> AudioDecoderCallbacks { AudioDecoderCallbacks { - eos: self.eos, - error: self.error, + eos: Mutex::new(self.eos), + error: Mutex::new(self.error), progress: self.progress, } } diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index d62ed0be..110091f2 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(fnbox)] + use std::sync::{self, Once}; use std::sync::{Arc, Mutex};