From f93107f5b826b1f552d038b01e276c96cc4aba26 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Tue, 8 Jan 2019 09:38:25 -0800 Subject: [PATCH] AudioService: fix UID device affinity Change I2994ae80624556d9321f788a0575d9f732157228 was missing a PS to properly call from AudioService methods to AudioPolicyProxy methods, log errors from AudioSystem, and return the errors to the caller. Bug: 111647296 Test: requires device with routing policy started by CarService Change-Id: Iba4d1a3ba3371682915bc526a140fe9237ed3e13 --- .../android/server/audio/AudioService.java | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d704a3ea8eb12..9a4ca1f954d08 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -7824,8 +7824,10 @@ public class AudioService extends IAudioService.Stub /** see AudioPolicy.setUidDeviceAffinity() */ public int setUidDeviceAffinity(IAudioPolicyCallback pcb, int uid, - @NonNull int[] deviceTypes, - @NonNull String[] deviceAddresses) { + @NonNull int[] deviceTypes, @NonNull String[] deviceAddresses) { + if (DEBUG_AP) { + Log.d(TAG, "setUidDeviceAffinity for " + pcb.asBinder() + " uid:" + uid); + } synchronized (mAudioPolicies) { final AudioPolicyProxy app = checkUpdateForPolicy(pcb, "Cannot change device affinity in audio policy"); @@ -7835,21 +7837,23 @@ public class AudioService extends IAudioService.Stub if (!app.hasMixRoutedToDevices(deviceTypes, deviceAddresses)) { return AudioManager.ERROR; } + return app.setUidDeviceAffinities(uid, deviceTypes, deviceAddresses); } - return AudioManager.SUCCESS; } /** see AudioPolicy.removeUidDeviceAffinity() */ public int removeUidDeviceAffinity(IAudioPolicyCallback pcb, int uid) { + if (DEBUG_AP) { + Log.d(TAG, "removeUidDeviceAffinity for " + pcb.asBinder() + " uid:" + uid); + } synchronized (mAudioPolicies) { final AudioPolicyProxy app = checkUpdateForPolicy(pcb, "Cannot remove device affinity in audio policy"); if (app == null) { return AudioManager.ERROR; } - + return app.removeUidDeviceAffinities(uid); } - return AudioManager.SUCCESS; } public int setFocusPropertiesForPolicy(int duckingBehavior, IAudioPolicyCallback pcb) { @@ -8160,27 +8164,41 @@ public class AudioService extends IAudioService.Stub Binder.restoreCallingIdentity(identity); } - void setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) { + 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(); - AudioSystem.removeUidDeviceAffinities(uid); + res = AudioSystem.removeUidDeviceAffinities(uid); Binder.restoreCallingIdentity(identity); + if (res != AudioSystem.SUCCESS) { + Log.e(TAG, "AudioSystem. removeUidDeviceAffinities(" + uid + ") failed, " + + " cannot call AudioSystem.setUidDeviceAffinities"); + return AudioManager.ERROR; + } } final long identity = Binder.clearCallingIdentity(); - final int res = AudioSystem.setUidDeviceAffinities(uid, types, addresses); + res = AudioSystem.setUidDeviceAffinities(uid, types, addresses); Binder.restoreCallingIdentity(identity); if (res == AudioSystem.SUCCESS) { mUidDeviceAffinities.put(Uid, new AudioDeviceArray(types, addresses)); + return AudioManager.SUCCESS; } + Log.e(TAG, "AudioSystem. setUidDeviceAffinities(" + uid + ") failed"); + return AudioManager.ERROR; } - void removeUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) { + int removeUidDeviceAffinities(int uid) { if (mUidDeviceAffinities.remove(new Integer(uid)) != null) { final long identity = Binder.clearCallingIdentity(); - AudioSystem.removeUidDeviceAffinities(uid); + final int res = AudioSystem.removeUidDeviceAffinities(uid); Binder.restoreCallingIdentity(identity); + if (res == AudioSystem.SUCCESS) { + return AudioManager.SUCCESS; + } } + Log.e(TAG, "AudioSystem. removeUidDeviceAffinities failed"); + return AudioManager.ERROR; } };