Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 030c3156 authored by Roman Birg's avatar Roman Birg
Browse files

Bluetooth: request audio focus on incoming call



When the a2dp stream is suspended for an incoming call, request audio
focus from the audio manager so that any playing media will pause/duck
as needed.

Change-Id: I308b697ad998b7167703ebc89c6285034ac1ebf9
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 24d06367
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -202,6 +202,7 @@ final class HeadsetStateMachine extends StateMachine {
    private IBluetoothHeadsetPhone mPhoneProxy;
    private boolean mNativeAvailable;

    private boolean mAudioFocused;
    private boolean mA2dpSuspend;
    private int mA2dpPlayState;
    private int mA2dpState;
@@ -1736,6 +1737,7 @@ final class HeadsetStateMachine extends StateMachine {
                                log("Audio is closed,Set A2dpSuspended=false");
                                mAudioManager.setParameters("A2dpSuspended=false");
                                mA2dpSuspend = false;
                                releaseAudioFocus();
                            }
                        }
                        broadcastAudioState(device, BluetoothHeadset.STATE_AUDIO_DISCONNECTED,
@@ -2249,6 +2251,7 @@ final class HeadsetStateMachine extends StateMachine {
                                log("Audio is closed,Set A2dpSuspended=false");
                                mAudioManager.setParameters("A2dpSuspended=false");
                                mA2dpSuspend = false;
                                releaseAudioFocus();
                            }
                        }
                        broadcastAudioState(device, BluetoothHeadset.STATE_AUDIO_DISCONNECTED,
@@ -2816,6 +2819,7 @@ final class HeadsetStateMachine extends StateMachine {
            if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) {
                log("suspending A2DP stream for SCO");
                mPendingCiev = true;
                requestAudioFocus();
                return true;
            }
        }
@@ -2920,6 +2924,21 @@ final class HeadsetStateMachine extends StateMachine {
        }
    }

    private void requestAudioFocus() {
        if (!mAudioFocused) {
            mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_BLUETOOTH_SCO,
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            mAudioFocused = true;
        }
    }

    private void releaseAudioFocus() {
        if (mAudioFocused) {
            mAudioManager.abandonAudioFocusForCall();
            mAudioFocused = false;
        }
    }

    private void processAnswerCall(BluetoothDevice device) {
         if(device == null) {
            Log.w(TAG, "processAnswerCall device is null");
@@ -3123,6 +3142,7 @@ final class HeadsetStateMachine extends StateMachine {
            if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) {
                Log.d(TAG, "suspending A2DP stream for Call");
                mPendingCiev = true;
                requestAudioFocus();
                return ;
            }
        }
@@ -3136,6 +3156,7 @@ final class HeadsetStateMachine extends StateMachine {
                log("Set A2dpSuspended=false to reset the a2dp state to standby");
                mAudioManager.setParameters("A2dpSuspended=false");
                mA2dpSuspend = false;
                releaseAudioFocus();
            }
        }
    }