gstreamer_audio/subclass/
audio_aggregator_pad.rs1use 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}