From 2fa1560f764740fa6bcba0aefa2dce2d5fe89a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Mon, 27 Aug 2018 14:10:51 +0200 Subject: [PATCH 1/3] Get number of channels from decoded audio sample --- backends/gstreamer/src/audio_decoder.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backends/gstreamer/src/audio_decoder.rs b/backends/gstreamer/src/audio_decoder.rs index ea131d1d..baf0df45 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()); From af79c8d5ee7f034db28f1e026e56625c5f63a134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Mon, 27 Aug 2018 14:13:52 +0200 Subject: [PATCH 2/3] Remove number of channels from audio decoder options --- audio/src/decoder.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/audio/src/decoder.rs b/audio/src/decoder.rs index d2e443c3..58322548 100644 --- a/audio/src/decoder.rs +++ b/audio/src/decoder.rs @@ -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, } } } From bfcd03afff00e15689134bfe51a4bb4cff2ffc13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Mon, 27 Aug 2018 15:23:34 +0200 Subject: [PATCH 3/3] Pass channel number through decoder eos callback --- audio/src/decoder.rs | 10 +++++----- backends/gstreamer/src/audio_decoder.rs | 2 +- examples/audio_decoder.rs | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/audio/src/decoder.rs b/audio/src/decoder.rs index 58322548..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 diff --git a/backends/gstreamer/src/audio_decoder.rs b/backends/gstreamer/src/audio_decoder.rs index baf0df45..70dbb309 100644 --- a/backends/gstreamer/src/audio_decoder.rs +++ b/backends/gstreamer/src/audio_decoder.rs @@ -152,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();