summaryrefslogtreecommitdiff
path: root/src/audio/track_queue.cpp
diff options
context:
space:
mode:
authorailurux <ailuruxx@gmail.com>2023-07-08 12:58:07 +1000
committerailurux <ailuruxx@gmail.com>2023-07-08 12:58:07 +1000
commit3de310f6e4c170c4c4bfb789cb07ca10e5ab17b8 (patch)
tree0d13d6efa758b8c029a35c73405529dcadde3788 /src/audio/track_queue.cpp
parentdaa3013836d619d920db3a9dc1f9cc988047a4b4 (diff)
parent8f8bc1f088b389a683735d626cbce9adb1f6dc17 (diff)
downloadtangara-fw-3de310f6e4c170c4c4bfb789cb07ca10e5ab17b8.tar.gz
Merge branch 'main' of git.sr.ht:~jacqueline/tangara-fw
Diffstat (limited to 'src/audio/track_queue.cpp')
-rw-r--r--src/audio/track_queue.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/audio/track_queue.cpp b/src/audio/track_queue.cpp
new file mode 100644
index 00000000..1c233f8f
--- /dev/null
+++ b/src/audio/track_queue.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2023 jacqueline <me@jacqueline.id.au>
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+#include "track_queue.hpp"
+
+#include <algorithm>
+#include <mutex>
+
+#include "audio_events.hpp"
+#include "audio_fsm.hpp"
+#include "event_queue.hpp"
+#include "track.hpp"
+#include "ui_fsm.hpp"
+
+namespace audio {
+
+TrackQueue::TrackQueue() {}
+
+auto TrackQueue::GetCurrent() const -> std::optional<database::TrackId> {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ return current_;
+}
+
+auto TrackQueue::GetUpcoming(std::size_t limit) const
+ -> std::vector<database::TrackId> {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ std::vector<database::TrackId> ret;
+ limit = std::min(limit, upcoming_.size());
+ std::for_each_n(upcoming_.begin(), limit,
+ [&](const auto i) { ret.push_back(i); });
+ return ret;
+}
+
+auto TrackQueue::AddNext(database::TrackId t) -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ if (!current_) {
+ current_ = t;
+ } else {
+ upcoming_.push_front(t);
+ }
+
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::AddNext(const std::vector<database::TrackId>& t) -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ std::for_each(t.rbegin(), t.rend(),
+ [&](const auto i) { upcoming_.push_front(i); });
+ if (!current_) {
+ current_ = upcoming_.front();
+ upcoming_.pop_front();
+ }
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::AddLast(database::TrackId t) -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ if (!current_) {
+ current_ = t;
+ } else {
+ upcoming_.push_back(t);
+ }
+
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::AddLast(const std::vector<database::TrackId>& t) -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ std::for_each(t.begin(), t.end(),
+ [&](const auto i) { upcoming_.push_back(i); });
+ if (!current_) {
+ current_ = upcoming_.front();
+ upcoming_.pop_front();
+ }
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::Next() -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ if (current_) {
+ played_.push_front(*current_);
+ }
+ if (!upcoming_.empty()) {
+ current_ = upcoming_.front();
+ upcoming_.pop_front();
+ } else {
+ current_.reset();
+ }
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::Previous() -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ if (current_) {
+ upcoming_.push_front(*current_);
+ }
+ if (!played_.empty()) {
+ current_ = played_.front();
+ played_.pop_front();
+ } else {
+ current_.reset();
+ }
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::Clear() -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ played_.clear();
+ upcoming_.clear();
+ current_.reset();
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+auto TrackQueue::RemoveUpcoming(database::TrackId t) -> void {
+ const std::lock_guard<std::mutex> lock(mutex_);
+ for (auto it = upcoming_.begin(); it != upcoming_.end(); it++) {
+ if (*it == t) {
+ upcoming_.erase(it);
+ return;
+ }
+ }
+ events::Dispatch<QueueUpdate, AudioState, ui::UiState>({});
+}
+
+} // namespace audio