From ca2481975fd02b57e14b411da28abe3e8adc73f0 Mon Sep 17 00:00:00 2001 From: lovegaoshi Date: Fri, 8 Sep 2023 16:45:26 +0000 Subject: [PATCH 1/5] feat: fade in/out --- .../kotlin_audio_example/MainActivity.kt | 7 +-- .../kotlinaudio/players/BaseAudioPlayer.kt | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt index 7cf74eef..2a5249fc 100644 --- a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt +++ b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt @@ -103,15 +103,16 @@ class MainActivity : ComponentActivity() { position = position, duration = duration, isLive = isLive, - onPrevious = { player.previous() }, - onNext = { player.next() }, + onPrevious = { player.simpleFadeDemo { player.previous() } }, + onNext = { player.simpleFadeDemo { player.next() } }, isPaused = state.value != AudioPlayerState.PLAYING, onTopBarAction = { showSheet = true }, onPlayPause = { if (player.playerState == AudioPlayerState.PLAYING) { - player.pause() + player.fadeOut { player.pause() } } else { player.play() + player.fadeIn { } } }, onSeek = { player.seek(it, TimeUnit.MILLISECONDS) } diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt index 8d7ce7cb..4981b457 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt @@ -73,6 +73,7 @@ import com.google.android.exoplayer2.upstream.cache.CacheDataSource import com.google.android.exoplayer2.upstream.cache.SimpleCache import com.google.android.exoplayer2.util.Util import kotlinx.coroutines.MainScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber import java.util.Locale @@ -149,6 +150,48 @@ abstract class BaseAudioPlayer internal constructor( exoPlayer.volume = value * volumeMultiplier } + /** + * fade out the current exoPlayer by a simple linear function. + */ + fun fadeOut(duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { + scope.launch { + val volume = exoPlayer.volume + var fadeOutDuration = duration + while (fadeOutDuration > 0) { + fadeOutDuration -= interval + exoPlayer.volume -= volume * interval / fadeOutDuration + delay(interval) + } + callback() + } + } + + /** + * fade in the current exoPlayer by a simple linear function. + */ + fun fadeIn(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { + scope.launch { + val volumeDiff = volume - exoPlayer.volume + var fadeInDuration = duration + while (fadeInDuration > 0) { + fadeInDuration -= interval + exoPlayer.volume += volumeDiff * interval / fadeInDuration + delay(interval) + } + callback() + } + } + + /** + * a simple fade in/out wrapper. for KA-example only, do not use. + */ + fun simpleFadeDemo(callback: () -> Unit = { }) { + fadeOut { + callback() + fadeIn() + } + } + var playbackSpeed: Float get() = exoPlayer.playbackParameters.speed set(value) { From 27ff95d024600f3c31817afffd0bd597ede7483a Mon Sep 17 00:00:00 2001 From: lovegaoshi Date: Fri, 8 Sep 2023 18:13:44 +0000 Subject: [PATCH 2/5] feat: fade inout --- .../kotlinaudio/players/BaseAudioPlayer.kt | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt index 4981b457..3e277473 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt @@ -151,25 +151,9 @@ abstract class BaseAudioPlayer internal constructor( } /** - * fade out the current exoPlayer by a simple linear function. + * fade volume of the current exoPlayer by a simple linear function. */ - fun fadeOut(duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { - scope.launch { - val volume = exoPlayer.volume - var fadeOutDuration = duration - while (fadeOutDuration > 0) { - fadeOutDuration -= interval - exoPlayer.volume -= volume * interval / fadeOutDuration - delay(interval) - } - callback() - } - } - - /** - * fade in the current exoPlayer by a simple linear function. - */ - fun fadeIn(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { + fun fadeVolume(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { scope.launch { val volumeDiff = volume - exoPlayer.volume var fadeInDuration = duration @@ -178,6 +162,7 @@ abstract class BaseAudioPlayer internal constructor( exoPlayer.volume += volumeDiff * interval / fadeInDuration delay(interval) } + exoPlayer.volume = volume callback() } } @@ -186,10 +171,10 @@ abstract class BaseAudioPlayer internal constructor( * a simple fade in/out wrapper. for KA-example only, do not use. */ fun simpleFadeDemo(callback: () -> Unit = { }) { - fadeOut { + fadeVolume(0f, callback={ callback() - fadeIn() - } + fadeVolume() + }) } var playbackSpeed: Float From eb28f53db66865adf1a96bd619a94cdcc0f65a80 Mon Sep 17 00:00:00 2001 From: lovegaoshi Date: Fri, 8 Sep 2023 19:12:54 +0000 Subject: [PATCH 3/5] feat: fade volume --- .../java/com/example/kotlin_audio_example/MainActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt index 2a5249fc..c2fd9253 100644 --- a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt +++ b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt @@ -109,10 +109,10 @@ class MainActivity : ComponentActivity() { onTopBarAction = { showSheet = true }, onPlayPause = { if (player.playerState == AudioPlayerState.PLAYING) { - player.fadeOut { player.pause() } + player.fadeVolume(0f, callback = { player.pause() }) } else { player.play() - player.fadeIn { } + player.fadeVolume() } }, onSeek = { player.seek(it, TimeUnit.MILLISECONDS) } From bb68d4c06b3eacf9be9d83b1e9a271559ba01a85 Mon Sep 17 00:00:00 2001 From: unknown <106490582+lovegaoshi@users.noreply.github.com> Date: Fri, 8 Sep 2023 19:34:41 -0700 Subject: [PATCH 4/5] Update BaseAudioPlayer.kt --- .../com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt index 3e277473..18740c96 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt @@ -155,11 +155,11 @@ abstract class BaseAudioPlayer internal constructor( */ fun fadeVolume(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { scope.launch { - val volumeDiff = volume - exoPlayer.volume + val volumeDiff = (volume - exoPlayer.volume) * interval / duration var fadeInDuration = duration while (fadeInDuration > 0) { fadeInDuration -= interval - exoPlayer.volume += volumeDiff * interval / fadeInDuration + exoPlayer.volume += volumeDiff delay(interval) } exoPlayer.volume = volume From 71d03bd6801625b441b2967682c1f8103d875524 Mon Sep 17 00:00:00 2001 From: unknown <106490582+lovegaoshi@users.noreply.github.com> Date: Fri, 8 Sep 2023 20:49:53 -0700 Subject: [PATCH 5/5] feat: use async instead of launch --- .../doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt index 18740c96..8295eede 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt @@ -72,7 +72,9 @@ import com.google.android.exoplayer2.upstream.RawResourceDataSource import com.google.android.exoplayer2.upstream.cache.CacheDataSource import com.google.android.exoplayer2.upstream.cache.SimpleCache import com.google.android.exoplayer2.util.Util +import kotlinx.coroutines.Deferred import kotlinx.coroutines.MainScope +import kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber @@ -153,8 +155,8 @@ abstract class BaseAudioPlayer internal constructor( /** * fade volume of the current exoPlayer by a simple linear function. */ - fun fadeVolume(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }) { - scope.launch { + fun fadeVolume(volume: Float = 1f, duration: Long = 500, interval: Long = 20L, callback: () -> Unit = { }): Deferred { + return scope.async { val volumeDiff = (volume - exoPlayer.volume) * interval / duration var fadeInDuration = duration while (fadeInDuration > 0) { @@ -164,6 +166,7 @@ abstract class BaseAudioPlayer internal constructor( } exoPlayer.volume = volume callback() + return@async } }