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

Commit a2e28612 authored by Oscar Azucena's avatar Oscar Azucena
Browse files

Fixed issue with enabling/disabling routing callback

Added fix for issue where enabling/disabling native routing callback for
AudioTrack and MediaPlayer when playback state switching in between
starting and enabling routing callback, or in between stopping and
disabling device callback.

Bug: 176043355
Test: atest android.media.cts.AudioPlaybackConfigurationTest
Test: Verify illegal state error was not present anymore
Change-Id: Iefedf7daab0de2250772ee17d23916b4ee6903f2
parent 87727e4d
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -2720,8 +2720,7 @@ public class AudioTrack extends PlayerBase
    private void startImpl() {
        synchronized (mRoutingChangeListeners) {
            if (!mEnableSelfRoutingMonitor) {
                testEnableNativeRoutingCallbacksLocked();
                mEnableSelfRoutingMonitor = true;
                mEnableSelfRoutingMonitor = testEnableNativeRoutingCallbacksLocked();
            }
        }
        synchronized(mPlayStateLock) {
@@ -3513,23 +3512,36 @@ public class AudioTrack extends PlayerBase
        }
    }

    /*
     * Call BEFORE adding a routing callback handler.
    /**
     * Call BEFORE adding a routing callback handler and when enabling self routing listener
     * @return returns true for success, false otherwise.
     */
    @GuardedBy("mRoutingChangeListeners")
    private void testEnableNativeRoutingCallbacksLocked() {
    private boolean testEnableNativeRoutingCallbacksLocked() {
        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
            try {
                native_enableDeviceCallback();
                return true;
            } catch (IllegalStateException e) {
                // Fail silently as track state could have changed in between start
                // and enabling routing callback, return false to indicate not enabled
            }
        }
        return false;
    }

    /*
     * Call AFTER removing a routing callback handler.
     * Call AFTER removing a routing callback handler and when disabling self routing listener.
     */
    @GuardedBy("mRoutingChangeListeners")
    private void testDisableNativeRoutingCallbacksLocked() {
        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
            try {
                native_disableDeviceCallback();
            } catch (IllegalStateException e) {
                // Fail silently as track state could have changed in between stop
                // and disabling routing callback
            }
        }
    }

+22 −10
Original line number Diff line number Diff line
@@ -1513,21 +1513,28 @@ public class MediaPlayer extends PlayerBase
        }
    }

    /*
     * Call BEFORE adding a routing callback handler.
    /**
     * Call BEFORE adding a routing callback handler and when enabling self routing listener
     * @return returns true for success, false otherwise.
     */
    @GuardedBy("mRoutingChangeListeners")
    private void testEnableNativeRoutingCallbacksLocked() {
    private boolean testEnableNativeRoutingCallbacksLocked() {
        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
            try {
                native_enableDeviceCallback(true);
                return true;
            } catch (IllegalStateException e) {
                // Fail silently as media player state could have changed in between start
                // and enabling routing callback, return false to indicate not enabled
            }
        }
        return false;
    }

    private void  tryToEnableNativeRoutingCallback() {
        synchronized (mRoutingChangeListeners) {
            if (!mEnableSelfRoutingMonitor) {
                testEnableNativeRoutingCallbacksLocked();
                mEnableSelfRoutingMonitor = true;
                mEnableSelfRoutingMonitor = testEnableNativeRoutingCallbacksLocked();
            }
        }
    }
@@ -1542,12 +1549,17 @@ public class MediaPlayer extends PlayerBase
    }

    /*
     * Call AFTER removing a routing callback handler.
     * Call AFTER removing a routing callback handler and when disabling self routing listener
     */
    @GuardedBy("mRoutingChangeListeners")
    private void testDisableNativeRoutingCallbacksLocked() {
        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
            try {
                native_enableDeviceCallback(false);
            } catch (IllegalStateException e) {
                // Fail silently as media player state could have changed in between stop
                // and disabling routing callback
            }
        }
    }

@@ -3854,8 +3866,8 @@ public class MediaPlayer extends PlayerBase
    private final OnCompletionListener mOnCompletionInternalListener = new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            baseStop();
            tryToDisableNativeRoutingCallback();
            baseStop();
        }
    };