use sdl2::mixer::Music;
use rand::thread_rng;
use std::path::PathBuf;
use rand::Rng;
pub struct Playlist {
tracks: Vec<Music<'static>>,
current_track: usize,
pub shuffle: bool,
pub loop_music: bool,
started: bool,
}
impl Playlist {
pub fn new() -> Playlist {
Playlist {
tracks: Vec::new(),
current_track: 0,
shuffle: false,
loop_music: false,
started: false,
}
}
pub fn start(&mut self) {
if self.shuffle {
self.shuffle();
}
self.started = true;
self.play_track(0).expect("No tracks present.");
}
pub fn stop(&mut self) {
if self.started {
self.started = false;
Music::halt();
}
}
fn shuffle(&mut self) {
if self.tracks.len() > 1 {
let mut new_tracks = Vec::new();
new_tracks.push(unborrow!(self.tracks
.remove(thread_rng().gen_range(0,
self.tracks.len() -
1))));
while self.tracks.len() > 0 {
new_tracks.push(unborrow!(self.tracks
.remove(thread_rng().gen_range(0,
self.tracks
.len()))));
}
self.tracks = new_tracks;
}
}
pub fn next_track(&mut self) {
if self.current_track < self.tracks.len() - 1 {
unborrow!(self.play_track(self.current_track + 1)).expect("Track index invalid.");
} else if self.loop_music {
if self.shuffle {
self.shuffle();
}
self.play_track(0).expect("Track index invalid.");
} else {
Music::halt();
}
}
pub fn play_track(&mut self, track: usize) -> Result<(), String> {
if track < self.tracks.len() {
self.current_track = track;
self.tracks[track].play(1)?;
return Ok(());
} else {
return Err("Track index invalid.".to_string());
}
}
pub fn current_track(&self) -> usize {
self.current_track
}
pub fn add_track(&mut self, path: &str) -> Result<(), String> {
let mut file_path = PathBuf::from("assets");
file_path.push("music");
file_path.push(path);
self.tracks.push(Music::from_file(file_path)?);
Ok(())
}
pub fn track_count(&self) -> usize {
self.tracks.len()
}
pub fn advance_if_needed(&mut self) {
if self.started {
if !Music::is_playing() {
self.next_track();
}
}
}
}