--- /dev/null
+/* $Id$
+
+This file is part of libmspal
+Copyright © 2009 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include <algorithm>
+#include <cstdlib>
+#include "jukebox.h"
+#include "sound.h"
+
+using namespace std;
+
+namespace Msp {
+namespace AL {
+
+Jukebox::Jukebox():
+ streamer(source),
+ sound(0),
+ shuffle(false)
+{ }
+
+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();
+}
+
+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);
+ }
+}
+
+void Jukebox::clear_tracks()
+{
+ stop();
+ tracks.clear();
+}
+
+void Jukebox::set_shuffle(bool s)
+{
+ shuffle=s;
+}
+
+void Jukebox::play()
+{
+ if(tracks.empty() || sound)
+ return;
+
+ sound=new AL::Sound;
+ sound->open_file(*current_track);
+ streamer.play(*sound);
+}
+
+void Jukebox::next()
+{
+ 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();
+ }
+ }
+ play();
+}
+
+void Jukebox::stop()
+{
+ streamer.stop();
+ delete sound;
+ sound=0;
+}
+
+void Jukebox::tick()
+{
+ streamer.tick();
+ if(sound && sound->eof())
+ next();
+}
+
+} // namespace AL
+} // namespace Msp
--- /dev/null
+/* $Id$
+
+This file is part of libmspal
+Copyright © 2009 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#ifndef MSP_AL_JUKEBOX_H_
+#define MSP_AL_JUKEBOX_H_
+
+#include <list>
+#include <string>
+#include "source.h"
+#include "streamer.h"
+
+namespace Msp {
+namespace AL {
+
+class Sound;
+
+class Jukebox
+{
+private:
+ Source source;
+ Streamer streamer;
+ Sound *sound;
+ std::list<std::string> tracks;
+ std::list<std::string>::iterator current_track;
+ bool shuffle;
+
+public:
+ Jukebox();
+ ~Jukebox();
+
+ Source &get_source() { return source; }
+ void add_track(const std::string &);
+ void remove_track(const std::string &);
+ void clear_tracks();
+ void set_shuffle(bool);
+
+ void play();
+ void next();
+ void stop();
+ void tick();
+};
+
+} // namespace AL
+} // namespace Msp
+
+#endif
/* $Id$
This file is part of libmspal
-Copyright © 2008 Mikko Rasa, Mikkosoft Productions
+Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
return memsrc.pos;
}
-void memory_close(void *src)
+int memory_close(void *src)
{
delete reinterpret_cast<MemorySource *>(src);
+ return 0;
}
long memory_tell(void *src)
{
&memory_read,
&memory_seek,
- 0,
+ &memory_close,
&memory_tell
};
/* $Id$
This file is part of libmspal
-Copyright © 2008 Mikko Rasa, Mikkosoft Productions
+Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
unsigned Source::get_buffers_queued() const
{
- int n;
+ int n=0;
get_attribute(AL_BUFFERS_QUEUED, &n);
return n;
}
unsigned Source::get_buffers_processed() const
{
- int n;
+ int n=0;
get_attribute(AL_BUFFERS_PROCESSED, &n);
return n;
}