summaryrefslogtreecommitdiff
path: root/src/audio/track_queue.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-02-29 12:10:44 +1100
committerjacqueline <me@jacqueline.id.au>2024-02-29 12:10:44 +1100
commit7d3ddac0eaea207aee187729e3beec95d8d201dc (patch)
tree4b4545e725697663a4768630c48f49e8bbb8cf59 /src/audio/track_queue.cpp
parentd41f9f703375171d5766840c9edec32ff47bb25d (diff)
parent9fca08f8434a05e1fe93a1c4f8133f0e7fc118bf (diff)
downloadtangara-fw-7d3ddac0eaea207aee187729e3beec95d8d201dc.tar.gz
Merge branch 'main' into seek-support
Diffstat (limited to 'src/audio/track_queue.cpp')
-rw-r--r--src/audio/track_queue.cpp57
1 files changed, 35 insertions, 22 deletions
diff --git a/src/audio/track_queue.cpp b/src/audio/track_queue.cpp
index 534da10c..b75230fc 100644
--- a/src/audio/track_queue.cpp
+++ b/src/audio/track_queue.cpp
@@ -200,39 +200,52 @@ auto TrackQueue::append(Item i) -> void {
}
auto TrackQueue::next() -> void {
- const std::unique_lock<std::shared_mutex> lock(mutex_);
- if (shuffle_) {
- shuffle_->next();
- pos_ = shuffle_->current();
- } else {
- if (pos_ + 1 >= tracks_.size()) {
- if (replay_) {
- pos_ = 0;
- }
+ bool changed = true;
+
+ {
+ const std::unique_lock<std::shared_mutex> lock(mutex_);
+ if (shuffle_) {
+ shuffle_->next();
+ pos_ = shuffle_->current();
} else {
- pos_++;
+ if (pos_ + 1 >= tracks_.size()) {
+ if (replay_) {
+ pos_ = 0;
+ } else {
+ pos_ = tracks_.size();
+ changed = false;
+ }
+ } else {
+ pos_++;
+ }
}
}
- notifyChanged(true);
+ notifyChanged(changed);
}
auto TrackQueue::previous() -> void {
- const std::unique_lock<std::shared_mutex> lock(mutex_);
- if (shuffle_) {
- shuffle_->prev();
- pos_ = shuffle_->current();
- } else {
- if (pos_ == 0) {
- if (repeat_) {
- pos_ = tracks_.size() - 1;
- }
+ bool changed = true;
+
+ {
+ const std::unique_lock<std::shared_mutex> lock(mutex_);
+ if (shuffle_) {
+ shuffle_->prev();
+ pos_ = shuffle_->current();
} else {
- pos_--;
+ if (pos_ == 0) {
+ if (repeat_) {
+ pos_ = tracks_.size() - 1;
+ } else {
+ changed = false;
+ }
+ } else {
+ pos_--;
+ }
}
}
- notifyChanged(true);
+ notifyChanged(changed);
}
auto TrackQueue::finish() -> void {