From 546a170bfa9aa8f877b76cbf7666c59161407029 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Mon, 18 Sep 2017 14:28:38 +0900 Subject: [PATCH] Select correct system audio route in updateAudioRoutes While update audio routes, MediaRouter had an access to the variable of MediaRouterService.mGlobalBluetoothA2dpOn, which was updated in the callback of AudioRoutesObserver.dispatchAudioRoutesChanged(). However, since updateAudioRoutes() was also called by the same callback, mGlobalBluetoothA2dpOn could be used in updateAudioRoutes() before its value was updated. Bug: 65629167 Test: passed MediaRouterTest Test: Manually confirmed that the issue is fixed with this CL Change-Id: Id0034996a51a6d8d1e8bd9d2c6ca386aabbb8baf --- media/java/android/media/IMediaRouterService.aidl | 1 - media/java/android/media/MediaRouter.java | 46 +++++++++++----------- .../android/server/media/MediaRouterService.java | 10 +---- 3 files changed, 23 insertions(+), 34 deletions(-) diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index dc7fa8c00f82..3308fc929b03 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -28,7 +28,6 @@ interface IMediaRouterService { MediaRouterClientState getState(IMediaRouterClient client); boolean isPlaybackActive(IMediaRouterClient client); - boolean isGlobalBluetoothA2doOn(); void setDiscoveryRequest(IMediaRouterClient client, int routeTypes, boolean activeScan); void setSelectedRoute(IMediaRouterClient client, String routeId, boolean explicit); diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 8707ad017f51..d733ad9085d1 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -184,13 +184,15 @@ public class MediaRouter { void updateAudioRoutes(AudioRoutesInfo newRoutes) { boolean audioRoutesChanged = false; + boolean forceUseDefaultRoute = false; + if (newRoutes.mainType != mCurAudioRoutesInfo.mainType) { mCurAudioRoutesInfo.mainType = newRoutes.mainType; int name; - if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HEADPHONES) != 0 - || (newRoutes.mainType&AudioRoutesInfo.MAIN_HEADSET) != 0) { + if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HEADPHONES) != 0 + || (newRoutes.mainType & AudioRoutesInfo.MAIN_HEADSET) != 0) { name = com.android.internal.R.string.default_audio_route_name_headphones; - } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) { + } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) { name = com.android.internal.R.string.default_audio_route_name_dock_speakers; } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HDMI) != 0) { name = com.android.internal.R.string.default_audio_route_name_hdmi; @@ -201,10 +203,16 @@ public class MediaRouter { } mDefaultAudioVideo.mNameResId = name; dispatchRouteChanged(mDefaultAudioVideo); + + if ((newRoutes.mainType & (AudioRoutesInfo.MAIN_HEADSET + | AudioRoutesInfo.MAIN_HEADPHONES | AudioRoutesInfo.MAIN_USB)) != 0) { + forceUseDefaultRoute = true; + } audioRoutesChanged = true; } if (!TextUtils.equals(newRoutes.bluetoothName, mCurAudioRoutesInfo.bluetoothName)) { + forceUseDefaultRoute = false; mCurAudioRoutesInfo.bluetoothName = newRoutes.bluetoothName; if (mCurAudioRoutesInfo.bluetoothName != null) { if (mBluetoothA2dpRoute == null) { @@ -233,30 +241,18 @@ public class MediaRouter { Log.v(TAG, "Audio routes updated: " + newRoutes + ", a2dp=" + isBluetoothA2dpOn()); if (mSelectedRoute == null || mSelectedRoute == mDefaultAudioVideo || mSelectedRoute == mBluetoothA2dpRoute) { - selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, getDefaultSystemAudioRoute(), false); + if (forceUseDefaultRoute || mBluetoothA2dpRoute == null) { + selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo, false); + } else { + selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mBluetoothA2dpRoute, false); + } } } } - RouteInfo getDefaultSystemAudioRoute() { - boolean globalBluetoothA2doOn = false; - try { - globalBluetoothA2doOn = mMediaRouterService.isGlobalBluetoothA2doOn(); - } catch (RemoteException ex) { - Log.e(TAG, "Unable to call isSystemBluetoothA2doOn.", ex); - } - return (globalBluetoothA2doOn && mBluetoothA2dpRoute != null) - ? mBluetoothA2dpRoute : mDefaultAudioVideo; - } - - RouteInfo getCurrentSystemAudioRoute() { - return (isBluetoothA2dpOn() && mBluetoothA2dpRoute != null) - ? mBluetoothA2dpRoute : mDefaultAudioVideo; - } - boolean isBluetoothA2dpOn() { try { - return mAudioService.isBluetoothA2dpOn(); + return mBluetoothA2dpRoute != null && mAudioService.isBluetoothA2dpOn(); } catch (RemoteException e) { Log.e(TAG, "Error querying Bluetooth A2DP state", e); return false; @@ -610,6 +606,7 @@ public class MediaRouter { || mSelectedRoute == null) { return; } + Log.v(TAG, "onRestoreRoute() : a2dp=" + isBluetoothA2dpOn()); mSelectedRoute.select(); } } @@ -942,10 +939,12 @@ public class MediaRouter { Log.v(TAG, "Selecting route: " + route); assert(route != null); final RouteInfo oldRoute = sStatic.mSelectedRoute; + final RouteInfo currentSystemRoute = sStatic.isBluetoothA2dpOn() + ? sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo; boolean wasDefaultOrBluetoothRoute = (oldRoute == sStatic.mDefaultAudioVideo || oldRoute == sStatic.mBluetoothA2dpRoute); if (oldRoute == route - && (!wasDefaultOrBluetoothRoute || route == sStatic.getCurrentSystemAudioRoute())) { + && (!wasDefaultOrBluetoothRoute || route == currentSystemRoute)) { return; } if (!route.matchesTypes(types)) { @@ -1016,8 +1015,7 @@ public class MediaRouter { static void selectDefaultRouteStatic() { // TODO: Be smarter about the route types here; this selects for all valid. - if (sStatic.mSelectedRoute != sStatic.mBluetoothA2dpRoute - && sStatic.mBluetoothA2dpRoute != null && sStatic.isBluetoothA2dpOn()) { + if (sStatic.mSelectedRoute != sStatic.mBluetoothA2dpRoute && sStatic.isBluetoothA2dpOn()) { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mBluetoothA2dpRoute, false); } else { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mDefaultAudioVideo, false); diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index 3795b7f3091c..1cfd5f02e810 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -271,14 +271,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override - public boolean isGlobalBluetoothA2doOn() { - synchronized (mLock) { - return mGlobalBluetoothA2dpOn; - } - } - - // Binder call - @Override public void setDiscoveryRequest(IMediaRouterClient client, int routeTypes, boolean activeScan) { if (client == null) { @@ -383,7 +375,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { a2dpOn = mGlobalBluetoothA2dpOn; } - Slog.v(TAG, "restoreBluetoothA2dp( " + a2dpOn + ")"); + Slog.v(TAG, "restoreBluetoothA2dp(" + a2dpOn + ")"); mAudioService.setBluetoothA2dpOn(a2dpOn); } catch (RemoteException e) { Slog.w(TAG, "RemoteException while calling setBluetoothA2dpOn."); -- 2.11.0