/* * Copyright 2013 (c) Anna Schumaker. */ #include #include #include #include Playqueue :: Playqueue() : flags(0), cur(-1), length(0) { } Playqueue :: Playqueue(playqueue_flags f) : flags(f), cur(-1), length(0) { } Playqueue :: ~Playqueue() { } void Playqueue :: write(File &f) { f << flags << " " << tracks.size(); for (unsigned int i = 0; i < tracks.size(); i++) f << " " << tracks[i]; } void Playqueue :: read(File &f) { unsigned int n; f >> flags >> n; tracks.resize(n); for (unsigned int i = 0; i < n; i++) f >> tracks[i]; } void Playqueue :: set_flag(playqueue_flags f) { flags |= f; } void Playqueue :: unset_flag(playqueue_flags f) { flags &= ~f; } const unsigned int Playqueue :: get_flags() { return flags; } unsigned int Playqueue :: get_length() { return length; } unsigned int Playqueue :: add(unsigned int track_id) { unsigned int id = tracks.size(); library :: Song song; tracks.push_back(track_id); library :: lookup(track_id, &song); length += song.track->length; get_callbacks()->on_queue_track_add(this, id); return id; } unsigned int Playqueue :: add_front(unsigned int track_id) { library :: Song song; tracks.insert(tracks.begin(), track_id); library :: lookup(track_id, &song); length += song.track->length; get_callbacks()->on_queue_track_add(this, 0); return 0; } void Playqueue :: del(unsigned int plist_id) { library :: Song song; unsigned int track_id = tracks[plist_id]; tracks.erase(tracks.begin() + plist_id); library :: lookup(track_id, &song); length -= song.track->length; get_callbacks()->on_queue_track_del(this, plist_id); } void Playqueue :: del_track(unsigned int track_id) { unsigned int i = 0; while (i < tracks.size()) { if (tracks[i] == track_id) del(i); else i++; } } unsigned int Playqueue :: size() { return tracks.size(); } unsigned int Playqueue :: operator[](unsigned int i) { return tracks[i]; } unsigned int Playqueue :: next() { unsigned int res; if (tracks.size() == 0) throw -E_EXIST; else if (tracks.size() == 1) cur = 0; else if (flags & PQ_RANDOM) cur += rand() % (tracks.size() / 2) + 1; else cur++; if (cur >= tracks.size()) cur -= tracks.size(); res = tracks[cur]; if (!(flags & PQ_REPEAT)) { del(cur); cur--; } return res; } void Playqueue :: reset_cur() { cur = 0; } #ifdef CONFIG_TEST void Playqueue :: reset() { tracks.clear(); reset_cur(); } #endif /* CONFIG_TEST */