[CrossFade] Cleanup

This commit is contained in:
Prathamesh More 2022-05-31 16:41:18 +05:30
parent 61895b666c
commit 931a0345a4
2 changed files with 36 additions and 32 deletions

View file

@ -10,29 +10,26 @@ import code.name.monkey.retromusic.util.PreferenceUtil
class AudioFader { class AudioFader {
companion object { companion object {
@JvmStatic
inline fun createFadeAnimator( inline fun createFadeAnimator(
fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/ fadeInMp: MediaPlayer,
mediaPlayer: MediaPlayer, fadeOutMp: MediaPlayer,
crossinline endAction: (animator: Animator) -> Unit, /* Code to run when Animator Ends*/ crossinline endAction: (animator: Animator) -> Unit, /* Code to run when Animator Ends*/
): Animator? { ): Animator? {
val duration = PreferenceUtil.crossFadeDuration * 1000 val duration = PreferenceUtil.crossFadeDuration * 1000
if (duration == 0) { if (duration == 0) {
return null return null
} }
val startValue = if (fadeIn) 0f else 1.0f return ValueAnimator.ofFloat(1f, 0f).apply {
val endValue = if (fadeIn) 1.0f else 0f
return ValueAnimator.ofFloat(startValue, endValue).apply {
this.duration = duration.toLong() this.duration = duration.toLong()
addUpdateListener { animation: ValueAnimator -> addUpdateListener { animation: ValueAnimator ->
mediaPlayer.setVolume( fadeInMp.setVolume(
animation.animatedValue as Float, animation.animatedValue as Float animation.animatedValue as Float, animation.animatedValue as Float
) )
fadeOutMp.setVolume(1 - animation.animatedValue as Float,
1 - animation.animatedValue as Float)
} }
doOnEnd { doOnEnd {
endAction(it) endAction(it)
// Set end values
mediaPlayer.setVolume(endValue, endValue)
} }
} }
} }

View file

@ -34,10 +34,10 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
private var durationListener = DurationListener() private var durationListener = DurationListener()
private var mIsInitialized = false private var mIsInitialized = false
private var hasDataSource: Boolean = false /* Whether first player has DataSource */ private var hasDataSource: Boolean = false /* Whether first player has DataSource */
private var fadeInAnimator: Animator? = null private var crossFadeAnimator: Animator? = null
private var fadeOutAnimator: Animator? = null
override var callbacks: PlaybackCallbacks? = null override var callbacks: PlaybackCallbacks? = null
private var crossFadeDuration = PreferenceUtil.crossFadeDuration private var crossFadeDuration = PreferenceUtil.crossFadeDuration
private var isCrossFading = false
init { init {
player1.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) player1.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK)
@ -48,8 +48,12 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
override fun start(): Boolean { override fun start(): Boolean {
super.start() super.start()
durationListener.start() durationListener.start()
resumeFade()
return try { return try {
getCurrentPlayer()?.start() getCurrentPlayer()?.start()
if (isCrossFading) {
getNextPlayer()?.start()
}
true true
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
e.printStackTrace() e.printStackTrace()
@ -58,9 +62,11 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
} }
override fun release() { override fun release() {
stop()
cancelFade()
getCurrentPlayer()?.release() getCurrentPlayer()?.release()
getNextPlayer()?.release() getNextPlayer()?.release()
durationListener.stop() durationListener.cancel()
} }
override fun stop() { override fun stop() {
@ -72,7 +78,7 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
override fun pause(): Boolean { override fun pause(): Boolean {
super.pause() super.pause()
durationListener.stop() durationListener.stop()
cancelFade() pauseFade()
getCurrentPlayer()?.let { getCurrentPlayer()?.let {
if (it.isPlaying) { if (it.isPlaying) {
it.pause() it.pause()
@ -87,7 +93,6 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
} }
override fun seek(whereto: Int): Int { override fun seek(whereto: Int): Int {
cancelFade()
getNextPlayer()?.stop() getNextPlayer()?.stop()
return try { return try {
getCurrentPlayer()?.seekTo(whereto) getCurrentPlayer()?.seekTo(whereto)
@ -120,7 +125,6 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
force: Boolean, force: Boolean,
completion: (success: Boolean) -> Unit, completion: (success: Boolean) -> Unit,
) { ) {
cancelFade()
if (force) hasDataSource = false if (force) hasDataSource = false
mIsInitialized = false mIsInitialized = false
/* We've already set DataSource if initialized is true in setNextDataSource */ /* We've already set DataSource if initialized is true in setNextDataSource */
@ -221,25 +225,29 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
} }
} }
private fun fadeIn(mediaPlayer: MediaPlayer) { private fun crossFade(fadeInMp: MediaPlayer, fadeOutMp: MediaPlayer) {
fadeInAnimator = createFadeAnimator(true, mediaPlayer) { isCrossFading = true
fadeInAnimator = null crossFadeAnimator = createFadeAnimator(fadeInMp, fadeOutMp) {
crossFadeAnimator = null
durationListener.start() durationListener.start()
isCrossFading = false
} }
fadeInAnimator?.start() crossFadeAnimator?.start()
}
private fun fadeOut(mediaPlayer: MediaPlayer) {
fadeOutAnimator = createFadeAnimator(false, mediaPlayer) {
fadeOutAnimator = null
mediaPlayer.stop()
}
fadeOutAnimator?.start()
} }
private fun cancelFade() { private fun cancelFade() {
fadeInAnimator = null crossFadeAnimator?.cancel()
fadeOutAnimator = null crossFadeAnimator = null
}
private fun pauseFade() {
crossFadeAnimator?.pause()
}
private fun resumeFade() {
if (crossFadeAnimator?.isPaused == true) {
crossFadeAnimator?.resume()
}
} }
override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean {
@ -283,9 +291,9 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
if (total > 0 && (total - progress).div(1000) == crossFadeDuration) { if (total > 0 && (total - progress).div(1000) == crossFadeDuration) {
getNextPlayer()?.let { player -> getNextPlayer()?.let { player ->
val nextSong = MusicPlayerRemote.nextSong val nextSong = MusicPlayerRemote.nextSong
// Switch to other player (Crossfade) only if next song exists
if (nextSong != null) { if (nextSong != null) {
setDataSourceImpl(player, nextSong.uri.toString()) { success -> setDataSourceImpl(player, nextSong.uri.toString()) { success ->
// Switch to other player (Crossfade) only if next song exists
if (success) switchPlayer() if (success) switchPlayer()
} }
} }
@ -295,8 +303,7 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
private fun switchPlayer() { private fun switchPlayer() {
getNextPlayer()?.start() getNextPlayer()?.start()
getCurrentPlayer()?.let { fadeOut(it) } crossFade(getCurrentPlayer()!!, getNextPlayer()!!)
getNextPlayer()?.let { fadeIn(it) }
currentPlayer = currentPlayer =
if (currentPlayer == CurrentPlayer.PLAYER_ONE || currentPlayer == CurrentPlayer.NOT_SET) { if (currentPlayer == CurrentPlayer.PLAYER_ONE || currentPlayer == CurrentPlayer.NOT_SET) {
CurrentPlayer.PLAYER_TWO CurrentPlayer.PLAYER_TWO