1use crate::{ClockTime, ControlBinding, ffi};
7use glib::{
8 prelude::*,
9 signal::{SignalHandlerId, connect_raw},
10 translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15 #[doc(alias = "GstObject")]
16 pub struct Object(Object<ffi::GstObject, ffi::GstObjectClass>);
17
18 match fn {
19 type_ => || ffi::gst_object_get_type(),
20 }
21}
22
23impl Object {
24 pub const NONE: Option<&'static Object> = None;
25
26 #[doc(alias = "gst_object_check_uniqueness")]
27 pub fn check_uniqueness(list: &[Object], name: &str) -> bool {
28 assert_initialized_main_thread!();
29 unsafe {
30 from_glib(ffi::gst_object_check_uniqueness(
31 list.to_glib_none().0,
32 name.to_glib_none().0,
33 ))
34 }
35 }
36
37 }
47
48impl std::fmt::Display for Object {
49 #[inline]
50 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
51 f.write_str(&GstObjectExt::name(self))
52 }
53}
54
55unsafe impl Send for Object {}
56unsafe impl Sync for Object {}
57
58pub trait GstObjectExt: IsA<Object> + 'static {
59 #[doc(alias = "gst_object_add_control_binding")]
60 fn add_control_binding(
61 &self,
62 binding: &impl IsA<ControlBinding>,
63 ) -> Result<(), glib::error::BoolError> {
64 unsafe {
65 glib::result_from_gboolean!(
66 ffi::gst_object_add_control_binding(
67 self.as_ref().to_glib_none().0,
68 binding.as_ref().to_glib_none().0
69 ),
70 "Failed to add control binding"
71 )
72 }
73 }
74
75 #[doc(alias = "gst_object_default_error")]
76 fn default_error(&self, error: &glib::Error, debug: Option<&str>) {
77 unsafe {
78 ffi::gst_object_default_error(
79 self.as_ref().to_glib_none().0,
80 error.to_glib_none().0,
81 debug.to_glib_none().0,
82 );
83 }
84 }
85
86 #[doc(alias = "gst_object_get_control_binding")]
87 #[doc(alias = "get_control_binding")]
88 fn control_binding(&self, property_name: &str) -> Option<ControlBinding> {
89 unsafe {
90 from_glib_full(ffi::gst_object_get_control_binding(
91 self.as_ref().to_glib_none().0,
92 property_name.to_glib_none().0,
93 ))
94 }
95 }
96
97 #[doc(alias = "gst_object_get_control_rate")]
98 #[doc(alias = "get_control_rate")]
99 fn control_rate(&self) -> Option<ClockTime> {
100 unsafe {
101 from_glib(ffi::gst_object_get_control_rate(
102 self.as_ref().to_glib_none().0,
103 ))
104 }
105 }
106
107 #[doc(alias = "gst_object_get_name")]
108 #[doc(alias = "get_name")]
109 fn name(&self) -> glib::GString {
110 unsafe { from_glib_full(ffi::gst_object_get_name(self.as_ref().to_glib_none().0)) }
111 }
112
113 #[doc(alias = "gst_object_get_parent")]
114 #[doc(alias = "get_parent")]
115 #[must_use]
116 fn parent(&self) -> Option<Object> {
117 unsafe { from_glib_full(ffi::gst_object_get_parent(self.as_ref().to_glib_none().0)) }
118 }
119
120 #[doc(alias = "gst_object_get_path_string")]
121 #[doc(alias = "get_path_string")]
122 fn path_string(&self) -> glib::GString {
123 unsafe {
124 from_glib_full(ffi::gst_object_get_path_string(
125 self.as_ref().to_glib_none().0,
126 ))
127 }
128 }
129
130 #[cfg(feature = "v1_28")]
131 #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
132 #[doc(alias = "gst_object_get_toplevel")]
133 #[doc(alias = "get_toplevel")]
134 #[must_use]
135 fn toplevel(&self) -> Object {
136 unsafe { from_glib_full(ffi::gst_object_get_toplevel(self.as_ref().to_glib_none().0)) }
137 }
138
139 #[doc(alias = "gst_object_get_value")]
140 #[doc(alias = "get_value")]
141 fn value(
142 &self,
143 property_name: &str,
144 timestamp: impl Into<Option<ClockTime>>,
145 ) -> Option<glib::Value> {
146 unsafe {
147 from_glib_full(ffi::gst_object_get_value(
148 self.as_ref().to_glib_none().0,
149 property_name.to_glib_none().0,
150 timestamp.into().into_glib(),
151 ))
152 }
153 }
154
155 #[doc(alias = "gst_object_has_active_control_bindings")]
162 fn has_active_control_bindings(&self) -> bool {
163 unsafe {
164 from_glib(ffi::gst_object_has_active_control_bindings(
165 self.as_ref().to_glib_none().0,
166 ))
167 }
168 }
169
170 #[doc(alias = "gst_object_has_ancestor")]
171 fn has_ancestor(&self, ancestor: &impl IsA<Object>) -> bool {
172 unsafe {
173 from_glib(ffi::gst_object_has_ancestor(
174 self.as_ref().to_glib_none().0,
175 ancestor.as_ref().to_glib_none().0,
176 ))
177 }
178 }
179
180 #[doc(alias = "gst_object_has_as_ancestor")]
181 fn has_as_ancestor(&self, ancestor: &impl IsA<Object>) -> bool {
182 unsafe {
183 from_glib(ffi::gst_object_has_as_ancestor(
184 self.as_ref().to_glib_none().0,
185 ancestor.as_ref().to_glib_none().0,
186 ))
187 }
188 }
189
190 #[doc(alias = "gst_object_has_as_parent")]
191 fn has_as_parent(&self, parent: &impl IsA<Object>) -> bool {
192 unsafe {
193 from_glib(ffi::gst_object_has_as_parent(
194 self.as_ref().to_glib_none().0,
195 parent.as_ref().to_glib_none().0,
196 ))
197 }
198 }
199
200 #[doc(alias = "gst_object_remove_control_binding")]
201 fn remove_control_binding(&self, binding: &impl IsA<ControlBinding>) -> bool {
202 unsafe {
203 from_glib(ffi::gst_object_remove_control_binding(
204 self.as_ref().to_glib_none().0,
205 binding.as_ref().to_glib_none().0,
206 ))
207 }
208 }
209
210 #[doc(alias = "gst_object_set_control_binding_disabled")]
211 fn set_control_binding_disabled(&self, property_name: &str, disabled: bool) {
212 unsafe {
213 ffi::gst_object_set_control_binding_disabled(
214 self.as_ref().to_glib_none().0,
215 property_name.to_glib_none().0,
216 disabled.into_glib(),
217 );
218 }
219 }
220
221 #[doc(alias = "gst_object_set_control_bindings_disabled")]
222 fn set_control_bindings_disabled(&self, disabled: bool) {
223 unsafe {
224 ffi::gst_object_set_control_bindings_disabled(
225 self.as_ref().to_glib_none().0,
226 disabled.into_glib(),
227 );
228 }
229 }
230
231 #[doc(alias = "gst_object_set_control_rate")]
232 fn set_control_rate(&self, control_rate: impl Into<Option<ClockTime>>) {
233 unsafe {
234 ffi::gst_object_set_control_rate(
235 self.as_ref().to_glib_none().0,
236 control_rate.into().into_glib(),
237 );
238 }
239 }
240
241 #[doc(alias = "gst_object_suggest_next_sync")]
242 fn suggest_next_sync(&self) -> Option<ClockTime> {
243 unsafe {
244 from_glib(ffi::gst_object_suggest_next_sync(
245 self.as_ref().to_glib_none().0,
246 ))
247 }
248 }
249
250 #[doc(alias = "gst_object_sync_values")]
251 fn sync_values(&self, timestamp: ClockTime) -> Result<(), glib::error::BoolError> {
252 unsafe {
253 glib::result_from_gboolean!(
254 ffi::gst_object_sync_values(self.as_ref().to_glib_none().0, timestamp.into_glib()),
255 "Failed to sync values"
256 )
257 }
258 }
259
260 #[doc(alias = "gst_object_unparent")]
261 fn unparent(&self) {
262 unsafe {
263 ffi::gst_object_unparent(self.as_ref().to_glib_none().0);
264 }
265 }
266
267 #[doc(alias = "parent")]
273 fn connect_parent_notify<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> SignalHandlerId {
274 unsafe extern "C" fn notify_parent_trampoline<
275 P: IsA<Object>,
276 F: Fn(&P) + Send + Sync + 'static,
277 >(
278 this: *mut ffi::GstObject,
279 _param_spec: glib::ffi::gpointer,
280 f: glib::ffi::gpointer,
281 ) {
282 unsafe {
283 let f: &F = &*(f as *const F);
284 f(Object::from_glib_borrow(this).unsafe_cast_ref())
285 }
286 }
287 unsafe {
288 let f: Box_<F> = Box_::new(f);
289 connect_raw(
290 self.as_ptr() as *mut _,
291 c"notify::parent".as_ptr(),
292 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
293 notify_parent_trampoline::<Self, F> as *const (),
294 )),
295 Box_::into_raw(f),
296 )
297 }
298 }
299}
300
301impl<O: IsA<Object>> GstObjectExt for O {}