diff options
| author | 2024-08-10 19:43:41 +0800 | |
|---|---|---|
| committer | 2024-09-05 10:39:24 -0700 | |
| commit | 515c71e80dc8a1de5535bca73d9aa2e6f532b777 (patch) | |
| tree | 50069bb31c6b209ac655fa9778119a0b9a671216 | |
| parent | 3f06b5600510d660ce2b0b4abd4f53971e476027 (diff) | |
HDMI-CEC: Query AVR's audio status with a delay [1/1]
AVR could report its previous volume when it receives a <Give Audio
Status> message instantly after a <User Control Pressed> MUTE key.
The mute status of TV's volume ui could be inverse with AVR's. This
patch allows to query avr's audio status with a delay
Test: verified by vendor
Bug: b/359373824
Flag: EXEMPT bugfix
Change-Id: I273177a98125d2fc045e07cd61da2d237cd1ae02
Signed-off-by: an.xi <an.xi@amlogic.com>
5 files changed, 26 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java index 234d6d323838..236333ee433d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java @@ -53,6 +53,10 @@ abstract class HdmiCecFeatureAction { // Default state used in common by all the feature actions. protected static final int STATE_NONE = 0; + // Delay to query avr's audio status, some avrs could report the old volume first. It could + // show inverse mute state on TV. + protected static final long DELAY_GIVE_AUDIO_STATUS = 500; + // Internal state indicating the progress of action. protected int mState = STATE_NONE; diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 3c7b9d37e4c6..271836ac7d29 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1638,6 +1638,10 @@ public class HdmiControlService extends SystemService { mHandler.post(new WorkSourceUidPreservingRunnable(runnable)); } + void runOnServiceThreadDelayed(Runnable runnable, long delay) { + mHandler.postDelayed(new WorkSourceUidPreservingRunnable(runnable), delay); + } + private void assertRunOnServiceThread() { if (Looper.myLooper() != mHandler.getLooper()) { throw new IllegalStateException("Should run on service thread."); diff --git a/services/core/java/com/android/server/hdmi/SendKeyAction.java b/services/core/java/com/android/server/hdmi/SendKeyAction.java index 7e18d8412aae..11682f664a15 100644 --- a/services/core/java/com/android/server/hdmi/SendKeyAction.java +++ b/services/core/java/com/android/server/hdmi/SendKeyAction.java @@ -180,15 +180,22 @@ final class SendKeyAction extends HdmiCecFeatureAction { && localDevice().getService().isAbsoluteVolumeBehaviorEnabled()) { sendCommand(HdmiCecMessageBuilder.buildUserControlReleased(getSourceAddress(), mTargetAddress), - __ -> sendCommand(HdmiCecMessageBuilder.buildGiveAudioStatus( - getSourceAddress(), - localDevice().findAudioReceiverAddress()))); + __ -> queryAvrAudioStatus()); } else { sendCommand(HdmiCecMessageBuilder.buildUserControlReleased(getSourceAddress(), mTargetAddress)); } } + private void queryAvrAudioStatus() { + localDevice().mService.runOnServiceThreadDelayed( + () -> sendCommand(HdmiCecMessageBuilder.buildGiveAudioStatus( + getSourceAddress(), + localDevice().findAudioReceiverAddress())), + DELAY_GIVE_AUDIO_STATUS); + + } + @Override public boolean processCommand(HdmiCecMessage cmd) { // Send key action doesn't need any incoming CEC command, hence does not consume it. diff --git a/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java index 6ace9f14757c..fca0cfbc7d2f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java @@ -20,6 +20,7 @@ import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM; import static com.android.server.hdmi.HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_BOOT_UP; +import static com.android.server.hdmi.HdmiCecFeatureAction.DELAY_GIVE_AUDIO_STATUS; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.TruthJUnit.assume; @@ -582,6 +583,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { ); mTestLooper.dispatchAll(); + mTestLooper.moveTimeForward(DELAY_GIVE_AUDIO_STATUS); + mTestLooper.dispatchAll(); + assertThat(mNativeWrapper.getResultMessages()).contains( HdmiCecMessageBuilder.buildUserControlPressed(getLogicalAddress(), getSystemAudioDeviceLogicalAddress(), CEC_KEYCODE_VOLUME_UP)); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java b/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java index 673140390ae7..ec44a918f8e8 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java @@ -17,6 +17,7 @@ package com.android.server.hdmi; import static com.android.server.hdmi.HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP; +import static com.android.server.hdmi.HdmiCecFeatureAction.DELAY_GIVE_AUDIO_STATUS; import static com.google.common.truth.Truth.assertThat; @@ -223,6 +224,9 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav ); mTestLooper.dispatchAll(); + mTestLooper.moveTimeForward(DELAY_GIVE_AUDIO_STATUS); + mTestLooper.dispatchAll(); + assertThat(mNativeWrapper.getResultMessages()).contains( HdmiCecMessageBuilder.buildUserControlPressed(getLogicalAddress(), getSystemAudioDeviceLogicalAddress(), CEC_KEYCODE_VOLUME_UP)); |