-/* $Id$
-
-This file is part of libmspal
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#include <algorithm>
#include <cstdlib>
-#include <msp/core/except.h>
+#include <stdexcept>
#include "jukebox.h"
-#include "sound.h"
+#include "playlist.h"
+#include "sounddecoder.h"
using namespace std;
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;
-}
-
-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);
- }
+ delete decoder;
+ delete in;
}
-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 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<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();
}
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();
}