diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index c89055c673042..43d8bac73a504 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -826,9 +826,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly void onNewAvrAdded(HdmiDeviceInfo avr) { assertRunOnServiceThread(); - if (getSystemAudioModeSetting() && !isSystemAudioActivated()) { - addAndStartAction(new SystemAudioAutoInitiationAction(this, avr.getLogicalAddress())); - } + addAndStartAction(new SystemAudioAutoInitiationAction(this, avr.getLogicalAddress())); if (isArcFeatureEnabled(avr.getPortId()) && !hasAction(SetArcTransmissionStateAction.class)) { startArcAction(true); @@ -1172,12 +1170,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (getAvrDeviceInfo() == null) { // AVR may not have been discovered yet. Delay the message processing. mDelayedMessageBuffer.add(message); - return true; + } else { + HdmiLogger.warning("Invalid message:" + message); + mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); } - HdmiLogger.warning("Invalid message:" + message); - mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return true; } + removeAction(SystemAudioAutoInitiationAction.class); SystemAudioActionFromAvr action = new SystemAudioActionFromAvr(this, message.getSource(), HdmiUtils.parseCommandParamSystemAudioStatus(message), null); addAndStartAction(action); diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java index 512d5378a64a2..78b40fd1892d3 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java @@ -64,13 +64,13 @@ final class SystemAudioAutoInitiationAction extends HdmiCecFeatureAction { } if (cmd.getOpcode() == Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS) { - handleSystemAudioModeStatusMessage(); + handleSystemAudioModeStatusMessage(HdmiUtils.parseCommandParamSystemAudioStatus(cmd)); return true; } return false; } - private void handleSystemAudioModeStatusMessage() { + private void handleSystemAudioModeStatusMessage(boolean isSystemAudioModeOn) { if (!canChangeSystemAudio()) { HdmiLogger.debug("Cannot change system audio mode in auto initiation action."); finish(); @@ -78,9 +78,11 @@ final class SystemAudioAutoInitiationAction extends HdmiCecFeatureAction { } boolean systemAudioModeSetting = tv().getSystemAudioModeSetting(); - // Update AVR's system audio mode regardless of AVR's status. - addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, systemAudioModeSetting, - null)); + if (systemAudioModeSetting && !isSystemAudioModeOn) { + addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, systemAudioModeSetting, null)); + } else { + tv().setSystemAudioMode(isSystemAudioModeOn, true); + } finish(); }