Skip to main content

voirs_spatial/visual_audio/
sync.rs

1//! Audio-visual synchronization types and state management
2
3use serde::{Deserialize, Serialize};
4use std::time::{Duration, Instant};
5
6/// Visual synchronization settings
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct VisualSyncSettings {
9    /// Audio-visual latency compensation (ms)
10    pub latency_compensation: f32,
11
12    /// Synchronization tolerance (ms)
13    pub sync_tolerance: f32,
14
15    /// Visual prediction lookahead (ms)
16    pub prediction_lookahead: f32,
17
18    /// Frame rate synchronization
19    pub frame_sync: bool,
20
21    /// V-sync enable
22    pub vsync: bool,
23}
24
25/// Visual synchronization state
26pub(crate) struct VisualSyncState {
27    /// Audio timeline reference
28    pub(crate) audio_timeline: Instant,
29
30    /// Visual timeline reference
31    pub(crate) visual_timeline: Instant,
32
33    /// Measured latency offset
34    pub(crate) measured_latency: Duration,
35
36    /// Frame timing buffer
37    pub(crate) frame_timing: Vec<FrameTiming>,
38
39    /// Sync quality metrics
40    pub(crate) sync_quality: SyncQualityMetrics,
41}
42
43/// Frame timing information
44#[derive(Debug, Clone)]
45pub(crate) struct FrameTiming {
46    /// Frame timestamp
47    pub(crate) timestamp: Instant,
48
49    /// Frame duration
50    pub(crate) duration: Duration,
51
52    /// Audio-visual offset
53    pub(crate) av_offset: Duration,
54
55    /// Sync quality score
56    pub(crate) quality_score: f32,
57}
58
59/// Synchronization quality metrics
60#[derive(Debug, Clone)]
61pub(crate) struct SyncQualityMetrics {
62    /// Average sync error (ms)
63    pub(crate) avg_sync_error: f32,
64
65    /// Maximum sync error (ms)
66    pub(crate) max_sync_error: f32,
67
68    /// Sync stability (coefficient of variation)
69    pub(crate) sync_stability: f32,
70
71    /// Frames in sync (percentage)
72    pub(crate) frames_in_sync: f32,
73}
74
75// Default implementations
76
77impl Default for VisualSyncSettings {
78    fn default() -> Self {
79        Self {
80            latency_compensation: 10.0, // 10ms default compensation
81            sync_tolerance: 5.0,
82            prediction_lookahead: 50.0,
83            frame_sync: true,
84            vsync: true,
85        }
86    }
87}
88
89impl VisualSyncState {
90    pub(crate) fn new() -> Self {
91        let now = Instant::now();
92        Self {
93            audio_timeline: now,
94            visual_timeline: now,
95            measured_latency: Duration::from_millis(10),
96            frame_timing: Vec::new(),
97            sync_quality: SyncQualityMetrics {
98                avg_sync_error: 0.0,
99                max_sync_error: 0.0,
100                sync_stability: 1.0,
101                frames_in_sync: 100.0,
102            },
103        }
104    }
105}