diff options
5 files changed, 39 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 81bccdc7dfaa..31fad5c8114f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -698,10 +698,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { protected boolean handleReportAudioStatus(HdmiCecMessage message) { assertRunOnServiceThread(); - byte params[] = message.getParams(); - int mute = params[0] & 0x80; - int volume = params[0] & 0x7F; - setAudioStatus(mute == 0x80, volume); + boolean mute = HdmiUtils.isAudioStatusMute(message); + int volume = HdmiUtils.getAudioStatusVolume(message); + setAudioStatus(mute, volume); return true; } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 807b1b19f870..3d079ccb0cad 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -989,8 +989,12 @@ public final class HdmiControlService extends SystemService { } // FLAG_HDMI_SYSTEM_AUDIO_VOLUME prevents audio manager from announcing // volume change notification back to hdmi control service. - audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, - AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME); + int flag = AudioManager.FLAG_HDMI_SYSTEM_AUDIO_VOLUME; + if (0 <= volume && volume <= 100) { + Slog.i(TAG, "volume: " + volume); + flag |= AudioManager.FLAG_SHOW_UI; + audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, flag); + } } } diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java index 8b1641187ac8..4ac3bba73e25 100644 --- a/services/core/java/com/android/server/hdmi/HdmiUtils.java +++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java @@ -152,6 +152,32 @@ final class HdmiUtils { } /** + * Parse the <Report Audio Status> message and check if it is mute + * + * @param cmd the CEC message to parse + * @return true if the given parameter has [MUTE] + */ + static boolean isAudioStatusMute(HdmiCecMessage cmd) { + byte params[] = cmd.getParams(); + return (params[0] & 0x80) == 0x80; + } + + /** + * Parse the <Report Audio Status> message and extract the volume + * + * @param cmd the CEC message to parse + * @return device's volume. Constants.UNKNOWN_VOLUME in case it is out of range + */ + static int getAudioStatusVolume(HdmiCecMessage cmd) { + byte params[] = cmd.getParams(); + int volume = params[0] & 0x7F; + if (volume < 0x00 || 0x64 < volume) { + volume = Constants.UNKNOWN_VOLUME; + } + return volume; + } + + /** * Convert integer array to list of {@link Integer}. * * <p>The result is immutable. diff --git a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java index cab8439b6f92..d41a36ca031f 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java @@ -92,8 +92,8 @@ final class SystemAudioStatusAction extends HdmiCecFeatureAction { private void handleReportAudioStatus(HdmiCecMessage cmd) { byte[] params = cmd.getParams(); - boolean mute = (params[0] & 0x80) == 0x80; - int volume = params[0] & 0x7F; + boolean mute = HdmiUtils.isAudioStatusMute(cmd); + int volume = HdmiUtils.getAudioStatusVolume(cmd); tv().setAudioStatus(mute, volume); if (!(tv().isSystemAudioActivated() ^ mute)) { diff --git a/services/core/java/com/android/server/hdmi/VolumeControlAction.java b/services/core/java/com/android/server/hdmi/VolumeControlAction.java index cd38b1fb2ac6..0011387f1c28 100644 --- a/services/core/java/com/android/server/hdmi/VolumeControlAction.java +++ b/services/core/java/com/android/server/hdmi/VolumeControlAction.java @@ -139,8 +139,8 @@ final class VolumeControlAction extends HdmiCecFeatureAction { private boolean handleReportAudioStatus(HdmiCecMessage cmd) { byte params[] = cmd.getParams(); - boolean mute = (params[0] & 0x80) == 0x80; - int volume = params[0] & 0x7F; + boolean mute = HdmiUtils.isAudioStatusMute(cmd); + int volume = HdmiUtils.getAudioStatusVolume(cmd); mLastAvrVolume = volume; mLastAvrMute = mute; if (shouldUpdateAudioVolume(mute)) { |