summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
+ }
+ }
}