From 5310682e6e1ba797accd30b3336b2fe71fe329d2 Mon Sep 17 00:00:00 2001 From: Yan Han Date: Thu, 11 May 2023 16:38:00 +0200 Subject: [PATCH] Improve reliability of soundbar volume UI on TVs. Currently, volume behavior can switch from adjust-only AVB to full volume behavior multiple times shortly after plugging in a soundbar. This causes volume UI to stop working intermittently, and adds noise to volume behavior listeners. This CL makes two changes to make this less likely: 1. When switching from adjust-only AVB to regular AVB, don't switch to full volume while waiting for the change to take place. Staying with adjust-only AVB is fine because it provides a subset of the features of regular AVB. 2. When support becomes unknown, don't switch to full volume behavior from adjust-only absolute volume behavior. It's unnecessary because adjust-only absolute volume behavior may be used regardless of support. Test: manual with falcon and atom Bug: 282012994 Change-Id: Ibf99fb67788441d5257c63b64a4b6683c9336798 --- .../android/server/hdmi/HdmiCecLocalDevice.java | 7 +++---- .../android/server/hdmi/HdmiControlService.java | 16 +++++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index f37ad5ed70492..ca1abd683d4f3 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -1013,11 +1013,10 @@ abstract class HdmiCecLocalDevice extends HdmiLocalDevice { } @ServiceThreadOnly - void addAvbAudioStatusAction(int targetAddress) { + void startNewAvbAudioStatusAction(int targetAddress) { assertRunOnServiceThread(); - if (!hasAction(AbsoluteVolumeAudioStatusAction.class)) { - addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress)); - } + removeAction(AbsoluteVolumeAudioStatusAction.class); + addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress)); } @ServiceThreadOnly diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index e87ed0a32a972..cede2738cff07 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -4341,12 +4341,9 @@ public class HdmiControlService extends SystemService { switch (systemAudioDeviceInfo.getDeviceFeatures().getSetAudioVolumeLevelSupport()) { case DeviceFeatures.FEATURE_SUPPORTED: if (currentVolumeBehavior != AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { - // If we're currently using adjust-only absolute volume behavior, switch to - // full volume behavior until we successfully adopt absolute volume behavior - switchToFullVolumeBehavior(); // Start an action that will call enableAbsoluteVolumeBehavior // once the System Audio device sends - localCecDevice.addAvbAudioStatusAction( + localCecDevice.startNewAvbAudioStatusAction( systemAudioDeviceInfo.getLogicalAddress()); } return; @@ -4358,10 +4355,13 @@ public class HdmiControlService extends SystemService { != AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY) { // If we're currently using absolute volume behavior, switch to full volume // behavior until we successfully adopt adjust-only absolute volume behavior - switchToFullVolumeBehavior(); + if (currentVolumeBehavior == AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { + getAudioManager().setDeviceVolumeBehavior(getAvbAudioOutputDevice(), + AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + } // Start an action that will call enableAbsoluteVolumeBehavior // once the System Audio device sends - localCecDevice.addAvbAudioStatusAction( + localCecDevice.startNewAvbAudioStatusAction( systemAudioDeviceInfo.getLogicalAddress()); } } else { @@ -4369,7 +4369,9 @@ public class HdmiControlService extends SystemService { } return; case DeviceFeatures.FEATURE_SUPPORT_UNKNOWN: - switchToFullVolumeBehavior(); + if (currentVolumeBehavior == AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { + switchToFullVolumeBehavior(); + } localCecDevice.querySetAudioVolumeLevelSupport( systemAudioDeviceInfo.getLogicalAddress()); }