I’m developing applications for nvidia shield tv.
there exists another application playing music using STREAM_MUSIC stream in the background.
so i wrote a code let my application use STREAM_NOTIFICATION stream and make possible playing another audio simultaneously.
i expected can controll each volume of stream but it didn’t work.
doesn’t nvidia shield tv pro support andriod framework audio stream?
here is a code sample below
private fun Context.playAudioAsync() {
val context = this
launch {
if (mediaPlayer?.isPlaying == true) {
return@launch
}
val (playTarget, startDelay) = audioPlayerList.poll() ?: return@launch
if (mediaPlayer != null) {
mediaPlayer?.reset()
}
if (startDelay != 0L) {
runBlocking {
delay(startDelay)
}
}
val audioAttributes = AudioAttributes.Builder()
.setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
.build()
val audioFocusRequest =
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
.setAudioAttributes(audioAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(mOnAudioFocusChangeListener)
.build()
val result = audioManager?.requestAudioFocus(audioFocusRequest)
val musicStream: Int = audioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) ?: 50
val notiStream: Int =
audioManager?.getStreamVolume(AudioManager.STREAM_NOTIFICATION) ?: 50
audioManager?.setStreamVolume(AudioManager.STREAM_MUSIC, musicStream / 2, 0)
audioManager?.setStreamVolume(AudioManager.STREAM_NOTIFICATION, notiStream, 0)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mediaPlayer = MediaPlayer().apply {
setAudioAttributes(audioAttributes)
setDataSource(
context,
Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(packageName)
.path(playTarget.toString()).build()
)
setOnCompletionListener {
audioManager?.setStreamVolume(AudioManager.STREAM_MUSIC, musicStream, 0)
audioManager?.abandonAudioFocusRequest(audioFocusRequest)
playAudioAsync()
}
prepare()
start()
}
}
}
}