1use crate::{ffi, Caps, Element, Object, Structure};
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 = "GstDevice")]
17 pub struct Device(Object<ffi::GstDevice, ffi::GstDeviceClass>) @extends Object;
18
19 match fn {
20 type_ => || ffi::gst_device_get_type(),
21 }
22}
23
24impl Device {
25 pub const NONE: Option<&'static Device> = None;
26}
27
28unsafe impl Send for Device {}
29unsafe impl Sync for Device {}
30
31mod sealed {
32 pub trait Sealed {}
33 impl<T: super::IsA<super::Device>> Sealed for T {}
34}
35
36pub trait DeviceExt: IsA<Device> + sealed::Sealed + 'static {
37 #[doc(alias = "gst_device_create_element")]
38 fn create_element(&self, name: Option<&str>) -> Result<Element, glib::BoolError> {
39 unsafe {
40 Option::<_>::from_glib_none(ffi::gst_device_create_element(
41 self.as_ref().to_glib_none().0,
42 name.to_glib_none().0,
43 ))
44 .ok_or_else(|| glib::bool_error!("Failed to create element for device"))
45 }
46 }
47
48 #[doc(alias = "gst_device_get_caps")]
49 #[doc(alias = "get_caps")]
50 fn caps(&self) -> Option<Caps> {
51 unsafe { from_glib_full(ffi::gst_device_get_caps(self.as_ref().to_glib_none().0)) }
52 }
53
54 #[doc(alias = "gst_device_get_device_class")]
55 #[doc(alias = "get_device_class")]
56 #[doc(alias = "device-class")]
57 fn device_class(&self) -> glib::GString {
58 unsafe {
59 from_glib_full(ffi::gst_device_get_device_class(
60 self.as_ref().to_glib_none().0,
61 ))
62 }
63 }
64
65 #[doc(alias = "gst_device_get_display_name")]
66 #[doc(alias = "get_display_name")]
67 #[doc(alias = "display-name")]
68 fn display_name(&self) -> glib::GString {
69 unsafe {
70 from_glib_full(ffi::gst_device_get_display_name(
71 self.as_ref().to_glib_none().0,
72 ))
73 }
74 }
75
76 #[doc(alias = "gst_device_get_properties")]
77 #[doc(alias = "get_properties")]
78 fn properties(&self) -> Option<Structure> {
79 unsafe {
80 from_glib_full(ffi::gst_device_get_properties(
81 self.as_ref().to_glib_none().0,
82 ))
83 }
84 }
85
86 #[doc(alias = "gst_device_has_classes")]
87 fn has_classes(&self, classes: &str) -> bool {
88 unsafe {
89 from_glib(ffi::gst_device_has_classes(
90 self.as_ref().to_glib_none().0,
91 classes.to_glib_none().0,
92 ))
93 }
94 }
95
96 #[doc(alias = "gst_device_has_classesv")]
97 fn has_classesv(&self, classes: &[&str]) -> bool {
98 unsafe {
99 from_glib(ffi::gst_device_has_classesv(
100 self.as_ref().to_glib_none().0,
101 classes.to_glib_none().0,
102 ))
103 }
104 }
105
106 #[doc(alias = "gst_device_reconfigure_element")]
107 fn reconfigure_element(
108 &self,
109 element: &impl IsA<Element>,
110 ) -> Result<(), glib::error::BoolError> {
111 unsafe {
112 glib::result_from_gboolean!(
113 ffi::gst_device_reconfigure_element(
114 self.as_ref().to_glib_none().0,
115 element.as_ref().to_glib_none().0
116 ),
117 "Failed to reconfigure the element to use this device"
118 )
119 }
120 }
121
122 #[doc(alias = "removed")]
123 fn connect_removed<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> SignalHandlerId {
124 unsafe extern "C" fn removed_trampoline<
125 P: IsA<Device>,
126 F: Fn(&P) + Send + Sync + 'static,
127 >(
128 this: *mut ffi::GstDevice,
129 f: glib::ffi::gpointer,
130 ) {
131 let f: &F = &*(f as *const F);
132 f(Device::from_glib_borrow(this).unsafe_cast_ref())
133 }
134 unsafe {
135 let f: Box_<F> = Box_::new(f);
136 connect_raw(
137 self.as_ptr() as *mut _,
138 b"removed\0".as_ptr() as *const _,
139 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
140 removed_trampoline::<Self, F> as *const (),
141 )),
142 Box_::into_raw(f),
143 )
144 }
145 }
146}
147
148impl<O: IsA<Device>> DeviceExt for O {}