1use crate::{ffi, ChildProxy, Element, ElementFlags, Object, Pad, PadDirection};
7use glib::{
8 object::ObjectType as _,
9 prelude::*,
10 signal::{connect_raw, SignalHandlerId},
11 translate::*,
12};
13use std::boxed::Box as Box_;
14
15glib::wrapper! {
16 #[doc(alias = "GstBin")]
17 pub struct Bin(Object<ffi::GstBin, ffi::GstBinClass>) @extends Element, Object, @implements ChildProxy;
18
19 match fn {
20 type_ => || ffi::gst_bin_get_type(),
21 }
22}
23
24impl Bin {
25 pub const NONE: Option<&'static Bin> = None;
26}
27
28unsafe impl Send for Bin {}
29unsafe impl Sync for Bin {}
30
31mod sealed {
32 pub trait Sealed {}
33 impl<T: super::IsA<super::Bin>> Sealed for T {}
34}
35
36pub trait GstBinExt: IsA<Bin> + sealed::Sealed + 'static {
37 #[doc(alias = "gst_bin_add")]
38 fn add(&self, element: &impl IsA<Element>) -> Result<(), glib::error::BoolError> {
39 unsafe {
40 glib::result_from_gboolean!(
41 ffi::gst_bin_add(
42 self.as_ref().to_glib_none().0,
43 element.as_ref().to_glib_none().0
44 ),
45 "Failed to add element"
46 )
47 }
48 }
49
50 #[doc(alias = "gst_bin_find_unlinked_pad")]
51 fn find_unlinked_pad(&self, direction: PadDirection) -> Option<Pad> {
52 unsafe {
53 from_glib_full(ffi::gst_bin_find_unlinked_pad(
54 self.as_ref().to_glib_none().0,
55 direction.into_glib(),
56 ))
57 }
58 }
59
60 #[doc(alias = "gst_bin_get_by_interface")]
61 #[doc(alias = "get_by_interface")]
62 fn by_interface(&self, iface: glib::types::Type) -> Option<Element> {
63 unsafe {
64 from_glib_full(ffi::gst_bin_get_by_interface(
65 self.as_ref().to_glib_none().0,
66 iface.into_glib(),
67 ))
68 }
69 }
70
71 #[doc(alias = "gst_bin_get_by_name")]
72 #[doc(alias = "get_by_name")]
73 fn by_name(&self, name: &str) -> Option<Element> {
74 unsafe {
75 from_glib_full(ffi::gst_bin_get_by_name(
76 self.as_ref().to_glib_none().0,
77 name.to_glib_none().0,
78 ))
79 }
80 }
81
82 #[doc(alias = "gst_bin_get_by_name_recurse_up")]
83 #[doc(alias = "get_by_name_recurse_up")]
84 fn by_name_recurse_up(&self, name: &str) -> Option<Element> {
85 unsafe {
86 from_glib_full(ffi::gst_bin_get_by_name_recurse_up(
87 self.as_ref().to_glib_none().0,
88 name.to_glib_none().0,
89 ))
90 }
91 }
92
93 #[doc(alias = "gst_bin_get_suppressed_flags")]
94 #[doc(alias = "get_suppressed_flags")]
95 fn suppressed_flags(&self) -> ElementFlags {
96 unsafe {
97 from_glib(ffi::gst_bin_get_suppressed_flags(
98 self.as_ref().to_glib_none().0,
99 ))
100 }
101 }
102
103 #[doc(alias = "gst_bin_recalculate_latency")]
104 fn recalculate_latency(&self) -> Result<(), glib::error::BoolError> {
105 unsafe {
106 glib::result_from_gboolean!(
107 ffi::gst_bin_recalculate_latency(self.as_ref().to_glib_none().0),
108 "Failed to recalculate latency"
109 )
110 }
111 }
112
113 #[doc(alias = "gst_bin_remove")]
114 fn remove(&self, element: &impl IsA<Element>) -> Result<(), glib::error::BoolError> {
115 unsafe {
116 glib::result_from_gboolean!(
117 ffi::gst_bin_remove(
118 self.as_ref().to_glib_none().0,
119 element.as_ref().to_glib_none().0
120 ),
121 "Failed to remove element"
122 )
123 }
124 }
125
126 #[doc(alias = "gst_bin_set_suppressed_flags")]
127 fn set_suppressed_flags(&self, flags: ElementFlags) {
128 unsafe {
129 ffi::gst_bin_set_suppressed_flags(self.as_ref().to_glib_none().0, flags.into_glib());
130 }
131 }
132
133 #[doc(alias = "gst_bin_sync_children_states")]
134 fn sync_children_states(&self) -> Result<(), glib::error::BoolError> {
135 unsafe {
136 glib::result_from_gboolean!(
137 ffi::gst_bin_sync_children_states(self.as_ref().to_glib_none().0),
138 "Failed to sync children states"
139 )
140 }
141 }
142
143 #[doc(alias = "async-handling")]
144 fn is_async_handling(&self) -> bool {
145 ObjectExt::property(self.as_ref(), "async-handling")
146 }
147
148 #[doc(alias = "async-handling")]
149 fn set_async_handling(&self, async_handling: bool) {
150 ObjectExt::set_property(self.as_ref(), "async-handling", async_handling)
151 }
152
153 #[doc(alias = "message-forward")]
154 fn is_message_forward(&self) -> bool {
155 ObjectExt::property(self.as_ref(), "message-forward")
156 }
157
158 #[doc(alias = "message-forward")]
159 fn set_message_forward(&self, message_forward: bool) {
160 ObjectExt::set_property(self.as_ref(), "message-forward", message_forward)
161 }
162
163 #[doc(alias = "deep-element-added")]
164 fn connect_deep_element_added<F: Fn(&Self, &Bin, &Element) + Send + Sync + 'static>(
165 &self,
166 f: F,
167 ) -> SignalHandlerId {
168 unsafe extern "C" fn deep_element_added_trampoline<
169 P: IsA<Bin>,
170 F: Fn(&P, &Bin, &Element) + Send + Sync + 'static,
171 >(
172 this: *mut ffi::GstBin,
173 sub_bin: *mut ffi::GstBin,
174 element: *mut ffi::GstElement,
175 f: glib::ffi::gpointer,
176 ) {
177 let f: &F = &*(f as *const F);
178 f(
179 Bin::from_glib_borrow(this).unsafe_cast_ref(),
180 &from_glib_borrow(sub_bin),
181 &from_glib_borrow(element),
182 )
183 }
184 unsafe {
185 let f: Box_<F> = Box_::new(f);
186 connect_raw(
187 self.as_ptr() as *mut _,
188 b"deep-element-added\0".as_ptr() as *const _,
189 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
190 deep_element_added_trampoline::<Self, F> as *const (),
191 )),
192 Box_::into_raw(f),
193 )
194 }
195 }
196
197 #[doc(alias = "deep-element-removed")]
198 fn connect_deep_element_removed<F: Fn(&Self, &Bin, &Element) + Send + Sync + 'static>(
199 &self,
200 f: F,
201 ) -> SignalHandlerId {
202 unsafe extern "C" fn deep_element_removed_trampoline<
203 P: IsA<Bin>,
204 F: Fn(&P, &Bin, &Element) + Send + Sync + 'static,
205 >(
206 this: *mut ffi::GstBin,
207 sub_bin: *mut ffi::GstBin,
208 element: *mut ffi::GstElement,
209 f: glib::ffi::gpointer,
210 ) {
211 let f: &F = &*(f as *const F);
212 f(
213 Bin::from_glib_borrow(this).unsafe_cast_ref(),
214 &from_glib_borrow(sub_bin),
215 &from_glib_borrow(element),
216 )
217 }
218 unsafe {
219 let f: Box_<F> = Box_::new(f);
220 connect_raw(
221 self.as_ptr() as *mut _,
222 b"deep-element-removed\0".as_ptr() as *const _,
223 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
224 deep_element_removed_trampoline::<Self, F> as *const (),
225 )),
226 Box_::into_raw(f),
227 )
228 }
229 }
230
231 #[doc(alias = "element-added")]
232 fn connect_element_added<F: Fn(&Self, &Element) + Send + Sync + 'static>(
233 &self,
234 f: F,
235 ) -> SignalHandlerId {
236 unsafe extern "C" fn element_added_trampoline<
237 P: IsA<Bin>,
238 F: Fn(&P, &Element) + Send + Sync + 'static,
239 >(
240 this: *mut ffi::GstBin,
241 element: *mut ffi::GstElement,
242 f: glib::ffi::gpointer,
243 ) {
244 let f: &F = &*(f as *const F);
245 f(
246 Bin::from_glib_borrow(this).unsafe_cast_ref(),
247 &from_glib_borrow(element),
248 )
249 }
250 unsafe {
251 let f: Box_<F> = Box_::new(f);
252 connect_raw(
253 self.as_ptr() as *mut _,
254 b"element-added\0".as_ptr() as *const _,
255 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
256 element_added_trampoline::<Self, F> as *const (),
257 )),
258 Box_::into_raw(f),
259 )
260 }
261 }
262
263 #[doc(alias = "element-removed")]
264 fn connect_element_removed<F: Fn(&Self, &Element) + Send + Sync + 'static>(
265 &self,
266 f: F,
267 ) -> SignalHandlerId {
268 unsafe extern "C" fn element_removed_trampoline<
269 P: IsA<Bin>,
270 F: Fn(&P, &Element) + Send + Sync + 'static,
271 >(
272 this: *mut ffi::GstBin,
273 element: *mut ffi::GstElement,
274 f: glib::ffi::gpointer,
275 ) {
276 let f: &F = &*(f as *const F);
277 f(
278 Bin::from_glib_borrow(this).unsafe_cast_ref(),
279 &from_glib_borrow(element),
280 )
281 }
282 unsafe {
283 let f: Box_<F> = Box_::new(f);
284 connect_raw(
285 self.as_ptr() as *mut _,
286 b"element-removed\0".as_ptr() as *const _,
287 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
288 element_removed_trampoline::<Self, F> as *const (),
289 )),
290 Box_::into_raw(f),
291 )
292 }
293 }
294
295 #[doc(alias = "async-handling")]
296 fn connect_async_handling_notify<F: Fn(&Self) + Send + Sync + 'static>(
297 &self,
298 f: F,
299 ) -> SignalHandlerId {
300 unsafe extern "C" fn notify_async_handling_trampoline<
301 P: IsA<Bin>,
302 F: Fn(&P) + Send + Sync + 'static,
303 >(
304 this: *mut ffi::GstBin,
305 _param_spec: glib::ffi::gpointer,
306 f: glib::ffi::gpointer,
307 ) {
308 let f: &F = &*(f as *const F);
309 f(Bin::from_glib_borrow(this).unsafe_cast_ref())
310 }
311 unsafe {
312 let f: Box_<F> = Box_::new(f);
313 connect_raw(
314 self.as_ptr() as *mut _,
315 b"notify::async-handling\0".as_ptr() as *const _,
316 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
317 notify_async_handling_trampoline::<Self, F> as *const (),
318 )),
319 Box_::into_raw(f),
320 )
321 }
322 }
323
324 #[doc(alias = "message-forward")]
325 fn connect_message_forward_notify<F: Fn(&Self) + Send + Sync + 'static>(
326 &self,
327 f: F,
328 ) -> SignalHandlerId {
329 unsafe extern "C" fn notify_message_forward_trampoline<
330 P: IsA<Bin>,
331 F: Fn(&P) + Send + Sync + 'static,
332 >(
333 this: *mut ffi::GstBin,
334 _param_spec: glib::ffi::gpointer,
335 f: glib::ffi::gpointer,
336 ) {
337 let f: &F = &*(f as *const F);
338 f(Bin::from_glib_borrow(this).unsafe_cast_ref())
339 }
340 unsafe {
341 let f: Box_<F> = Box_::new(f);
342 connect_raw(
343 self.as_ptr() as *mut _,
344 b"notify::message-forward\0".as_ptr() as *const _,
345 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
346 notify_message_forward_trampoline::<Self, F> as *const (),
347 )),
348 Box_::into_raw(f),
349 )
350 }
351 }
352}
353
354impl<O: IsA<Bin>> GstBinExt for O {}