diff --git a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java index 68311defd3eb0..922a2c14c4cce 100644 --- a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java +++ b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java @@ -54,6 +54,7 @@ final class DelayedMessageBuffer { mBuffer.add(message); break; case Constants.MESSAGE_INITIATE_ARC: + case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE: mBuffer.add(message); break; default: diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index f40010da3d94f..ed7cebbc1b031 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -742,7 +742,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly void onNewAvrAdded(HdmiDeviceInfo avr) { assertRunOnServiceThread(); - if (getSystemAudioModeSetting()) { + if (getSystemAudioModeSetting() && !isSystemAudioActivated()) { addAndStartAction(new SystemAudioAutoInitiationAction(this, avr.getLogicalAddress())); } if (isArcFeatureEnabled() && !hasAction(SetArcTransmissionStateAction.class)) { @@ -1037,6 +1037,11 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { protected boolean handleSetSystemAudioMode(HdmiCecMessage message) { assertRunOnServiceThread(); if (!isMessageForSystemAudio(message)) { + if (getAvrDeviceInfo() == null) { + // AVR may not have been discovered yet. Delay the message processing. + mDelayedMessageBuffer.add(message); + return true; + } HdmiLogger.warning("Invalid message:" + message); mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return true;