summaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorDaniel Norman <danielnorman@google.com>2021-06-18 15:33:36 -0700
committerScott Lobdell <slobdell@google.com>2021-06-21 23:21:54 +0000
commitb6d6690a3594cd78966e26508247d4ab1b66776f (patch)
tree43afd0520ff98b8729b5c8f73ef2ee1c7e77041a /media
parent71c831703ae59baf47e0afe611fecd714c481cdf (diff)
parent233ce9ef453bc7b47f7ac5d0eb1d5fda0ce845ab (diff)
Merge SP1A.210616.001
Change-Id: I9acdc955f698dbebb8fad19cfd5cb71fcdd27b45
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/AudioManager.java2
-rw-r--r--media/java/android/media/AudioSystem.java3
-rw-r--r--media/java/android/media/IMediaRoute2ProviderServiceCallback.aidl4
-rw-r--r--media/java/android/media/MediaRoute2ProviderService.java42
-rw-r--r--media/java/android/media/MediaRouter.java17
-rw-r--r--media/java/android/media/RingtoneManager.java4
-rw-r--r--media/jni/soundpool/Sound.cpp2
7 files changed, 56 insertions, 18 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 98f066057c9f..ef478ee6aa6b 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -7111,6 +7111,8 @@ public class AudioManager {
* @return a map where the key is a surround format and
* the value indicates the surround format is enabled or not
*/
+ @TestApi
+ @NonNull
public Map<Integer, Boolean> getSurroundFormats() {
Map<Integer, Boolean> surroundFormats = new HashMap<>();
int status = AudioSystem.getSurroundFormats(surroundFormats);
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index cefa3f82533e..54185daa5380 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -27,6 +27,7 @@ import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
import android.os.Build;
+import android.os.IBinder;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -1680,6 +1681,8 @@ public class AudioSystem
/** @hide */
@UnsupportedAppUsage
public static native int checkAudioFlinger();
+ /** @hide */
+ public static native void setAudioFlingerBinder(IBinder audioFlinger);
/** @hide */
public static native int listAudioPorts(ArrayList<AudioPort> ports, int[] generation);
diff --git a/media/java/android/media/IMediaRoute2ProviderServiceCallback.aidl b/media/java/android/media/IMediaRoute2ProviderServiceCallback.aidl
index 1755657ddc64..63c52a142fdd 100644
--- a/media/java/android/media/IMediaRoute2ProviderServiceCallback.aidl
+++ b/media/java/android/media/IMediaRoute2ProviderServiceCallback.aidl
@@ -26,9 +26,9 @@ import android.os.Bundle;
*/
oneway interface IMediaRoute2ProviderServiceCallback {
// TODO: Change it to updateRoutes?
- void updateState(in MediaRoute2ProviderInfo providerInfo);
+ void notifyProviderUpdated(in MediaRoute2ProviderInfo providerInfo);
void notifySessionCreated(long requestId, in RoutingSessionInfo sessionInfo);
- void notifySessionUpdated(in RoutingSessionInfo sessionInfo);
+ void notifySessionsUpdated(in List<RoutingSessionInfo> sessionInfo);
void notifySessionReleased(in RoutingSessionInfo sessionInfo);
void notifyRequestFailed(long requestId, int reason);
}
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index 93fe06ac99aa..49e0411cc4d1 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -141,6 +141,7 @@ public abstract class MediaRoute2ProviderService extends Service {
private final Object mSessionLock = new Object();
private final Object mRequestIdsLock = new Object();
private final AtomicBoolean mStatePublishScheduled = new AtomicBoolean(false);
+ private final AtomicBoolean mSessionUpdateScheduled = new AtomicBoolean(false);
private MediaRoute2ProviderServiceStub mStub;
private IMediaRoute2ProviderServiceCallback mRemoteCallback;
private volatile MediaRoute2ProviderInfo mProviderInfo;
@@ -287,16 +288,8 @@ public abstract class MediaRoute2ProviderService extends Service {
Log.w(TAG, "notifySessionUpdated: Ignoring unknown session info.");
return;
}
-
- if (mRemoteCallback == null) {
- return;
- }
- try {
- mRemoteCallback.notifySessionUpdated(sessionInfo);
- } catch (RemoteException ex) {
- Log.w(TAG, "Failed to notify session info changed.");
- }
}
+ scheduleUpdateSessions();
}
/**
@@ -479,6 +472,7 @@ public abstract class MediaRoute2ProviderService extends Service {
void setCallback(IMediaRoute2ProviderServiceCallback callback) {
mRemoteCallback = callback;
schedulePublishState();
+ scheduleUpdateSessions();
}
void schedulePublishState() {
@@ -497,12 +491,40 @@ public abstract class MediaRoute2ProviderService extends Service {
}
try {
- mRemoteCallback.updateState(mProviderInfo);
+ mRemoteCallback.notifyProviderUpdated(mProviderInfo);
} catch (RemoteException ex) {
Log.w(TAG, "Failed to publish provider state.", ex);
}
}
+ void scheduleUpdateSessions() {
+ if (mSessionUpdateScheduled.compareAndSet(false, true)) {
+ mHandler.post(this::updateSessions);
+ }
+ }
+
+ private void updateSessions() {
+ if (!mSessionUpdateScheduled.compareAndSet(true, false)) {
+ return;
+ }
+
+ if (mRemoteCallback == null) {
+ return;
+ }
+
+ List<RoutingSessionInfo> sessions;
+ synchronized (mSessionLock) {
+ sessions = new ArrayList<>(mSessionInfo.values());
+ }
+
+ try {
+ mRemoteCallback.notifySessionsUpdated(sessions);
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Failed to notify session info changed.");
+ }
+
+ }
+
/**
* Adds a requestId in the request ID list whose max size is {@link #MAX_REQUEST_IDS_SIZE}.
* When the max size is reached, the first element is removed (FIFO).
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 4c8a8fa4a554..345d9b27c8a8 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -185,6 +185,7 @@ public class MediaRouter {
AudioRoutesInfo newAudioRoutes = null;
try {
+ mIsBluetoothA2dpOn = mAudioService.isBluetoothA2dpOn();
newAudioRoutes = mAudioService.startWatchingRoutes(mAudioRoutesObserver);
} catch (RemoteException e) {
}
@@ -695,13 +696,17 @@ public class MediaRouter {
@Override
public void onGlobalA2dpChanged(boolean a2dpOn) {
mHandler.post(() -> {
- if (mSelectedRoute == null) {
+ if (mSelectedRoute == null || mBluetoothA2dpRoute == null) {
return;
}
if (mSelectedRoute.isDefault() && a2dpOn) {
- setSelectedRoute(mBluetoothA2dpRoute, /*explicit=*/false);
+ setSelectedRoute(mBluetoothA2dpRoute, /*explicit=*/ false);
+ dispatchRouteUnselected(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo);
+ dispatchRouteSelected(ROUTE_TYPE_LIVE_AUDIO, mBluetoothA2dpRoute);
} else if (mSelectedRoute.isBluetooth() && !a2dpOn) {
- setSelectedRoute(mDefaultAudioVideo, /*explicit=*/false);
+ setSelectedRoute(mDefaultAudioVideo, /*explicit=*/ false);
+ dispatchRouteUnselected(ROUTE_TYPE_LIVE_AUDIO, mBluetoothA2dpRoute);
+ dispatchRouteSelected(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo);
}
});
}
@@ -1362,6 +1367,9 @@ public class MediaRouter {
}
static void dispatchRouteSelected(int type, RouteInfo info) {
+ if (DEBUG) {
+ Log.d(TAG, "Dispatching route selected: " + info);
+ }
for (CallbackInfo cbi : sStatic.mCallbacks) {
if (cbi.filterRouteEvent(info)) {
cbi.cb.onRouteSelected(cbi.router, type, info);
@@ -1370,6 +1378,9 @@ public class MediaRouter {
}
static void dispatchRouteUnselected(int type, RouteInfo info) {
+ if (DEBUG) {
+ Log.d(TAG, "Dispatching route unselected: " + info);
+ }
for (CallbackInfo cbi : sStatic.mCallbacks) {
if (cbi.filterRouteEvent(info)) {
cbi.cb.onRouteUnselected(cbi.router, type, info);
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index e2e13b048cf7..be6ff1baadd6 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -521,12 +521,12 @@ public class RingtoneManager {
public int getRingtonePosition(Uri ringtoneUri) {
try {
if (ringtoneUri == null) return -1;
- final long ringtoneId = ContentUris.parseId(ringtoneUri);
final Cursor cursor = getCursor();
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
- if (ringtoneId == cursor.getLong(ID_COLUMN_INDEX)) {
+ Uri uriFromCursor = getUriFromCursor(mContext, cursor);
+ if (ringtoneUri.equals(uriFromCursor)) {
return cursor.getPosition();
}
}
diff --git a/media/jni/soundpool/Sound.cpp b/media/jni/soundpool/Sound.cpp
index 50e0d336f981..6ef074090df8 100644
--- a/media/jni/soundpool/Sound.cpp
+++ b/media/jni/soundpool/Sound.cpp
@@ -214,7 +214,7 @@ status_t Sound::doLoad()
} else if (sampleRate > kMaxSampleRate) {
ALOGE("%s: sample rate (%u) out of range", __func__, sampleRate);
status = BAD_VALUE;
- } else if (channelCount < 1 || channelCount > FCC_8) {
+ } else if (channelCount < 1 || channelCount > FCC_LIMIT) {
ALOGE("%s: sample channel count (%d) out of range", __func__, channelCount);
status = BAD_VALUE;
} else {