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}