]> git.tdb.fi Git - libs/al.git/blob - source/playlist.cpp
Externalize playlist management from Jukebox
[libs/al.git] / source / playlist.cpp
1 #include <cstdlib>
2 #include <msp/datafile/collection.h>
3 #include "playlist.h"
4
5 using namespace std;
6
7 namespace Msp {
8 namespace AL {
9
10 Playlist::Playlist():
11         shuffle(false)
12 { }
13
14 void Playlist::add_track(const string &trk)
15 {
16         tracks.push_back(trk);
17 }
18
19 void Playlist::remove_track(const string &trk)
20 {
21         for(vector<Track>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
22                 if(i->filename==trk)
23                 {
24                         tracks.erase(i);
25                         break;
26                 }
27 }
28
29 void Playlist::clear_tracks()
30 {
31         tracks.clear();
32 }
33
34 void Playlist::set_shuffle(bool s)
35 {
36         shuffle = s;
37 }
38
39 const string &Playlist::get_track(unsigned i) const
40 {
41         if(i>=tracks.size())
42                 throw out_of_range("Playlist::get_track");
43         return tracks[i].filename;
44 }
45
46 unsigned Playlist::advance(unsigned i, int d) const
47 {
48         unsigned s = tracks.size();
49         if(i>=s)
50                 throw out_of_range("Playlist::next_track");
51
52         if(shuffle)
53         {
54                 if(s>1)
55                 {
56                         unsigned j = i;
57                         while(j==i)
58                                 j = rand()%s;
59                         i = j;
60                 }
61         }
62         else if(d>0)
63                 i = (i+d)%s;
64         else
65                 i = s-1-(s-1-i-d)%s;
66
67         return i;
68 }
69
70 IO::Seekable *Playlist::open(unsigned i) const
71 {
72         if(i>=tracks.size())
73                 throw out_of_range("Playlist::open");
74
75         const Track &track = tracks[i];
76         if(track.collection)
77                 return track.collection->open_raw(track.filename);
78
79         return new IO::BufferedFile(track.filename);
80 }
81
82
83 Playlist::Track::Track():
84         collection(0)
85 { }
86
87 Playlist::Track::Track(const string &fn):
88         collection(0),
89         filename(fn)
90 { }
91
92
93 Playlist::Loader::Loader(Playlist &p):
94         DataFile::CollectionObjectLoader<Playlist>(p, 0)
95 {
96         init();
97 }
98
99 Playlist::Loader::Loader(Playlist &p, Collection &c):
100         DataFile::CollectionObjectLoader<Playlist>(p, &c)
101 {
102         init();
103 }
104
105 void Playlist::Loader::init()
106 {
107         add("track",   &Loader::track);
108         add("shuffle", &Playlist::shuffle);
109 }
110
111 void Playlist::Loader::track(const string &fn)
112 {
113         Track trk;
114         trk.collection = coll;
115         trk.filename = fn;
116         obj.tracks.push_back(trk);
117 }
118
119 } // namespace AL
120 } // namespace Msp