Skip to content

Commit

Permalink
feat(Playback): add fade-out effect on stopping playback
Browse files Browse the repository at this point in the history
  • Loading branch information
ashutoshgngwr committed Apr 9, 2020
1 parent a4f85f5 commit ca73ace
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.junit.Assert.*
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import java.lang.Thread.sleep


@RunWith(AndroidJUnit4::class)
Expand Down Expand Up @@ -89,7 +90,7 @@ class PlaybackTest {
assertTrue(requireNotNull(p).player.playWhenReady)

InstrumentationRegistry.getInstrumentation().runOnMainSync {
requireNotNull(p).stop()
requireNotNull(p).stop(false)
}

// should stop
Expand All @@ -112,7 +113,7 @@ class PlaybackTest {
assertTrue(requireNotNull(p).handler.hasCallbacks(requireNotNull(p)))

InstrumentationRegistry.getInstrumentation().runOnMainSync {
requireNotNull(p).stop()
requireNotNull(p).stop(false)
}

// should stop
Expand All @@ -122,6 +123,30 @@ class PlaybackTest {
assertFalse(requireNotNull(p).handler.hasCallbacks(requireNotNull(p)))
}

@Test
fun testFadeInOutTransitions() {
var p: Playback? = null
val defaultVolume = Playback.DEFAULT_VOLUME.toFloat() / Playback.MAX_VOLUME
InstrumentationRegistry.getInstrumentation().runOnMainSync {
p = Playback(context, loopingSound, audioAttributes)
requireNotNull(p).play()
assertNotEquals(defaultVolume, requireNotNull(p).player.volume)
}

// wait for fade-in to finish
sleep(600L)
assertEquals(defaultVolume, requireNotNull(p).player.volume)

InstrumentationRegistry.getInstrumentation().runOnMainSync {
requireNotNull(p).stop(true)
assertNotEquals(0f, requireNotNull(p).player.volume)
}

// wait for fade-out to finish
sleep(600L)
assertEquals(0f, requireNotNull(p).player.volume)
}

@Test
fun testJsonSerializationDeserialization() {
val gson = GsonBuilder()
Expand Down
24 changes: 21 additions & 3 deletions app/src/main/java/com/github/ashutoshgngwr/noice/sound/Playback.kt
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ class Playback(
private fun fadeIn() {
if (player.volume >= volume.toFloat() / MAX_VOLUME) {
isTransitioning = false
player.volume = volume.toFloat() / MAX_VOLUME
return
}

Expand All @@ -143,6 +144,20 @@ class Playback(
handler.postDelayed(this::fadeIn, TRANSITION_STEP_DELAY)
}

private fun fadeOut() {
if (player.volume <= 0) {
isTransitioning = false
player.volume = 0f
player.playWhenReady = false
player.release()
return
}

isTransitioning = true
player.volume -= TRANSITION_VOLUME_STEP * 2
handler.postDelayed(this::fadeOut, TRANSITION_STEP_DELAY / 2)
}

/**
* Sets the volume for the playback. It also sets the volume of the underlying
* [MediaPlayer][android.media.MediaPlayer] instance.
Expand Down Expand Up @@ -186,9 +201,13 @@ class Playback(
/**
* Stops the playback. If the sound is non-loopable, it also removes the randomised play callback.
*/
fun stop() {
fun stop(fadeOut: Boolean) {
isPlaying = false
player.playWhenReady = false
if (fadeOut && player.playWhenReady) {
fadeOut()
} else {
player.playWhenReady = false
}

if (player.repeatMode == ExoPlayer.REPEAT_MODE_OFF) {
handler.removeCallbacks(this)
Expand All @@ -199,7 +218,6 @@ class Playback(
* Releases resources used by underlying [MediaPlayer][android.media.MediaPlayer] instance.
*/
fun release() {
stop()
player.release()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ class PlaybackManager(private val context: Context) :
// stops a playback and releases its resources.
private fun stop(sound: Sound) {
requireNotNull(playbacks[sound.key]).apply {
release()
stop(true)
}

playbacks.remove(sound.key)
Expand All @@ -165,7 +165,7 @@ class PlaybackManager(private val context: Context) :
private fun pauseAll() {
isPaused = true
playbacks.values.forEach {
it.stop()
it.stop(false)
}

AudioManagerCompat.abandonAudioFocusRequest(audioManager, audioFocusRequest)
Expand Down Expand Up @@ -235,6 +235,7 @@ class PlaybackManager(private val context: Context) :
private fun stopAll() {
isPaused = false
playbacks.values.forEach {
it.stop(false)
it.release()
}

Expand Down

0 comments on commit ca73ace

Please sign in to comment.