voirs_spatial/visual_audio/
sync.rs1use serde::{Deserialize, Serialize};
4use std::time::{Duration, Instant};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct VisualSyncSettings {
9 pub latency_compensation: f32,
11
12 pub sync_tolerance: f32,
14
15 pub prediction_lookahead: f32,
17
18 pub frame_sync: bool,
20
21 pub vsync: bool,
23}
24
25pub(crate) struct VisualSyncState {
27 pub(crate) audio_timeline: Instant,
29
30 pub(crate) visual_timeline: Instant,
32
33 pub(crate) measured_latency: Duration,
35
36 pub(crate) frame_timing: Vec<FrameTiming>,
38
39 pub(crate) sync_quality: SyncQualityMetrics,
41}
42
43#[derive(Debug, Clone)]
45pub(crate) struct FrameTiming {
46 pub(crate) timestamp: Instant,
48
49 pub(crate) duration: Duration,
51
52 pub(crate) av_offset: Duration,
54
55 pub(crate) quality_score: f32,
57}
58
59#[derive(Debug, Clone)]
61pub(crate) struct SyncQualityMetrics {
62 pub(crate) avg_sync_error: f32,
64
65 pub(crate) max_sync_error: f32,
67
68 pub(crate) sync_stability: f32,
70
71 pub(crate) frames_in_sync: f32,
73}
74
75impl Default for VisualSyncSettings {
78 fn default() -> Self {
79 Self {
80 latency_compensation: 10.0, 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}