From e099d1c38c95d04dd70cdd7a9bd2624e9c572d26 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Fri, 7 Jan 2022 15:56:43 -0700 Subject: [PATCH] playback: switch audioreactor to callback system Switch AudioReactor to a callback-based system. This makes updating the volume much faster, as it's no longer reliant on a 500ms polling interval. --- .../auxio/playback/system/AudioReactor.kt | 18 ++++++++++++++---- .../auxio/playback/system/PlaybackService.kt | 15 ++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt index 981ff54ba..dfc2ac6a1 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt @@ -37,7 +37,10 @@ import kotlin.math.pow * Manages the current volume and playback state across ReplayGain and AudioFocus events. * @author OxygenCobalt */ -class AudioReactor(context: Context) : AudioManager.OnAudioFocusChangeListener, SettingsManager.Callback { +class AudioReactor( + context: Context, + private val callback: (Float) -> Unit +) : AudioManager.OnAudioFocusChangeListener, SettingsManager.Callback { private data class Gain(val track: Float, val album: Float) private val playbackManager = PlaybackStateManager.maybeGetInstance() @@ -55,12 +58,19 @@ class AudioReactor(context: Context) : AudioManager.OnAudioFocusChangeListener, .setOnAudioFocusChangeListener(this) .build() - private var multiplier = 1f private var pauseWasTransient = false + private var multiplier = 1f + set(value) { + field = value + callback(volume) + } - var volume = 0f + private var volume = 0f get() = field * multiplier - private set + set(value) { + field = value + callback(volume) + } init { settingsManager.addCallback(this) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 3a18374a0..d3e7598f7 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -126,9 +126,13 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac false ) + audioReactor = AudioReactor(this) { volume -> + logD("Updating player volume to $volume") + player.volume = volume + } + // --- SYSTEM SETUP --- - audioReactor = AudioReactor(this) widgets = WidgetController(this) // Set up the media button callbacks @@ -402,19 +406,16 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac * Start polling the position on a coroutine. */ private fun startPolling() { - data class Poll(val pos: Long, val multiplier: Float) - val pollFlow = flow { while (true) { - emit(Poll(player.currentPosition, audioReactor.volume)) + emit(player.currentPosition) delay(POS_POLL_INTERVAL) } }.conflate() serviceScope.launch { - pollFlow.takeWhile { player.isPlaying }.collect { poll -> - playbackManager.setPosition(poll.pos) - player.volume = audioReactor.volume + pollFlow.takeWhile { player.isPlaying }.collect { pos -> + playbackManager.setPosition(pos) } } }