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

Commit 82d5049b authored by Eric Shih's avatar Eric Shih
Browse files

Handle Code Selection with LC3 in Java layer for HFPC

Bug: 278469604
Test: atest HeadsetClientStateMachineTest
Change-Id: Ia9e9c90e66df4470c4c2321631b521beb0934fa7
parent 20d84252
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ public final class HeadsetClientHalConstants {
    static final int AUDIO_STATE_CONNECTING = 1;
    static final int AUDIO_STATE_CONNECTED = 2;
    static final int AUDIO_STATE_CONNECTED_MSBC = 3;
    static final int AUDIO_STATE_CONNECTED_LC3 = 4;

    // match up with bthf_client_vr_state_t enum of bt_hf_client.h
    static final int VR_STATE_STOPPED = 0;
+30 −10
Original line number Diff line number Diff line
@@ -197,7 +197,10 @@ public class HeadsetClientStateMachine extends StateMachine {
    private final int mInBandRingtonePolicyProperty;
    private final boolean mForceSetAudioPolicyProperty;

    private boolean mAudioWbs;
    @VisibleForTesting boolean mAudioWbs;

    @VisibleForTesting boolean mAudioSWB;

    private int mVoiceRecognitionActive;
    private final BluetoothAdapter mAdapter;

@@ -237,6 +240,7 @@ public class HeadsetClientStateMachine extends StateMachine {
        }
        ProfileService.println(sb, "  mAudioState: " + mAudioState);
        ProfileService.println(sb, "  mAudioWbs: " + mAudioWbs);
        ProfileService.println(sb, "  mAudioSWB: " + mAudioSWB);
        ProfileService.println(sb, "  mIndicatorNetworkState: " + mIndicatorNetworkState);
        ProfileService.println(sb, "  mIndicatorNetworkType: " + mIndicatorNetworkType);
        ProfileService.println(sb, "  mIndicatorNetworkSignal: " + mIndicatorNetworkSignal);
@@ -893,6 +897,7 @@ public class HeadsetClientStateMachine extends StateMachine {
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
        mAudioWbs = false;
        mAudioSWB = false;
        mVoiceRecognitionActive = HeadsetClientHalConstants.VR_STATE_STOPPED;

        mAudioRouteAllowed = context.getResources().getBoolean(
@@ -1030,6 +1035,7 @@ public class HeadsetClientStateMachine extends StateMachine {
            mInBandRing = false;

            mAudioWbs = false;
            mAudioSWB = false;

            // will be set on connect

@@ -1344,6 +1350,7 @@ public class HeadsetClientStateMachine extends StateMachine {
        public void enter() {
            logD("Enter Connected: " + getCurrentMessage().what);
            mAudioWbs = false;
            mAudioSWB = false;
            mCommandedSpeakerVolume = -1;

            if (mPrevState == mConnecting) {
@@ -1782,10 +1789,11 @@ public class HeadsetClientStateMachine extends StateMachine {
            }

            switch (state) {
                case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC:
                    mAudioWbs = true;
                    // fall through
                case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED:
                case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED,
                        HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3,
                        HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC:
                    mAudioSWB = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3;
                    mAudioWbs = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC;
                    if (DBG) {
                        Log.d(TAG, "mAudioRouteAllowed=" + mAudioRouteAllowed);
                    }
@@ -1820,8 +1828,13 @@ public class HeadsetClientStateMachine extends StateMachine {
                    final int amVol = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
                    final int hfVol = amToHfVol(amVol);

                    logD("hfp_enable=true mAudioSWB is " + mAudioSWB);
                    logD("hfp_enable=true mAudioWbs is " + mAudioWbs);
                    if (mAudioWbs) {

                    if (mAudioSWB) {
                        logD("Setting sampling rate as 32000");
                        mAudioManager.setHfpSamplingRate(32000);
                    } else if (mAudioWbs) {
                        logD("Setting sampling rate as 16000");
                        mAudioManager.setHfpSamplingRate(16000);
                    } else {
@@ -2007,11 +2020,18 @@ public class HeadsetClientStateMachine extends StateMachine {

    @VisibleForTesting
    void broadcastAudioState(BluetoothDevice device, int newState, int prevState) {
        BluetoothStatsLog.write(BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED,
        int sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_CVSD;
        if (mAudioSWB) {
            sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_LC3;
        } else if (mAudioWbs) {
            sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_MSBC;
        }

        BluetoothStatsLog.write(
                BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED,
                AdapterService.getAdapterService().obfuscateAddress(device),
                getConnectionStateFromAudioState(newState), mAudioWbs
                        ? BluetoothHfpProtoEnums.SCO_CODEC_MSBC
                        : BluetoothHfpProtoEnums.SCO_CODEC_CVSD,
                getConnectionStateFromAudioState(newState),
                sco_codec,
                AdapterService.getAdapterService().getMetricId(device));
        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED);
        intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState);
+32 −0
Original line number Diff line number Diff line
@@ -1573,6 +1573,38 @@ public class HeadsetClientStateMachineTest {
                IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class));
    }

    @Test
    public void testProcessStackEvent_CodecSelection_onConnectedState() {
        initToConnectedState();
        Assert.assertThat(
                mHeadsetClientStateMachine.getCurrentState(),
                IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class));

        // Trigger a MSBC codec stack event. Expect to mAudioWbs = true.
        mHeadsetClientStateMachine.mAudioWbs = false;
        mHeadsetClientStateMachine.mAudioSWB = false;
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED);
        event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC;
        event.device = mTestDevice;
        mHeadsetClientStateMachine.sendMessage(
                mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event));
        TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper());
        Assert.assertTrue(mHeadsetClientStateMachine.mAudioWbs);
        Assert.assertFalse(mHeadsetClientStateMachine.mAudioSWB);

        // Trigger a LC3 codec stack event. Expect to mAudioSWB = true.
        mHeadsetClientStateMachine.mAudioWbs = false;
        mHeadsetClientStateMachine.mAudioSWB = false;
        event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED);
        event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3;
        event.device = mTestDevice;
        mHeadsetClientStateMachine.sendMessage(
                mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event));
        TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper());
        Assert.assertFalse(mHeadsetClientStateMachine.mAudioWbs);
        Assert.assertTrue(mHeadsetClientStateMachine.mAudioSWB);
    }

    /**
     * Allow/disallow connection to any device
     *