Merge "Send <Request ARC Termination> when Standby"

This commit is contained in:
Paul Colța
2022-11-17 13:20:53 +00:00
committed by Gerrit Code Review
2 changed files with 63 additions and 2 deletions

View File

@@ -837,7 +837,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
void enableAudioReturnChannel(boolean enabled) {
assertRunOnServiceThread();
HdmiDeviceInfo avr = getAvrDeviceInfo();
if (avr != null) {
if (avr != null && avr.getPortId() != Constants.INVALID_PORT_ID) {
mService.enableAudioReturnChannel(avr.getPortId(), enabled);
}
}
@@ -1335,6 +1335,16 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
}
}
@ServiceThreadOnly
private void forceDisableArcOnAllPins() {
List<HdmiPortInfo> ports = mService.getPortInfo();
for (HdmiPortInfo port : ports) {
if (isArcFeatureEnabled(port.getId())) {
mService.enableAudioReturnChannel(port.getId(), false);
}
}
}
@ServiceThreadOnly
private void disableArcIfExist() {
assertRunOnServiceThread();
@@ -1342,13 +1352,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (avr == null) {
return;
}
disableArc();
// Seq #44.
removeAllRunningArcAction();
if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) {
addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress()));
}
// Disable ARC Pin earlier, prevent the case where AVR doesn't send <Terminate ARC> in time
forceDisableArcOnAllPins();
}
@ServiceThreadOnly

View File

@@ -842,4 +842,53 @@ public class HdmiCecLocalDeviceTvTest {
verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(),
anyInt());
}
@Test
public void tvSendRequestArcTerminationOnSleep() {
// Emulate Audio device on port 0x2000 (supports ARC)
mNativeWrapper.setPortConnectionStatus(2, true);
HdmiCecMessage hdmiCecMessage = HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
ADDR_AUDIO_SYSTEM, 0x2000, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
mNativeWrapper.onCecMessage(hdmiCecMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDeviceTv.startArcAction(true);
mTestLooper.dispatchAll();
HdmiCecMessage requestArcInitiation = HdmiCecMessageBuilder.buildRequestArcInitiation(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
HdmiCecMessage requestArcTermination = HdmiCecMessageBuilder.buildRequestArcTermination(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc(
ADDR_AUDIO_SYSTEM,
ADDR_TV);
HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
assertThat(mNativeWrapper.getResultMessages()).contains(requestArcInitiation);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(requestArcTermination);
mNativeWrapper.onCecMessage(initiateArc);
mTestLooper.dispatchAll();
// Finish querying SADs
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
// ARC should be established after RequestSadAction is finished
assertThat(mNativeWrapper.getResultMessages()).contains(reportArcInitiated);
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(requestArcTermination);
}
}