]> git.tdb.fi Git - libs/al.git/blobdiff - source/jukebox.cpp
Externalize playlist management from Jukebox
[libs/al.git] / source / jukebox.cpp
index 52f673e796c49bf875de112c9a0ecb937d7e630e..b753e6b9eb58bf391a13d2e5b0ef42735b8c9045 100644 (file)
@@ -2,6 +2,7 @@
 #include <cstdlib>
 #include <stdexcept>
 #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<string>::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<string>::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()