summaryrefslogtreecommitdiff
path: root/src/tangara/audio
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-09-24 15:24:16 +1000
committerjacqueline <me@jacqueline.id.au>2024-09-24 15:24:16 +1000
commitfaddb229fcf1417dd283ae43fb26fbf5b3ceaf19 (patch)
tree80dd36ae8422d5625d92fb138bd090b2058fe3f2 /src/tangara/audio
parent5e43b422182b300074a2d2e02736557d34434996 (diff)
downloadtangara-fw-faddb229fcf1417dd283ae43fb26fbf5b3ceaf19.tar.gz
Record play_count in TrackData, incrementing it when tracks finish
Diffstat (limited to 'src/tangara/audio')
-rw-r--r--src/tangara/audio/audio_fsm.cpp19
-rw-r--r--src/tangara/audio/audio_fsm.hpp5
2 files changed, 21 insertions, 3 deletions
diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp
index f9823fb3..c6ac75f0 100644
--- a/src/tangara/audio/audio_fsm.cpp
+++ b/src/tangara/audio/audio_fsm.cpp
@@ -91,7 +91,8 @@ auto AudioState::emitPlaybackUpdate(bool paused) -> void {
}
// If we've got an elapsed duration and it's more than 5 minutes
- // increment a counter. Every 60 counts (ie, every minute) save the current elapsed position
+ // increment a counter. Every 60 counts (ie, every minute) save the current
+ // elapsed position
if (position && *position > (5 * 60)) {
sUpdateCounter++;
if (sUpdateCounter >= 60) {
@@ -232,6 +233,7 @@ void AudioState::react(const internal::DecodingFinished& ev) {
}
if (path == ev.track->uri) {
queue.finish();
+ incrementPlayCount(ev.track->uri);
}
});
}
@@ -399,7 +401,8 @@ void AudioState::react(const OutputModeChanged& ev) {
}
}
-auto AudioState::updateSavedPosition(std::string uri, uint32_t position)
+auto AudioState::updateTrackData(std::string uri,
+ std::function<void(database::TrackData&)> fn)
-> void {
sServices->bg_worker().Dispatch<void>([=]() {
auto db = sServices->database().lock();
@@ -415,11 +418,21 @@ auto AudioState::updateSavedPosition(std::string uri, uint32_t position)
return;
}
auto data = track->data().clone();
- data->last_position = position;
+ std::invoke(fn, *data);
db->setTrackData(*id, *data);
});
}
+auto AudioState::updateSavedPosition(std::string uri, uint32_t position)
+ -> void {
+ updateTrackData(
+ uri, [&](database::TrackData& data) { data.last_position = position; });
+}
+
+auto AudioState::incrementPlayCount(std::string uri) -> void {
+ updateTrackData(uri, [&](database::TrackData& data) { data.play_count++; });
+}
+
auto AudioState::updateOutputMode() -> void {
if (is_in_state<states::Playback>() || sIsTtsPlaying) {
sOutput->mode(IAudioOutput::Modes::kOnPlaying);
diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp
index c765b417..fb42e387 100644
--- a/src/tangara/audio/audio_fsm.hpp
+++ b/src/tangara/audio/audio_fsm.hpp
@@ -76,6 +76,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
auto commitVolume() -> void;
auto updateSavedPosition(std::string uri, uint32_t position) -> void;
+ auto incrementPlayCount(std::string uri) -> void;
static std::shared_ptr<system_fsm::ServiceLocator> sServices;
@@ -94,6 +95,10 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
static bool sIsPaused;
static uint8_t sUpdateCounter;
static bool sIsTtsPlaying;
+
+ private:
+ auto updateTrackData(std::string uri,
+ std::function<void(database::TrackData&)>) -> void;
};
namespace states {