X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fjukebox.cpp;h=d79e4c1420804631ade9d91818ff932f6d3f003f;hb=12d27761bc8a24677b52a67bff0e8cbfca14a902;hp=da2bcbbd4663907dfde24430b98c5bdf87319dad;hpb=14008b157c64752ba7c1cef831124992c35c4646;p=libs%2Fal.git diff --git a/source/jukebox.cpp b/source/jukebox.cpp index da2bcbb..d79e4c1 100644 --- a/source/jukebox.cpp +++ b/source/jukebox.cpp @@ -1,8 +1,9 @@ #include #include -#include +#include #include "jukebox.h" -#include "sound.h" +#include "playlist.h" +#include "sounddecoder.h" using namespace std; @@ -11,126 +12,73 @@ namespace AL { Jukebox::Jukebox(): streamer(source), - sound(0), - current_track(tracks.end()), - shuffle(false) + in(0), + decoder(0), + playlist(0), + current(0) { } Jukebox::~Jukebox() { streamer.stop(); - delete sound; + 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 InvalidState("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() || sound) + if(!playlist || playlist->empty() || decoder) return; - sound = new AL::Sound; - sound->open_file(*current_track); - streamer.play(*sound); + 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(); } void Jukebox::stop() { streamer.stop(); - delete sound; - sound = 0; + delete decoder; + decoder = 0; + delete in; + in = 0; } void Jukebox::tick() { streamer.tick(); - if(sound && sound->eof()) + if(decoder && decoder->eof()) next(); }