summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shubang Lu <shubang@google.com> 2019-01-16 17:39:50 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-01-16 17:39:50 +0000
commit43375255357653c5c43f8dadf65cc85f66eb839c (patch)
tree75daa8fbd56e59dd760113cb24cb3978d914272d
parent7f7d8fb5eeae853ddcc3c6e964133ec0ca9b55ed (diff)
parentb9d7f4320477e0a79b31d6d8ca2f08f1e171c8c7 (diff)
Merge changes Ic1afbadf,I4074a924,If38b8c6d,I7fe7a17e
* changes: Broadcast Active Source when user enables HDMI CEC control. Use portid to physical address mapping to get correct port address. Add classes to hold Short Audio Descriptor xml parsed data. Implement find key receiver method for Audio System device to send key code to active source.
-rw-r--r--services/core/java/com/android/server/hdmi/Constants.java10
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java12
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java4
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java2
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java6
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiUtils.java29
6 files changed, 56 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index ff029c194f12..297a418fa5e3 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -17,6 +17,7 @@
package com.android.server.hdmi;
import android.annotation.IntDef;
+import android.annotation.StringDef;
import android.hardware.hdmi.HdmiDeviceInfo;
import java.lang.annotation.Retention;
@@ -222,6 +223,15 @@ final class Constants {
static final int AUDIO_CODEC_WMAPRO = 0xE; // Support WMA-Pro
static final int AUDIO_CODEC_MAX = 0xF;
+ @StringDef({
+ AUDIO_DEVICE_ARC_IN,
+ AUDIO_DEVICE_SPDIF,
+ })
+ public @interface AudioDevice {}
+
+ static final String AUDIO_DEVICE_ARC_IN = "ARC_IN";
+ static final String AUDIO_DEVICE_SPDIF = "SPDIF";
+
// Bit mask used to get the routing path of the top level device.
// When &'d with the path 1.2.2.0 (0x1220), for instance, gives 1.0.0.0.
static final int ROUTING_PATH_TOP_MASK = 0xF000;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 1029a0d7677d..71075f3d71ce 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -269,6 +269,10 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
@ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
+ if (reason == mService.INITIATED_BY_ENABLE_CEC) {
+ mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+ getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST);
+ }
mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, mService.getPhysicalAddress(), mDeviceType));
@@ -288,7 +292,10 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
@Override
protected int findKeyReceiverAddress() {
- return Constants.ADDR_TV;
+ if (getActiveSource().isValid()) {
+ return getActiveSource().logicalAddress;
+ }
+ return Constants.ADDR_INVALID;
}
@VisibleForTesting
@@ -1051,8 +1058,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
return;
}
- int routingInformationPath =
- getActivePathOnSwitchFromActivePortId(getRoutingPort());
+ int routingInformationPath = mService.portIdToPath(getRoutingPort());
// If current device is already the leaf of the whole HDMI system, will do nothing.
if (routingInformationPath == mService.getPhysicalAddress()) {
HdmiLogger.debug("Current device can't assign valid physical address"
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 07db9716497c..32288de15a00 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -77,6 +77,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
@ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
+ if (reason == mService.INITIATED_BY_ENABLE_CEC) {
+ mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+ getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST);
+ }
mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, mService.getPhysicalAddress(), mDeviceType));
mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
index 83c2fe12e462..ae008b4bfa7a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
@@ -218,7 +218,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
// This method should only be called when the device can be the active source.
protected void setAndBroadcastActiveSource(HdmiCecMessage message, int physicalAddress) {
mService.setAndBroadcastActiveSource(
- message, physicalAddress, getDeviceInfo().getDeviceType());
+ physicalAddress, getDeviceInfo().getDeviceType(), message.getSource());
}
@ServiceThreadOnly
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 7174f6f62ffe..486faf3e9fa5 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -2707,14 +2707,14 @@ public class HdmiControlService extends SystemService {
// For example, when receiving broadcast messages, all the device types will call this
// method but only one of them will be the Active Source.
protected void setAndBroadcastActiveSource(
- HdmiCecMessage message, int physicalAddress, int deviceType) {
+ int physicalAddress, int deviceType, int source) {
// If the device has both playback and audio system logical addresses,
// playback will claim active source. Otherwise audio system will.
if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) {
HdmiCecLocalDevicePlayback playback = playback();
playback.setIsActiveSource(true);
playback.wakeUpIfActiveSource();
- playback.maySendActiveSource(message.getSource());
+ playback.maySendActiveSource(source);
setActiveSource(playback.mAddress, physicalAddress);
}
@@ -2725,7 +2725,7 @@ public class HdmiControlService extends SystemService {
} else {
audioSystem.setIsActiveSource(true);
audioSystem.wakeUpIfActiveSource();
- audioSystem.maySendActiveSource(message.getSource());
+ audioSystem.maySendActiveSource(source);
setActiveSource(audioSystem.mAddress, physicalAddress);
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java
index 21106828d43f..11e557c024ce 100644
--- a/services/core/java/com/android/server/hdmi/HdmiUtils.java
+++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java
@@ -391,4 +391,33 @@ final class HdmiUtils {
}
pw.decreaseIndent();
}
+
+ // Device configuration of its supported Codecs and their Short Audio Descriptors.
+ public static class DeviceConfig {
+ /** Name of the device. Should be {@link Constants.AudioDevice}. **/
+ public final String name;
+ /** List of a {@link CodecSad}. **/
+ public final List<CodecSad> supportedCodecs;
+
+ private DeviceConfig(String name, List<CodecSad> supportedCodecs) {
+ this.name = name;
+ this.supportedCodecs = supportedCodecs;
+ }
+ }
+
+ // Short Audio Descriptor of a specific Codec
+ public static class CodecSad {
+ /** Audio Codec. Should be {@link Constants.AudioCodec}. **/
+ public final int audioCodec;
+ /**
+ * Three-byte Short Audio Descriptor. See HDMI Specification 1.4b CEC 13.15.3 and
+ * ANSI-CTA-861-F-FINAL 7.5.2 Audio Data Block for more details.
+ */
+ public final byte[] sad;
+
+ public CodecSad(int audioCodec, byte[] sad) {
+ this.audioCodec = audioCodec;
+ this.sad = sad;
+ }
+ }
}