From ca5d7b867c381b7886a660ce744df0b74f38b2e6 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 8 Dec 2023 11:11:57 +1100 Subject: Add shuffle and repeat options for the playback queue --- src/audio/include/track_queue.hpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'src/audio/include/track_queue.hpp') diff --git a/src/audio/include/track_queue.hpp b/src/audio/include/track_queue.hpp index 4a1984c9..24b4fe48 100644 --- a/src/audio/include/track_queue.hpp +++ b/src/audio/include/track_queue.hpp @@ -18,6 +18,30 @@ namespace audio { +/* + * Utility that uses a Miller shuffle to yield well-distributed random indexes + * from within a range. + */ +class RandomIterator { + public: + RandomIterator(size_t size); + + auto current() const -> size_t; + + auto next() -> void; + auto prev() -> void; + + // Note resizing has the side-effect of restarting iteration. + auto resize(size_t) -> void; + auto repeat(bool) -> void; + + private: + size_t seed_; + size_t pos_; + size_t size_; + bool repeat_; +}; + /* * Owns and manages a complete view of the playback queue. Includes the * currently playing track, a truncated list of previously played tracks, and @@ -51,7 +75,7 @@ class TrackQueue { auto totalSize() const -> size_t; using Item = std::variant; - auto insert(Item) -> void; + auto insert(Item, size_t index = 0) -> void; auto append(Item i) -> void; /* @@ -68,6 +92,12 @@ class TrackQueue { */ auto clear() -> void; + auto random(bool) -> void; + auto random() const -> bool; + + auto repeat(bool) -> void; + auto repeat() const -> bool; + // Cannot be copied or moved. TrackQueue(const TrackQueue&) = delete; TrackQueue& operator=(const TrackQueue&) = delete; @@ -79,6 +109,9 @@ class TrackQueue { size_t pos_; std::pmr::vector tracks_; + + std::optional shuffle_; + bool repeat_; }; } // namespace audio -- cgit v1.2.3