new: allow user to seek a position in the record

This commit is contained in:
2026-06-19 13:53:10 +02:00
parent 511e3b5b9a
commit 7720a71825
7 changed files with 48 additions and 3 deletions
@@ -49,6 +49,10 @@ class AndroidAudioPlayer(
?.milliseconds
?: 0.milliseconds
override fun seekTo(position: Duration) {
player.seekTo(position.inWholeMilliseconds)
}
override fun load(uri: String) {
val mediaItem = MediaItem.fromUri(uri)
player.setMediaItem(mediaItem)
@@ -10,6 +10,8 @@ interface AudioPlayer {
val duration: Duration
fun seekTo(position: Duration)
fun play()
fun pause()
@@ -13,7 +13,9 @@ import platform.AVFoundation.duration
import platform.AVFoundation.pause
import platform.AVFoundation.play
import platform.AVFoundation.replaceCurrentItemWithPlayerItem
import platform.AVFoundation.seekToTime
import platform.CoreMedia.CMTimeGetSeconds
import platform.CoreMedia.CMTimeMakeWithSeconds
import platform.Foundation.NSNotificationCenter
import platform.Foundation.NSOperationQueue
import platform.Foundation.NSURL
@@ -45,6 +47,12 @@ class IosAudioPlayer : AudioPlayer {
return seconds?.seconds ?: 0.milliseconds
}
@OptIn(ExperimentalForeignApi::class)
override fun seekTo(position: Duration) {
val seconds = position.inWholeSeconds
player?.seekToTime(CMTimeMakeWithSeconds(seconds.toDouble(), preferredTimescale = 1000))
}
@OptIn(ExperimentalForeignApi::class)
override fun load(uri: String) {
release()
@@ -33,6 +33,10 @@ class JvmAudioPlayer : AudioPlayer {
override val duration: Duration
get() = (clip?.microsecondLength ?: 0L).microseconds
override fun seekTo(position: Duration) {
clip?.microsecondPosition = position.inWholeMicroseconds
}
override fun load(uri: String) {
release()
@@ -20,6 +20,10 @@ class WebAudioPlayer : AudioPlayer {
override val duration: Duration
get() = (audio?.duration?.takeIf { it.isFinite() } ?: 0.0).seconds
override fun seekTo(position: Duration) {
audio?.currentTime = position.inWholeMicroseconds.toDouble()
}
override fun load(uri: String) {
release()