mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-26 11:31:06 +00:00
clock: Add some more ClockId API for being able to implement clock subclasses
This commit is contained in:
parent
4e60a0aea4
commit
bacf4998ce
2 changed files with 86 additions and 2 deletions
|
@ -17,6 +17,7 @@ use libc::c_void;
|
|||
use std::cmp;
|
||||
use std::ptr;
|
||||
use Clock;
|
||||
use ClockEntryType;
|
||||
use ClockError;
|
||||
use ClockFlags;
|
||||
use ClockReturn;
|
||||
|
@ -24,6 +25,9 @@ use ClockSuccess;
|
|||
use ClockTime;
|
||||
use ClockTimeDiff;
|
||||
|
||||
use std::sync::atomic;
|
||||
use std::sync::atomic::AtomicI32;
|
||||
|
||||
glib_wrapper! {
|
||||
#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Hash)]
|
||||
pub struct ClockId(Shared<c_void>);
|
||||
|
@ -118,7 +122,7 @@ impl ClockId {
|
|||
}
|
||||
|
||||
#[cfg(any(feature = "v1_16", feature = "dox"))]
|
||||
pub fn id_uses_clock<P: IsA<Clock>>(&self, clock: &P) -> bool {
|
||||
pub fn uses_clock<P: IsA<Clock>>(&self, clock: &P) -> bool {
|
||||
unsafe {
|
||||
from_glib(gst_sys::gst_clock_id_uses_clock(
|
||||
self.to_glib_none().0,
|
||||
|
@ -126,6 +130,86 @@ impl ClockId {
|
|||
))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_type(&self) -> ClockEntryType {
|
||||
unsafe {
|
||||
let ptr: *mut gst_sys::GstClockEntry = self.to_glib_none().0 as *mut _;
|
||||
from_glib((*ptr).type_)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_interval(&self) -> Option<ClockTime> {
|
||||
if self.get_type() != ClockEntryType::Periodic {
|
||||
return None;
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let ptr: *mut gst_sys::GstClockEntry = self.to_glib_none().0 as *mut _;
|
||||
Some(from_glib((*ptr).interval))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_status(&self) -> &AtomicClockReturn {
|
||||
unsafe {
|
||||
let ptr: *mut gst_sys::GstClockEntry = self.to_glib_none().0 as *mut _;
|
||||
&*((&(*ptr).status) as *const i32 as *const AtomicClockReturn)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn wake_up(&self, clock: &Clock) {
|
||||
#[cfg(feature = "v1_16")]
|
||||
{
|
||||
assert!(self.uses_clock(clock));
|
||||
}
|
||||
#[cfg(not(feature = "v1_16"))]
|
||||
{
|
||||
unsafe {
|
||||
let ptr: *mut gst_sys::GstClockEntry = self.to_glib_none().0 as *mut _;
|
||||
assert_eq!((*ptr).clock, clock.to_glib_none().0);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let ptr: *mut gst_sys::GstClockEntry = self.to_glib_none().0 as *mut _;
|
||||
if let Some(func) = (*ptr).func {
|
||||
func(
|
||||
clock.to_glib_none().0,
|
||||
(*ptr).time,
|
||||
ptr as gst_sys::GstClockID,
|
||||
(*ptr).user_data,
|
||||
);
|
||||
}
|
||||
if (*ptr).type_ == gst_sys::GST_CLOCK_ENTRY_PERIODIC {
|
||||
(*ptr).time += (*ptr).interval;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug)]
|
||||
pub struct AtomicClockReturn(AtomicI32);
|
||||
|
||||
impl AtomicClockReturn {
|
||||
pub fn load(&self) -> ClockReturn {
|
||||
from_glib(self.0.load(atomic::Ordering::SeqCst))
|
||||
}
|
||||
|
||||
pub fn store(&self, val: ClockReturn) {
|
||||
self.0.store(val.to_glib(), atomic::Ordering::SeqCst)
|
||||
}
|
||||
|
||||
pub fn swap(&self, val: ClockReturn) -> ClockReturn {
|
||||
from_glib(self.0.swap(val.to_glib(), atomic::Ordering::SeqCst))
|
||||
}
|
||||
|
||||
pub fn compare_and_swap(&self, current: ClockReturn, new: ClockReturn) -> ClockReturn {
|
||||
from_glib(self.0.compare_and_swap(
|
||||
current.to_glib(),
|
||||
new.to_glib(),
|
||||
atomic::Ordering::SeqCst,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl Send for ClockId {}
|
||||
|
|
|
@ -263,7 +263,7 @@ pub use toc::{Toc, TocEntry, TocEntryRef, TocRef};
|
|||
mod toc_serde;
|
||||
|
||||
mod clock;
|
||||
pub use clock::{ClockExtManual, ClockId};
|
||||
pub use clock::{AtomicClockReturn, ClockExtManual, ClockId};
|
||||
|
||||
mod buffer_pool;
|
||||
pub use buffer_pool::*;
|
||||
|
|
Loading…
Reference in a new issue