Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +14 −2 Original line number Original line Diff line number Diff line Loading @@ -837,7 +837,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { void enableAudioReturnChannel(boolean enabled) { void enableAudioReturnChannel(boolean enabled) { assertRunOnServiceThread(); assertRunOnServiceThread(); HdmiDeviceInfo avr = getAvrDeviceInfo(); HdmiDeviceInfo avr = getAvrDeviceInfo(); if (avr != null) { if (avr != null && avr.getPortId() != Constants.INVALID_PORT_ID) { mService.enableAudioReturnChannel(avr.getPortId(), enabled); 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 @ServiceThreadOnly private void disableArcIfExist() { private void disableArcIfExist() { assertRunOnServiceThread(); assertRunOnServiceThread(); Loading @@ -1342,13 +1352,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (avr == null) { if (avr == null) { return; return; } } disableArc(); // Seq #44. // Seq #44. removeAllRunningArcAction(); removeAllRunningArcAction(); if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) { if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) { addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress())); addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress())); } } // Disable ARC Pin earlier, prevent the case where AVR doesn't send <Terminate ARC> in time forceDisableArcOnAllPins(); } } @ServiceThreadOnly @ServiceThreadOnly Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -842,4 +842,53 @@ public class HdmiCecLocalDeviceTvTest { verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(), verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(), 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 Original line Diff line number Diff line Loading @@ -837,7 +837,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { void enableAudioReturnChannel(boolean enabled) { void enableAudioReturnChannel(boolean enabled) { assertRunOnServiceThread(); assertRunOnServiceThread(); HdmiDeviceInfo avr = getAvrDeviceInfo(); HdmiDeviceInfo avr = getAvrDeviceInfo(); if (avr != null) { if (avr != null && avr.getPortId() != Constants.INVALID_PORT_ID) { mService.enableAudioReturnChannel(avr.getPortId(), enabled); 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 @ServiceThreadOnly private void disableArcIfExist() { private void disableArcIfExist() { assertRunOnServiceThread(); assertRunOnServiceThread(); Loading @@ -1342,13 +1352,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (avr == null) { if (avr == null) { return; return; } } disableArc(); // Seq #44. // Seq #44. removeAllRunningArcAction(); removeAllRunningArcAction(); if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) { if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) { addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress())); addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress())); } } // Disable ARC Pin earlier, prevent the case where AVR doesn't send <Terminate ARC> in time forceDisableArcOnAllPins(); } } @ServiceThreadOnly @ServiceThreadOnly Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -842,4 +842,53 @@ public class HdmiCecLocalDeviceTvTest { verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(), verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(), 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); } } }