diff options
author | Jinsuk Kim <jinsukkim@google.com> | 2014-05-15 16:51:49 +0900 |
---|---|---|
committer | Jinsuk Kim <jinsukkim@google.com> | 2014-05-15 17:19:36 +0900 |
commit | a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f (patch) | |
tree | 7aefcd162a9882af9dd39ce73859bc473b5b48fd /services/core/java/com/android | |
parent | fc2cf830b040fe2e1ab54d7ca2921b3e7bd32220 (diff) | |
download | frameworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.zip frameworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.tar.gz frameworks_base-a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8f.tar.bz2 |
Initialize internal CEC logical devices
Allocates logical address of internal HDMI-CEC logical device(s)
using the resource config_hdmiCecLogicalDeviceType.
Change-Id: I1a0d2f7bce36fc643887241f03161dc053d6c25c
Diffstat (limited to 'services/core/java/com/android')
-rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecController.java | 50 | ||||
-rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiControlService.java | 5 |
2 files changed, 49 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java index 5327ef4..986cb9b 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecController.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java @@ -24,6 +24,7 @@ import android.os.Looper; import android.os.Message; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseIntArray; import libcore.util.EmptyArray; @@ -79,11 +80,12 @@ final class HdmiCecController { new SparseArray<HdmiCecDeviceInfo>(); // Set-like container for all local devices' logical address. // Key and value are same. - private final SparseArray<Integer> mLocalLogicalAddresses = - new SparseArray<Integer>(); + private final SparseIntArray mLocalAddresses = new SparseIntArray(); // Private constructor. Use HdmiCecController.create(). private HdmiCecController() { + // TODO: Consider restoring the local device addresses from persistent storage + // to allocate the same addresses again if possible. } /** @@ -109,6 +111,44 @@ final class HdmiCecController { } /** + * Initialize {@link #mLocalAddresses} by allocating logical addresses for each hosted type. + * + * @param deviceTypes local device types + */ + void initializeLocalDevices(int[] deviceTypes) { + for (int deviceType : deviceTypes) { + int preferred = getPreferredAddress(deviceType); + allocateLogicalAddress(deviceType, preferred, new AllocateLogicalAddressCallback() { + @Override + public void onAllocated(int deviceType, int logicalAddress) { + addLogicalAddress(logicalAddress); + } + }); + } + } + + /** + * Get the preferred address for a given type. + * + * @param deviceType logical device type to get the address for + * @return preferred address; {@link HdmiCec#ADDR_UNREGISTERED} if not available. + */ + private int getPreferredAddress(int deviceType) { + // Uses the data restored from persistent memory at boot up if they are available. + // Otherwise we return UNREGISTERED indicating there is no preferred address. + // Note that for address SPECIFIC_USE(14), HdmiCec.getTypeFromAddress() returns DEVICE_TV, + // meaning that we do not support device type video processor yet. + for (int i = 0; i < mLocalAddresses.size(); ++i) { + int address = mLocalAddresses.keyAt(i); + int type = HdmiCec.getTypeFromAddress(address); + if (type == deviceType) { + return address; + } + } + return HdmiCec.ADDR_UNREGISTERED; + } + + /** * Interface to report allocated logical address. */ interface AllocateLogicalAddressCallback { @@ -322,7 +362,7 @@ final class HdmiCecController { */ int addLogicalAddress(int newLogicalAddress) { if (HdmiCec.isValidAddress(newLogicalAddress)) { - mLocalLogicalAddresses.append(newLogicalAddress, newLogicalAddress); + mLocalAddresses.put(newLogicalAddress, newLogicalAddress); return nativeAddLogicalAddress(mNativePtr, newLogicalAddress); } else { return -1; @@ -337,7 +377,7 @@ final class HdmiCecController { void clearLogicalAddress() { // TODO: consider to backup logical address so that new logical address // allocation can use it as preferred address. - mLocalLogicalAddresses.clear(); + mLocalAddresses.clear(); nativeClearLogicalAddress(mNativePtr); } @@ -382,7 +422,7 @@ final class HdmiCecController { // Can access command targeting devices available in local device or // broadcast command. return address == HdmiCec.ADDR_BROADCAST - || mLocalLogicalAddresses.get(address) != null; + || mLocalAddresses.indexOfKey(address) < 0; } private void onReceiveCommand(HdmiCecMessage message) { diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index c122645..25c221b 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -54,7 +54,10 @@ public final class HdmiControlService extends SystemService { @Override public void onStart() { mCecController = HdmiCecController.create(this); - if (mCecController == null) { + if (mCecController != null) { + mCecController.initializeLocalDevices(getContext().getResources() + .getIntArray(com.android.internal.R.array.config_hdmiCecLogicalDeviceType)); + } else { Slog.i(TAG, "Device does not support HDMI-CEC."); } |