diff --git a/src/tangara/audio/track_queue.cpp b/src/tangara/audio/track_queue.cpp index ecf33c74..761ea09a 100644 --- a/src/tangara/audio/track_queue.cpp +++ b/src/tangara/audio/track_queue.cpp @@ -137,14 +137,16 @@ auto TrackQueue::open() -> bool { return playlist_.open(); } -auto TrackQueue::openPlaylist(const std::string& playlist_file) -> bool { +auto TrackQueue::openPlaylist(const std::string& playlist_file, bool notify) -> bool { opened_playlist_.emplace(playlist_file); auto res = opened_playlist_->open(); if (!res) { return false; } updateShuffler(true); - notifyChanged(true, Reason::kExplicitUpdate); + if (notify) { + notifyChanged(true, Reason::kExplicitUpdate); + } return true; } @@ -371,7 +373,7 @@ auto TrackQueue::serialise() -> std::string { } TrackQueue::QueueParseClient::QueueParseClient(TrackQueue& queue) - : queue_(queue), state_(State::kInit), i_(0) {} + : queue_(queue), state_(State::kInit), i_(0), position_to_set_(0) {} cppbor::ParseClient* TrackQueue::QueueParseClient::item( std::unique_ptr& item, @@ -400,10 +402,11 @@ cppbor::ParseClient* TrackQueue::QueueParseClient::item( i_ = 0; } else if (item->type() == cppbor::UINT) { auto val = item->asUint()->unsignedValue(); - queue_.goTo(val); + // Save the position so we can apply it later when we have finished serialising + position_to_set_ = val; } else if (item->type() == cppbor::TSTR) { auto val = item->asTstr(); - queue_.openPlaylist(val->value()); + queue_.openPlaylist(val->value(), false); } else if (item->type() == cppbor::SIMPLE) { bool val = item->asBool()->value(); if (i_ == 0) { @@ -448,6 +451,7 @@ cppbor::ParseClient* TrackQueue::QueueParseClient::itemEnd( if (state_ == State::kInit) { state_ = State::kFinished; } else if (state_ == State::kRoot) { + queue_.goTo(position_to_set_); state_ = State::kFinished; } else if (state_ == State::kMetadata) { if (item->type() == cppbor::ARRAY) { diff --git a/src/tangara/audio/track_queue.hpp b/src/tangara/audio/track_queue.hpp index b66d18d1..54898a5d 100644 --- a/src/tangara/audio/track_queue.hpp +++ b/src/tangara/audio/track_queue.hpp @@ -74,7 +74,7 @@ class TrackQueue { auto currentPosition() const -> size_t; auto totalSize() const -> size_t; auto open() -> bool; - auto openPlaylist(const std::string& playlist_file) -> bool; + auto openPlaylist(const std::string& playlist_file, bool notify = true) -> bool; using Item = std::variant; auto insert(Item, size_t index = 0) -> void; @@ -163,6 +163,7 @@ class TrackQueue { }; State state_; size_t i_; + size_t position_to_set_; }; };