use super::audio::{read_m4a_as_f32, read_ogg_as_f32, read_wav_as_f32};
use crate::audio::AudioPlayer;
use crate::error::TalkError;
pub(crate) struct WavPlayer {
inner: AudioPlayer,
}
impl WavPlayer {
pub(crate) fn new() -> Result<Self, TalkError> {
Ok(Self {
inner: AudioPlayer::new()?,
})
}
pub(crate) fn play(&self, audio_path: &std::path::Path) -> Result<(), TalkError> {
let ext = audio_path
.extension()
.and_then(|e| e.to_str())
.unwrap_or("")
.to_ascii_lowercase();
let rate = self.inner.device_sample_rate();
let samples = match ext.as_str() {
"ogg" | "opus" => read_ogg_as_f32(audio_path, rate)?,
"m4a" | "mp4" | "aac" => read_m4a_as_f32(audio_path, rate)?,
_ => read_wav_as_f32(audio_path, rate)?,
};
self.inner.load_f32(samples);
Ok(())
}
pub(crate) fn stop(&self) {
self.inner.stop();
}
pub(crate) fn is_finished(&self) -> bool {
self.inner.is_finished()
}
pub(crate) fn progress(&self) -> f64 {
self.inner.progress()
}
pub(crate) fn seek(&self, fraction: f64) {
self.inner.seek(fraction);
}
pub(crate) fn pause(&self) {
self.inner.pause();
}
pub(crate) fn resume(&self) {
self.inner.resume();
}
pub(crate) fn is_paused(&self) -> bool {
self.inner.is_paused()
}
pub(crate) fn has_audio(&self) -> bool {
self.inner.has_audio()
}
pub(crate) fn duration_secs(&self) -> f64 {
self.inner.duration_secs()
}
}