summaryrefslogtreecommitdiff
path: root/src/tangara/audio
diff options
context:
space:
mode:
authorailurux <ailuruxx@gmail.com>2024-09-17 14:13:05 +1000
committerailurux <ailuruxx@gmail.com>2024-09-17 14:13:05 +1000
commitc479d699d059bc58e6850d43b14f2e91c2076e12 (patch)
treeef9c059f377ab74a438d26f194bca4f7d1f76aac /src/tangara/audio
parent6c1757a1766180497dc5196193c9e81417074ba7 (diff)
downloadtangara-fw-c479d699d059bc58e6850d43b14f2e91c2076e12.tar.gz
Implements seeking to saved position for tracks
Diffstat (limited to 'src/tangara/audio')
-rw-r--r--src/tangara/audio/audio_events.hpp2
-rw-r--r--src/tangara/audio/audio_fsm.cpp2
-rw-r--r--src/tangara/audio/track_queue.cpp23
-rw-r--r--src/tangara/audio/track_queue.hpp1
4 files changed, 26 insertions, 2 deletions
diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp
index 56d150b2..89dc28ff 100644
--- a/src/tangara/audio/audio_events.hpp
+++ b/src/tangara/audio/audio_events.hpp
@@ -106,6 +106,8 @@ struct QueueUpdate : tinyfsm::Event {
kBulkLoadingUpdate,
};
Reason reason;
+
+ std::optional<uint32_t> seek_to_second;
};
struct StepUpVolume : tinyfsm::Event {};
diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp
index 71decd48..dd9f2fde 100644
--- a/src/tangara/audio/audio_fsm.cpp
+++ b/src/tangara/audio/audio_fsm.cpp
@@ -113,7 +113,7 @@ auto AudioState::emitPlaybackUpdate(bool paused) -> void {
void AudioState::react(const QueueUpdate& ev) {
SetTrack cmd{
.new_track = std::monostate{},
- .seek_to_second = {},
+ .seek_to_second = ev.seek_to_second,
};
auto current = sServices->track_queue().current();
diff --git a/src/tangara/audio/track_queue.cpp b/src/tangara/audio/track_queue.cpp
index 2c1faf96..ff24637b 100644
--- a/src/tangara/audio/track_queue.cpp
+++ b/src/tangara/audio/track_queue.cpp
@@ -85,6 +85,16 @@ auto notifyChanged(bool current_changed, Reason reason) -> void {
events::Audio().Dispatch(ev);
}
+auto notifyPlayFrom(uint32_t start_from_position) -> void {
+ QueueUpdate ev{
+ .current_changed = true,
+ .reason = Reason::kExplicitUpdate,
+ .seek_to_second = start_from_position,
+ };
+ events::Ui().Dispatch(ev);
+ events::Audio().Dispatch(ev);
+}
+
TrackQueue::TrackQueue(tasks::WorkerPool& bg_worker, database::Handle db)
: mutex_(),
bg_worker_(bg_worker),
@@ -109,6 +119,17 @@ auto TrackQueue::current() const -> TrackItem {
return val;
}
+auto TrackQueue::playFromPosition(const std::string& filepath,
+ uint32_t position) -> void {
+ clear();
+ {
+ const std::unique_lock<std::shared_mutex> lock(mutex_);
+ playlist_.append(filepath);
+ updateShuffler(true);
+ }
+ notifyPlayFrom(position);
+}
+
auto TrackQueue::currentPosition() const -> size_t {
const std::shared_lock<std::shared_mutex> lock(mutex_);
return position_;
@@ -245,7 +266,7 @@ auto TrackQueue::currentPosition(size_t position) -> bool {
goTo(position);
}
- // If we're explicitly setting the position, we want to treat it as though
+ // If we're explicitly setting the position, we want to treat it as though
// the current track has changed, even if the position was the same
notifyChanged(true, Reason::kExplicitUpdate);
return true;
diff --git a/src/tangara/audio/track_queue.hpp b/src/tangara/audio/track_queue.hpp
index a8d1dc3a..727b4be0 100644
--- a/src/tangara/audio/track_queue.hpp
+++ b/src/tangara/audio/track_queue.hpp
@@ -78,6 +78,7 @@ class TrackQueue {
auto open() -> bool;
auto openPlaylist(const std::string& playlist_file, bool notify = true)
-> bool;
+ auto playFromPosition(const std::string& filepath, uint32_t position) -> void;
using Item =
std::variant<database::TrackId, database::TrackIterator, std::string>;