use crate::PlaySoundParams;
extern "C" {
fn audio_init();
fn audio_add_buffer(content: *const u8, content_len: u32) -> u32;
fn audio_play_buffer(buffer: u32, volume: f32, repeat: bool) -> u32;
fn audio_source_is_loaded(buffer: u32) -> bool;
fn audio_source_set_volume(buffer: u32, volume: f32);
fn audio_source_stop(buffer: u32);
fn audio_source_delete(buffer: u32);
fn audio_playback_stop(playback: u32);
fn audio_playback_set_volume(playback: u32, volume: f32);
}
#[no_mangle]
pub extern "C" fn macroquad_audio_crate_version() -> u32 {
1
}
pub struct AudioContext;
impl AudioContext {
pub fn new() -> AudioContext {
unsafe {
audio_init();
}
AudioContext
}
}
pub struct Sound(u32);
pub struct Playback(u32);
impl Playback {
pub fn stop(self, _ctx: &AudioContext) {
unsafe { audio_playback_stop(self.0) }
}
pub fn set_volume(&self, _ctx: &AudioContext, volume: f32) {
unsafe { audio_playback_set_volume(self.0, volume) }
}
}
impl Sound {
pub fn load(_ctx: &AudioContext, data: &[u8]) -> Sound {
let buffer = unsafe { audio_add_buffer(data.as_ptr(), data.len() as u32) };
Sound(buffer)
}
/// WASM requirement - sound may be used only after it is is_loaded
/// something like will do:
///```skip
/// let sound = Sound::load(&mut ctx, include_bytes!("test.wav"));
/// while sound.is_lodead() == false {
/// next_frame().await;
/// }
/// sound.play(ctx, Default::default());
///```
pub fn is_loaded(&self) -> bool {
unsafe { audio_source_is_loaded(self.0) }
}
pub fn play(&self, _ctx: &AudioContext, params: PlaySoundParams) -> Playback {
let id = unsafe { audio_play_buffer(self.0, params.volume, params.looped) };
Playback(id)
}
pub fn stop(&self, _ctx: &AudioContext) {
unsafe { audio_source_stop(self.0) }
}
pub fn set_volume(&self, _ctx: &AudioContext, volume: f32) {
unsafe { audio_source_set_volume(self.0, volume) }
}
pub fn delete(&self, _ctx: &AudioContext) {
unsafe { audio_source_delete(self.0) }
}
}