Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f766f24 authored by Yan Han's avatar Yan Han
Browse files

Ignore incoming <Set Audio Volume Level> messages with out-of-bounds volume

Previously, such messages could cause a TV to change its volume level to
100% at unexpected times, because Playback devices may use <Set Audio
Volume Level>[127] to check whether the TV supports the message.

(The CEC range for volume index is 0 to 100 inclusive. 127 means
"unknown volume".)

Bug: 286559620
Test: atest com.android.server.hdmi.HdmiCecLocalDeviceTvTest#receiveSetAudioVolumeLevel_volumeOutOfBounds_noVolumeChange; manual

Change-Id: Ie1abda753b2a6eaccc54970ff15ba3022ad66b31
parent fb685b91
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -1184,7 +1184,11 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        if (mService.isSystemAudioActivated()) {
            return Constants.ABORT_NOT_IN_CORRECT_MODE;
        } else {
            mService.setStreamMusicVolume(message.getAudioVolumeLevel(), 0);
            int audioVolumeLevel = message.getAudioVolumeLevel();
            if (audioVolumeLevel >= AudioStatus.MIN_VOLUME
                    && audioVolumeLevel <= AudioStatus.MAX_VOLUME) {
                mService.setStreamMusicVolume(audioVolumeLevel, 0);
            }
            return Constants.HANDLED;
        }
    }
+18 −0
Original line number Diff line number Diff line
@@ -1012,6 +1012,24 @@ public class HdmiCecLocalDeviceTvTest {
                anyInt());
    }

    @Test
    public void receiveSetAudioVolumeLevel_volumeOutOfBounds_noVolumeChange() {
        mAudioFramework.setStreamMaxVolume(AudioManager.STREAM_MUSIC, 25);

        // Max volume of STREAM_MUSIC is retrieved on boot
        mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY);
        mTestLooper.dispatchAll();

        mNativeWrapper.onCecMessage(SetAudioVolumeLevelMessage.build(
                ADDR_PLAYBACK_1,
                ADDR_TV,
                127));
        mTestLooper.dispatchAll();

        verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(),
                anyInt());
    }

    @Test
    public void tvSendRequestArcTerminationOnSleep() {
        // Emulate Audio device on port 0x2000 (supports ARC)