X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fjukebox.cpp;h=d79e4c1420804631ade9d91818ff932f6d3f003f;hb=12d27761bc8a24677b52a67bff0e8cbfca14a902;hp=02a33cdfee3e1d55e56eed59b647b7fe630131a0;hpb=6cc0f1735a00e8f9eb80ff0c9468fb67205f6d20;p=libs%2Fal.git diff --git a/source/jukebox.cpp b/source/jukebox.cpp index 02a33cd..d79e4c1 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,112 +12,57 @@ namespace AL { Jukebox::Jukebox(): streamer(source), + in(0), decoder(0), - current_track(tracks.end()), - shuffle(false) + playlist(0), + current(0) { } Jukebox::~Jukebox() { streamer.stop(); delete decoder; + delete in; } -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 = new AL::SoundDecoder; - decoder->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(); } @@ -125,6 +71,8 @@ void Jukebox::stop() streamer.stop(); delete decoder; decoder = 0; + delete in; + in = 0; } void Jukebox::tick()