summaryrefslogtreecommitdiff
path: root/src/audio/include/track_queue.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-12-07 16:57:05 +1100
committerjacqueline <me@jacqueline.id.au>2023-12-07 17:00:30 +1100
commit3f7f199cb940c8d5f6d48f77fd59971adffe49ef (patch)
treeaa22162e46c5e9ccce4c7ee8537b493f437664d9 /src/audio/include/track_queue.hpp
parent009f69c929eb1d1b65d75b0937fbf3b8de5d9148 (diff)
downloadtangara-fw-3f7f199cb940c8d5f6d48f77fd59971adffe49ef.tar.gz
Remove pre-iterator concepts
- No more IndexRecord/Result/dbGetPage nonsense - Queue is just track ids - i am so tired and have so much to do
Diffstat (limited to 'src/audio/include/track_queue.hpp')
-rw-r--r--src/audio/include/track_queue.hpp60
1 files changed, 18 insertions, 42 deletions
diff --git a/src/audio/include/track_queue.hpp b/src/audio/include/track_queue.hpp
index bec887ae..4a1984c9 100644
--- a/src/audio/include/track_queue.hpp
+++ b/src/audio/include/track_queue.hpp
@@ -9,10 +9,11 @@
#include <list>
#include <memory>
#include <mutex>
+#include <shared_mutex>
#include <vector>
#include "database.hpp"
-#include "source.hpp"
+#include "tasks.hpp"
#include "track.hpp"
namespace audio {
@@ -32,77 +33,52 @@ namespace audio {
*/
class TrackQueue {
public:
- TrackQueue();
-
- class Editor {
- public:
- ~Editor();
-
- // Cannot be copied or moved.
- Editor(const Editor&) = delete;
- Editor& operator=(const Editor&) = delete;
-
- private:
- friend TrackQueue;
-
- Editor(TrackQueue&);
-
- std::lock_guard<std::recursive_mutex> lock_;
- bool has_current_changed_;
- };
-
- auto Edit() -> Editor;
+ TrackQueue(tasks::Worker& bg_worker);
/* Returns the currently playing track. */
- auto Current() const -> std::optional<database::TrackId>;
+ auto current() const -> std::optional<database::TrackId>;
/* Returns, in order, tracks that have been queued to be played next. */
- auto PeekNext(std::size_t limit) const -> std::vector<database::TrackId>;
+ auto peekNext(std::size_t limit) const -> std::vector<database::TrackId>;
/*
* Returns the tracks in the queue that have already been played, ordered
* most recently played first.
*/
- auto PeekPrevious(std::size_t limit) const -> std::vector<database::TrackId>;
+ auto peekPrevious(std::size_t limit) const -> std::vector<database::TrackId>;
- auto GetCurrentPosition() const -> size_t;
- auto GetTotalSize() const -> size_t;
+ auto currentPosition() const -> size_t;
+ auto totalSize() const -> size_t;
using Item = std::variant<database::TrackId, database::TrackIterator>;
- auto Insert(Editor&, Item, size_t) -> void;
- auto Append(Editor&, Item i) -> void;
+ auto insert(Item) -> void;
+ auto append(Item i) -> void;
/*
* Advances to the next track in the queue, placing the current track at the
* front of the 'played' queue.
*/
- auto Next(Editor&) -> std::optional<database::TrackId>;
- auto Previous(Editor&) -> std::optional<database::TrackId>;
+ auto next() -> void;
+ auto previous() -> void;
- auto SkipTo(Editor&, database::TrackId) -> void;
+ auto skipTo(database::TrackId) -> void;
/*
* Removes all tracks from all queues, and stops any currently playing track.
*/
- auto Clear(Editor&) -> void;
-
- auto Save(std::weak_ptr<database::Database>) -> void;
- auto Load(std::weak_ptr<database::Database>) -> void;
+ auto clear() -> void;
// Cannot be copied or moved.
TrackQueue(const TrackQueue&) = delete;
TrackQueue& operator=(const TrackQueue&) = delete;
private:
- // FIXME: Make this a shared_mutex so that multithread reads don't block.
- mutable std::recursive_mutex mutex_;
+ mutable std::shared_mutex mutex_;
- std::optional<database::TrackId> current_;
+ tasks::Worker& bg_worker_;
- // Note: stored in reverse order, i.e. most recent played it at the *back* of
- // this vector.
- std::pmr::vector<database::TrackId> played_;
- std::pmr::vector<Item> enqueued_;
+ size_t pos_;
+ std::pmr::vector<database::TrackId> tracks_;
};
} // namespace audio