From f7787e45ec513cea80f47d8138cb05d9ac365f58 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 12 Jan 2023 04:34:47 -0800 Subject: [PATCH] Expose current position for XMP --- src/audio/music_player.cpp | 2 ++ src/audio/xmp.cpp | 10 ++++++++++ src/audio/xmp.hpp | 1 + src/audio/xmp_player.cpp | 5 +++++ src/audio/xmp_player.hpp | 1 + 5 files changed, 19 insertions(+) diff --git a/src/audio/music_player.cpp b/src/audio/music_player.cpp index bb85a01de..d1801e65b 100644 --- a/src/audio/music_player.cpp +++ b/src/audio/music_player.cpp @@ -260,6 +260,8 @@ public: return ogg_inst_->position_seconds(); if (gme_inst_) return gme_inst_->position_seconds(); + if (xmp_inst_) + return xmp_inst_->position_seconds(); return std::nullopt; } diff --git a/src/audio/xmp.cpp b/src/audio/xmp.cpp index 9e88f2a7f..574792a2d 100644 --- a/src/audio/xmp.cpp +++ b/src/audio/xmp.cpp @@ -116,6 +116,16 @@ float Xmp::duration_seconds() const { return static_cast(info.total_time) / 1000.f; } +template +float Xmp::position_seconds() const { + SRB2_ASSERT(instance_ != nullptr); + SRB2_ASSERT(module_loaded_ == true); + + xmp_frame_info info; + xmp_get_frame_info(instance_, &info); + return static_cast(info.time) / 1000.f; +} + template void Xmp::seek(int position_ms) { SRB2_ASSERT(instance_ != nullptr); diff --git a/src/audio/xmp.hpp b/src/audio/xmp.hpp index a5b443bfa..a0cbc8538 100644 --- a/src/audio/xmp.hpp +++ b/src/audio/xmp.hpp @@ -56,6 +56,7 @@ public: void looping(bool looping) { looping_ = looping; }; void reset(); float duration_seconds() const; + float position_seconds() const; void seek(int position_ms); ~Xmp(); diff --git a/src/audio/xmp_player.cpp b/src/audio/xmp_player.cpp index a08ee8bb5..e2bcb703b 100644 --- a/src/audio/xmp_player.cpp +++ b/src/audio/xmp_player.cpp @@ -48,6 +48,11 @@ float XmpPlayer::duration_seconds() const { return xmp_.duration_seconds(); } +template +float XmpPlayer::position_seconds() const { + return xmp_.position_seconds(); +} + template void XmpPlayer::seek(float position_seconds) { xmp_.seek(static_cast(std::round(position_seconds * 1000.f))); diff --git a/src/audio/xmp_player.hpp b/src/audio/xmp_player.hpp index 5829dbd8a..ed24689cd 100644 --- a/src/audio/xmp_player.hpp +++ b/src/audio/xmp_player.hpp @@ -37,6 +37,7 @@ public: void looping(bool looping) { xmp_.looping(looping); } void reset() { xmp_.reset(); } float duration_seconds() const; + float position_seconds() const; void seek(float position_seconds); };