X-Git-Url: http://git.tdb.fi/?p=libs%2Fal.git;a=blobdiff_plain;f=source%2Fjukebox.cpp;fp=source%2Fjukebox.cpp;h=b753e6b9eb58bf391a13d2e5b0ef42735b8c9045;hp=52f673e796c49bf875de112c9a0ecb937d7e630e;hb=d17577639d3842baa0e4bf9afcfd2b4a096dd01b;hpb=35b092aaa718dcb12933effd33324bda5d3b5cce diff --git a/source/jukebox.cpp b/source/jukebox.cpp index 52f673e..b753e6b 100644 --- a/source/jukebox.cpp +++ b/source/jukebox.cpp @@ -2,6 +2,7 @@ #include #include #include "jukebox.h" +#include "playlist.h" #include "sounddecoder.h" using namespace std; @@ -11,9 +12,10 @@ namespace AL { Jukebox::Jukebox(): streamer(source), + in(0), decoder(0), - current_track(tracks.end()), - shuffle(false) + playlist(0), + current(0) { } Jukebox::~Jukebox() @@ -22,100 +24,44 @@ Jukebox::~Jukebox() delete decoder; } -void Jukebox::add_track(const string &trk) -{ - bool was_empty = tracks.empty(); - tracks.push_back(trk); - if(was_empty) - { - current_track = tracks.begin(); - signal_track_changed.emit(*current_track); - } -} - -void Jukebox::remove_track(const string &trk) -{ - list::iterator i = find(tracks.begin(), tracks.end(), trk); - if(i!=tracks.end()) - { - if(i==current_track) - next(); - tracks.erase(i); - if(tracks.empty()) - current_track = tracks.end(); - } -} - -void Jukebox::clear_tracks() +void Jukebox::set_playlist(const Playlist *p) { + bool was_playing = decoder; stop(); - tracks.clear(); - current_track = tracks.end(); -} - -const string &Jukebox::get_current_track() const -{ - if(tracks.empty()) - throw logic_error("No current track"); - return *current_track; -} - -void Jukebox::set_shuffle(bool s) -{ - shuffle = s; + playlist = p; + if(playlist && was_playing) + play(); } void Jukebox::play() { - if(tracks.empty() || decoder) + if(!playlist || playlist->empty() || decoder) return; - decoder = SoundDecoder::open_file(*current_track); + in = playlist->open(current); + decoder = SoundDecoder::open_io(*in); streamer.play(*decoder); } void Jukebox::next() { + if(!playlist || playlist->empty()) + return; + stop(); - if(tracks.size()>1) - { - if(shuffle) - { - while(1) - { - list::iterator i = tracks.begin(); - advance(i, rand()%tracks.size()); - if(i!=current_track) - { - current_track = i; - break; - } - } - } - else - { - ++current_track; - if(current_track==tracks.end()) - current_track = tracks.begin(); - } - signal_track_changed.emit(*current_track); - } + current = playlist->advance(current, 1); + signal_track_changed.emit(current); play(); } void Jukebox::previous() { - if(shuffle) - return next(); + if(!playlist || playlist->empty()) + return; stop(); - if(tracks.size()>1) - { - if(current_track==tracks.begin()) - current_track = tracks.end(); - --current_track; - signal_track_changed.emit(*current_track); - } + current = playlist->advance(current, -1); + signal_track_changed.emit(current); play(); } @@ -124,6 +70,8 @@ void Jukebox::stop() streamer.stop(); delete decoder; decoder = 0; + delete in; + in = 0; } void Jukebox::tick()