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