diff --git a/gstreamer-audio/Gir.toml b/gstreamer-audio/Gir.toml index b64ecef5f..7675a8f12 100644 --- a/gstreamer-audio/Gir.toml +++ b/gstreamer-audio/Gir.toml @@ -23,6 +23,7 @@ generate = [ "GstAudio.AudioBaseSrc", "GstAudio.AudioChannelPosition", "GstAudio.AudioDitherMethod", + "GstAudio.AudioFilter", "GstAudio.AudioFormatFlags", "GstAudio.AudioLayout", "GstAudio.AudioNoiseShapingMethod", @@ -53,6 +54,7 @@ manual = [ "GstBase.AggregatorPad", "GstBase.BaseSink", "GstBase.BaseSrc", + "GstBase.BaseTransform", ] [[object]] diff --git a/gstreamer-audio/src/audio_info.rs b/gstreamer-audio/src/audio_info.rs index d31bc394d..d554f8ad9 100644 --- a/gstreamer-audio/src/audio_info.rs +++ b/gstreamer-audio/src/audio_info.rs @@ -409,6 +409,17 @@ impl<'a> glib::translate::ToGlibPtr<'a, *const ffi::GstAudioInfo> for AudioInfo } } +#[doc(hidden)] +impl glib::translate::FromGlibPtrNone<*const ffi::GstAudioInfo> for AudioInfo { + #[inline] + unsafe fn from_glib_none(ptr: *const ffi::GstAudioInfo) -> Self { + Self( + ptr::read(ptr), + std::array::from_fn(|i| from_glib((*ptr).position[i])), + ) + } +} + #[doc(hidden)] impl glib::translate::FromGlibPtrNone<*mut ffi::GstAudioInfo> for AudioInfo { #[inline] diff --git a/gstreamer-audio/src/auto/audio_filter.rs b/gstreamer-audio/src/auto/audio_filter.rs new file mode 100644 index 000000000..06b1cf230 --- /dev/null +++ b/gstreamer-audio/src/auto/audio_filter.rs @@ -0,0 +1,20 @@ +// This file was generated by gir (https://github.com/gtk-rs/gir) +// from gir-files (https://github.com/gtk-rs/gir-files) +// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git) +// DO NOT EDIT + +glib::wrapper! { + #[doc(alias = "GstAudioFilter")] + pub struct AudioFilter(Object) @extends gst_base::BaseTransform, gst::Element, gst::Object; + + match fn { + type_ => || ffi::gst_audio_filter_get_type(), + } +} + +impl AudioFilter { + pub const NONE: Option<&'static AudioFilter> = None; +} + +unsafe impl Send for AudioFilter {} +unsafe impl Sync for AudioFilter {} diff --git a/gstreamer-audio/src/auto/mod.rs b/gstreamer-audio/src/auto/mod.rs index 4f74aa40d..c5fafdaee 100644 --- a/gstreamer-audio/src/auto/mod.rs +++ b/gstreamer-audio/src/auto/mod.rs @@ -24,6 +24,9 @@ pub use self::audio_decoder::AudioDecoder; mod audio_encoder; pub use self::audio_encoder::AudioEncoder; +mod audio_filter; +pub use self::audio_filter::AudioFilter; + mod audio_sink; pub use self::audio_sink::AudioSink; diff --git a/gstreamer-audio/src/subclass/audio_filter.rs b/gstreamer-audio/src/subclass/audio_filter.rs new file mode 100644 index 000000000..fab261ceb --- /dev/null +++ b/gstreamer-audio/src/subclass/audio_filter.rs @@ -0,0 +1,78 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use glib::translate::*; + +use gst_base::prelude::*; +use gst_base::subclass::prelude::*; + +use crate::AudioFilter; +use crate::AudioInfo; + +pub trait AudioFilterImpl: AudioFilterImplExt + BaseTransformImpl { + fn allowed_caps() -> &'static gst::Caps; + + fn setup(&self, info: &AudioInfo) -> Result<(), gst::LoggableError> { + self.parent_setup(info) + } +} + +pub trait AudioFilterImplExt: ObjectSubclass { + fn parent_setup(&self, info: &AudioInfo) -> Result<(), gst::LoggableError>; +} + +impl AudioFilterImplExt for T { + fn parent_setup(&self, info: &AudioInfo) -> Result<(), gst::LoggableError> { + unsafe { + let data = Self::type_data(); + let parent_class = data.as_ref().parent_class() as *mut ffi::GstAudioFilterClass; + (*parent_class) + .setup + .map(|f| { + gst::result_from_gboolean!( + f( + self.obj().unsafe_cast_ref::().to_glib_none().0, + info.to_glib_none().0, + ), + gst::CAT_RUST, + "Parent function `setup` failed" + ) + }) + .unwrap_or(Ok(())) + } + } +} + +unsafe impl IsSubclassable for AudioFilter { + fn class_init(klass: &mut glib::Class) { + Self::parent_class_init::(klass); + + let klass = klass.as_mut(); + klass.setup = Some(audio_filter_setup::); + + unsafe { + ffi::gst_audio_filter_class_add_pad_templates( + &mut *klass, + T::allowed_caps().to_glib_none().0, + ); + } + } +} + +unsafe extern "C" fn audio_filter_setup( + ptr: *mut ffi::GstAudioFilter, + info: *const ffi::GstAudioInfo, +) -> glib::ffi::gboolean { + let instance = &*(ptr as *mut T::Instance); + let imp = instance.imp(); + + gst::panic_to_error!(imp, false, { + match imp.setup(&from_glib_none(info)) { + Ok(()) => true, + Err(err) => { + err.log_with_imp(imp); + false + } + } + }) + .into_glib() +} diff --git a/gstreamer-audio/src/subclass/mod.rs b/gstreamer-audio/src/subclass/mod.rs index 851d507bf..df1efdd25 100644 --- a/gstreamer-audio/src/subclass/mod.rs +++ b/gstreamer-audio/src/subclass/mod.rs @@ -9,6 +9,7 @@ mod audio_base_sink; mod audio_base_src; mod audio_decoder; mod audio_encoder; +mod audio_filter; mod audio_sink; mod audio_src; @@ -23,6 +24,7 @@ pub mod prelude { pub use super::audio_base_src::AudioBaseSrcImpl; pub use super::audio_decoder::{AudioDecoderImpl, AudioDecoderImplExt}; pub use super::audio_encoder::{AudioEncoderImpl, AudioEncoderImplExt}; + pub use super::audio_filter::{AudioFilterImpl, AudioFilterImplExt}; pub use super::audio_sink::{AudioSinkImpl, AudioSinkImplExt}; pub use super::audio_src::{AudioSrcImpl, AudioSrcImplExt}; }