'Android AudioFocus with AudioTrack hardly works
I use AudioTrack to play some audio like GPS navigation does. Of course, I need to ask for an audio focus, but my ugly code doesn't make the trick as I expected. I hear the audioTrack sounds, but I can't say that the music player (another application) reduces it's volume.
AudioTrack:
audioTrack = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(SAMPLE_RATE)
.build())
.setTransferMode(AudioTrack.MODE_STREAM)
.setBufferSizeInBytes(intBufferSize)
.build();
audioTrack.play();
Playback and focus request:
maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
AudioAttributes playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
.setAudioAttributes(playbackAttributes)
// .setAcceptsDelayedFocusGain(true)
// .setOnAudioFocusChangeListener(afChangeListener)
.build();
int afresult = audioManager.requestAudioFocus(focusRequest);
Log.d(TAG, "Music request focus, result: " + afresult);
if (afresult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(TAG, "Audio Focus is granted ");
audioTrack.setVolume(maxVolume*0.4f);
audioTrack.write(myAudioData, 0, myAudioData.length);
}
else if (afresult == AudioManager.AUDIOFOCUS_REQUEST_FAILED){
Log.d(TAG, "Audio Focus is failed ");
} else if (afresult == AudioManager.AUDIOFOCUS_REQUEST_DELAYED){
Log.d(TAG, "Audio Focus is delayed ");
}
audioManager.abandonAudioFocusRequest(focusRequest);
I don't have OnAudioFocusChangeListener
yet, but I will implement it. So why does it seem like that other applications don't handle audio focus loss? AUDIOFOCUS_GAIN_TRANSIENT
works, but AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
doesn't. What am I doing wrong?
Thank you in advance.
Solution 1:[1]
I realized that my code can't be working as I am trying to mute one music stream and play another one. I had to change USAGE
and CONTENT_TYPE
attributes.
It can be CONTENT_TYPE_SONIFICATION
+ USAGE_ASSISTANCE_SONIFICATION
or CONTENT_TYPE_SPEECH
+ USAGE_VOICE_COMMUNICATION
as it is said in documentation.
Hope, it will help somebody.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | user12628549 |