[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 {
companion object {
@JvmStatic
inline fun createFadeAnimator(
fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/
mediaPlayer: MediaPlayer,
fadeInMp: MediaPlayer,
fadeOutMp: MediaPlayer,
crossinline endAction: (animator: Animator) -> Unit, /* Code to run when Animator Ends*/
): Animator? {
val duration = PreferenceUtil.crossFadeDuration * 1000
if (duration == 0) {
return null
}
val startValue = if (fadeIn) 0f else 1.0f
val endValue = if (fadeIn) 1.0f else 0f
return ValueAnimator.ofFloat(startValue, endValue).apply {
return ValueAnimator.ofFloat(1f, 0f).apply {
this.duration = duration.toLong()
addUpdateListener { animation: ValueAnimator ->
mediaPlayer.setVolume(
fadeInMp.setVolume(
animation.animatedValue as Float, animation.animatedValue as Float
)
fadeOutMp.setVolume(1 - animation.animatedValue as Float,
1 - animation.animatedValue as Float)
}
doOnEnd {
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 mIsInitialized = false
private var hasDataSource: Boolean = false /* Whether first player has DataSource */
private var fadeInAnimator: Animator? = null
private var fadeOutAnimator: Animator? = null
private var crossFadeAnimator: Animator? = null
override var callbacks: PlaybackCallbacks? = null
private var crossFadeDuration = PreferenceUtil.crossFadeDuration
private var isCrossFading = false
init {
player1.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK)
@ -48,8 +48,12 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
override fun start(): Boolean {
super.start()
durationListener.start()
resumeFade()
return try {
getCurrentPlayer()?.start()
if (isCrossFading) {
getNextPlayer()?.start()
}
true
} catch (e: IllegalStateException) {
e.printStackTrace()
@ -58,9 +62,11 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
}
override fun release() {
stop()
cancelFade()
getCurrentPlayer()?.release()
getNextPlayer()?.release()
durationListener.stop()
durationListener.cancel()
}
override fun stop() {
@ -72,7 +78,7 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
override fun pause(): Boolean {
super.pause()
durationListener.stop()
cancelFade()
pauseFade()
getCurrentPlayer()?.let {
if (it.isPlaying) {
it.pause()
@ -87,7 +93,6 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
}
override fun seek(whereto: Int): Int {
cancelFade()
getNextPlayer()?.stop()
return try {
getCurrentPlayer()?.seekTo(whereto)
@ -120,7 +125,6 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
force: Boolean,
completion: (success: Boolean) -> Unit,
) {
cancelFade()
if (force) hasDataSource = false
mIsInitialized = false
/* 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) {
fadeInAnimator = createFadeAnimator(true, mediaPlayer) {
fadeInAnimator = null
private fun crossFade(fadeInMp: MediaPlayer, fadeOutMp: MediaPlayer) {
isCrossFading = true
crossFadeAnimator = createFadeAnimator(fadeInMp, fadeOutMp) {
crossFadeAnimator = null
durationListener.start()
isCrossFading = false
}
fadeInAnimator?.start()
}
private fun fadeOut(mediaPlayer: MediaPlayer) {
fadeOutAnimator = createFadeAnimator(false, mediaPlayer) {
fadeOutAnimator = null
mediaPlayer.stop()
}
fadeOutAnimator?.start()
crossFadeAnimator?.start()
}
private fun cancelFade() {
fadeInAnimator = null
fadeOutAnimator = null
crossFadeAnimator?.cancel()
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 {
@ -283,9 +291,9 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
if (total > 0 && (total - progress).div(1000) == crossFadeDuration) {
getNextPlayer()?.let { player ->
val nextSong = MusicPlayerRemote.nextSong
// Switch to other player (Crossfade) only if next song exists
if (nextSong != null) {
setDataSourceImpl(player, nextSong.uri.toString()) { success ->
// Switch to other player (Crossfade) only if next song exists
if (success) switchPlayer()
}
}
@ -295,8 +303,7 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
private fun switchPlayer() {
getNextPlayer()?.start()
getCurrentPlayer()?.let { fadeOut(it) }
getNextPlayer()?.let { fadeIn(it) }
crossFade(getCurrentPlayer()!!, getNextPlayer()!!)
currentPlayer =
if (currentPlayer == CurrentPlayer.PLAYER_ONE || currentPlayer == CurrentPlayer.NOT_SET) {
CurrentPlayer.PLAYER_TWO