Fixed Playback speed and pitch not working when CrossFade is enabled

This commit is contained in:
Prathamesh More 2022-05-13 18:56:03 +05:30
parent 1cfa5aaac5
commit 88669ceaef
5 changed files with 43 additions and 20 deletions

View file

@ -6,10 +6,12 @@ import android.content.Intent
import android.media.AudioAttributes import android.media.AudioAttributes
import android.media.AudioManager import android.media.AudioManager
import android.media.MediaPlayer import android.media.MediaPlayer
import android.media.PlaybackParams
import android.media.audiofx.AudioEffect import android.media.audiofx.AudioEffect
import android.os.PowerManager import android.os.PowerManager
import android.util.Log import android.util.Log
import androidx.core.net.toUri import androidx.core.net.toUri
import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.MusicPlayerRemote 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.service.playback.Playback.PlaybackCallbacks
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil 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.* import kotlinx.coroutines.*
/** @author Prathamesh M */ /** @author Prathamesh M */
@ -138,7 +142,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
/** /**
* @param player The {@link MediaPlayer} to use * @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 <code>player</code> has been prepared and is ready to play, false otherwise * @return True if the <code>player</code> has been prepared and is ready to play, false otherwise
*/ */
private fun setDataSourceImpl( private fun setDataSourceImpl(
@ -157,6 +161,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build() AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build()
) )
player.prepare() player.prepare()
player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
return false return false
@ -341,6 +346,20 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
crossFadeDuration = duration 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 { companion object {
val TAG: String = CrossFadePlayer::class.java.simpleName val TAG: String = CrossFadePlayer::class.java.simpleName
} }

View file

@ -16,7 +16,6 @@ package code.name.monkey.retromusic.service;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.media.PlaybackParams; import android.media.PlaybackParams;
@ -28,12 +27,10 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import code.name.monkey.appthemehelper.util.VersionUtils; import code.name.monkey.appthemehelper.util.VersionUtils;
import code.name.monkey.retromusic.ConstantsKt;
import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.service.playback.Playback; import code.name.monkey.retromusic.service.playback.Playback;
import code.name.monkey.retromusic.util.PreferenceUtil; 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) * @author Andrew Neal, Karim Abou Zeid (kabouzeid)
*/ */
public class MultiPlayer 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(); public static final String TAG = MultiPlayer.class.getSimpleName();
private MediaPlayer mCurrentMediaPlayer = new MediaPlayer(); private MediaPlayer mCurrentMediaPlayer = new MediaPlayer();
@ -60,7 +57,6 @@ public class MultiPlayer
MultiPlayer(final Context context) { MultiPlayer(final Context context) {
this.context = context; this.context = context;
mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this);
} }
/** /**
@ -94,7 +90,7 @@ public class MultiPlayer
} else { } else {
player.setDataSource(path); player.setDataSource(path);
} }
setPlaybackSpeedPitch(player); setPlaybackSpeedPitch(PreferenceUtil.INSTANCE.getPlaybackSpeed(), PreferenceUtil.INSTANCE.getPlaybackPitch());
player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare(); player.prepare();
} catch (Exception e) { } catch (Exception e) {
@ -208,7 +204,6 @@ public class MultiPlayer
if (mNextMediaPlayer != null) { if (mNextMediaPlayer != null) {
mNextMediaPlayer.release(); mNextMediaPlayer.release();
} }
PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this);
} }
/** /**
@ -359,20 +354,14 @@ public class MultiPlayer
} }
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void setPlaybackSpeedPitch(float speed, float pitch) {
if (key.equals(ConstantsKt.PLAYBACK_SPEED) || key.equals(ConstantsKt.PLAYBACK_PITCH)) {
setPlaybackSpeedPitch(mCurrentMediaPlayer);
}
}
public void setPlaybackSpeedPitch(MediaPlayer mp) {
if (VersionUtils.INSTANCE.hasMarshmallow()) { if (VersionUtils.INSTANCE.hasMarshmallow()) {
boolean wasPlaying = mp.isPlaying(); boolean wasPlaying = mCurrentMediaPlayer.isPlaying();
mp.setPlaybackParams(new PlaybackParams() mCurrentMediaPlayer.setPlaybackParams(new PlaybackParams()
.setSpeed(PreferenceUtil.INSTANCE.getPlaybackSpeed()) .setSpeed(PreferenceUtil.INSTANCE.getPlaybackSpeed())
.setPitch(PreferenceUtil.INSTANCE.getPlaybackPitch())); .setPitch(PreferenceUtil.INSTANCE.getPlaybackPitch()));
if (!wasPlaying) { if (!wasPlaying) {
if (mp.isPlaying()) mp.pause(); if (mCurrentMediaPlayer.isPlaying()) mCurrentMediaPlayer.pause();
} }
} }
} }

View file

@ -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.isHeadsetPlugged
import code.name.monkey.retromusic.util.PreferenceUtil.isLockScreen import code.name.monkey.retromusic.util.PreferenceUtil.isLockScreen
import code.name.monkey.retromusic.util.PreferenceUtil.isPauseOnZeroVolume 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.playbackSpeed
import code.name.monkey.retromusic.util.PreferenceUtil.registerOnSharedPreferenceChangedListener import code.name.monkey.retromusic.util.PreferenceUtil.registerOnSharedPreferenceChangedListener
import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener
@ -695,6 +696,9 @@ class MusicService : MediaBrowserServiceCompat(),
sharedPreferences: SharedPreferences, key: String, sharedPreferences: SharedPreferences, key: String,
) { ) {
when (key) { when (key) {
PLAYBACK_SPEED, PLAYBACK_PITCH -> {
playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
}
CROSS_FADE_DURATION -> { CROSS_FADE_DURATION -> {
val progress = songProgressMillis val progress = songProgressMillis
val wasPlaying = isPlaying val wasPlaying = isPlaying

View file

@ -49,6 +49,8 @@ interface Playback {
fun setCrossFadeDuration(duration: Int) fun setCrossFadeDuration(duration: Int)
fun setPlaybackSpeedPitch(speed: Float, pitch: Float)
interface PlaybackCallbacks { interface PlaybackCallbacks {
fun onTrackWentToNext() fun onTrackWentToNext()

View file

@ -3,6 +3,7 @@ package code.name.monkey.retromusic.util
import android.content.Context import android.content.Context
import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.content.res.use import androidx.core.content.res.use
@ -340,8 +341,14 @@ object PreferenceUtil {
"always" -> true "always" -> true
"only_wifi" -> { "only_wifi" -> {
val connectivityManager = context.getSystemService<ConnectivityManager>() val connectivityManager = context.getSystemService<ConnectivityManager>()
val netInfo = connectivityManager?.activeNetworkInfo if (VersionUtils.hasMarshmallow()) {
netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting 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 "never" -> false
else -> false else -> false
@ -678,6 +685,8 @@ object PreferenceUtil {
get() = sharedPreferences get() = sharedPreferences
.getInt(CROSS_FADE_DURATION, 0) .getInt(CROSS_FADE_DURATION, 0)
val isCrossfadeEnabled get() = crossFadeDuration > 0
val materialYou val materialYou
get() = sharedPreferences.getBoolean(MATERIAL_YOU, VersionUtils.hasS()) get() = sharedPreferences.getBoolean(MATERIAL_YOU, VersionUtils.hasS())