gstreamer_audio/subclass/
audio_aggregator_pad.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::ptr;
4
5use glib::translate::*;
6use gst_base::{prelude::*, subclass::prelude::*};
7
8use crate::{ffi, AudioAggregatorPad};
9
10pub trait AudioAggregatorPadImpl:
11    AggregatorPadImpl + ObjectSubclass<Type: IsA<AudioAggregatorPad>>
12{
13    const HANDLE_CONVERSION: bool = false;
14
15    fn update_conversion_info(&self) {
16        self.parent_update_conversion_info()
17    }
18
19    fn convert_buffer(
20        &self,
21        in_info: &crate::AudioInfo,
22        out_info: &crate::AudioInfo,
23        buffer: &gst::Buffer,
24    ) -> Option<gst::Buffer> {
25        self.parent_convert_buffer(in_info, out_info, buffer)
26    }
27}
28
29pub trait AudioAggregatorPadImplExt: AudioAggregatorPadImpl {
30    fn parent_update_conversion_info(&self) {
31        unsafe {
32            let data = Self::type_data();
33            let parent_class = data.as_ref().parent_class() as *mut ffi::GstAudioAggregatorPadClass;
34            if let Some(f) = (*parent_class).update_conversion_info {
35                f(self
36                    .obj()
37                    .unsafe_cast_ref::<AudioAggregatorPad>()
38                    .to_glib_none()
39                    .0);
40            }
41        }
42    }
43
44    fn parent_convert_buffer(
45        &self,
46        in_info: &crate::AudioInfo,
47        out_info: &crate::AudioInfo,
48        buffer: &gst::Buffer,
49    ) -> Option<gst::Buffer> {
50        unsafe {
51            let data = Self::type_data();
52            let parent_class = data.as_ref().parent_class() as *mut ffi::GstAudioAggregatorPadClass;
53            let f = (*parent_class)
54                .convert_buffer
55                .expect("Missing parent function `convert_buffer`");
56            from_glib_full(f(
57                self.obj()
58                    .unsafe_cast_ref::<AudioAggregatorPad>()
59                    .to_glib_none()
60                    .0,
61                mut_override(in_info.to_glib_none().0),
62                mut_override(out_info.to_glib_none().0),
63                buffer.as_mut_ptr(),
64            ))
65        }
66    }
67}
68
69impl<T: AudioAggregatorPadImpl> AudioAggregatorPadImplExt for T {}
70
71unsafe impl<T: AudioAggregatorPadImpl> IsSubclassable<T> for AudioAggregatorPad {
72    fn class_init(klass: &mut glib::Class<Self>) {
73        Self::parent_class_init::<T>(klass);
74
75        let klass = klass.as_mut();
76        if T::HANDLE_CONVERSION {
77            klass.update_conversion_info = Some(audio_aggregator_pad_update_conversion_info::<T>);
78            klass.convert_buffer = Some(audio_aggregator_pad_convert_buffer::<T>);
79        }
80    }
81}
82
83unsafe extern "C" fn audio_aggregator_pad_update_conversion_info<T: AudioAggregatorPadImpl>(
84    ptr: *mut ffi::GstAudioAggregatorPad,
85) {
86    let instance = &*(ptr as *mut T::Instance);
87    let imp = instance.imp();
88
89    imp.update_conversion_info();
90}
91
92unsafe extern "C" fn audio_aggregator_pad_convert_buffer<T: AudioAggregatorPadImpl>(
93    ptr: *mut ffi::GstAudioAggregatorPad,
94    in_info: *mut ffi::GstAudioInfo,
95    out_info: *mut ffi::GstAudioInfo,
96    buffer: *mut gst::ffi::GstBuffer,
97) -> *mut gst::ffi::GstBuffer {
98    let instance = &*(ptr as *mut T::Instance);
99    let imp = instance.imp();
100
101    imp.convert_buffer(
102        &from_glib_none(in_info),
103        &from_glib_none(out_info),
104        &from_glib_borrow(buffer),
105    )
106    .map(|buffer| buffer.into_glib_ptr())
107    .unwrap_or(ptr::null_mut())
108}