use crate::{arc, cat, define_cls, define_obj_type, ns, objc};
use super::FramePos;
define_obj_type!(
#[doc(alias = "AVAudioTime")]
pub Time(ns::Id)
);
impl arc::A<Time> {
#[objc::msg_send(initWithAudioTimeStamp:sampleRate:)]
pub fn init_with_audio_ts_sample_rate(
self,
ts: &cat::AudioTimeStamp,
sample_rate: f64,
) -> arc::R<Time>;
#[objc::msg_send(initWithHostTime:)]
pub fn init_with_host_time(self, host_time: u64) -> arc::R<Time>;
#[objc::msg_send(initWithHostTime:sampleTime:atRate:)]
pub fn init_with_host_time_sample_rate_at_rate(
self,
host_time: u64,
sample_time: FramePos,
at_rate: f64,
) -> arc::R<Time>;
#[objc::msg_send(initWithSampleTime:atRate:)]
pub fn init_with_sample_time_at_rate(self, time: FramePos, at_rate: f64) -> arc::R<Time>;
}
impl Time {
define_cls!(AV_AUDIO_TIME);
pub fn with_ts(ts: &cat::AudioTimeStamp, sample_rate: f64) -> arc::R<Time> {
Self::alloc().init_with_audio_ts_sample_rate(ts, sample_rate)
}
pub fn with_host_time(host_time: u64) -> arc::R<Time> {
Self::alloc().init_with_host_time(host_time)
}
pub fn with_host_time_sample_rate_at_rate(
host_time: u64,
sample_time: FramePos,
at_rate: f64,
) -> arc::R<Time> {
Self::alloc().init_with_host_time_sample_rate_at_rate(host_time, sample_time, at_rate)
}
pub fn with_sample_time(time: FramePos, at_rate: f64) -> arc::R<Time> {
Self::alloc().init_with_sample_time_at_rate(time, at_rate)
}
#[objc::msg_send(hostTime)]
pub fn host_time(&self) -> u64;
#[objc::msg_send(sampleRate)]
pub fn sample_rate(&self) -> f64;
#[objc::msg_send(sampleTime)]
pub fn sample_time(&self) -> FramePos;
#[objc::msg_send(isSampleTimeValid)]
pub fn is_sample_time_valid(&self) -> bool;
#[objc::msg_send(isHostTimeValid)]
pub fn is_host_time_valid(&self) -> bool;
#[objc::msg_send(audioTimeStamp)]
pub fn audio_timestamp(&self) -> cat::AudioTimeStamp;
#[objc::msg_send(extrapolateTimeFromAnchor:)]
pub fn extrapolate_time_from_anchor(&self, anchor: &Time) -> Option<arc::R<Time>>;
}
unsafe extern "C" {
static AV_AUDIO_TIME: &'static objc::Class<Time>;
}
#[cfg(test)]
mod tests {
use crate::av;
#[test]
fn basics() {
let time = av::AudioTime::with_host_time(101);
assert_eq!(time.host_time(), 101);
assert_eq!(time.sample_rate(), 0f64);
assert_eq!(time.is_sample_time_valid(), false);
assert_eq!(time.is_host_time_valid(), true);
}
}