Fixed Playback speed and pitch not working when CrossFade is enabled
This commit is contained in:
parent
1cfa5aaac5
commit
88669ceaef
5 changed files with 43 additions and 20 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue