From 09c0e1608f2d88f56d8bf87ff90482459376ad95 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 23 Nov 2023 14:08:46 +1100 Subject: Implement adding to the playback queue from lua --- src/playlist/source.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/playlist/source.cpp') diff --git a/src/playlist/source.cpp b/src/playlist/source.cpp index 7a062bc7..2540c3fb 100644 --- a/src/playlist/source.cpp +++ b/src/playlist/source.cpp @@ -22,6 +22,55 @@ namespace playlist { +[[maybe_unused]] static constexpr char kTag[] = "queue_src"; + +IteratorSource::IteratorSource(const database::Iterator& it) + : start_(it), current_(), next_() { + Reset(); + Advance(); +} + +auto IteratorSource::Current() -> std::optional { + return current_; +} + +auto IteratorSource::Advance() -> std::optional { + ESP_LOGI(kTag, "advancing"); + while (!next_.empty()) { + auto next = next_.top().NextSync(); + if (!next) { + ESP_LOGI(kTag, "top was empty"); + next_.pop(); + continue; + } + if (next->track()) { + ESP_LOGI(kTag, "top held track %lu", next->track().value_or(0)); + current_ = next->track(); + return current_; + } + ESP_LOGI(kTag, "top held records"); + next_.push(database::Iterator(start_.database(), next->Expand(1).value())); + } + ESP_LOGI(kTag, "exhausted"); + return {}; +} + +auto IteratorSource::Peek(std::size_t n, std::vector*) + -> std::size_t { + return 0; +} + +auto IteratorSource::Previous() -> std::optional { + return {}; +} + +auto IteratorSource::Reset() -> void { + while (!next_.empty()) { + next_.pop(); + } + next_.push(start_); +} + auto CreateSourceFromResults( std::weak_ptr db, std::shared_ptr> results) -- cgit v1.2.3