diff options
| author | 2019-01-16 17:39:50 +0000 | |
|---|---|---|
| committer | 2019-01-16 17:39:50 +0000 | |
| commit | 43375255357653c5c43f8dadf65cc85f66eb839c (patch) | |
| tree | 75daa8fbd56e59dd760113cb24cb3978d914272d | |
| parent | 7f7d8fb5eeae853ddcc3c6e964133ec0ca9b55ed (diff) | |
| parent | b9d7f4320477e0a79b31d6d8ca2f08f1e171c8c7 (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.
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; + } + } } |