From c6b960466b767c2d80a41d892b4c958a9dc71e55 Mon Sep 17 00:00:00 2001 From: unrenowned <163776820+unrenowned@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:27:18 +0000 Subject: [PATCH 1/7] playback: fix playNext crash on last song of queue Fixes OxygenCobalt/Auxio#735. ExoPlayer method for fetching next media item returns C.INDEX_UNSET (-1) when used on the last song of a queue, which is not a valid index for ExoPlayer.addMediaItems(). New code just adds songs to the end of the queue if there isn't a next song. --- .../org/oxycblt/auxio/playback/system/PlaybackService.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 0250a6a85..997e355a9 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 @@ -377,7 +377,14 @@ class PlaybackService : } override fun playNext(songs: List, ack: StateAck.PlayNext) { - player.addMediaItems(player.nextMediaItemIndex, songs.map { it.toMediaItem() }) + val nextIndex = player.nextMediaItemIndex + + if (nextIndex == C.INDEX_UNSET) { + player.addMediaItems(songs.map { it.toMediaItem() }) + } else { + player.addMediaItems(nextIndex, songs.map { it.toMediaItem() }) + } + playbackManager.ack(this, ack) deferSave() } From 1d9dc345494c59e82eb77894631c979726e856de Mon Sep 17 00:00:00 2001 From: unrenowned <163776820+unrenowned@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:40:42 +0000 Subject: [PATCH 2/7] playback: fix playNext wraparound with Repeat All ExoPlayer method for fetching next media item respects Repeat All, which on the last song of a queue causes playNext to wrap around and insert the songs at the start of the queue. New code fetches next song as if repeat were turned off, so the songs will always be added to the end of the queue. --- .../oxycblt/auxio/playback/system/PlaybackService.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 997e355a9..19b7136a8 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 @@ -377,7 +377,17 @@ class PlaybackService : } override fun playNext(songs: List, ack: StateAck.PlayNext) { - val nextIndex = player.nextMediaItemIndex + val currTimeline = player.currentTimeline + val nextIndex = + if (currTimeline.isEmpty) { + C.INDEX_UNSET + } else { + currTimeline.getNextWindowIndex( + player.currentMediaItemIndex, + Player.REPEAT_MODE_OFF, + player.shuffleModeEnabled + ) + } if (nextIndex == C.INDEX_UNSET) { player.addMediaItems(songs.map { it.toMediaItem() }) From 13a3a57365b877263c3f56f763d7c6dffa495c88 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 11:33:40 -0600 Subject: [PATCH 3/7] build: bump media --- media | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media b/media index 2cfefb8f3..f9a17d51d 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit 2cfefb8f39d84412920d17be4ba76ebaabf2d6a6 +Subproject commit f9a17d51d6b711cf29823fe543091e647d9f83fc From 6e05ef371cba8f59905c18bb225514849116cf80 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 12:11:23 -0600 Subject: [PATCH 4/7] home: handle playback decision event Forgot to add this. Resolves #734. --- CHANGELOG.md | 7 ++++++ .../org/oxycblt/auxio/home/HomeFragment.kt | 22 ++++++++++++++++--- .../playback/decision/PlayFromArtistDialog.kt | 2 +- .../playback/decision/PlayFromGenreDialog.kt | 2 +- .../auxio/playback/system/PlaybackService.kt | 5 +---- app/src/main/res/navigation/inner.xml | 4 ++-- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74f7b60b9..a9a877142 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## dev + +#### What's Fixed +- Fixed crash when using play next on the end of a queue or with a single-song queue +- Fixed weird behavior if using play next on the end of a queue with repeat all enabled +- Fixed artist choice dialog not showing up on home screen if playing from artist/genre was enabled + ## 3.4.2 #### What's Fixed diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index 41a1055a7..5744a389e 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -75,6 +75,7 @@ import org.oxycblt.auxio.music.PlaylistDecision import org.oxycblt.auxio.music.PlaylistMessage import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.external.M3U +import org.oxycblt.auxio.playback.PlaybackDecision import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collectImmediately @@ -214,12 +215,13 @@ class HomeFragment : collectImmediately(homeModel.currentTabType, ::updateCurrentTab) collectImmediately(homeModel.songList, homeModel.isFastScrolling, ::updateFab) collect(homeModel.speedDialOpen, ::updateSpeedDial) + collect(detailModel.toShow.flow, ::handleShow) collect(listModel.menu.flow, ::handleMenu) collectImmediately(listModel.selected, ::updateSelection) collectImmediately(musicModel.indexingState, ::updateIndexerState) - collect(musicModel.playlistDecision.flow, ::handleDecision) + collect(musicModel.playlistDecision.flow, ::handlePlaylistDecision) collectImmediately(musicModel.playlistMessage.flow, ::handlePlaylistMessage) - collect(detailModel.toShow.flow, ::handleShow) + collect(playbackModel.playbackDecision.flow, ::handlePlaybackDecision) } override fun onResume() { @@ -487,7 +489,7 @@ class HomeFragment : } } - private fun handleDecision(decision: PlaylistDecision?) { + private fun handlePlaylistDecision(decision: PlaylistDecision?) { if (decision == null) return val directions = when (decision) { @@ -539,6 +541,20 @@ class HomeFragment : musicModel.playlistMessage.consume() } + private fun handlePlaybackDecision(decision: PlaybackDecision?) { + when (decision) { + is PlaybackDecision.PlayFromArtist -> { + findNavController() + .navigateSafe(HomeFragmentDirections.playFromArtist(decision.song.uid)) + } + is PlaybackDecision.PlayFromGenre -> { + findNavController() + .navigateSafe(HomeFragmentDirections.playFromGenre(decision.song.uid)) + } + null -> {} + } + } + private fun updateFab(songs: List, isFastScrolling: Boolean) { updateFabVisibility(songs, isFastScrolling, homeModel.currentTabType.value) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt index 8e318ab3c..67f295466 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt @@ -70,7 +70,7 @@ class PlayFromArtistDialog : } playbackModel.playbackDecision.consume() - pickerModel.setPickerSongUid(args.artistUid) + pickerModel.setPickerSongUid(args.songUid) collectImmediately(pickerModel.currentPickerSong, ::updateSong) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt index 831e5c6e0..dfc522d3c 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt @@ -70,7 +70,7 @@ class PlayFromGenreDialog : } playbackModel.playbackDecision.consume() - pickerModel.setPickerSongUid(args.genreUid) + pickerModel.setPickerSongUid(args.songUid) collectImmediately(pickerModel.currentPickerSong, ::updateSong) } 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 19b7136a8..3fc93a7f8 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 @@ -383,10 +383,7 @@ class PlaybackService : C.INDEX_UNSET } else { currTimeline.getNextWindowIndex( - player.currentMediaItemIndex, - Player.REPEAT_MODE_OFF, - player.shuffleModeEnabled - ) + player.currentMediaItemIndex, Player.REPEAT_MODE_OFF, player.shuffleModeEnabled) } if (nextIndex == C.INDEX_UNSET) { diff --git a/app/src/main/res/navigation/inner.xml b/app/src/main/res/navigation/inner.xml index c688464cb..ff6f18d10 100644 --- a/app/src/main/res/navigation/inner.xml +++ b/app/src/main/res/navigation/inner.xml @@ -491,7 +491,7 @@ android:label="play_from_artist_dialog" tools:layout="@layout/dialog_music_choices"> @@ -501,7 +501,7 @@ android:label="play_from_genre_dialog" tools:layout="@layout/dialog_music_choices"> From 124fe18850887787e0573395e90a2d74ab1201ca Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 12:31:02 -0600 Subject: [PATCH 5/7] playback: re-add replaygain off mode It was honestly foolish for me to recommend retagging. Resolves #746. --- app/src/main/java/org/oxycblt/auxio/IntegerTable.kt | 2 +- .../java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt | 3 +++ .../auxio/playback/replaygain/ReplayGainAudioProcessor.kt | 5 +++++ app/src/main/res/values/settings.xml | 3 +++ app/src/main/res/values/strings.xml | 3 ++- 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt index 54d59eb50..271de0969 100644 --- a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt +++ b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt @@ -102,7 +102,7 @@ object IntegerTable { /** Sort.Mode.ByDateAdded */ const val SORT_BY_DATE_ADDED = 0xA118 /** ReplayGainMode.Off (No longer used but still reserved) */ - // const val REPLAY_GAIN_MODE_OFF = 0xA110 + const val REPLAY_GAIN_MODE_OFF = 0xA110 /** ReplayGainMode.Track */ const val REPLAY_GAIN_MODE_TRACK = 0xA111 /** ReplayGainMode.Album */ diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt index 5a19c7df3..012bdfce3 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt @@ -29,6 +29,8 @@ import org.oxycblt.auxio.R * @author Alexander Capehart (OxygenCobalt) */ enum class ReplayGainMode { + /** Do not apply any ReplayGain adjustments. */ + OFF, /** Apply the track gain, falling back to the album gain if the track gain is not found. */ TRACK, /** Apply the album gain, falling back to the track gain if the album gain is not found. */ @@ -45,6 +47,7 @@ enum class ReplayGainMode { */ fun fromIntCode(intCode: Int) = when (intCode) { + IntegerTable.REPLAY_GAIN_MODE_OFF -> OFF IntegerTable.REPLAY_GAIN_MODE_TRACK -> TRACK IntegerTable.REPLAY_GAIN_MODE_ALBUM -> ALBUM IntegerTable.REPLAY_GAIN_MODE_DYNAMIC -> DYNAMIC diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt index c94f32ae5..09168842d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt @@ -119,6 +119,11 @@ constructor( // ReplayGain is configurable, so determine what to do based off of the mode. val resolvedAdjustment = when (playbackSettings.replayGainMode) { + // User wants no adjustment. + ReplayGainMode.OFF -> { + logD("ReplayGain is off") + null + } // User wants track gain to be preferred. Default to album gain only if // there is no track gain. ReplayGainMode.TRACK -> { diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index f5c45132a..49dbceebd 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -139,12 +139,14 @@ + @string/set_replay_gain_mode_off @string/set_replay_gain_mode_track @string/set_replay_gain_mode_album @string/set_replay_gain_mode_dynamic + @integer/replay_gain_off @integer/replay_gain_track @integer/replay_gain_album @integer/replay_gain_dynamic @@ -161,6 +163,7 @@ 0xA122 0xA124 + 0xA110 0xA111 0xA112 0xA113 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a465a49c..e4431dacd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,8 +290,9 @@ Pause when a song repeats Remember pause Remain playing/paused when skipping or editing queue - ReplayGain + Volume normalization ReplayGain strategy + Off Prefer track Prefer album Prefer album if one is playing From d7ea08cccd133c6150cebef882fb62e0180da1c6 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 14:47:04 -0600 Subject: [PATCH 6/7] build: bump to 3.4.3 Bump to version 3.4.3 (44). --- CHANGELOG.md | 3 +++ README.md | 4 ++-- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/44.txt | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/44.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a877142..da465569a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev +#### What's Improved +- Added back option disable ReplayGain for poorly tagged libraries + #### What's Fixed - Fixed crash when using play next on the end of a queue or with a single-song queue - Fixed weird behavior if using play next on the end of a queue with repeat all enabled diff --git a/README.md b/README.md index 03010bdbe..168184c01 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@

Auxio

A simple, rational music player for android.

- - Latest Version + + Latest Version Releases diff --git a/app/build.gradle b/app/build.gradle index 868e7d8f3..147514045 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { defaultConfig { applicationId namespace - versionName "3.4.2" - versionCode 43 + versionName "3.4.3" + versionCode 44 minSdk 24 targetSdk 34 diff --git a/fastlane/metadata/android/en-US/changelogs/44.txt b/fastlane/metadata/android/en-US/changelogs/44.txt new file mode 100644 index 000000000..005811807 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/44.txt @@ -0,0 +1,3 @@ +Auxio 3.4.0 adds gapless playback and new widget designs, alongside a variety of fixes. +This release fixes issues identified in the previous version. +For more information, see https://github.com/OxygenCobalt/Auxio/releases/tag/v3.4.3 \ No newline at end of file From c35ede67b055f25c57431e456c70c0fe54f33786 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 14:47:30 -0600 Subject: [PATCH 7/7] build: bump media --- media | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media b/media index f9a17d51d..e585deaa9 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit f9a17d51d6b711cf29823fe543091e647d9f83fc +Subproject commit e585deaa94cc679ab4fd0a653cc1bf67abb54b7e