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}