Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07600116 authored by Jinsuk Kim's avatar Jinsuk Kim
Browse files

CEC: Ensure stable AVR connection

Make sure AVR device removal due to hotplug detection failure occur
in a less strict manner - doing it only if the failure is detected
3 times in a row.

Bug: 19171321
Change-Id: I1479663b05cdc957cc52123799c756f6b74f6708
parent 2ee0d6f4
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ final class HotplugDetectionAction extends HdmiCecFeatureAction {

    private static final int POLLING_INTERVAL_MS = 5000;
    private static final int TIMEOUT_COUNT = 3;
    private static final int AVR_COUNT_MAX = 3;

    // State in which waits for next polling
    private static final int STATE_WAIT_FOR_NEXT_POLLING = 1;
@@ -48,6 +49,12 @@ final class HotplugDetectionAction extends HdmiCecFeatureAction {

    private int mTimeoutCount = 0;

    // Counter used to ensure the connection to AVR is stable. Occasional failure to get
    // polling response from AVR despite its presence leads to unstable status flipping.
    // This is a workaround to deal with it, by removing the device only if the removal
    // is detected {@code AVR_COUNT_MAX} times in a row.
    private int mAvrStatusCount = 0;

    /**
     * Constructor
     *
@@ -148,10 +155,22 @@ final class HotplugDetectionAction extends HdmiCecFeatureAction {
        BitSet removed = complement(currentInfos, polledResult);
        int index = -1;
        while ((index = removed.nextSetBit(index + 1)) != -1) {
            if (index == Constants.ADDR_AUDIO_SYSTEM) {
                ++mAvrStatusCount;
                Slog.w(TAG, "Ack not returned from AVR. count: " + mAvrStatusCount);
                if (mAvrStatusCount < AVR_COUNT_MAX) {
                    continue;
                }
            }
            Slog.v(TAG, "Remove device by hot-plug detection:" + index);
            removeDevice(index);
        }

        // Reset the counter if the ack is returned from AVR.
        if (!removed.get(Constants.ADDR_AUDIO_SYSTEM)) {
            mAvrStatusCount = 0;
        }

        // Next, check added devices.
        BitSet added = complement(polledResult, currentInfos);
        index = -1;