diff --git a/audio/src/decoder.rs b/audio/src/decoder.rs index d2e443c3..17bedfd6 100644 --- a/audio/src/decoder.rs +++ b/audio/src/decoder.rs @@ -2,7 +2,7 @@ use std::boxed::FnBox; use std::sync::Mutex; pub struct AudioDecoderCallbacks { - pub eos: Mutex>>, + pub eos: Mutex>>, pub error: Mutex>>, pub progress: Option>) + Send + Sync + 'static>>, } @@ -16,11 +16,11 @@ impl AudioDecoderCallbacks { } } - pub fn eos(&self) { + pub fn eos(&self, channels: u32) { let eos = self.eos.lock().unwrap().take(); match eos { None => return, - Some(callback) => callback(), + Some(callback) => callback(channels), }; } @@ -44,13 +44,13 @@ unsafe impl Send for AudioDecoderCallbacks {} unsafe impl Sync for AudioDecoderCallbacks {} pub struct AudioDecoderCallbacksBuilder { - eos: 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 @@ -82,14 +82,12 @@ impl AudioDecoderCallbacksBuilder { pub struct AudioDecoderOptions { pub sample_rate: f32, - pub channels: u32, } impl Default for AudioDecoderOptions { fn default() -> Self { AudioDecoderOptions { sample_rate: 44100., - channels: 1, } } } diff --git a/backends/gstreamer/src/audio_decoder.rs b/backends/gstreamer/src/audio_decoder.rs index ea131d1d..70dbb309 100644 --- a/backends/gstreamer/src/audio_decoder.rs +++ b/backends/gstreamer/src/audio_decoder.rs @@ -76,11 +76,11 @@ impl AudioDecoder for GStreamerAudioDecoder { let pipeline = &pipeline_; let callbacks = &callbacks_; - let (is_audio, _) = { + let (is_audio, caps) = { let media_type = src_pad.get_current_caps().and_then(|caps| { caps.get_structure(0).map(|s| { let name = s.get_name(); - (name.starts_with("audio/"), name.starts_with("video/")) + (name.starts_with("audio/"), caps.clone()) }) }); @@ -103,12 +103,15 @@ impl AudioDecoder for GStreamerAudioDecoder { let resample = gst::ElementFactory::make("audioresample", None).ok_or(())?; let sink = gst::ElementFactory::make("appsink", None).ok_or(())?; let appsink = sink.clone().dynamic_cast::().map_err(|_| ())?; - sink.set_property("sync", &false.to_value()).map_err(|_| ())?; + sink.set_property("sync", &false.to_value()) + .map_err(|_| ())?; + let sample_audio_info = gst_audio::AudioInfo::from_caps(&caps).ok_or(())?; + let channels = sample_audio_info.channels(); let audio_info = gst_audio::AudioInfo::new( gst_audio::AUDIO_FORMAT_F32, options.sample_rate as u32, - options.channels, + channels, ).build() .ok_or(())?; appsink.set_caps(&audio_info.to_caps().unwrap()); @@ -149,7 +152,7 @@ impl AudioDecoder for GStreamerAudioDecoder { gst::FlowReturn::Ok }) .eos(move |_| { - callbacks__.eos(); + callbacks__.eos(channels); let _ = pipeline__.set_state(gst::State::Null); }) .build(), diff --git a/examples/audio_decoder.rs b/examples/audio_decoder.rs index cf2417a5..bd472a01 100644 --- a/examples/audio_decoder.rs +++ b/examples/audio_decoder.rs @@ -26,8 +26,8 @@ fn run_example(servo_media: Arc) { let progress = decoded_audio.clone(); let (sender, receiver) = mpsc::channel(); let callbacks = AudioDecoderCallbacks::new() - .eos(move || { - sender.send(()).unwrap(); + .eos(move |channels| { + sender.send(channels).unwrap(); }) .error(|| { eprintln!("Error decoding audio"); @@ -41,8 +41,8 @@ fn run_example(servo_media: Arc) { .build(); context.decode_audio_data(bytes.to_vec(), callbacks); println!("Decoding audio"); - receiver.recv().unwrap(); - println!("Audio decoded"); + let channels = receiver.recv().unwrap(); + println!("Audio decoded. Channels {}", channels); let buffer_source = context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default())); let dest = context.dest_node();