diff options
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; + } + } } |