CEC: Define a system property to keep playback device awake

Playback device doesn't go to suspend (standby) mode if it's
the active source. This CL makes the behavior configurable through
the system property persist.sys.hdmi.keep_awake.

Bug: 19299723
Change-Id: Icb8b593ab44429ec0520e60d19d0368982ff5667
This commit is contained in:
Jinsuk Kim
2015-02-10 07:10:40 +09:00
parent be96280fda
commit bad839386a
2 changed files with 56 additions and 7 deletions

View File

@@ -214,6 +214,10 @@ final class Constants {
// values which denotes the device type in HDMI Spec 1.4.
static final String PROPERTY_DEVICE_TYPE = "ro.hdmi.device_type";
// Set to false to allow playback device to go to suspend mode even
// when it's an active source. True by default.
static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake";
static final int RECORDING_TYPE_DIGITAL_RF = 1;
static final int RECORDING_TYPE_ANALOGUE_RF = 2;
static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;

View File

@@ -38,9 +38,11 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
// Used to keep the device awake while it is the active source. For devices that
// cannot wake up via CEC commands, this address the inconvenience of having to
// turn them on.
// turn them on. True by default, and can be disabled (i.e. device can go to sleep
// in active device status) by explicitly setting the system property
// persist.sys.hdmi.keep_awake to false.
// Lazily initialized - should call getWakeLock() to get the instance.
private WakeLock mWakeLock;
private ActiveWakeLock mWakeLock;
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
@@ -142,19 +144,30 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
mIsActiveSource = on;
if (on) {
getWakeLock().acquire();
HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);
} else {
getWakeLock().release();
HdmiLogger.debug("Wake lock released");
}
}
@ServiceThreadOnly
private WakeLock getWakeLock() {
private ActiveWakeLock getWakeLock() {
assertRunOnServiceThread();
if (mWakeLock == null) {
mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);
if (SystemProperties.getBoolean(Constants.PROPERTY_KEEP_AWAKE, true)) {
mWakeLock = new SystemWakeLock();
} else {
// Create a dummy lock object that doesn't do anything about wake lock,
// hence allows the device to go to sleep even if it's the active source.
mWakeLock = new ActiveWakeLock() {
@Override
public void acquire() { }
@Override
public void release() { }
@Override
public boolean isHeld() { return false; }
};
HdmiLogger.debug("No wakelock is used to keep the display on.");
}
}
return mWakeLock;
}
@@ -258,4 +271,36 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
super.dump(pw);
pw.println("mIsActiveSource: " + mIsActiveSource);
}
// Wrapper interface over PowerManager.WakeLock
private interface ActiveWakeLock {
void acquire();
void release();
boolean isHeld();
}
private class SystemWakeLock implements ActiveWakeLock {
private final WakeLock mWakeLock;
public SystemWakeLock() {
mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);
}
@Override
public void acquire() {
mWakeLock.acquire();
HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);
}
@Override
public void release() {
mWakeLock.release();
HdmiLogger.debug("Wake lock released");
}
@Override
public boolean isHeld() {
return mWakeLock.isHeld();
}
}
}