From 88669ceaef02dfcbfa617b8ec50fe6888b2f29b9 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 18:56:03 +0530 Subject: [PATCH] Fixed Playback speed and pitch not working when CrossFade is enabled --- .../retromusic/service/CrossFadePlayer.kt | 21 ++++++++++++++++- .../retromusic/service/MultiPlayer.java | 23 +++++-------------- .../monkey/retromusic/service/MusicService.kt | 4 ++++ .../retromusic/service/playback/Playback.kt | 2 ++ .../monkey/retromusic/util/PreferenceUtil.kt | 13 +++++++++-- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 4f5e791ad..13c2310b0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -6,10 +6,12 @@ import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer +import android.media.PlaybackParams import android.media.audiofx.AudioEffect import android.os.PowerManager import android.util.Log import androidx.core.net.toUri +import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -18,6 +20,8 @@ import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch +import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed import kotlinx.coroutines.* /** @author Prathamesh M */ @@ -138,7 +142,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion /** * @param player The {@link MediaPlayer} to use - * @param path The path of the file, or the http/rtsp URL of the stream you want to play + * @param path The path of the file, or the http/rtsp URL of the stream you want to play * @return True if the player has been prepared and is ready to play, false otherwise */ private fun setDataSourceImpl( @@ -157,6 +161,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build() ) player.prepare() + player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) } catch (e: Exception) { e.printStackTrace() return false @@ -341,6 +346,20 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion crossFadeDuration = duration } + override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { + getCurrentPlayer()?.setPlaybackSpeedPitch(speed, pitch) + } + + private fun MediaPlayer.setPlaybackSpeedPitch(speed: Float, pitch: Float) { + if (hasMarshmallow()) { + val wasPlaying: Boolean = isPlaying + playbackParams = PlaybackParams().setSpeed(speed).setPitch(pitch) + if (!wasPlaying) { + if (isPlaying) pause() + } + } + } + companion object { val TAG: String = CrossFadePlayer::class.java.simpleName } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java index f5c8756bb..66556bbe0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java @@ -16,7 +16,6 @@ package code.name.monkey.retromusic.service; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.PlaybackParams; @@ -28,12 +27,10 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.preference.PreferenceManager; import org.jetbrains.annotations.NotNull; import code.name.monkey.appthemehelper.util.VersionUtils; -import code.name.monkey.retromusic.ConstantsKt; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.service.playback.Playback; import code.name.monkey.retromusic.util.PreferenceUtil; @@ -42,7 +39,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil; * @author Andrew Neal, Karim Abou Zeid (kabouzeid) */ public class MultiPlayer - implements Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, SharedPreferences.OnSharedPreferenceChangeListener { + implements Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener { public static final String TAG = MultiPlayer.class.getSimpleName(); private MediaPlayer mCurrentMediaPlayer = new MediaPlayer(); @@ -60,7 +57,6 @@ public class MultiPlayer MultiPlayer(final Context context) { this.context = context; mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); - PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this); } /** @@ -94,7 +90,7 @@ public class MultiPlayer } else { player.setDataSource(path); } - setPlaybackSpeedPitch(player); + setPlaybackSpeedPitch(PreferenceUtil.INSTANCE.getPlaybackSpeed(), PreferenceUtil.INSTANCE.getPlaybackPitch()); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.prepare(); } catch (Exception e) { @@ -208,7 +204,6 @@ public class MultiPlayer if (mNextMediaPlayer != null) { mNextMediaPlayer.release(); } - PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this); } /** @@ -359,20 +354,14 @@ public class MultiPlayer } @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (key.equals(ConstantsKt.PLAYBACK_SPEED) || key.equals(ConstantsKt.PLAYBACK_PITCH)) { - setPlaybackSpeedPitch(mCurrentMediaPlayer); - } - } - - public void setPlaybackSpeedPitch(MediaPlayer mp) { + public void setPlaybackSpeedPitch(float speed, float pitch) { if (VersionUtils.INSTANCE.hasMarshmallow()) { - boolean wasPlaying = mp.isPlaying(); - mp.setPlaybackParams(new PlaybackParams() + boolean wasPlaying = mCurrentMediaPlayer.isPlaying(); + mCurrentMediaPlayer.setPlaybackParams(new PlaybackParams() .setSpeed(PreferenceUtil.INSTANCE.getPlaybackSpeed()) .setPitch(PreferenceUtil.INSTANCE.getPlaybackPitch())); if (!wasPlaying) { - if (mp.isPlaying()) mp.pause(); + if (mCurrentMediaPlayer.isPlaying()) mCurrentMediaPlayer.pause(); } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 20796815c..4274978e0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -87,6 +87,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil.isClassicNotification import code.name.monkey.retromusic.util.PreferenceUtil.isHeadsetPlugged import code.name.monkey.retromusic.util.PreferenceUtil.isLockScreen import code.name.monkey.retromusic.util.PreferenceUtil.isPauseOnZeroVolume +import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed import code.name.monkey.retromusic.util.PreferenceUtil.registerOnSharedPreferenceChangedListener import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener @@ -695,6 +696,9 @@ class MusicService : MediaBrowserServiceCompat(), sharedPreferences: SharedPreferences, key: String, ) { when (key) { + PLAYBACK_SPEED, PLAYBACK_PITCH -> { + playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) + } CROSS_FADE_DURATION -> { val progress = songProgressMillis val wasPlaying = isPlaying diff --git a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt index 9a0ef73a7..4d98f3336 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt @@ -49,6 +49,8 @@ interface Playback { fun setCrossFadeDuration(duration: Int) + fun setPlaybackSpeedPitch(speed: Float, pitch: Float) + interface PlaybackCallbacks { fun onTrackWentToNext() diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index ffdee11b6..dcdbae20d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.util import android.content.Context import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.net.ConnectivityManager +import android.net.NetworkCapabilities import androidx.core.content.edit import androidx.core.content.getSystemService import androidx.core.content.res.use @@ -340,8 +341,14 @@ object PreferenceUtil { "always" -> true "only_wifi" -> { val connectivityManager = context.getSystemService() - val netInfo = connectivityManager?.activeNetworkInfo - netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting + if (VersionUtils.hasMarshmallow()) { + val network = connectivityManager?.activeNetwork + val capabilities = connectivityManager?.getNetworkCapabilities(network) + capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) + } else { + val netInfo = connectivityManager?.activeNetworkInfo + netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting + } } "never" -> false else -> false @@ -678,6 +685,8 @@ object PreferenceUtil { get() = sharedPreferences .getInt(CROSS_FADE_DURATION, 0) + val isCrossfadeEnabled get() = crossFadeDuration > 0 + val materialYou get() = sharedPreferences.getBoolean(MATERIAL_YOU, VersionUtils.hasS())