From d16a9c234f7427915fd1149c19ff8c42780b6ebf Mon Sep 17 00:00:00 2001 From: Pascal Grittmann Date: Sat, 24 Jan 2026 17:39:57 +0100 Subject: [PATCH] feat: Playback speed controls for music (#376) Enable playback speed controls for music Button is moved to the top left, next to bit rate, because it would overlap with the "shuffle" button. The speed rotation logic was cleaned up to 0.25x increments without all the hard-coded constants and code duplication. Co-authored-by: eddyizm --- .../tempo/ui/activity/MainActivity.java | 2 +- .../ui/fragment/PlayerControllerFragment.java | 36 +++++-------------- .../cappielloantonio/tempo/util/Constants.kt | 7 ---- ...nner_fragment_player_controller_layout.xml | 34 +++++++++--------- 4 files changed, 26 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java b/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java index e0567913..1a75b242 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java @@ -354,7 +354,7 @@ public class MainActivity extends BaseActivity { // TODO Enter all settings to be reset Preferences.setOpenSubsonic(false); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_100); + Preferences.setPlaybackSpeed(1.0f); Preferences.setSkipSilenceMode(false); Preferences.setDataSavingMode(false); Preferences.setStarredSyncEnabled(false); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java index e3155b56..f45b5061 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java @@ -413,10 +413,10 @@ public class PlayerControllerFragment extends Fragment { bind.getRoot().setShowNextButton(true); bind.getRoot().setShowFastForwardButton(false); bind.getRoot().setRepeatToggleModes(RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL | RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE); - bind.getRoot().findViewById(R.id.player_playback_speed_button).setVisibility(View.GONE); + bind.getRoot().findViewById(R.id.player_playback_speed_button).setVisibility(View.VISIBLE); bind.getRoot().findViewById(R.id.player_skip_silence_toggle_button).setVisibility(View.GONE); bind.getRoot().findViewById(R.id.button_favorite).setVisibility(View.VISIBLE); - resetPlaybackParameters(mediaBrowser); + setPlaybackParameters(mediaBrowser); break; } } @@ -524,31 +524,11 @@ public class PlayerControllerFragment extends Fragment { playbackSpeedButton.setOnClickListener(view -> { float currentSpeed = Preferences.getPlaybackSpeed(); - if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_080) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_100)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_100)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_100); - } else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_100) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_125)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_125)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_125); - } else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_125) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_150)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_150)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_150); - } else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_150) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_175)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_175)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_175); - } else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_175) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_200)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_200)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_200); - } else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_200) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_080)); - playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_080)); - Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_080); - } + currentSpeed += 0.25f; + if (currentSpeed > 2.0f) currentSpeed = 0.5f; + mediaBrowser.setPlaybackParameters(new PlaybackParameters(currentSpeed)); + playbackSpeedButton.setText(getString(R.string.player_playback_speed, currentSpeed)); + Preferences.setPlaybackSpeed(currentSpeed); }); skipSilenceToggleButton.setOnClickListener(view -> { @@ -600,7 +580,7 @@ public class PlayerControllerFragment extends Fragment { } private void resetPlaybackParameters(MediaBrowser mediaBrowser) { - mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_100)); + mediaBrowser.setPlaybackParameters(new PlaybackParameters(1.0f)); // TODO Resettare lo skip del silenzio } diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt index 2ae3dbb0..7d2224ed 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt @@ -61,13 +61,6 @@ object Constants { const val MEDIA_TYPE_VIDEO = "video" const val MEDIA_TYPE_RADIO = "radio" - const val MEDIA_PLAYBACK_SPEED_080 = 0.8f - const val MEDIA_PLAYBACK_SPEED_100 = 1.0f - const val MEDIA_PLAYBACK_SPEED_125 = 1.25f - const val MEDIA_PLAYBACK_SPEED_150 = 1.50f - const val MEDIA_PLAYBACK_SPEED_175 = 1.75f - const val MEDIA_PLAYBACK_SPEED_200 = 2.0f - const val MEDIA_RECENTLY_PLAYED = "MEDIA_RECENTLY_PLAYED" const val MEDIA_MOST_PLAYED = "MEDIA_MOST_PLAYED" const val MEDIA_RECENTLY_ADDED = "MEDIA_RECENTLY_ADDED" diff --git a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml index 29747587..8fab7c84 100644 --- a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml +++ b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml @@ -16,6 +16,23 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> +