playdate_sound/player/sp/
api.rs

1use core::ffi::c_void;
2use core::ffi::c_float;
3use core::ffi::c_int;
4use core::ptr::NonNull;
5
6use sys::ffi::AudioSample;
7use sys::ffi::SamplePlayer;
8use sys::ffi::sndCallbackProc;
9use sys::ffi::playdate_sound_sampleplayer;
10
11
12/// Default sample player api end-point, ZST.
13///
14/// All calls approximately costs ~4 derefs.
15#[derive(Debug, Clone, Copy, core::default::Default)]
16pub struct Default;
17impl Api for Default {}
18
19
20/// Cached sample player api end-point.
21///
22/// Stores one reference, so size on stack is eq `usize`.
23///
24/// All calls approximately costs ~1 deref.
25#[derive(Clone, Copy)]
26#[cfg_attr(feature = "bindings-derive-debug", derive(Debug))]
27pub struct Cache(&'static playdate_sound_sampleplayer);
28
29impl core::default::Default for Cache {
30	fn default() -> Self { Self(sys::api!(sound.sampleplayer)) }
31}
32
33impl From<*const playdate_sound_sampleplayer> for Cache {
34	#[inline(always)]
35	fn from(ptr: *const playdate_sound_sampleplayer) -> Self { Self(unsafe { ptr.as_ref() }.expect("sp")) }
36}
37
38impl From<&'static playdate_sound_sampleplayer> for Cache {
39	#[inline(always)]
40	fn from(r: &'static playdate_sound_sampleplayer) -> Self { Self(r) }
41}
42
43impl From<NonNull<playdate_sound_sampleplayer>> for Cache {
44	#[inline(always)]
45	fn from(ptr: NonNull<playdate_sound_sampleplayer>) -> Self { Self(unsafe { ptr.as_ref() }) }
46}
47
48impl From<&'_ NonNull<playdate_sound_sampleplayer>> for Cache {
49	#[inline(always)]
50	fn from(ptr: &NonNull<playdate_sound_sampleplayer>) -> Self { Self(unsafe { ptr.as_ref() }) }
51}
52
53
54impl Api for Cache {
55	fn new_player(&self) -> FnNewPlayer { self.0.newPlayer.expect("newPlayer") }
56	fn free_player(&self) -> FnFreePlayer { self.0.freePlayer.expect("freePlayer") }
57	fn set_sample(&self) -> FnSetSample { self.0.setSample.expect("setSample") }
58	fn play(&self) -> FnPlay { self.0.play.expect("play") }
59	fn is_playing(&self) -> FnIsPlaying { self.0.isPlaying.expect("isPlaying") }
60	fn stop(&self) -> FnStop { self.0.stop.expect("stop") }
61	fn set_volume(&self) -> FnSetVolume { self.0.setVolume.expect("setVolume") }
62	fn get_volume(&self) -> FnGetVolume { self.0.getVolume.expect("getVolume") }
63	fn get_length(&self) -> FnGetLength { self.0.getLength.expect("getLength") }
64	fn set_offset(&self) -> FnSetOffset { self.0.setOffset.expect("setOffset") }
65	fn set_rate(&self) -> FnSetRate { self.0.setRate.expect("setRate") }
66	fn set_play_range(&self) -> FnSetPlayRange { self.0.setPlayRange.expect("setPlayRange") }
67	fn set_finish_callback(&self) -> FnSetFinishCallback { self.0.setFinishCallback.expect("setFinishCallback") }
68	fn set_loop_callback(&self) -> FnSetLoopCallback { self.0.setLoopCallback.expect("setLoopCallback") }
69	fn get_offset(&self) -> FnGetOffset { self.0.getOffset.expect("getOffset") }
70	fn get_rate(&self) -> FnGetRate { self.0.getRate.expect("getRate") }
71	fn set_paused(&self) -> FnSetPaused { self.0.setPaused.expect("setPaused") }
72}
73
74
75pub trait Api {
76	/// Returns [`sys::ffi::playdate_sound_sampleplayer::newPlayer`]
77	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::newPlayer")]
78	fn new_player(&self) -> FnNewPlayer { *sys::api!(sound.sampleplayer.newPlayer) }
79
80	/// Returns [`sys::ffi::playdate_sound_sampleplayer::freePlayer`]
81	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::freePlayer")]
82	fn free_player(&self) -> FnFreePlayer { *sys::api!(sound.sampleplayer.freePlayer) }
83
84	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setSample`]
85	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setSample")]
86	fn set_sample(&self) -> FnSetSample { *sys::api!(sound.sampleplayer.setSample) }
87
88	/// Returns [`sys::ffi::playdate_sound_sampleplayer::play`]
89	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::play")]
90	fn play(&self) -> FnPlay { *sys::api!(sound.sampleplayer.play) }
91
92	/// Returns [`sys::ffi::playdate_sound_sampleplayer::isPlaying`]
93	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::isPlaying")]
94	fn is_playing(&self) -> FnIsPlaying { *sys::api!(sound.sampleplayer.isPlaying) }
95
96	/// Returns [`sys::ffi::playdate_sound_sampleplayer::stop`]
97	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::stop")]
98	fn stop(&self) -> FnStop { *sys::api!(sound.sampleplayer.stop) }
99
100	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setVolume`]
101	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setVolume")]
102	fn set_volume(&self) -> FnSetVolume { *sys::api!(sound.sampleplayer.setVolume) }
103
104	/// Returns [`sys::ffi::playdate_sound_sampleplayer::getVolume`]
105	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::getVolume")]
106	fn get_volume(&self) -> FnGetVolume { *sys::api!(sound.sampleplayer.getVolume) }
107
108	/// Returns [`sys::ffi::playdate_sound_sampleplayer::getLength`]
109	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::getLength")]
110	fn get_length(&self) -> FnGetLength { *sys::api!(sound.sampleplayer.getLength) }
111
112	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setOffset`]
113	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setOffset")]
114	fn set_offset(&self) -> FnSetOffset { *sys::api!(sound.sampleplayer.setOffset) }
115
116	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setRate`]
117	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setRate")]
118	fn set_rate(&self) -> FnSetRate { *sys::api!(sound.sampleplayer.setRate) }
119
120	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setPlayRange`]
121	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setPlayRange")]
122	fn set_play_range(&self) -> FnSetPlayRange { *sys::api!(sound.sampleplayer.setPlayRange) }
123
124	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setFinishCallback`]
125	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setFinishCallback")]
126	fn set_finish_callback(&self) -> FnSetFinishCallback { *sys::api!(sound.sampleplayer.setFinishCallback) }
127
128	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setLoopCallback`]
129	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setLoopCallback")]
130	fn set_loop_callback(&self) -> FnSetLoopCallback { *sys::api!(sound.sampleplayer.setLoopCallback) }
131
132	/// Returns [`sys::ffi::playdate_sound_sampleplayer::getOffset`]
133	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::getOffset")]
134	fn get_offset(&self) -> FnGetOffset { *sys::api!(sound.sampleplayer.getOffset) }
135
136	/// Returns [`sys::ffi::playdate_sound_sampleplayer::getRate`]
137	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::getRate")]
138	fn get_rate(&self) -> FnGetRate { *sys::api!(sound.sampleplayer.getRate) }
139
140	/// Returns [`sys::ffi::playdate_sound_sampleplayer::setPaused`]
141	#[doc(alias = "sys::ffi::playdate_sound_sampleplayer::setPaused")]
142	fn set_paused(&self) -> FnSetPaused { *sys::api!(sound.sampleplayer.setPaused) }
143}
144
145
146type FnNewPlayer = unsafe extern "C" fn() -> *mut SamplePlayer;
147type FnFreePlayer = unsafe extern "C" fn(player: *mut SamplePlayer);
148type FnSetSample = unsafe extern "C" fn(player: *mut SamplePlayer, sample: *mut AudioSample);
149type FnPlay = unsafe extern "C" fn(player: *mut SamplePlayer, repeat: c_int, rate: c_float) -> c_int;
150type FnIsPlaying = unsafe extern "C" fn(player: *mut SamplePlayer) -> c_int;
151type FnStop = unsafe extern "C" fn(player: *mut SamplePlayer);
152type FnSetVolume = unsafe extern "C" fn(player: *mut SamplePlayer, left: c_float, right: c_float);
153type FnGetVolume = unsafe extern "C" fn(player: *mut SamplePlayer, left: *mut c_float, right: *mut c_float);
154type FnGetLength = unsafe extern "C" fn(player: *mut SamplePlayer) -> c_float;
155type FnSetOffset = unsafe extern "C" fn(player: *mut SamplePlayer, offset: c_float);
156type FnSetRate = unsafe extern "C" fn(player: *mut SamplePlayer, rate: c_float);
157type FnSetPlayRange = unsafe extern "C" fn(player: *mut SamplePlayer, start: c_int, end: c_int);
158type FnSetFinishCallback =
159	unsafe extern "C" fn(player: *mut SamplePlayer, callback: sndCallbackProc, userdata: *mut c_void);
160type FnSetLoopCallback =
161	unsafe extern "C" fn(player: *mut SamplePlayer, callback: sndCallbackProc, userdata: *mut c_void);
162type FnGetOffset = unsafe extern "C" fn(player: *mut SamplePlayer) -> c_float;
163type FnGetRate = unsafe extern "C" fn(player: *mut SamplePlayer) -> c_float;
164type FnSetPaused = unsafe extern "C" fn(player: *mut SamplePlayer, flag: c_int);