kithara_queue/queue/
player.rs1use 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}