Skip to main content

record_player/
view.rs

1use crate::{DeckId, LoadStatus, PlayerState};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5pub struct DeckViewState {
6    pub deck: DeckId,
7    pub loaded: bool,
8    pub load_status: LoadStatus,
9    pub transport_on: bool,
10    pub needle_lifted: bool,
11    pub playing: bool,
12    pub scratch_active: bool,
13    pub playback_seconds: f64,
14    pub duration_seconds: f64,
15    pub source_sample_rate: f64,
16    pub playback_rate: f32,
17    pub channel_gain: f32,
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21pub struct PlayerViewState {
22    pub revision: u64,
23    pub active_deck: DeckId,
24    pub decks: [DeckViewState; 2],
25    pub crossfader: f32,
26    pub lead_in_active: bool,
27    pub deadwax_active: bool,
28    pub clip_loop_active: bool,
29}
30
31impl PlayerViewState {
32    pub fn from_state(state: &PlayerState, revision: u64) -> Self {
33        let deck_view = |deck: DeckId| {
34            let value = &state.decks[deck.index()];
35            DeckViewState {
36                deck,
37                loaded: value.loaded,
38                load_status: value.playback.load_status,
39                transport_on: value.transport.motor_on,
40                needle_lifted: value.needle.lifted,
41                playing: value.playback.playing,
42                scratch_active: value.scratch.active,
43                playback_seconds: value.playback.current_seconds,
44                duration_seconds: value.playback.duration_seconds,
45                source_sample_rate: value.playback.source_sample_rate,
46                playback_rate: value.playback.playback_rate,
47                channel_gain: value.mixer.channel_gain,
48            }
49        };
50        Self {
51            revision,
52            active_deck: state.active_deck,
53            decks: [deck_view(DeckId::A), deck_view(DeckId::B)],
54            crossfader: state.decks[0].mixer.crossfader,
55            lead_in_active: state.lead_in.active,
56            deadwax_active: state.deadwax.active,
57            clip_loop_active: state.clip_loop.active,
58        }
59    }
60}