diff --git a/CHANGELOG.md b/CHANGELOG.md index 74f7b60b9..da465569a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 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 +- 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/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/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/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/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/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 0250a6a85..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 @@ -377,7 +377,21 @@ class PlaybackService : } override fun playNext(songs: List, ack: StateAck.PlayNext) { - player.addMediaItems(player.nextMediaItemIndex, songs.map { it.toMediaItem() }) + 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() }) + } else { + player.addMediaItems(nextIndex, songs.map { it.toMediaItem() }) + } + playbackManager.ack(this, ack) deferSave() } 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"> 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 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 diff --git a/media b/media index 2cfefb8f3..e585deaa9 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit 2cfefb8f39d84412920d17be4ba76ebaabf2d6a6 +Subproject commit e585deaa94cc679ab4fd0a653cc1bf67abb54b7e