From c573bc5d3da12b52b0c45416f884d8d21b0ef500 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 26 Jun 2015 10:01:12 -0700 Subject: AudioManager: optimize audio port listener registration In order to reduce the number of binder calls, only install an audio port callback in a client process if either: - an audio port related API has been called once - an audio port listenr has been registered. Bug: 22045560. Change-Id: I0e5cf31bec0c986d6f7761891b860ba6fadd2f4c --- media/java/android/media/AudioManager.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index a80644050af2..b3b2b973bc37 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -619,10 +619,6 @@ public class AudioManager { com.android.internal.R.bool.config_useVolumeKeySounds); mUseFixedVolume = getContext().getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); - sAudioPortEventHandler.init(); - - mPortListener = new OnAmPortUpdateListener(); - registerAudioPortUpdateListener(mPortListener); } private Context getContext() { @@ -3554,6 +3550,7 @@ public class AudioManager { * @hide */ public void registerAudioPortUpdateListener(OnAudioPortUpdateListener l) { + sAudioPortEventHandler.init(); sAudioPortEventHandler.registerListener(l); } @@ -3586,6 +3583,7 @@ public class AudioManager { static int updateAudioPortCache(ArrayList ports, ArrayList patches, ArrayList previousPorts) { + sAudioPortEventHandler.init(); synchronized (sAudioPortGeneration) { if (sAudioPortGeneration == AUDIOPORT_GENERATION_INIT) { @@ -3849,6 +3847,12 @@ public class AudioManager { android.os.Handler handler) { if (callback != null && !mDeviceCallbacks.containsKey(callback)) { synchronized (mDeviceCallbacks) { + if (mDeviceCallbacks.size() == 0) { + if (mPortListener == null) { + mPortListener = new OnAmPortUpdateListener(); + } + registerAudioPortUpdateListener(mPortListener); + } NativeEventHandlerDelegate delegate = new NativeEventHandlerDelegate(callback, handler); mDeviceCallbacks.put(callback, delegate); @@ -3867,6 +3871,9 @@ public class AudioManager { synchronized (mDeviceCallbacks) { if (mDeviceCallbacks.containsKey(callback)) { mDeviceCallbacks.remove(callback); + if (mDeviceCallbacks.size() == 0) { + unregisterAudioPortUpdateListener(mPortListener); + } } } } -- cgit v1.2.3-59-g8ed1b