playback: fix queue adding with one-song queues

Fix an issue where with queues of one-song, adding another song with
"Play next" results in it going behind the current song. This stemmed
from a fix for a crash with empty queues, so instead of doing some
insane min/max logic we just check if the queue is empty and just don't
add the item if it is. It will only get overwritten anyway.
This commit is contained in:
OxygenCobalt 2022-01-13 20:24:02 -07:00
parent ddf2757cb6
commit 4dcc3c3b69
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
2 changed files with 20 additions and 8 deletions

View file

@ -30,8 +30,6 @@ import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.logE
import kotlin.math.max
import kotlin.math.min
/** /**
* Master class (and possible god object) for the playback state. * Master class (and possible god object) for the playback state.
@ -319,7 +317,11 @@ class PlaybackStateManager private constructor() {
* Add a [song] to the top of the queue. * Add a [song] to the top of the queue.
*/ */
fun playNext(song: Song) { fun playNext(song: Song) {
mQueue.add(min(mIndex + 1, max(mQueue.lastIndex, 0)), song) if (mQueue.isEmpty()) {
return
}
mQueue.add(mIndex + 1, song)
pushQueueUpdate() pushQueueUpdate()
} }
@ -327,7 +329,11 @@ class PlaybackStateManager private constructor() {
* Add a list of [songs] to the top of the queue. * Add a list of [songs] to the top of the queue.
*/ */
fun playNext(songs: List<Song>) { fun playNext(songs: List<Song>) {
mQueue.addAll(min(mIndex + 1, max(mQueue.lastIndex, 0)), songs) if (mQueue.isEmpty()) {
return
}
mQueue.addAll(mIndex + 1, songs)
pushQueueUpdate() pushQueueUpdate()
} }

View file

@ -43,6 +43,7 @@ class AudioReactor(
private val callback: (Float) -> Unit private val callback: (Float) -> Unit
) : AudioManager.OnAudioFocusChangeListener, SettingsManager.Callback { ) : AudioManager.OnAudioFocusChangeListener, SettingsManager.Callback {
private data class Gain(val track: Float, val album: Float) private data class Gain(val track: Float, val album: Float)
private data class GainTag(val key: String, val value: Float)
private val playbackManager = PlaybackStateManager.getInstance() private val playbackManager = PlaybackStateManager.getInstance()
private val settingsManager = SettingsManager.getInstance() private val settingsManager = SettingsManager.getInstance()
@ -60,6 +61,8 @@ class AudioReactor(
.build() .build()
private var pauseWasTransient = false private var pauseWasTransient = false
// It's good to keep the volume and the ducking multiplier separate so that we can
private var multiplier = 1f private var multiplier = 1f
set(value) { set(value) {
field = value field = value
@ -103,17 +106,21 @@ class AudioReactor(
return return
} }
// User wants track gain to be preferred // User wants track gain to be preferred. Default to album gain only if there
// is no track gain.
ReplayGainMode.TRACK -> ReplayGainMode.TRACK ->
{ gain -> { gain ->
gain.track == 0f gain.track == 0f
} }
// User wants album gain to be preferred. Default to track gain only if there
// is no album gain.
ReplayGainMode.ALBUM -> ReplayGainMode.ALBUM ->
{ gain -> { gain ->
gain.album != 0f gain.album != 0f
} }
// User wants album gain to be used when in an album, track gain otherwise.
ReplayGainMode.DYNAMIC -> ReplayGainMode.DYNAMIC ->
{ _ -> { _ ->
playbackManager.parent is Album && playbackManager.parent is Album &&
@ -131,6 +138,7 @@ class AudioReactor(
gain.track gain.track
} }
} else { } else {
// No gain tags were present
0f 0f
} }
@ -140,8 +148,6 @@ class AudioReactor(
} }
private fun parseReplayGain(metadata: Metadata): Gain? { private fun parseReplayGain(metadata: Metadata): Gain? {
data class GainTag(val key: String, val value: Float)
var trackGain = 0f var trackGain = 0f
var albumGain = 0f var albumGain = 0f
var found = false var found = false
@ -213,7 +219,7 @@ class AudioReactor(
} }
/** /**
* Abandon the current focus request, functionally "Destroying it". * Abandon the current focus request and any callbacks
*/ */
fun release() { fun release() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, request) AudioManagerCompat.abandonAudioFocusRequest(audioManager, request)