Loading services/core/java/com/android/server/audio/AudioService.java +67 −17 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.media.audiopolicy.AudioProductStrategy; import android.media.audiopolicy.AudioVolumeGroup; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionCallback; import android.media.projection.IMediaProjectionManager; import android.net.Uri; import android.os.Binder; Loading Loading @@ -6705,13 +6706,13 @@ public class AudioService extends IAudioService.Stub String regId = null; synchronized (mAudioPolicies) { try { if (mAudioPolicies.containsKey(pcb.asBinder())) { Slog.e(TAG, "Cannot re-register policy"); return null; } try { AudioPolicyProxy app = new AudioPolicyProxy(policyConfig, pcb, hasFocusListener, isFocusPolicy, isTestFocusPolicy, isVolumeController); isFocusPolicy, isTestFocusPolicy, isVolumeController, projection); pcb.asBinder().linkToDeath(app, 0/*flags*/); regId = app.getRegistrationId(); mAudioPolicies.put(pcb.asBinder(), app); Loading @@ -6720,6 +6721,9 @@ public class AudioService extends IAudioService.Stub Slog.w(TAG, "Audio policy registration failed, could not link to " + pcb + " binder death", e); return null; } catch (IllegalStateException e) { Slog.w(TAG, "Audio policy registration failed for binder " + pcb, e); return null; } } return regId; Loading Loading @@ -6884,9 +6888,9 @@ public class AudioService extends IAudioService.Stub if (app == null){ return AudioManager.ERROR; } app.addMixes(policyConfig.getMixes()); return app.addMixes(policyConfig.getMixes()) == AudioSystem.SUCCESS ? AudioManager.SUCCESS : AudioManager.ERROR; } return AudioManager.SUCCESS; } public int removeMixForPolicy(AudioPolicyConfig policyConfig, IAudioPolicyCallback pcb) { Loading @@ -6898,9 +6902,9 @@ public class AudioService extends IAudioService.Stub if (app == null) { return AudioManager.ERROR; } app.removeMixes(policyConfig.getMixes()); return app.removeMixes(policyConfig.getMixes()) == AudioSystem.SUCCESS ? AudioManager.SUCCESS : AudioManager.ERROR; } return AudioManager.SUCCESS; } /** see AudioPolicy.setUidDeviceAffinity() */ Loading Loading @@ -7165,6 +7169,15 @@ public class AudioService extends IAudioService.Stub final boolean mIsVolumeController; final HashMap<Integer, AudioDeviceArray> mUidDeviceAffinities = new HashMap<Integer, AudioDeviceArray>(); final IMediaProjection mProjection; private final class UnregisterOnStopCallback extends IMediaProjectionCallback.Stub { public void onStop() { unregisterAudioPolicyAsync(mPolicyCallback); } }; UnregisterOnStopCallback mProjectionCallback; /** * Audio focus ducking behavior for an audio policy. * This variable reflects the value that was successfully set in Loading @@ -7178,12 +7191,13 @@ public class AudioService extends IAudioService.Stub AudioPolicyProxy(AudioPolicyConfig config, IAudioPolicyCallback token, boolean hasFocusListener, boolean isFocusPolicy, boolean isTestFocusPolicy, boolean isVolumeController) { boolean isVolumeController, IMediaProjection projection) { super(config); setRegistration(new String(config.hashCode() + ":ap:" + mAudioPolicyCounter++)); mPolicyCallback = token; mHasFocusListener = hasFocusListener; mIsVolumeController = isVolumeController; mProjection = projection; if (mHasFocusListener) { mMediaFocusControl.addFocusFollower(mPolicyCallback); // can only ever be true if there is a focus listener Loading @@ -7196,7 +7210,21 @@ public class AudioService extends IAudioService.Stub if (mIsVolumeController) { setExtVolumeController(mPolicyCallback); } connectMixes(); if (mProjection != null) { mProjectionCallback = new UnregisterOnStopCallback(); try { mProjection.registerCallback(mProjectionCallback); } catch (RemoteException e) { release(); throw new IllegalStateException("MediaProjection callback registration failed, " + "could not link to " + projection + " binder death", e); } } int status = connectMixes(); if (status != AudioSystem.SUCCESS) { release(); throw new IllegalStateException("Could not connect mix, error: " + status); } } public void binderDied() { Loading Loading @@ -7226,6 +7254,13 @@ public class AudioService extends IAudioService.Stub if (mHasFocusListener) { mMediaFocusControl.removeFocusFollower(mPolicyCallback); } if (mProjectionCallback != null) { try { mProjection.unregisterCallback(mProjectionCallback); } catch (RemoteException e) { Log.e(TAG, "Fail to unregister Audiopolicy callback from MediaProjection"); } } final long identity = Binder.clearCallingIdentity(); AudioSystem.registerPolicyMixes(mMixes, false); Binder.restoreCallingIdentity(identity); Loading Loading @@ -7260,28 +7295,29 @@ public class AudioService extends IAudioService.Stub return true; } void addMixes(@NonNull ArrayList<AudioMix> mixes) { int addMixes(@NonNull ArrayList<AudioMix> mixes) { // TODO optimize to not have to unregister the mixes already in place synchronized (mMixes) { AudioSystem.registerPolicyMixes(mMixes, false); this.add(mixes); AudioSystem.registerPolicyMixes(mMixes, true); return AudioSystem.registerPolicyMixes(mMixes, true); } } void removeMixes(@NonNull ArrayList<AudioMix> mixes) { int removeMixes(@NonNull ArrayList<AudioMix> mixes) { // TODO optimize to not have to unregister the mixes already in place synchronized (mMixes) { AudioSystem.registerPolicyMixes(mMixes, false); this.remove(mixes); AudioSystem.registerPolicyMixes(mMixes, true); return AudioSystem.registerPolicyMixes(mMixes, true); } } void connectMixes() { int connectMixes() { final long identity = Binder.clearCallingIdentity(); AudioSystem.registerPolicyMixes(mMixes, true); int status = AudioSystem.registerPolicyMixes(mMixes, true); Binder.restoreCallingIdentity(identity); return status; } int setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) { Loading Loading @@ -7320,6 +7356,20 @@ public class AudioService extends IAudioService.Stub Log.e(TAG, "AudioSystem. removeUidDeviceAffinities failed"); return AudioManager.ERROR; } /** @return human readable debug informations summarizing the state of the object. */ public String toLogFriendlyString() { String textDump = super.toLogFriendlyString(); textDump += " Proxy:\n"; textDump += " is focus policy= " + mIsFocusPolicy + "\n"; if (mIsFocusPolicy) { textDump += " focus duck behaviour= " + mFocusDuckBehavior + "\n"; textDump += " is test focus policy= " + mIsTestFocusPolicy + "\n"; textDump += " has focus listener= " + mHasFocusListener + "\n"; } textDump += " media projection= " + mProjection + "\n"; return textDump; } }; //====================== Loading Loading
services/core/java/com/android/server/audio/AudioService.java +67 −17 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.media.audiopolicy.AudioProductStrategy; import android.media.audiopolicy.AudioVolumeGroup; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionCallback; import android.media.projection.IMediaProjectionManager; import android.net.Uri; import android.os.Binder; Loading Loading @@ -6705,13 +6706,13 @@ public class AudioService extends IAudioService.Stub String regId = null; synchronized (mAudioPolicies) { try { if (mAudioPolicies.containsKey(pcb.asBinder())) { Slog.e(TAG, "Cannot re-register policy"); return null; } try { AudioPolicyProxy app = new AudioPolicyProxy(policyConfig, pcb, hasFocusListener, isFocusPolicy, isTestFocusPolicy, isVolumeController); isFocusPolicy, isTestFocusPolicy, isVolumeController, projection); pcb.asBinder().linkToDeath(app, 0/*flags*/); regId = app.getRegistrationId(); mAudioPolicies.put(pcb.asBinder(), app); Loading @@ -6720,6 +6721,9 @@ public class AudioService extends IAudioService.Stub Slog.w(TAG, "Audio policy registration failed, could not link to " + pcb + " binder death", e); return null; } catch (IllegalStateException e) { Slog.w(TAG, "Audio policy registration failed for binder " + pcb, e); return null; } } return regId; Loading Loading @@ -6884,9 +6888,9 @@ public class AudioService extends IAudioService.Stub if (app == null){ return AudioManager.ERROR; } app.addMixes(policyConfig.getMixes()); return app.addMixes(policyConfig.getMixes()) == AudioSystem.SUCCESS ? AudioManager.SUCCESS : AudioManager.ERROR; } return AudioManager.SUCCESS; } public int removeMixForPolicy(AudioPolicyConfig policyConfig, IAudioPolicyCallback pcb) { Loading @@ -6898,9 +6902,9 @@ public class AudioService extends IAudioService.Stub if (app == null) { return AudioManager.ERROR; } app.removeMixes(policyConfig.getMixes()); return app.removeMixes(policyConfig.getMixes()) == AudioSystem.SUCCESS ? AudioManager.SUCCESS : AudioManager.ERROR; } return AudioManager.SUCCESS; } /** see AudioPolicy.setUidDeviceAffinity() */ Loading Loading @@ -7165,6 +7169,15 @@ public class AudioService extends IAudioService.Stub final boolean mIsVolumeController; final HashMap<Integer, AudioDeviceArray> mUidDeviceAffinities = new HashMap<Integer, AudioDeviceArray>(); final IMediaProjection mProjection; private final class UnregisterOnStopCallback extends IMediaProjectionCallback.Stub { public void onStop() { unregisterAudioPolicyAsync(mPolicyCallback); } }; UnregisterOnStopCallback mProjectionCallback; /** * Audio focus ducking behavior for an audio policy. * This variable reflects the value that was successfully set in Loading @@ -7178,12 +7191,13 @@ public class AudioService extends IAudioService.Stub AudioPolicyProxy(AudioPolicyConfig config, IAudioPolicyCallback token, boolean hasFocusListener, boolean isFocusPolicy, boolean isTestFocusPolicy, boolean isVolumeController) { boolean isVolumeController, IMediaProjection projection) { super(config); setRegistration(new String(config.hashCode() + ":ap:" + mAudioPolicyCounter++)); mPolicyCallback = token; mHasFocusListener = hasFocusListener; mIsVolumeController = isVolumeController; mProjection = projection; if (mHasFocusListener) { mMediaFocusControl.addFocusFollower(mPolicyCallback); // can only ever be true if there is a focus listener Loading @@ -7196,7 +7210,21 @@ public class AudioService extends IAudioService.Stub if (mIsVolumeController) { setExtVolumeController(mPolicyCallback); } connectMixes(); if (mProjection != null) { mProjectionCallback = new UnregisterOnStopCallback(); try { mProjection.registerCallback(mProjectionCallback); } catch (RemoteException e) { release(); throw new IllegalStateException("MediaProjection callback registration failed, " + "could not link to " + projection + " binder death", e); } } int status = connectMixes(); if (status != AudioSystem.SUCCESS) { release(); throw new IllegalStateException("Could not connect mix, error: " + status); } } public void binderDied() { Loading Loading @@ -7226,6 +7254,13 @@ public class AudioService extends IAudioService.Stub if (mHasFocusListener) { mMediaFocusControl.removeFocusFollower(mPolicyCallback); } if (mProjectionCallback != null) { try { mProjection.unregisterCallback(mProjectionCallback); } catch (RemoteException e) { Log.e(TAG, "Fail to unregister Audiopolicy callback from MediaProjection"); } } final long identity = Binder.clearCallingIdentity(); AudioSystem.registerPolicyMixes(mMixes, false); Binder.restoreCallingIdentity(identity); Loading Loading @@ -7260,28 +7295,29 @@ public class AudioService extends IAudioService.Stub return true; } void addMixes(@NonNull ArrayList<AudioMix> mixes) { int addMixes(@NonNull ArrayList<AudioMix> mixes) { // TODO optimize to not have to unregister the mixes already in place synchronized (mMixes) { AudioSystem.registerPolicyMixes(mMixes, false); this.add(mixes); AudioSystem.registerPolicyMixes(mMixes, true); return AudioSystem.registerPolicyMixes(mMixes, true); } } void removeMixes(@NonNull ArrayList<AudioMix> mixes) { int removeMixes(@NonNull ArrayList<AudioMix> mixes) { // TODO optimize to not have to unregister the mixes already in place synchronized (mMixes) { AudioSystem.registerPolicyMixes(mMixes, false); this.remove(mixes); AudioSystem.registerPolicyMixes(mMixes, true); return AudioSystem.registerPolicyMixes(mMixes, true); } } void connectMixes() { int connectMixes() { final long identity = Binder.clearCallingIdentity(); AudioSystem.registerPolicyMixes(mMixes, true); int status = AudioSystem.registerPolicyMixes(mMixes, true); Binder.restoreCallingIdentity(identity); return status; } int setUidDeviceAffinities(int uid, @NonNull int[] types, @NonNull String[] addresses) { Loading Loading @@ -7320,6 +7356,20 @@ public class AudioService extends IAudioService.Stub Log.e(TAG, "AudioSystem. removeUidDeviceAffinities failed"); return AudioManager.ERROR; } /** @return human readable debug informations summarizing the state of the object. */ public String toLogFriendlyString() { String textDump = super.toLogFriendlyString(); textDump += " Proxy:\n"; textDump += " is focus policy= " + mIsFocusPolicy + "\n"; if (mIsFocusPolicy) { textDump += " focus duck behaviour= " + mFocusDuckBehavior + "\n"; textDump += " is test focus policy= " + mIsTestFocusPolicy + "\n"; textDump += " has focus listener= " + mHasFocusListener + "\n"; } textDump += " media projection= " + mProjection + "\n"; return textDump; } }; //====================== Loading