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.
-
-
+
+
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