summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java155
1 files changed, 127 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index f41eeeb11d5a..4be74b510879 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -30,6 +30,7 @@ import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
@@ -158,6 +159,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
@@ -1075,6 +1077,15 @@ public class AudioService extends IAudioService.Stub
+ AudioSystem.audioSystemErrorToString(status)
+ " when connecting mixes for policy " + policy.toLogFriendlyString());
policy.release();
+ } else {
+ final int deviceAffinitiesStatus = policy.setupDeviceAffinities();
+ if (deviceAffinitiesStatus != AudioSystem.SUCCESS) {
+ Log.e(TAG, "onAudioServerDied: error "
+ + AudioSystem.audioSystemErrorToString(deviceAffinitiesStatus)
+ + " when connecting device affinities for policy "
+ + policy.toLogFriendlyString());
+ policy.release();
+ }
}
}
}
@@ -7898,22 +7909,16 @@ public class AudioService extends IAudioService.Stub
int setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) {
final Integer Uid = new Integer(uid);
- int res;
if (mUidDeviceAffinities.remove(Uid) != null) {
- final long identity = Binder.clearCallingIdentity();
- res = AudioSystem.removeUidDeviceAffinities(uid);
- Binder.restoreCallingIdentity(identity);
- if (res != AudioSystem.SUCCESS) {
+ if (removeUidDeviceAffinitiesFromSystem(uid) != AudioSystem.SUCCESS) {
Log.e(TAG, "AudioSystem. removeUidDeviceAffinities(" + uid + ") failed, "
+ " cannot call AudioSystem.setUidDeviceAffinities");
return AudioManager.ERROR;
}
}
- final long identity = Binder.clearCallingIdentity();
- res = AudioSystem.setUidDeviceAffinities(uid, types, addresses);
- Binder.restoreCallingIdentity(identity);
- if (res == AudioSystem.SUCCESS) {
- mUidDeviceAffinities.put(Uid, new AudioDeviceArray(types, addresses));
+ AudioDeviceArray deviceArray = new AudioDeviceArray(types, addresses);
+ if (setUidDeviceAffinitiesOnSystem(uid, deviceArray) == AudioSystem.SUCCESS) {
+ mUidDeviceAffinities.put(Uid, deviceArray);
return AudioManager.SUCCESS;
}
Log.e(TAG, "AudioSystem. setUidDeviceAffinities(" + uid + ") failed");
@@ -7922,10 +7927,7 @@ public class AudioService extends IAudioService.Stub
int removeUidDeviceAffinities(int uid) {
if (mUidDeviceAffinities.remove(new Integer(uid)) != null) {
- final long identity = Binder.clearCallingIdentity();
- final int res = AudioSystem.removeUidDeviceAffinities(uid);
- Binder.restoreCallingIdentity(identity);
- if (res == AudioSystem.SUCCESS) {
+ if (removeUidDeviceAffinitiesFromSystem(uid) == AudioSystem.SUCCESS) {
return AudioManager.SUCCESS;
}
}
@@ -7933,26 +7935,41 @@ public class AudioService extends IAudioService.Stub
return AudioManager.ERROR;
}
+ @AudioSystem.AudioSystemError private int removeUidDeviceAffinitiesFromSystem(int uid) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return AudioSystem.removeUidDeviceAffinities(uid);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @AudioSystem.AudioSystemError private int setUidDeviceAffinitiesOnSystem(int uid,
+ AudioDeviceArray deviceArray) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return AudioSystem.setUidDeviceAffinities(uid, deviceArray.mDeviceTypes,
+ deviceArray.mDeviceAddresses);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
int setUserIdDeviceAffinities(int userId,
@NonNull int[] types, @NonNull String[] addresses) {
final Integer UserId = new Integer(userId);
- int res;
if (mUserIdDeviceAffinities.remove(UserId) != null) {
- final long identity = Binder.clearCallingIdentity();
- res = AudioSystem.removeUserIdDeviceAffinities(UserId);
- Binder.restoreCallingIdentity(identity);
- if (res != AudioSystem.SUCCESS) {
+ if (removeUserIdDeviceAffinitiesFromSystem(userId) != AudioSystem.SUCCESS) {
Log.e(TAG, "AudioSystem. removeUserIdDeviceAffinities("
+ UserId + ") failed, "
+ " cannot call AudioSystem.setUserIdDeviceAffinities");
return AudioManager.ERROR;
}
}
- final long identity = Binder.clearCallingIdentity();
- res = AudioSystem.setUserIdDeviceAffinities(userId, types, addresses);
- Binder.restoreCallingIdentity(identity);
- if (res == AudioSystem.SUCCESS) {
- mUserIdDeviceAffinities.put(UserId, new AudioDeviceArray(types, addresses));
+ AudioDeviceArray audioDeviceArray = new AudioDeviceArray(types, addresses);
+ if (setUserIdDeviceAffinitiesOnSystem(userId, audioDeviceArray)
+ == AudioSystem.SUCCESS) {
+ mUserIdDeviceAffinities.put(UserId, audioDeviceArray);
return AudioManager.SUCCESS;
}
Log.e(TAG, "AudioSystem.setUserIdDeviceAffinities(" + userId + ") failed");
@@ -7961,10 +7978,7 @@ public class AudioService extends IAudioService.Stub
int removeUserIdDeviceAffinities(int userId) {
if (mUserIdDeviceAffinities.remove(new Integer(userId)) != null) {
- final long identity = Binder.clearCallingIdentity();
- final int res = AudioSystem.removeUserIdDeviceAffinities(userId);
- Binder.restoreCallingIdentity(identity);
- if (res == AudioSystem.SUCCESS) {
+ if (removeUserIdDeviceAffinitiesFromSystem(userId) == AudioSystem.SUCCESS) {
return AudioManager.SUCCESS;
}
}
@@ -7972,9 +7986,76 @@ public class AudioService extends IAudioService.Stub
return AudioManager.ERROR;
}
+ @AudioSystem.AudioSystemError private int removeUserIdDeviceAffinitiesFromSystem(
+ @UserIdInt int userId) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return AudioSystem.removeUserIdDeviceAffinities(userId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @AudioSystem.AudioSystemError private int setUserIdDeviceAffinitiesOnSystem(
+ @UserIdInt int userId, AudioDeviceArray deviceArray) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return AudioSystem.setUserIdDeviceAffinities(userId, deviceArray.mDeviceTypes,
+ deviceArray.mDeviceAddresses);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @AudioSystem.AudioSystemError int setupDeviceAffinities() {
+ for (Map.Entry<Integer, AudioDeviceArray> uidEntry : mUidDeviceAffinities.entrySet()) {
+ int uidStatus = removeUidDeviceAffinitiesFromSystem(uidEntry.getKey());
+ if (uidStatus != AudioSystem.SUCCESS) {
+ Log.e(TAG,
+ "setupDeviceAffinities failed to remove device affinity for uid "
+ + uidEntry.getKey());
+ return uidStatus;
+ }
+ uidStatus = setUidDeviceAffinitiesOnSystem(uidEntry.getKey(), uidEntry.getValue());
+ if (uidStatus != AudioSystem.SUCCESS) {
+ Log.e(TAG,
+ "setupDeviceAffinities failed to set device affinity for uid "
+ + uidEntry.getKey());
+ return uidStatus;
+ }
+ }
+
+ for (Map.Entry<Integer, AudioDeviceArray> userIdEntry :
+ mUserIdDeviceAffinities.entrySet()) {
+ int userIdStatus = removeUserIdDeviceAffinitiesFromSystem(userIdEntry.getKey());
+ if (userIdStatus != AudioSystem.SUCCESS) {
+ Log.e(TAG,
+ "setupDeviceAffinities failed to remove device affinity for userId "
+ + userIdEntry.getKey());
+ return userIdStatus;
+ }
+ userIdStatus = setUserIdDeviceAffinitiesOnSystem(userIdEntry.getKey(),
+ userIdEntry.getValue());
+ if (userIdStatus != AudioSystem.SUCCESS) {
+ Log.e(TAG,
+ "setupDeviceAffinities failed to set device affinity for userId "
+ + userIdEntry.getKey());
+ return userIdStatus;
+ }
+ }
+ return AudioSystem.SUCCESS;
+ }
+
/** @return human readable debug informations summarizing the state of the object. */
public String toLogFriendlyString() {
String textDump = super.toLogFriendlyString();
+ textDump += " Uid Device Affinities:\n";
+ String spacer = " ";
+ textDump += logFriendlyAttributeDeviceArrayMap("Uid",
+ mUidDeviceAffinities, spacer);
+ textDump += " UserId Device Affinities:\n";
+ textDump += logFriendlyAttributeDeviceArrayMap("UserId",
+ mUserIdDeviceAffinities, spacer);
textDump += " Proxy:\n";
textDump += " is focus policy= " + mIsFocusPolicy + "\n";
if (mIsFocusPolicy) {
@@ -7985,6 +8066,24 @@ public class AudioService extends IAudioService.Stub
textDump += " media projection= " + mProjection + "\n";
return textDump;
}
+
+ private String logFriendlyAttributeDeviceArrayMap(String attribute,
+ Map<Integer, AudioDeviceArray> map, String spacer) {
+ final StringBuilder stringBuilder = new StringBuilder();
+ for (Map.Entry<Integer, AudioDeviceArray> mapEntry : map.entrySet()) {
+ stringBuilder.append(spacer).append(attribute).append(": ")
+ .append(mapEntry.getKey()).append("\n");
+ AudioDeviceArray deviceArray = mapEntry.getValue();
+ String deviceSpacer = spacer + " ";
+ for (int i = 0; i < deviceArray.mDeviceTypes.length; i++) {
+ stringBuilder.append(deviceSpacer).append("Type: 0x")
+ .append(Integer.toHexString(deviceArray.mDeviceTypes[i]))
+ .append(" Address: ").append(deviceArray.mDeviceAddresses[i])
+ .append("\n");
+ }
+ }
+ return stringBuilder.toString();
+ }
};
//======================