-/* $Id$
-
-This file is part of libmspal
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#include <algorithm>
#include <cstdlib>
+#include <stdexcept>
#include "jukebox.h"
-#include "sound.h"
+#include "sounddecoder.h"
using namespace std;
Jukebox::Jukebox():
streamer(source),
- sound(0),
+ decoder(0),
+ current_track(tracks.end()),
shuffle(false)
{ }
Jukebox::~Jukebox()
{
streamer.stop();
- delete sound;
+ delete decoder;
}
void Jukebox::add_track(const string &trk)
{
- bool was_empty=tracks.empty();
+ bool was_empty = tracks.empty();
tracks.push_back(trk);
if(was_empty)
- current_track=tracks.begin();
+ {
+ 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);
+ 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();
}
}
{
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;
+ shuffle = s;
}
void Jukebox::play()
{
- if(tracks.empty() || sound)
+ if(tracks.empty() || decoder)
return;
- sound=new AL::Sound;
- sound->open_file(*current_track);
- streamer.play(*sound);
+ decoder = new AL::SoundDecoder;
+ decoder->open_file(*current_track);
+ streamer.play(*decoder);
}
void Jukebox::next()
{
while(1)
{
- list<string>::iterator i=tracks.begin();
+ list<string>::iterator i = tracks.begin();
advance(i, rand()%tracks.size());
if(i!=current_track)
{
{
++current_track;
if(current_track==tracks.end())
- current_track=tracks.begin();
+ current_track = tracks.begin();
}
+ signal_track_changed.emit(*current_track);
+ }
+ play();
+}
+
+void Jukebox::previous()
+{
+ if(shuffle)
+ return next();
+
+ stop();
+ if(tracks.size()>1)
+ {
+ if(current_track==tracks.begin())
+ current_track = tracks.end();
+ --current_track;
+ signal_track_changed.emit(*current_track);
}
play();
}
void Jukebox::stop()
{
streamer.stop();
- delete sound;
- sound=0;
+ delete decoder;
+ decoder = 0;
}
void Jukebox::tick()
{
streamer.tick();
- if(sound && sound->eof())
+ if(decoder && decoder->eof())
next();
}