Update HDMI source volume change handling

Forward volume keys to HdmiControlManager if the Android device is
a HDMI source device and if the volume behavior of the audio device
is full volume.

The output audio device will be full volume if the Android device is
a HDMI source device with a sink that supports HDMI CEC OR if the user
selected HDMI CEC as the volume control mechanism.

In case the user prefers HDMI CEC, always attempt to send CEC messages,
even if the audio sink possibly does not support CEC volume changes.

Bug: 172539380
Test: make; test manually

Change-Id: I520dbebaf5ed8f1827405c65137d039be8d816e3
This commit is contained in:
Marvin Ramin
2020-12-15 16:12:11 +01:00
parent c8d8b7cd9c
commit da8f97e6e5

View File

@@ -1076,7 +1076,6 @@ public class AudioService extends IAudioService.Stub
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_HDMI_CEC)) {
synchronized (mHdmiClientLock) {
mHdmiCecSink = false;
mHdmiManager = mContext.getSystemService(HdmiControlManager.class);
if (mHdmiManager != null) {
mHdmiManager.addHdmiControlStatusChangeListener(
@@ -1508,7 +1507,8 @@ public class AudioService extends IAudioService.Stub
if (isPlatformTelevision()) {
synchronized (mHdmiClientLock) {
if (mHdmiManager != null && mHdmiPlaybackClient != null) {
updateHdmiCecSinkLocked(mHdmiCecSink | false);
updateHdmiCecSinkLocked(
mFullVolumeDevices.contains(AudioSystem.DEVICE_OUT_HDMI));
}
}
}
@@ -1518,7 +1518,8 @@ public class AudioService extends IAudioService.Stub
if (isPlatformTelevision()) {
synchronized (mHdmiClientLock) {
if (mHdmiManager != null) {
updateHdmiCecSinkLocked(mHdmiCecSink | false);
updateHdmiCecSinkLocked(
mFullVolumeDevices.contains(AudioSystem.DEVICE_OUT_HDMI));
}
}
}
@@ -2670,8 +2671,7 @@ public class AudioService extends IAudioService.Stub
if (adjustVolume) {
synchronized (mHdmiClientLock) {
if (mHdmiManager != null) {
// mHdmiCecSink true => mHdmiPlaybackClient != null
if (mHdmiCecSink
if (mHdmiPlaybackClient != null
&& mHdmiCecVolumeControlEnabled
&& streamTypeAlias == AudioSystem.STREAM_MUSIC
// vol change on a full volume device
@@ -7825,9 +7825,8 @@ public class AudioService extends IAudioService.Stub
@GuardedBy("mHdmiClientLock")
private void updateHdmiCecSinkLocked(boolean hdmiCecSink) {
mHdmiCecSink = hdmiCecSink;
if (!hasDeviceVolumeBehavior(AudioSystem.DEVICE_OUT_HDMI)) {
if (mHdmiCecSink) {
if (hdmiCecSink) {
if (DEBUG_VOL) {
Log.d(TAG, "CEC sink: setting HDMI as full vol device");
}
@@ -7885,9 +7884,6 @@ public class AudioService extends IAudioService.Stub
// Set only when device is a set-top box.
@GuardedBy("mHdmiClientLock")
private HdmiPlaybackClient mHdmiPlaybackClient;
// true if we are a set-top box, an HDMI sink is connected and it supports CEC.
@GuardedBy("mHdmiClientLock")
private boolean mHdmiCecSink;
// Set only when device is an audio system.
@GuardedBy("mHdmiClientLock")
private HdmiAudioSystemClient mHdmiAudioSystemClient;
@@ -8142,7 +8138,6 @@ public class AudioService extends IAudioService.Stub
pw.print(" mFixedVolumeDevices="); pw.println(dumpDeviceTypes(mFixedVolumeDevices));
pw.print(" mFullVolumeDevices="); pw.println(dumpDeviceTypes(mFullVolumeDevices));
pw.print(" mExtVolumeController="); pw.println(mExtVolumeController);
pw.print(" mHdmiCecSink="); pw.println(mHdmiCecSink);
pw.print(" mHdmiAudioSystemClient="); pw.println(mHdmiAudioSystemClient);
pw.print(" mHdmiPlaybackClient="); pw.println(mHdmiPlaybackClient);
pw.print(" mHdmiTvClient="); pw.println(mHdmiTvClient);