diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java | 16 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java | 49 | 
2 files changed, 63 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 9bce471fd0cb..8a22ab968165 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -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);          }      } @@ -1336,19 +1336,31 @@ 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();          HdmiDeviceInfo avr = getAvrDeviceInfo();          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 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 8112ca8fbb14..aceae72371eb 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java @@ -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); +    } +  }  |