Skip to main content

kithara_queue/queue/
player.rs

1use kithara_bufpool::HasPool;
2use kithara_play::{
3    BeatGrid, BeatGridId, BeatGridSnapshot, PlayError, SeekOutcome, SessionBinding,
4    player::{PlaybackView, Player, PlayerControlSource, PlayerMember},
5};
6use kithara_sync::{
7    ParentFact, SyncAdmission, SyncError, SyncGroup, SyncGroupSnapshot, SyncOperation, SyncReceipt,
8    SyncRejected, SyncStaged, SyncStatusSnapshot, SyncTransition,
9};
10
11use super::Queue;
12
13impl<S> BeatGrid for Queue<S>
14where
15    S: HasPool<u8> + HasPool<f32> + Send + Sync + 'static,
16{
17    delegate::delegate! {
18        to self.player {
19            fn id(&self) -> BeatGridId;
20            fn snapshot(&self) -> BeatGridSnapshot;
21        }
22    }
23}
24
25impl<S> SyncGroup for Queue<S>
26where
27    S: HasPool<u8> + HasPool<f32> + Send + Sync + 'static,
28{
29    type NestedGroup = PlayerMember;
30
31    fn status(&self) -> SyncStatusSnapshot {
32        SyncGroup::status(&self.player)
33    }
34
35    delegate::delegate! {
36        to self.player {
37            fn stage_fact(&self, fact: ParentFact) -> Result<SyncStaged, SyncError>;
38            fn apply_staged(&mut self, staged: SyncStaged) -> SyncTransition;
39            fn topology(&self) -> Result<SyncGroupSnapshot, SyncError>;
40
41            fn transact(
42                &mut self,
43                operation: SyncOperation<PlayerMember>,
44            ) -> Result<SyncAdmission, SyncRejected<PlayerMember>>;
45
46            fn acknowledge(
47                &mut self,
48                receipt: SyncReceipt,
49            ) -> Result<SyncStatusSnapshot, SyncError>;
50        }
51    }
52}
53
54impl<S> Player for Queue<S>
55where
56    S: HasPool<u8> + HasPool<f32> + Send + Sync + 'static,
57{
58    delegate::delegate! {
59        to self.control {
60            fn play(&self);
61            fn pause(&self);
62            fn playback_view(&self) -> PlaybackView;
63            fn close(&mut self) -> Result<(), PlayError>;
64        }
65        to self {
66            #[call(seek_player)]
67            fn seek_seconds(&self, seconds: f64) -> Result<SeekOutcome, PlayError>;
68            #[call(tick_player)]
69            fn tick(&self) -> Result<(), PlayError>;
70        }
71        to self.player {
72            fn set_host_level(&self, level: f32);
73            fn host_level(&self) -> f32;
74        }
75    }
76}
77
78impl<S> PlayerControlSource for Queue<S>
79where
80    S: HasPool<u8> + HasPool<f32> + Send + Sync + 'static,
81{
82    type Control = super::QueueControl<S>;
83    type Schema = S;
84
85    fn close_control(control: &Self::Control) -> Result<(), PlayError> {
86        control.close()
87    }
88
89    fn control(&self) -> Self::Control {
90        self.control.clone()
91    }
92
93    fn prepare_control(control: &Self::Control) -> Result<(), PlayError> {
94        control.with_open_result(|queue| queue.player.prepare())
95    }
96
97    delegate::delegate! {
98        to self.player {
99            fn attach_session(&mut self, binding: SessionBinding<S>) -> Result<(), PlayError>;
100            #[cfg(target_arch = "wasm32")]
101            fn take_host_member(&mut self) -> Result<PlayerMember, PlayError>;
102        }
103    }
104}