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

Commit 3ffe98ed authored by Joseph Pirozzo's avatar Joseph Pirozzo
Browse files

HFP client volume control

Accept volume controls from connected phone.  Suport AT+VGS and +VGS
commands.

Bug: 38005564
Test: Connect a phone, start a call, change volume up and down on phone
and verify volume level on headunit changes, as well as monitor snoop
logs.

Change-Id: I8b89b2487da81cf9562598a0a5408c266e8ecc6a
parent 8954139a
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -162,16 +162,30 @@ public class HeadsetClientService extends ProfileService {
            // ({@link HeadsetClientStateMachine#SET_SPEAKER_VOLUME} in
            // {@link HeadsetClientStateMachine} for details.
            if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
                Log.d(TAG, "Volume changed for stream: " +
                    intent.getExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE));
                if (DBG) {
                    Log.d(TAG,
                            "Volume changed for stream: "
                                    + intent.getExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE));
                }
                int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
                if (streamType == AudioManager.STREAM_VOICE_CALL) {
                    int streamValue = intent
                            .getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1);
                    int hfVol = HeadsetClientStateMachine.amToHfVol(streamValue);
                    Log.d(TAG, "Setting volume to audio manager: " + streamValue + " hands free: "
                                    + hfVol);
                    if (DBG) {
                        Log.d(TAG,
                                "Setting volume to audio manager: " + streamValue
                                        + " hands free: " + hfVol);
                    }
                    mAudioManager.setParameters("hfp_volume=" + hfVol);
                    synchronized (this) {
                        for (HeadsetClientStateMachine sm : mStateMachineMap.values()) {
                            if (sm != null) {
                                sm.sendMessage(
                                        HeadsetClientStateMachine.SET_SPEAKER_VOLUME, streamValue);
                            }
                        }
                    }
                }
            }
        }
+17 −10
Original line number Diff line number Diff line
@@ -1051,12 +1051,15 @@ public class HeadsetClientStateMachine extends StateMachine {
    }

    class Connected extends State {
        int mCommandedSpeakerVolume = -1;

        @Override
        public void enter() {
            if (DBG) {
                Log.d(TAG, "Enter Connected: " + getCurrentMessage().what);
            }
            mAudioWbs = false;
            mCommandedSpeakerVolume = -1;
        }

        @Override
@@ -1120,11 +1123,15 @@ public class HeadsetClientStateMachine extends StateMachine {
                    // This message should always contain the volume in AudioManager max normalized.
                    int amVol = message.arg1;
                    int hfVol = amToHfVol(amVol);
                    Log.d(TAG,"HF volume is set to " + hfVol);
                    sAudioManager.setParameters("hfp_volume=" + hfVol);
                    // We do not set the volume in native because multiple devices might be
                    // connected and it does not make sense to synchronize them. Car becomes the
                    // master in such case.
                    if (amVol != mCommandedSpeakerVolume) {
                        Log.d(TAG, "Volume" + amVol + ":" + mCommandedSpeakerVolume);
                        // Volume was changed by a 3rd party
                        mCommandedSpeakerVolume = -1;
                        if (NativeInterface.setVolumeNative(getByteAddress(mCurrentDevice),
                                    HeadsetClientHalConstants.VOLUME_TYPE_SPK, hfVol)) {
                            addQueuedAction(SET_SPEAKER_VOLUME);
                        }
                    }
                    break;
                case DIAL_NUMBER:
                    // Add the call as an outgoing call.
@@ -1305,12 +1312,12 @@ public class HeadsetClientStateMachine extends StateMachine {
                            break;
                        case StackEvent.EVENT_TYPE_VOLUME_CHANGED:
                            if (event.valueInt == HeadsetClientHalConstants.VOLUME_TYPE_SPK) {
                                Log.d(TAG, "AM volume set to " +
                                      hfToAmVol(event.valueInt2));
                                mCommandedSpeakerVolume = hfToAmVol(event.valueInt2);
                                Log.d(TAG, "AM volume set to " + mCommandedSpeakerVolume);
                                sAudioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
                                        hfToAmVol(event.valueInt2), AudioManager.FLAG_SHOW_UI);
                            } else if (event.valueInt ==
                                    HeadsetClientHalConstants.VOLUME_TYPE_MIC) {
                                        +mCommandedSpeakerVolume, AudioManager.FLAG_SHOW_UI);
                            } else if (event.valueInt
                                    == HeadsetClientHalConstants.VOLUME_TYPE_MIC) {
                                sAudioManager.setMicrophoneMute(event.valueInt2 == 0);
                            }
                            break;
+5 −3
Original line number Diff line number Diff line
@@ -311,9 +311,11 @@ class NativeInterface {
            Log.d(TAG, "onVolumeChange: address " + address + " event "  + event);
        }
        HeadsetClientService service = HeadsetClientService.getHeadsetClientService();
        // Ignore volume changes from the Phone. This is to avoid the scenario where we may have two
        // phones connected each tries to set different volumes.
        Log.w(TAG, "onVolumeChange: Ignoring message: " + event);
        if (service != null) {
            service.messageFromNative(event);
        } else {
            Log.w(TAG, "onVolumeChange: Ignoring message because service not available: " + event);
        }
    }

    private void onCmdResult(int type, int cme, byte[] address) {