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

Commit 4ab2de10 authored by daren.liao's avatar daren.liao Committed by Nathalie Le Clair
Browse files

Fix SAD validation condition

This CL fixes a bug in the condition for validating a Short Audio
Descriptor. Without this CL, valid SADs get dropped, while invalid SADs
get forwarded to the audio framework. With this CL, only valid SADs get
forwarded to the audio framework.

Test: atest and manual
Bug: 215186955

Change-Id: Idfdff2546cf2188e428f4e7b925d402ed9e0e46e
parent 1d6e7107
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -337,6 +337,8 @@ final class Constants {
    static final int AUDIO_CODEC_WMAPRO = 0xE; // Support WMA-Pro
    static final int AUDIO_CODEC_MAX = 0xF;

    static final int AUDIO_FORMAT_MASK = 0b0111_1000;

    @StringDef({
        AUDIO_DEVICE_ARC_IN,
        AUDIO_DEVICE_SPDIF,
+8 −2
Original line number Diff line number Diff line
@@ -200,8 +200,14 @@ final class RequestSadAction extends HdmiCecFeatureAction {
    }

    private boolean isValidCodec(byte codec) {
        return Constants.AUDIO_CODEC_NONE < (codec & 0xFF)
                && (codec & 0xFF) <= Constants.AUDIO_CODEC_MAX;
        // Bit 7 needs to be 0.
        if ((codec & (1 << 7)) != 0) {
            return false;
        }
        // Bit [6, 3] is the audio format code.
        int audioFormatCode = (codec & Constants.AUDIO_FORMAT_MASK) >> 3;
        return Constants.AUDIO_CODEC_NONE < audioFormatCode
                && audioFormatCode <= Constants.AUDIO_CODEC_MAX;
    }

    private void updateResult(byte[] sad) {
+56 −55
Original line number Diff line number Diff line
@@ -295,10 +295,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_1 = new byte[]{
                0x01, 0x18, 0x4A,
                0x02, 0x64, 0x5A,
                0x03, 0x4B, 0x00,
                0x04, 0x20, 0x0A};
                0x0F, 0x18, 0x4A,
                0x17, 0x64, 0x5A,
                0x1F, 0x4B, 0x00,
                0x27, 0x20, 0x0A};
        HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -310,10 +310,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_2 = new byte[]{
                0x05, 0x18, 0x4A,
                0x06, 0x64, 0x5A,
                0x07, 0x4B, 0x00,
                0x08, 0x20, 0x0A};
                0x2F, 0x18, 0x4A,
                0x37, 0x64, 0x5A,
                0x3F, 0x4B, 0x00,
                0x47, 0x20, 0x0A};
        HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -325,10 +325,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_3 = new byte[]{
                0x09, 0x18, 0x4A,
                0x0A, 0x64, 0x5A,
                0x0B, 0x4B, 0x00,
                0x0C, 0x20, 0x0A};
                0x4F, 0x18, 0x4A,
                0x57, 0x64, 0x5A,
                0x5F, 0x4B, 0x00,
                0x67, 0x20, 0x0A};
        HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -340,9 +340,9 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_4 = new byte[]{
                0x0D, 0x18, 0x4A,
                0x0E, 0x64, 0x5A,
                0x0F, 0x4B, 0x00};
                0x6F, 0x18, 0x4A,
                0x77, 0x64, 0x5A,
                0x7F, 0x4B, 0x00};
        HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -371,9 +371,9 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_1 = new byte[]{
                0x01, 0x18, 0x4A,
                0x03, 0x4B, 0x00,
                0x04, 0x20, 0x0A};
                0x0F, 0x18, 0x4A,
                0x1F, 0x4B, 0x00,
                0x27, 0x20, 0x0A};
        HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -385,7 +385,7 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_2 = new byte[]{
                0x08, 0x20, 0x0A};
                0x2F, 0x20, 0x0A};
        HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -397,10 +397,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_3 = new byte[]{
                0x09, 0x18, 0x4A,
                0x0A, 0x64, 0x5A,
                0x0B, 0x4B, 0x00,
                0x0C, 0x20, 0x0A};
                0x4F, 0x18, 0x4A,
                0x57, 0x64, 0x5A,
                0x5F, 0x4B, 0x00,
                0x67, 0x20, 0x0A};
        HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -412,7 +412,7 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_4 = new byte[]{
                0x0F, 0x4B, 0x00};
                0x7F, 0x4B, 0x00};
        HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -440,11 +440,12 @@ public class RequestSadActionTest {
        HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
        // Negative values require explicit casting
        byte[] sadsToRespond_1 = new byte[]{
                0x20, 0x18, 0x4A,
                0x21, 0x64, 0x5A,
                0x22, 0x4B, 0x00,
                0x23, 0x20, 0x0A};
                (byte) 0x80, 0x18, 0x4A,
                (byte) 0x82, 0x64, 0x5A,
                (byte) 0x87, 0x4B, 0x00,
                (byte) 0x8F, 0x20, 0x0A};
        HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -456,10 +457,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_2 = new byte[]{
                0x24, 0x18, 0x4A,
                0x25, 0x64, 0x5A,
                0x26, 0x4B, 0x00,
                0x27, 0x20, 0x0A};
                (byte) 0x92, 0x18, 0x4A,
                (byte) 0x98, 0x64, 0x5A,
                (byte) 0xA1, 0x4B, 0x00,
                (byte) 0xA4, 0x20, 0x0A};
        HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -471,10 +472,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_3 = new byte[]{
                0x28, 0x18, 0x4A,
                0x29, 0x64, 0x5A,
                0x2A, 0x4B, 0x00,
                0x2B, 0x20, 0x0A};
                (byte) 0xB3, 0x18, 0x4A,
                (byte) 0xBA, 0x64, 0x5A,
                (byte) 0xCB, 0x4B, 0x00,
                (byte) 0xCF, 0x20, 0x0A};
        HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -486,9 +487,9 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_4 = new byte[]{
                0x2C, 0x18, 0x4A,
                0x2D, 0x64, 0x5A,
                0x2E, 0x4B, 0x00};
                (byte) 0xF0, 0x18, 0x4A,
                (byte) 0xF1, 0x64, 0x5A,
                (byte) 0xF3, 0x4B, 0x00};
        HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -510,10 +511,10 @@ public class RequestSadActionTest {
                mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
                CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
        byte[] sadsToRespond_1 = new byte[]{
                0x01, 0x18,
                0x02, 0x64, 0x5A,
                0x03, 0x4B, 0x00,
                0x04, 0x20, 0x0A};
                0x0F, 0x18,
                0x17, 0x64, 0x5A,
                0x1F, 0x4B, 0x00,
                0x27, 0x20, 0x0A};
        HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -580,10 +581,10 @@ public class RequestSadActionTest {
                new int[]{Constants.AUDIO_CODEC_LPCM, Constants.AUDIO_CODEC_DD,
                        Constants.AUDIO_CODEC_MP3, Constants.AUDIO_CODEC_MPEG2});
        byte[] sadsToRespond_1 = new byte[]{
                0x01, 0x18, 0x4A,
                0x02, 0x64, 0x5A,
                0x04, 0x20, 0x0A,
                0x05, 0x18, 0x4A};
                0x0F, 0x18, 0x4A,
                0x17, 0x64, 0x5A,
                0x27, 0x20, 0x0A,
                0x2F, 0x18, 0x4A};
        HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -596,10 +597,10 @@ public class RequestSadActionTest {
                new int[]{Constants.AUDIO_CODEC_AAC, Constants.AUDIO_CODEC_DTS,
                        Constants.AUDIO_CODEC_ATRAC, Constants.AUDIO_CODEC_DDP});
        byte[] sadsToRespond_2 = new byte[]{
                0x06, 0x64, 0x5A,
                0x07, 0x4B, 0x00,
                0x08, 0x20, 0x0A,
                0x09, 0x18, 0x4A};
                0x37, 0x64, 0x5A,
                0x3F, 0x4B, 0x00,
                0x47, 0x20, 0x0A,
                0x4F, 0x18, 0x4A};
        HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -612,10 +613,10 @@ public class RequestSadActionTest {
                new int[]{Constants.AUDIO_CODEC_DTSHD, Constants.AUDIO_CODEC_TRUEHD,
                        Constants.AUDIO_CODEC_DST, Constants.AUDIO_CODEC_MAX});
        byte[] sadsToRespond_3 = new byte[]{
                0x0B, 0x4B, 0x00,
                0x0C, 0x20, 0x0A,
                0x0D, 0x18, 0x4A,
                0x0F, 0x4B, 0x00};
                0x5F, 0x4B, 0x00,
                0x67, 0x20, 0x0A,
                0x6F, 0x18, 0x4A,
                0x7F, 0x4B, 0x00};
        HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
                Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
        assertThat(mNativeWrapper.getResultMessages()).contains(expected3);