[CrossFade] Cleanup
This commit is contained in:
parent
61895b666c
commit
931a0345a4
2 changed files with 36 additions and 32 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue