summaryrefslogtreecommitdiff
path: root/src/tangara/audio/track_queue.cpp
diff options
context:
space:
mode:
authorailurux <ailuruxx@gmail.com>2024-08-26 11:15:27 +1000
committerailurux <ailuruxx@gmail.com>2024-08-26 11:15:27 +1000
commit978429109ed421a8e49b7a155f3e043247d905b1 (patch)
tree603bfafd39eb3ab62d66f7ebf9865776ff7fb2b0 /src/tangara/audio/track_queue.cpp
parent0f9005626d2d919e6995809453b9b5ec3c72096b (diff)
downloadtangara-fw-978429109ed421a8e49b7a155f3e043247d905b1.tar.gz
Fix queue serialisation so that the position is correctly applied
Diffstat (limited to 'src/tangara/audio/track_queue.cpp')
-rw-r--r--src/tangara/audio/track_queue.cpp14
1 files changed, 9 insertions, 5 deletions
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<cppbor::Item>& 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) {