Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +14 −2 Original line number Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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(); Loading @@ -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 Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -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); } } Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +14 −2 Original line number Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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(); Loading @@ -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 Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -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); } }