use rodio::{Decoder, OutputStream, OutputStreamHandle, Sink};
use std::fs::File;
use std::io::BufReader;
pub struct Player {
sink: Sink,
#[allow(dead_code)]
stream: OutputStream,
#[allow(dead_code)]
stream_handle: OutputStreamHandle,
#[allow(dead_code)]
state: PlayerState,
}
impl Default for Player {
fn default() -> Self {
let (stream, stream_handle) = OutputStream::try_default().unwrap();
let sink = Sink::try_new(&stream_handle).unwrap();
sink.pause();
Self {
sink: sink,
state: PlayerState::Paused,
stream: stream,
stream_handle: stream_handle,
}
}
}
impl Player {
pub fn new(sink: Sink) -> Self {
let mut default = Player::default();
default.sink = sink;
default
}
pub fn play(&self, path: String) {
let file = BufReader::new(File::open(path).unwrap());
let source = Decoder::new(file).unwrap();
self.sink.append(source);
}
pub fn set_volume(&self, new_volume: f32) {
self.sink.set_volume(new_volume);
}
pub fn clear(&self) {
self.sink.clear();
}
pub fn toggle_pause(&mut self) {
if self.sink.is_paused() {
self.sink.play();
self.state = PlayerState::Playing;
} else {
self.sink.pause();
self.state = PlayerState::Paused;
}
}
pub fn seek() {}
}
pub enum PlayerState {
Playing,
Paused,
Stopped,
}