X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fplaylist.cpp;fp=source%2Fplaylist.cpp;h=10640ee4db8376f7909a3a9e0f58ba816802ae71;hb=d17577639d3842baa0e4bf9afcfd2b4a096dd01b;hp=0000000000000000000000000000000000000000;hpb=35b092aaa718dcb12933effd33324bda5d3b5cce;p=libs%2Fal.git diff --git a/source/playlist.cpp b/source/playlist.cpp new file mode 100644 index 0000000..10640ee --- /dev/null +++ b/source/playlist.cpp @@ -0,0 +1,120 @@ +#include +#include +#include "playlist.h" + +using namespace std; + +namespace Msp { +namespace AL { + +Playlist::Playlist(): + shuffle(false) +{ } + +void Playlist::add_track(const string &trk) +{ + tracks.push_back(trk); +} + +void Playlist::remove_track(const string &trk) +{ + for(vector::iterator i=tracks.begin(); i!=tracks.end(); ++i) + if(i->filename==trk) + { + tracks.erase(i); + break; + } +} + +void Playlist::clear_tracks() +{ + tracks.clear(); +} + +void Playlist::set_shuffle(bool s) +{ + shuffle = s; +} + +const string &Playlist::get_track(unsigned i) const +{ + if(i>=tracks.size()) + throw out_of_range("Playlist::get_track"); + return tracks[i].filename; +} + +unsigned Playlist::advance(unsigned i, int d) const +{ + unsigned s = tracks.size(); + if(i>=s) + throw out_of_range("Playlist::next_track"); + + if(shuffle) + { + if(s>1) + { + unsigned j = i; + while(j==i) + j = rand()%s; + i = j; + } + } + else if(d>0) + i = (i+d)%s; + else + i = s-1-(s-1-i-d)%s; + + return i; +} + +IO::Seekable *Playlist::open(unsigned i) const +{ + if(i>=tracks.size()) + throw out_of_range("Playlist::open"); + + const Track &track = tracks[i]; + if(track.collection) + return track.collection->open_raw(track.filename); + + return new IO::BufferedFile(track.filename); +} + + +Playlist::Track::Track(): + collection(0) +{ } + +Playlist::Track::Track(const string &fn): + collection(0), + filename(fn) +{ } + + +Playlist::Loader::Loader(Playlist &p): + DataFile::CollectionObjectLoader(p, 0) +{ + init(); +} + +Playlist::Loader::Loader(Playlist &p, Collection &c): + DataFile::CollectionObjectLoader(p, &c) +{ + init(); +} + +void Playlist::Loader::init() +{ + add("track", &Loader::track); + add("shuffle", &Playlist::shuffle); +} + +void Playlist::Loader::track(const string &fn) +{ + Track trk; + trk.collection = coll; + trk.filename = fn; + obj.tracks.push_back(trk); +} + +} // namespace AL +} // namespace Msp