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.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 <code>player</code> 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
}

View file

@ -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();
}
}
}

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

View file

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

View file

@ -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<ConnectivityManager>()
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())