use crate::internal::{AudioParameter, PLAYING_SOUND_CONTROLLERS};
use tokio::sync::oneshot;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Controller(u64);
impl Controller {
pub(crate) fn new(id: u64) -> Self {
Self(id)
}
#[must_use]
pub fn is_finished(&self) -> bool {
#[expect(clippy::missing_panics_doc)]
let map = PLAYING_SOUND_CONTROLLERS.get().unwrap().read().unwrap();
map.get(&self.0).is_none()
}
pub async fn wait_until_finished(self) {
if self.is_finished() {
return;
}
let receiver = {
#[expect(clippy::missing_panics_doc)]
let mut map = PLAYING_SOUND_CONTROLLERS.get().unwrap().write().unwrap();
let (sender, receiver) = oneshot::channel();
map.entry(self.0).or_default().push(sender);
receiver
};
let _ = receiver.await;
}
pub fn set_paused(&self, paused: bool) {
let value = if paused { 1. } else { 0. };
self.set_controller_parameter(AudioParameter::Pause, value)
}
pub fn set_volume(&self, multiplier: f32) {
self.set_controller_parameter(AudioParameter::Volume, multiplier)
}
pub fn set_speed(&self, multiplier: f32) {
self.set_controller_parameter(AudioParameter::Speed, multiplier)
}
pub fn stop(self) {
self.set_controller_parameter(AudioParameter::Stop, 1.0)
}
fn set_controller_parameter(&self, param: AudioParameter, value: f32) {
(crate::internal::AUDIO_CONTROLLER_MODIFY_PARAMS_FN
.get()
.unwrap())(self.0, param, value);
}
}