gstreamer_net/
ptp_clock.rs1use std::num::NonZeroU64;
4
5use glib::translate::*;
6
7use crate::{PtpClock, ffi};
8
9impl PtpClock {
10 #[doc(alias = "gst_ptp_init")]
15 pub fn init(clock_id: Option<u64>, interfaces: &[&str]) -> Result<(), glib::BoolError> {
16 skip_assert_initialized!();
17 unsafe {
18 let res: bool = from_glib(ffi::gst_ptp_init(
19 clock_id.unwrap_or(u64::MAX),
20 interfaces.to_glib_none().0,
21 ));
22
23 if res {
24 Ok(())
25 } else {
26 Err(glib::bool_error!("Failed to initialize PTP subsystem"))
27 }
28 }
29 }
30
31 #[cfg(feature = "v1_24")]
32 #[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
33 #[doc(alias = "gst_ptp_init_full")]
38 pub fn init_full(s: &gst::StructureRef) -> Result<(), glib::BoolError> {
39 skip_assert_initialized!();
40 unsafe {
41 let res: bool = from_glib(ffi::gst_ptp_init_full(s.as_ptr()));
42
43 if res {
44 Ok(())
45 } else {
46 Err(glib::bool_error!("Failed to initialize PTP subsystem"))
47 }
48 }
49 }
50
51 #[doc(alias = "gst_ptp_deinit")]
56 pub fn deinit() {
57 unsafe {
58 ffi::gst_ptp_deinit();
59 }
60 }
61
62 #[doc(alias = "gst_ptp_is_initialized")]
65 pub fn is_initialized() -> bool {
66 unsafe { from_glib(ffi::gst_ptp_is_initialized()) }
67 }
68
69 #[doc(alias = "gst_ptp_is_supported")]
72 pub fn is_supported() -> bool {
73 unsafe { from_glib(ffi::gst_ptp_is_supported()) }
74 }
75
76 #[doc(alias = "gst_ptp_statistics_callback_add")]
79 pub fn add_statistics_callback<
80 F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
81 >(
82 func: F,
83 ) -> PtpStatisticsCallback {
84 unsafe {
85 unsafe extern "C" fn trampoline<
86 F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
87 >(
88 domain: u8,
89 stats: *const gst::ffi::GstStructure,
90 user_data: glib::ffi::gpointer,
91 ) -> glib::ffi::gboolean {
92 unsafe {
93 let callback = &*(user_data as *const F);
94 callback(domain, gst::StructureRef::from_glib_borrow(stats)).into_glib()
95 }
96 }
97
98 unsafe extern "C" fn destroy<
99 F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
100 >(
101 user_data: glib::ffi::gpointer,
102 ) {
103 unsafe {
104 let _ = Box::from_raw(user_data as *mut F);
105 }
106 }
107
108 let user_data = Box::new(func);
109 let id = ffi::gst_ptp_statistics_callback_add(
110 Some(trampoline::<F>),
111 Box::into_raw(user_data) as glib::ffi::gpointer,
112 Some(destroy::<F>),
113 );
114 debug_assert_ne!(id, 0);
115
116 PtpStatisticsCallback(NonZeroU64::new_unchecked(id as _))
117 }
118 }
119}
120
121#[derive(Debug)]
122pub struct PtpStatisticsCallback(NonZeroU64);
123
124impl PtpStatisticsCallback {
125 #[doc(alias = "gst_ptp_statistics_callback_remove")]
126 pub fn remove(self) {
127 unsafe {
128 ffi::gst_ptp_statistics_callback_remove(self.0.get() as _);
129 }
130 }
131}