gstreamer-rs/gstreamer-net/src/ptp_clock.rs
Bilal Elmoussaoui 4ebec84f5e Adapt to no longer renamed ffi crates
Allows us to set all the crates in the main workspace file, so changing
their versions or branch is much simpler and reduce the amount of noise
in the diff

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1450>
2024-06-02 11:20:55 +02:00

128 lines
4 KiB
Rust

// Take a look at the license at the top of the repository in the LICENSE file.
use std::num::NonZeroU64;
use glib::translate::*;
use crate::{ffi, PtpClock};
impl PtpClock {
// rustdoc-stripper-ignore-next
/// Initialize GStreamer PTP clock support
///
/// This is automatically called once the first PTP clock instance is created.
#[doc(alias = "gst_ptp_init")]
pub fn init(clock_id: Option<u64>, interfaces: &[&str]) -> Result<(), glib::BoolError> {
skip_assert_initialized!();
unsafe {
let res: bool = from_glib(ffi::gst_ptp_init(
clock_id.unwrap_or(u64::MAX),
interfaces.to_glib_none().0,
));
if res {
Ok(())
} else {
Err(glib::bool_error!("Failed to initialize PTP subsystem"))
}
}
}
#[cfg(feature = "v1_24")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
// rustdoc-stripper-ignore-next
/// Initialize GStreamer PTP clock support
///
/// This is automatically called once the first PTP clock instance is created.
#[doc(alias = "gst_ptp_init_full")]
pub fn init_full(s: &gst::StructureRef) -> Result<(), glib::BoolError> {
skip_assert_initialized!();
unsafe {
let res: bool = from_glib(ffi::gst_ptp_init_full(s.as_ptr()));
if res {
Ok(())
} else {
Err(glib::bool_error!("Failed to initialize PTP subsystem"))
}
}
}
// rustdoc-stripper-ignore-next
/// Deinitialize GStreamer PTP clock support
///
/// Any PTP clocks that are still running will not receive any updates anymore.
#[doc(alias = "gst_ptp_deinit")]
pub fn deinit() {
unsafe {
ffi::gst_ptp_deinit();
}
}
// rustdoc-stripper-ignore-next
/// Check if the GStreamer PTP clock support is initialized
#[doc(alias = "gst_ptp_is_initialized")]
pub fn is_initialized() -> bool {
unsafe { from_glib(ffi::gst_ptp_is_initialized()) }
}
// rustdoc-stripper-ignore-next
/// Check if GStreamer PTP clocks are supported
#[doc(alias = "gst_ptp_is_supported")]
pub fn is_supported() -> bool {
unsafe { from_glib(ffi::gst_ptp_is_supported()) }
}
// rustdoc-stripper-ignore-next
/// Add a PTP clock statistics callback
#[doc(alias = "gst_ptp_statistics_callback_add")]
pub fn add_statistics_callback<
F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
>(
func: F,
) -> PtpStatisticsCallback {
unsafe {
unsafe extern "C" fn trampoline<
F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
>(
domain: u8,
stats: *const gst::ffi::GstStructure,
user_data: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let callback = &*(user_data as *const F);
callback(domain, gst::StructureRef::from_glib_borrow(stats)).into_glib()
}
unsafe extern "C" fn destroy<
F: Fn(u8, &gst::StructureRef) -> glib::ControlFlow + 'static + Send + Sync,
>(
user_data: glib::ffi::gpointer,
) {
let _ = Box::from_raw(user_data as *mut F);
}
let user_data = Box::new(func);
let id = ffi::gst_ptp_statistics_callback_add(
Some(trampoline::<F>),
Box::into_raw(user_data) as glib::ffi::gpointer,
Some(destroy::<F>),
);
debug_assert_ne!(id, 0);
PtpStatisticsCallback(NonZeroU64::new_unchecked(id as _))
}
}
}
#[derive(Debug)]
pub struct PtpStatisticsCallback(NonZeroU64);
impl PtpStatisticsCallback {
#[doc(alias = "gst_ptp_statistics_callback_remove")]
pub fn remove(self) {
unsafe {
ffi::gst_ptp_statistics_callback_remove(self.0.get() as _);
}
}
}