new: add playback speed control

This commit is contained in:
2026-07-03 10:37:28 +02:00
parent 9aaffdc363
commit 3847f46adb
20 changed files with 618 additions and 80 deletions
@@ -136,6 +136,10 @@ internal class PlaybackRepositoryImpl(
audioPlayer.seekTo(position)
}
override fun setSpeed(speed: Float) {
audioPlayer.setSpeed(speed)
}
override fun seekToSentence(sentenceIndex: Int) {
val matchingSubtitleLine = subtitle.value.lines.getOrNull(sentenceIndex) ?: return
audioPlayer.seekTo(matchingSubtitleLine.startTime)
@@ -25,6 +25,8 @@ interface PlaybackRepository {
fun seekTo(position: Duration)
fun setSpeed(speed: Float)
fun seekToSentence(sentenceIndex: Int)
fun goToPreviousSentence()
@@ -1,6 +1,7 @@
package fr.ajaury.gwenedeg.preferences.data
import fr.ajaury.gwenedeg.preferences.domain.PreferencesRepository
import fr.ajaury.gwenedeg.preferences.model.PlaybackPreferences
import fr.ajaury.gwenedeg.preferences.model.SubtitlePreferences
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -8,14 +9,21 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
internal class PreferencesRepositoryImpl : PreferencesRepository {
private val state = MutableStateFlow(SubtitlePreferences())
override val subtitlePreferences: StateFlow<SubtitlePreferences> = state.asStateFlow()
private val subtitleState = MutableStateFlow(SubtitlePreferences())
override val subtitlePreferences: StateFlow<SubtitlePreferences> = subtitleState.asStateFlow()
private val playbackState = MutableStateFlow(PlaybackPreferences())
override val playbackPreferences: StateFlow<PlaybackPreferences> = playbackState.asStateFlow()
override fun setShowTranscription(enabled: Boolean) {
state.update { it.copy(showTranscription = enabled) }
subtitleState.update { it.copy(showTranscription = enabled) }
}
override fun setShowTranslation(enabled: Boolean) {
state.update { it.copy(showTranslation = enabled) }
subtitleState.update { it.copy(showTranslation = enabled) }
}
override fun setPlaybackSpeed(speed: Float) {
playbackState.update { it.copy(speed = speed) }
}
}
@@ -1,12 +1,17 @@
package fr.ajaury.gwenedeg.preferences.domain
import fr.ajaury.gwenedeg.preferences.model.PlaybackPreferences
import fr.ajaury.gwenedeg.preferences.model.SubtitlePreferences
import kotlinx.coroutines.flow.StateFlow
interface PreferencesRepository {
val subtitlePreferences: StateFlow<SubtitlePreferences>
val playbackPreferences: StateFlow<PlaybackPreferences>
fun setShowTranscription(enabled: Boolean)
fun setShowTranslation(enabled: Boolean)
fun setPlaybackSpeed(speed: Float)
}
@@ -0,0 +1,18 @@
package fr.ajaury.gwenedeg.preferences.model
/**
* User preferences controlling audio playback.
*
* @property speed playback speed multiplier, clamped between [MIN_SPEED] and [MAX_SPEED] in
* [SPEED_STEP] increments. [DEFAULT_SPEED] is the normal, unaltered speed.
*/
data class PlaybackPreferences(
val speed: Float = DEFAULT_SPEED,
) {
companion object {
const val DEFAULT_SPEED = 1f
const val MIN_SPEED = 0.5f
const val MAX_SPEED = 1f
const val SPEED_STEP = 0.1f
}
}