gstreamer_audio/
audio_aggregator.rs

1#[cfg(feature = "v1_18")]
2use std::mem::transmute;
3
4#[cfg(feature = "v1_18")]
5use glib::object::Cast;
6#[cfg(feature = "v1_18")]
7use glib::signal::{connect_raw, SignalHandlerId};
8use glib::translate::*;
9use gst::prelude::*;
10
11use crate::{ffi, AudioAggregator, AudioAggregatorPad};
12
13pub trait AudioAggregatorExtManual: IsA<AudioAggregator> + 'static {
14    #[doc(alias = "gst_audio_aggregator_set_sink_caps")]
15    fn set_sink_caps(&self, pad: &impl IsA<AudioAggregatorPad>, caps: &gst::CapsRef) {
16        unsafe {
17            ffi::gst_audio_aggregator_set_sink_caps(
18                self.as_ref().to_glib_none().0,
19                pad.as_ref().to_glib_none().0,
20                caps.as_mut_ptr(),
21            );
22        }
23    }
24
25    #[cfg(feature = "v1_18")]
26    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
27    #[doc(alias = "output-buffer-duration-fraction")]
28    fn output_buffer_duration_fraction(&self) -> gst::Fraction {
29        ObjectExt::property(self.as_ref(), "output-buffer-duration-fraction")
30    }
31
32    #[cfg(feature = "v1_18")]
33    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
34    #[doc(alias = "output-buffer-duration-fraction")]
35    fn set_output_buffer_duration_fraction(&self, output_buffer_duration_fraction: gst::Fraction) {
36        ObjectExt::set_property(
37            self.as_ref(),
38            "output-buffer-duration-fraction",
39            output_buffer_duration_fraction,
40        )
41    }
42
43    #[cfg(feature = "v1_18")]
44    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
45    #[doc(alias = "output-buffer-duration-fraction")]
46    fn connect_output_buffer_duration_fraction_notify<F: Fn(&Self) + Send + Sync + 'static>(
47        &self,
48        f: F,
49    ) -> SignalHandlerId {
50        unsafe extern "C" fn notify_output_buffer_duration_fraction_trampoline<
51            P: IsA<AudioAggregator>,
52            F: Fn(&P) + Send + Sync + 'static,
53        >(
54            this: *mut ffi::GstAudioAggregator,
55            _param_spec: glib::ffi::gpointer,
56            f: glib::ffi::gpointer,
57        ) {
58            let f: &F = &*(f as *const F);
59            f(AudioAggregator::from_glib_borrow(this).unsafe_cast_ref())
60        }
61        unsafe {
62            let f: Box<F> = Box::new(f);
63            connect_raw(
64                self.as_ptr() as *mut _,
65                b"notify::output-buffer-duration-fraction\0".as_ptr() as *const _,
66                Some(transmute::<*const (), unsafe extern "C" fn()>(
67                    notify_output_buffer_duration_fraction_trampoline::<Self, F> as *const (),
68                )),
69                Box::into_raw(f),
70            )
71        }
72    }
73
74    fn current_caps(&self) -> Option<gst::Caps> {
75        unsafe {
76            let ptr = self.as_ptr() as *mut ffi::GstAudioAggregator;
77            let _guard = self.as_ref().object_lock();
78            from_glib_none((*ptr).current_caps)
79        }
80    }
81
82    fn current_audio_info(&self) -> Option<crate::AudioInfo> {
83        self.current_caps()
84            .and_then(|caps| crate::AudioInfo::from_caps(&caps).ok())
85    }
86}
87
88impl<O: IsA<AudioAggregator>> AudioAggregatorExtManual for O {}