Merge "Send <Request ARC Termination> when Standby"
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user