Merge "Fix illegal volume value issue"

This commit is contained in:
Dan Zhang
2018-01-18 21:50:10 +00:00
committed by Gerrit Code Review
5 changed files with 39 additions and 10 deletions

View File

@@ -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;
}

View File

@@ -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);
}
}
}

View File

@@ -151,6 +151,32 @@ final class HdmiUtils {
return cmd.getParams()[0] == Constants.SYSTEM_AUDIO_STATUS_ON;
}
/**
* 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}.
*

View File

@@ -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)) {

View File

@@ -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)) {