pub use boppo_core::audio::Controller;
pub use boppo_core::audio::*;
pub use boppo_core::audio::{ControllerOpts, SoundBuilder};
use boppo_core::log::error;
use crate::{Error, internal::host_ffi};
pub fn try_play(sound: impl Into<SoundBuilder>) -> Result<(), Error> {
let si = sound.into();
let data = match serde_json::to_string(si.as_instruction()) {
Ok(data) => data,
Err(e) => {
error!("Failed to serialize sound instruction: {e:?}");
return Err(Error::InvalidParameter);
}
};
let Some(ids) = si.as_instruction().controller_ids() else {
error!("Controller found inside Repeat.");
return Err(Error::InvalidParameter);
};
Error::result_from_i32(unsafe {
host_ffi::boppo_play_sound_instruction(data.as_ptr(), data.len())
})?;
for id in ids {
boppo_core::internal::on_sound_controller_started_playing(id);
}
Ok(())
}
pub fn play(sound: impl Into<SoundBuilder>) {
try_play(sound).expect("failed to play sound");
}
pub fn play_with_controller(sound: impl Into<SoundBuilder>) -> Controller {
let (sound, controller) = sound.into().controller();
play(sound);
controller
}
pub async fn play_and_wait_until_finished(sound: impl Into<SoundBuilder>) {
play_with_controller(sound).wait_until_finished().await;
}
pub fn stop_all() {
unsafe {
host_ffi::boppo_stop_all_sounds();
}
}
pub(crate) fn init() {
boppo_core::internal::init_audio(set_controller_parameter);
}
fn set_controller_parameter(id: u64, param: boppo_core::internal::AudioParameter, value: f32) {
let result = unsafe { host_ffi::boppo_set_sound_controller_parameter(id, param as i32, value) };
match Error::result_from_i32(result) {
Ok(_) => (),
Err(Error::NotFound) => {
}
Err(e) => {
panic!("Unexpected error setting controller parameter: {:?}", e);
}
}
}