use crate::common::errors::MyError;
use libmpv::Mpv;
pub struct AudioPlayer {
mpv: Mpv,
}
impl AudioPlayer {
pub fn new(input_path: &str) -> Result<Self, MyError> {
let mpv = Mpv::new().expect("Failed to init MPV builder");
mpv.set_property("vid", "no")
.map_err(|err| MyError::Audio(format!("Failed to set no-video property: {:?}", err)))?;
mpv.set_property("audio-display", "no").map_err(|err| {
MyError::Audio(format!(
"Failed to set no-audio-display property: {:?}",
err
))
})?;
mpv.command("loadfile", &[input_path])
.map_err(|err| MyError::Audio(format!("Failed to load audio file: {:?}", err)))?;
mpv.set_property("pause", true)
.map_err(|err| MyError::Audio(format!("Failed to set pause property: {:?}", err)))?;
Ok(Self { mpv })
}
pub fn pause(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("pause", true)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
pub fn resume(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("pause", false)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
pub fn toggle_play(&mut self) -> Result<(), MyError> {
let paused = self
.mpv
.get_property("pause")
.map_err(|err| MyError::Audio(format!("{:?}", err)))?;
if paused {
self.resume()
} else {
self.pause()
}
}
pub fn mute(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("mute", true)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
pub fn unmute(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("mute", false)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
pub fn toggle_mute(&mut self) -> Result<(), MyError> {
let muted = self
.mpv
.get_property("mute")
.map_err(|err| MyError::Audio(format!("{:?}", err)))?;
if muted {
self.unmute()
} else {
self.mute()
}
}
pub fn stop(&mut self) -> Result<(), MyError> {
self.mpv
.command("stop", &["false"])
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
}