- Use usage type instead of stream type when requesting audio focus.

This commit is contained in:
Juha Heinanen
2020-02-23 05:28:02 +02:00
parent b464db5060
commit b587910cb8
@@ -48,7 +48,7 @@ class BaresipService: Service() {
internal var rtTimer: Timer? = null internal var rtTimer: Timer? = null
internal var audioFocusRequest: AudioFocusRequest? = null internal var audioFocusRequest: AudioFocusRequest? = null
internal var audioFocused = false internal var audioFocusUsage = -1
internal var origVolumes = arrayOf(-1, -1, -1, -1) internal var origVolumes = arrayOf(-1, -1, -1, -1)
internal val btAdapter = BluetoothAdapter.getDefaultAdapter() internal val btAdapter = BluetoothAdapter.getDefaultAdapter()
internal var activeNetwork = "" internal var activeNetwork = ""
@@ -543,12 +543,9 @@ class BaresipService: Service() {
return return
} }
"call progress", "call ringing" -> { "call progress", "call ringing" -> {
if (!isAudioFocused()) { requestAudioFocus(AudioAttributes.USAGE_VOICE_COMMUNICATION)
requestAudioFocus(AudioManager.STREAM_VOICE_CALL) setCallVolume()
setCallVolume() return
} else {
return
}
} }
"call incoming" -> { "call incoming" -> {
val peerUri = Api.call_peeruri(callp) val peerUri = Api.call_peeruri(callp)
@@ -645,10 +642,8 @@ class BaresipService: Service() {
stopRinging() stopRinging()
if (am.mode != AudioManager.MODE_IN_COMMUNICATION) if (am.mode != AudioManager.MODE_IN_COMMUNICATION)
am.mode = AudioManager.MODE_IN_COMMUNICATION am.mode = AudioManager.MODE_IN_COMMUNICATION
if (!isAudioFocused()) { requestAudioFocus(AudioAttributes.USAGE_VOICE_COMMUNICATION)
requestAudioFocus(AudioManager.STREAM_VOICE_CALL) setCallVolume()
setCallVolume()
}
if (!Utils.isVisible()) if (!Utils.isVisible())
return return
} }
@@ -728,7 +723,6 @@ class BaresipService: Service() {
calls.remove(call) calls.remove(call)
if (Call.calls().size == 0) { if (Call.calls().size == 0) {
resetCallVolume() resetCallVolume()
Log.d(LOG_TAG, "Audio mode is ${am.mode}")
if (am.mode != AudioManager.MODE_NORMAL) if (am.mode != AudioManager.MODE_NORMAL)
am.mode = AudioManager.MODE_NORMAL am.mode = AudioManager.MODE_NORMAL
if (am.isSpeakerphoneOn) am.isSpeakerphoneOn = false if (am.isSpeakerphoneOn) am.isSpeakerphoneOn = false
@@ -780,7 +774,6 @@ class BaresipService: Service() {
} }
val timeStamp = System.currentTimeMillis().toString() val timeStamp = System.currentTimeMillis().toString()
Log.d(LOG_TAG, "Message event for $uap from $peer at $timeStamp") Log.d(LOG_TAG, "Message event for $uap from $peer at $timeStamp")
Log.d(LOG_TAG, "Audio mode is ${am.mode}")
Message.add(Message(ua.account.aor, peer, text, timeStamp.toLong(), Message.add(Message(ua.account.aor, peer, text, timeStamp.toLong(),
R.drawable.arrow_down_green, 0, "", true)) R.drawable.arrow_down_green, 0, "", true))
Message.save() Message.save()
@@ -910,20 +903,27 @@ class BaresipService: Service() {
private fun requestAudioFocus(streamType: Int) { private fun requestAudioFocus(usage: Int) {
if (audioFocusUsage != -1) {
if (audioFocusUsage == usage)
return
else
abandonAudioFocus()
}
if ((Build.VERSION.SDK_INT >= 26) && (audioFocusRequest == null)) { if ((Build.VERSION.SDK_INT >= 26) && (audioFocusRequest == null)) {
@TargetApi(26) @TargetApi(26)
audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
.run { .run {
setAudioAttributes(AudioAttributes.Builder().run { setAudioAttributes(AudioAttributes.Builder().run {
setLegacyStreamType(streamType) setUsage(usage)
build() build()
}) })
build() build()
} }
@TargetApi(26) @TargetApi(26)
if (am.requestAudioFocus(audioFocusRequest!!) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { if (am.requestAudioFocus(audioFocusRequest!!) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(LOG_TAG, "Audio focus granted for stream $streamType") Log.d(LOG_TAG, "Audio focus granted for usage $usage")
audioFocusUsage = usage
if (isBluetoothHeadsetConnected() && !am.isBluetoothScoOn) { if (isBluetoothHeadsetConnected() && !am.isBluetoothScoOn) {
Log.d(LOG_TAG, "Starting Bluetooth Sco") Log.d(LOG_TAG, "Starting Bluetooth Sco")
am.startBluetoothSco() am.startBluetoothSco()
@@ -931,17 +931,18 @@ class BaresipService: Service() {
} else { } else {
Log.d(LOG_TAG, "Audio focus denied") Log.d(LOG_TAG, "Audio focus denied")
audioFocusRequest = null audioFocusRequest = null
audioFocusUsage = -1
} }
} else { } else {
if (am.requestAudioFocus(null, streamType, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) == if (am.requestAudioFocus(null, usage, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) ==
AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(LOG_TAG, "Audio focus granted for stream $streamType") Log.d(LOG_TAG, "Audio focus granted for usage $usage")
audioFocusUsage = usage
if (isBluetoothHeadsetConnected() && !am.isBluetoothScoOn) if (isBluetoothHeadsetConnected() && !am.isBluetoothScoOn)
am.startBluetoothSco() am.startBluetoothSco()
audioFocused = true
} else { } else {
Log.d(LOG_TAG, "Audio focus denied") Log.d(LOG_TAG, "Audio focus denied")
audioFocused = false audioFocusUsage = -1
} }
} }
} }
@@ -953,10 +954,7 @@ class BaresipService: Service() {
} }
private fun isAudioFocused(): Boolean { private fun isAudioFocused(): Boolean {
if (Build.VERSION.SDK_INT >= 26) return audioFocusUsage != -1
return audioFocusRequest != null
else
return audioFocused
} }
private fun abandonAudioFocus() { private fun abandonAudioFocus() {
@@ -966,15 +964,16 @@ class BaresipService: Service() {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(LOG_TAG, "Audio focus abandoned") Log.d(LOG_TAG, "Audio focus abandoned")
audioFocusRequest = null audioFocusRequest = null
audioFocusUsage = -1
} else { } else {
Log.d(LOG_TAG, "Failed to abandon audio focus") Log.d(LOG_TAG, "Failed to abandon audio focus")
} }
} }
} else { } else {
if (audioFocused) { if (audioFocusUsage != -1) {
if (am.abandonAudioFocus(null) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { if (am.abandonAudioFocus(null) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(LOG_TAG, "Audio focus abandoned") Log.d(LOG_TAG, "Audio focus abandoned")
audioFocused = false audioFocusUsage = -1
} else { } else {
Log.d(LOG_TAG, "Failed to abandon audio focus") Log.d(LOG_TAG, "Failed to abandon audio focus")
} }
@@ -984,7 +983,7 @@ class BaresipService: Service() {
private fun startRinging() { private fun startRinging() {
am.mode = AudioManager.MODE_RINGTONE am.mode = AudioManager.MODE_RINGTONE
requestAudioFocus(AudioManager.STREAM_RING) requestAudioFocus(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
if (Build.VERSION.SDK_INT >= 28) { if (Build.VERSION.SDK_INT >= 28) {
rt.isLooping = true rt.isLooping = true
rt.play() rt.play()
@@ -1012,14 +1011,14 @@ class BaresipService: Service() {
} }
private fun setCallVolume() { private fun setCallVolume() {
if (callVolume != 0) { if ((callVolume != 0) && (origVolumes.contentEquals(arrayOf(-1, -1, -1, -1)))) {
for (streamType in listOf(AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_MUSIC)) { for (streamType in listOf(AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_MUSIC)) {
origVolumes[streamType] = am.getStreamVolume(streamType) origVolumes[streamType] = am.getStreamVolume(streamType)
am.setStreamVolume(streamType, am.setStreamVolume(streamType,
(callVolume * 0.1 * am.getStreamMaxVolume(streamType)).roundToInt(), (callVolume * 0.1 * am.getStreamMaxVolume(streamType)).roundToInt(),
0) 0)
Log.d(LOG_TAG, "New call volume of stream type $streamType is " + Log.d(LOG_TAG, "Orig/new call volume of stream type $streamType is " +
"${am.getStreamVolume(streamType)}") "${origVolumes[streamType]}/${am.getStreamVolume(streamType)}")
} }
} }
} }