in src/backend/mod.rs [4977:5014]
fn position(&mut self) -> Result<u64> {
let OutputCallbackTimingData {
frames_queued,
timestamp,
buffer_size,
} = self.output_callback_timing_data_read.read().clone();
let total_output_latency_frames =
u64::from(self.total_output_latency_frames.load(Ordering::SeqCst));
// If output latency is available, take it into account. Otherwise, use the number of
// frames played.
let position = if total_output_latency_frames != 0 {
if total_output_latency_frames > frames_queued {
0
} else {
// Interpolate here to match other cubeb backends. Only return an interpolated time
// if we've played enough frames. If the stream is paused, clamp the interpolated
// number of frames to the buffer size.
const NS2S: u64 = 1_000_000_000;
let now = unsafe { mach_absolute_time() };
let diff = now - timestamp;
let interpolated_frames = cmp::min(
host_time_to_ns(self.context, diff)
* self.core_stream_data.output_stream_params.rate() as u64
/ NS2S,
buffer_size,
);
(frames_queued - total_output_latency_frames) + interpolated_frames
}
} else {
frames_queued
};
// Ensure mononicity of the clock even when changing output device.
if position > self.prev_position {
self.prev_position = position;
}
Ok(self.prev_position)
}