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

Commit b27e202b authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Add new HDMI CEC messages

Add Give/Report Features messages, validators and builders. Add required
constants for arguments.

Add Request/Report Current Latency messages and basic validators.

Bug: 166227212
Test: atest com.android.server.hdmi

Change-Id: I6c0ece20206d8a9131624e5d46519c4ff83ed525
parent ad263c58
Loading
Loading
Loading
Loading
+110 −72
Original line number Diff line number Diff line
@@ -151,6 +151,10 @@ final class Constants {
            MESSAGE_SET_EXTERNAL_TIMER,
            MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR,
            MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
            MESSAGE_GIVE_FEATURES,
            MESSAGE_REPORT_FEATURES,
            MESSAGE_REQUEST_CURRENT_LATENCY,
            MESSAGE_REPORT_CURRENT_LATENCY,
            MESSAGE_INITIATE_ARC,
            MESSAGE_REPORT_ARC_INITIATED,
            MESSAGE_REPORT_ARC_TERMINATED,
@@ -160,7 +164,8 @@ final class Constants {
            MESSAGE_CDC_MESSAGE,
            MESSAGE_ABORT,
    })
    public @interface FeatureOpcode {}
    public @interface FeatureOpcode {
    }

    static final int MESSAGE_FEATURE_ABORT = 0x00;
    static final int MESSAGE_IMAGE_VIEW_ON = 0x04;
@@ -225,6 +230,10 @@ final class Constants {
    static final int MESSAGE_SET_EXTERNAL_TIMER = 0xA2;
    static final int MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR = 0xA3;
    static final int MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR = 0xA4;
    static final int MESSAGE_GIVE_FEATURES = 0xA5;
    static final int MESSAGE_REPORT_FEATURES = 0xA6;
    static final int MESSAGE_REQUEST_CURRENT_LATENCY = 0xA7;
    static final int MESSAGE_REPORT_CURRENT_LATENCY = 0xA8;
    static final int MESSAGE_INITIATE_ARC = 0xC0;
    static final int MESSAGE_REPORT_ARC_INITIATED = 0xC1;
    static final int MESSAGE_REPORT_ARC_TERMINATED = 0xC2;
@@ -501,6 +510,35 @@ final class Constants {
    static final int VERSION_1_4 = 0x05;
    static final int VERSION_2_0 = 0x06;

    static final int ALL_DEVICE_TYPES_TV = 7;
    static final int ALL_DEVICE_TYPES_RECORDER = 6;
    static final int ALL_DEVICE_TYPES_TUNER = 5;
    static final int ALL_DEVICE_TYPES_PLAYBACK = 4;
    static final int ALL_DEVICE_TYPES_AUDIO_SYSTEM = 3;
    static final int ALL_DEVICE_TYPES_SWITCH = 2;

    static final int DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN = 6;
    static final int DEVICE_FEATURE_TV_SUPPORTS_SET_OSD_STRING = 5;
    static final int DEVICE_FEATURE_SUPPORTS_DECK_CONTROL = 4;
    static final int DEVICE_FEATURE_SUPPORTS_SET_AUDIO_RATE = 3;
    static final int DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX = 2;
    static final int DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX = 1;

    static final int RC_PROFILE_TV = 0;
    static final int RC_PROFILE_SOURCE = 1;

    static final int RC_PROFILE_TV_NONE = 0x0;
    static final int RC_PROFILE_TV_ONE = 0x2;
    static final int RC_PROFILE_TV_TWO = 0x6;
    static final int RC_PROFILE_TV_THREE = 0xA;
    static final int RC_PROFILE_TV_FOUR = 0xE;

    static final int RC_PROFILE_SOURCE_HANDLES_ROOT_MENU = 4;
    static final int RC_PROFILE_SOURCE_HANDLES_SETUP_MENU = 3;
    static final int RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU = 2;
    static final int RC_PROFILE_SOURCE_HANDLES_TOP_MENU = 1;
    static final int RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU = 0;

    private Constants() {
        /* cannot be instantiated */
    }
+29 −0
Original line number Diff line number Diff line
@@ -351,6 +351,8 @@ abstract class HdmiCecLocalDevice {
                return handleRequestShortAudioDescriptor(message);
            case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR:
                return handleReportShortAudioDescriptor(message);
            case Constants.MESSAGE_GIVE_FEATURES:
                return handleGiveFeatures(message);
            default:
                return false;
        }
@@ -551,6 +553,33 @@ abstract class HdmiCecLocalDevice {
        return false;
    }

    protected abstract int getRcProfile();

    protected abstract List<Integer> getRcFeatures();

    protected abstract List<Integer> getDeviceFeatures();

    protected boolean handleGiveFeatures(HdmiCecMessage message) {
        if (mService.getCecVersion() < Constants.VERSION_2_0) {
            return false;
        }

        List<Integer> localDeviceTypes = new ArrayList<>();
        for (HdmiCecLocalDevice localDevice : mService.getAllLocalDevices()) {
            localDeviceTypes.add(localDevice.mDeviceType);
        }


        int rcProfile = getRcProfile();
        List<Integer> rcFeatures = getRcFeatures();
        List<Integer> deviceFeatures = getDeviceFeatures();

        mService.sendCecCommand(
                HdmiCecMessageBuilder.buildReportFeatures(mAddress, mService.getCecVersion(),
                        localDeviceTypes, rcProfile, rcFeatures, deviceFeatures));
        return true;
    }

    @ServiceThreadOnly
    protected boolean handleStandby(HdmiCecMessage message) {
        assertRunOnServiceThread();
+7 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiUtils.CodecSad;
import com.android.server.hdmi.HdmiUtils.DeviceConfig;

import com.google.android.collect.Lists;

import org.xmlpull.v1.XmlPullParserException;

import java.io.File;
@@ -175,6 +177,11 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        return info != null;
    }

    @Override
    protected List<Integer> getDeviceFeatures() {
        return Lists.newArrayList(Constants.DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX);
    }

    @Override
    @ServiceThreadOnly
    void onHotplug(int portId, boolean connected) {
+20 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.hdmi.Constants.LocalActivePort;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;

import com.google.android.collect.Lists;

import java.util.List;

/**
@@ -233,6 +235,24 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
        // do nothing
    }

    @Override
    protected int getRcProfile() {
        return Constants.RC_PROFILE_SOURCE;
    }

    @Override
    protected List<Integer> getRcFeatures() {
        return Lists.newArrayList(Constants.RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU,
                Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU,
                Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU,
                Constants.RC_PROFILE_SOURCE_HANDLES_TOP_MENU);
    }

    @Override
    protected List<Integer> getDeviceFeatures() {
        return Lists.newArrayList();
    }

    // Active source claiming needs to be handled in Service
    // since service can decide who will be the active source when the device supports
    // multiple device types in this method.
+18 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiControlService.SendMessageCallback;

import com.google.android.collect.Lists;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -1478,6 +1480,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        return true;
    }

    @Override
    protected int getRcProfile() {
        return Constants.RC_PROFILE_TV;
    }

    @Override
    protected List<Integer> getRcFeatures() {
        return Lists.newArrayList(Constants.RC_PROFILE_TV_NONE);
    }

    @Override
    protected List<Integer> getDeviceFeatures() {
        return Lists.newArrayList(Constants.DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX,
                Constants.DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN);
    }

    @Override
    protected void sendStandby(int deviceId) {
        HdmiDeviceInfo targetDevice = mService.getHdmiCecNetwork().getDeviceInfo(deviceId);
Loading