playdate_sound/player/fp/
api.rs

1use core::ffi::c_char;
2use core::ffi::c_float;
3use core::ffi::c_int;
4use core::ffi::c_void;
5use core::ptr::NonNull;
6
7use sys::ffi::FilePlayer;
8use sys::ffi::sndCallbackProc;
9use sys::ffi::playdate_sound_fileplayer;
10
11
12/// Default file 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 file 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_fileplayer);
28
29impl core::default::Default for Cache {
30	fn default() -> Self { Self(sys::api!(sound.fileplayer)) }
31}
32
33impl From<*const playdate_sound_fileplayer> for Cache {
34	#[inline(always)]
35	fn from(ptr: *const playdate_sound_fileplayer) -> Self { Self(unsafe { ptr.as_ref() }.expect("sp")) }
36}
37
38impl From<&'static playdate_sound_fileplayer> for Cache {
39	#[inline(always)]
40	fn from(r: &'static playdate_sound_fileplayer) -> Self { Self(r) }
41}
42
43impl From<NonNull<playdate_sound_fileplayer>> for Cache {
44	#[inline(always)]
45	fn from(ptr: NonNull<playdate_sound_fileplayer>) -> Self { Self(unsafe { ptr.as_ref() }) }
46}
47
48impl From<&'_ NonNull<playdate_sound_fileplayer>> for Cache {
49	#[inline(always)]
50	fn from(ptr: &NonNull<playdate_sound_fileplayer>) -> 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 load_into_player(&self) -> FnLoadIntoPlayer { self.0.loadIntoPlayer.expect("loadIntoPlayer") }
58	fn set_buffer_length(&self) -> FnSetBufferLength { self.0.setBufferLength.expect("setBufferLength") }
59	fn play(&self) -> FnPlay { self.0.play.expect("play") }
60	fn is_playing(&self) -> FnIsPlaying { self.0.isPlaying.expect("isPlaying") }
61	fn stop(&self) -> FnStop { self.0.stop.expect("stop") }
62	fn set_volume(&self) -> FnSetVolume { self.0.setVolume.expect("setVolume") }
63	fn get_volume(&self) -> FnGetVolume { self.0.getVolume.expect("getVolume") }
64	fn get_length(&self) -> FnGetLength { self.0.getLength.expect("getLength") }
65	fn set_offset(&self) -> FnSetOffset { self.0.setOffset.expect("setOffset") }
66	fn set_rate(&self) -> FnSetRate { self.0.setRate.expect("setRate") }
67	fn set_loop_range(&self) -> FnSetLoopRange { self.0.setLoopRange.expect("setLoopRange") }
68	fn did_underrun(&self) -> FnDidUnderrun { self.0.didUnderrun.expect("didUnderrun") }
69	fn set_stop_on_underrun(&self) -> FnSetStopOnUnderrun { self.0.setStopOnUnderrun.expect("setStopOnUnderrun") }
70	fn set_finish_callback(&self) -> FnSetFinishCallback { self.0.setFinishCallback.expect("setFinishCallback") }
71	fn set_loop_callback(&self) -> FnSetLoopCallback { self.0.setLoopCallback.expect("setLoopCallback") }
72	fn get_offset(&self) -> FnGetOffset { self.0.getOffset.expect("getOffset") }
73	fn get_rate(&self) -> FnGetRate { self.0.getRate.expect("getRate") }
74	fn fade_volume(&self) -> FnFadeVolume { self.0.fadeVolume.expect("fadeVolume") }
75	fn set_mp3_stream_source(&self) -> FnSetMP3StreamSource {
76		self.0.setMP3StreamSource.expect("setMP3StreamSource")
77	}
78}
79
80
81pub trait Api {
82	/// Returns [`sys::ffi::playdate_sound_fileplayer::newPlayer`]
83	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::newPlayer")]
84	fn new_player(&self) -> FnNewPlayer { *sys::api!(sound.fileplayer.newPlayer) }
85
86	/// Returns [`sys::ffi::playdate_sound_fileplayer::freePlayer`]
87	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::freePlayer")]
88	fn free_player(&self) -> FnFreePlayer { *sys::api!(sound.fileplayer.freePlayer) }
89
90	/// Returns [`sys::ffi::playdate_sound_fileplayer::loadIntoPlayer`]
91	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::loadIntoPlayer")]
92	fn load_into_player(&self) -> FnLoadIntoPlayer { *sys::api!(sound.fileplayer.loadIntoPlayer) }
93
94	/// Returns [`sys::ffi::playdate_sound_fileplayer::setBufferLength`]
95	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setBufferLength")]
96	fn set_buffer_length(&self) -> FnSetBufferLength { *sys::api!(sound.fileplayer.setBufferLength) }
97
98	/// Returns [`sys::ffi::playdate_sound_fileplayer::play`]
99	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::play")]
100	fn play(&self) -> FnPlay { *sys::api!(sound.fileplayer.play) }
101
102	/// Returns [`sys::ffi::playdate_sound_fileplayer::isPlaying`]
103	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::isPlaying")]
104	fn is_playing(&self) -> FnIsPlaying { *sys::api!(sound.fileplayer.isPlaying) }
105
106	/// Returns [`sys::ffi::playdate_sound_fileplayer::stop`]
107	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::stop")]
108	fn stop(&self) -> FnStop { *sys::api!(sound.fileplayer.stop) }
109
110	/// Returns [`sys::ffi::playdate_sound_fileplayer::setVolume`]
111	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setVolume")]
112	fn set_volume(&self) -> FnSetVolume { *sys::api!(sound.fileplayer.setVolume) }
113
114	/// Returns [`sys::ffi::playdate_sound_fileplayer::getVolume`]
115	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::getVolume")]
116	fn get_volume(&self) -> FnGetVolume { *sys::api!(sound.fileplayer.getVolume) }
117
118	/// Returns [`sys::ffi::playdate_sound_fileplayer::getLength`]
119	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::getLength")]
120	fn get_length(&self) -> FnGetLength { *sys::api!(sound.fileplayer.getLength) }
121
122	/// Returns [`sys::ffi::playdate_sound_fileplayer::setOffset`]
123	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setOffset")]
124	fn set_offset(&self) -> FnSetOffset { *sys::api!(sound.fileplayer.setOffset) }
125
126	/// Returns [`sys::ffi::playdate_sound_fileplayer::setRate`]
127	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setRate")]
128	fn set_rate(&self) -> FnSetRate { *sys::api!(sound.fileplayer.setRate) }
129
130	/// Returns [`sys::ffi::playdate_sound_fileplayer::setLoopRange`]
131	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setLoopRange")]
132	fn set_loop_range(&self) -> FnSetLoopRange { *sys::api!(sound.fileplayer.setLoopRange) }
133
134	/// Returns [`sys::ffi::playdate_sound_fileplayer::didUnderrun`]
135	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::didUnderrun")]
136	fn did_underrun(&self) -> FnDidUnderrun { *sys::api!(sound.fileplayer.didUnderrun) }
137
138	/// Returns [`sys::ffi::playdate_sound_fileplayer::setStopOnUnderrun`]
139	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setStopOnUnderrun")]
140	fn set_stop_on_underrun(&self) -> FnSetStopOnUnderrun { *sys::api!(sound.fileplayer.setStopOnUnderrun) }
141
142	/// Returns [`sys::ffi::playdate_sound_fileplayer::setFinishCallback`]
143	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setFinishCallback")]
144	fn set_finish_callback(&self) -> FnSetFinishCallback { *sys::api!(sound.fileplayer.setFinishCallback) }
145
146	/// Returns [`sys::ffi::playdate_sound_fileplayer::setLoopCallback`]
147	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setLoopCallback")]
148	fn set_loop_callback(&self) -> FnSetLoopCallback { *sys::api!(sound.fileplayer.setLoopCallback) }
149
150	/// Returns [`sys::ffi::playdate_sound_fileplayer::getOffset`]
151	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::getOffset")]
152	fn get_offset(&self) -> FnGetOffset { *sys::api!(sound.fileplayer.getOffset) }
153
154	/// Returns [`sys::ffi::playdate_sound_fileplayer::getRate`]
155	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::getRate")]
156	fn get_rate(&self) -> FnGetRate { *sys::api!(sound.fileplayer.getRate) }
157
158	/// Returns [`sys::ffi::playdate_sound_fileplayer::fadeVolume`]
159	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::fadeVolume")]
160	fn fade_volume(&self) -> FnFadeVolume { *sys::api!(sound.fileplayer.fadeVolume) }
161
162	/// Returns [`sys::ffi::playdate_sound_fileplayer::setMP3StreamSource`]
163	#[doc(alias = "sys::ffi::playdate_sound_fileplayer::setMP3StreamSource")]
164	fn set_mp3_stream_source(&self) -> FnSetMP3StreamSource { *sys::api!(sound.fileplayer.setMP3StreamSource) }
165}
166
167
168type FnNewPlayer = unsafe extern "C" fn() -> *mut FilePlayer;
169type FnFreePlayer = unsafe extern "C" fn(player: *mut FilePlayer);
170
171type FnLoadIntoPlayer = unsafe extern "C" fn(player: *mut FilePlayer, path: *const c_char) -> c_int;
172type FnSetBufferLength = unsafe extern "C" fn(player: *mut FilePlayer, bufferLen: c_float);
173
174type FnPlay = unsafe extern "C" fn(player: *mut FilePlayer, repeat: c_int) -> c_int;
175type FnIsPlaying = unsafe extern "C" fn(player: *mut FilePlayer) -> c_int;
176type FnStop = unsafe extern "C" fn(player: *mut FilePlayer);
177type FnSetVolume = unsafe extern "C" fn(player: *mut FilePlayer, left: c_float, right: c_float);
178type FnGetVolume = unsafe extern "C" fn(player: *mut FilePlayer, left: *mut c_float, right: *mut c_float);
179type FnGetLength = unsafe extern "C" fn(player: *mut FilePlayer) -> c_float;
180type FnSetOffset = unsafe extern "C" fn(player: *mut FilePlayer, offset: c_float);
181type FnSetRate = unsafe extern "C" fn(player: *mut FilePlayer, rate: c_float);
182type FnSetLoopRange = unsafe extern "C" fn(player: *mut FilePlayer, start: c_float, end: c_float);
183type FnDidUnderrun = unsafe extern "C" fn(player: *mut FilePlayer) -> c_int;
184type FnSetStopOnUnderrun = unsafe extern "C" fn(player: *mut FilePlayer, flag: c_int);
185type FnSetFinishCallback =
186	unsafe extern "C" fn(player: *mut FilePlayer, callback: sndCallbackProc, userdata: *mut c_void);
187type FnSetLoopCallback =
188	unsafe extern "C" fn(player: *mut FilePlayer, callback: sndCallbackProc, userdata: *mut c_void);
189type FnGetOffset = unsafe extern "C" fn(player: *mut FilePlayer) -> c_float;
190type FnGetRate = unsafe extern "C" fn(player: *mut FilePlayer) -> c_float;
191type FnFadeVolume = unsafe extern "C" fn(player: *mut FilePlayer,
192                                         left: c_float,
193                                         right: c_float,
194                                         len: i32,
195                                         finishCallback: sndCallbackProc,
196                                         userdata: *mut c_void);
197type FnSetMP3StreamSource = unsafe extern "C" fn(player: *mut FilePlayer,
198                                                 dataSource: Option<FnDataSource>,
199                                                 userdata: *mut c_void,
200                                                 bufferLen: c_float);
201type FnDataSource = unsafe extern "C" fn(data: *mut u8, bytes: c_int, userdata: *mut c_void) -> c_int;