[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 {
|
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue