Merge "HDMI: check and wake up avr first [1/1]" into main
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 154710f..81c30dd 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -1225,11 +1225,15 @@
boolean avrSystemAudioMode = HdmiUtils.parseCommandParamSystemAudioStatus(message);
// Set System Audio Mode according to TV's settings.
// Handle <System Audio Mode Status> here only when
- // SystemAudioAutoInitiationAction timeout
+ // SystemAudioAutoInitiationAction timeout.
+ // If AVR reports SAM on and it is in standby, the action SystemAudioActionFromTv
+ // triggers a <SAM Request> that will wake-up the AVR.
HdmiDeviceInfo avr = getAvrDeviceInfo();
if (avr == null) {
setSystemAudioMode(false);
- } else if (avrSystemAudioMode != tvSystemAudioMode) {
+ } else if (avrSystemAudioMode != tvSystemAudioMode
+ || (avrSystemAudioMode && avr.getDevicePowerStatus()
+ == HdmiControlManager.POWER_STATUS_STANDBY)) {
addAndStartAction(new SystemAudioActionFromTv(this, avr.getLogicalAddress(),
tvSystemAudioMode, null));
} else {
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
index 56e538b..028637b 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
@@ -16,7 +16,9 @@
package com.android.server.hdmi;
+import android.hardware.hdmi.HdmiControlManager;
import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
@@ -89,8 +91,13 @@
// If System Audio Control feature is enabled, turn on system audio mode when new AVR is
// detected. Otherwise, turn off system audio mode.
+ // If AVR reports SAM on and it is in standby, the action SystemAudioActionFromTv
+ // triggers a <SAM Request> that will wake-up the AVR.
boolean targetSystemAudioMode = tv().isSystemAudioControlFeatureEnabled();
- if (currentSystemAudioMode != targetSystemAudioMode) {
+ if (currentSystemAudioMode != targetSystemAudioMode
+ || (currentSystemAudioMode && tv().getAvrDeviceInfo() != null
+ && tv().getAvrDeviceInfo().getDevicePowerStatus()
+ == HdmiControlManager.POWER_STATUS_STANDBY)) {
// Start System Audio Control feature actions only if necessary.
addAndStartAction(
new SystemAudioActionFromTv(tv(), mAvrAddress, targetSystemAudioMode, null));
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
index 2b93ccb..a7e8a00 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -2148,6 +2148,40 @@
.hasSize(1);
}
+
+ @Test
+ public void handleReportAudioStatus_SamOnAvrStandby_startSystemAudioActionFromTv() {
+ mHdmiControlService.getHdmiCecConfig().setIntValue(
+ HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
+ HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED);
+ // Emulate Audio device on port 0x1000 (does not support ARC)
+ mNativeWrapper.setPortConnectionStatus(1, true);
+ HdmiCecMessage reportPhysicalAddress =
+ HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
+ ADDR_AUDIO_SYSTEM, 0x1000, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
+ HdmiCecMessage reportPowerStatus =
+ HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_AUDIO_SYSTEM, ADDR_TV,
+ HdmiControlManager.POWER_STATUS_STANDBY);
+ mNativeWrapper.onCecMessage(reportPhysicalAddress);
+ mNativeWrapper.onCecMessage(reportPowerStatus);
+ mTestLooper.dispatchAll();
+ assertThat(mHdmiCecLocalDeviceTv.getActions(SystemAudioActionFromTv.class)).hasSize(0);
+
+ HdmiCecFeatureAction systemAudioAutoInitiationAction =
+ new SystemAudioAutoInitiationAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM);
+ mHdmiCecLocalDeviceTv.addAndStartAction(systemAudioAutoInitiationAction);
+ HdmiCecMessage reportSystemAudioMode =
+ HdmiCecMessageBuilder.buildReportSystemAudioMode(
+ ADDR_AUDIO_SYSTEM,
+ mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(),
+ true);
+ mHdmiControlService.handleCecCommand(reportSystemAudioMode);
+ mTestLooper.dispatchAll();
+
+ // SAM must be on; ARC must be off
+ assertThat(mHdmiCecLocalDeviceTv.getActions(SystemAudioActionFromTv.class)).hasSize(1);
+ }
+
protected static class MockTvDevice extends HdmiCecLocalDeviceTv {
MockTvDevice(HdmiControlService service) {
super(service);