summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eric Laurent <elaurent@google.com> 2015-01-14 13:23:27 -0800
committer Eric Laurent <elaurent@google.com> 2015-01-15 10:13:52 -0800
commitf076db407029e734703d8676f806bea94393e824 (patch)
treebeba72dba1ebe4be57685b760e397f125b8e9cb1
parentb018399a3a2762e95126acbe14397eca15bad772 (diff)
AudioManager: make AudioPortEventHandler static
Make AudioPortEventHandler and audio port and patch caches static members of AudioManager. There is only one callback per process in AudioSystem for audio port updates and having those non static would not work when more than one AudioManager instance exists in one app. Bug: 18727023. Change-Id: I4c1041dc6441d168be4efa066e14289cc5f41872
-rw-r--r--media/java/android/media/AudioManager.java40
-rw-r--r--media/java/android/media/AudioPortEventHandler.java140
2 files changed, 91 insertions, 89 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 360f764ace7c..67c05520bad8 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -65,7 +65,7 @@ public class AudioManager {
private final boolean mUseFixedVolume;
private final Binder mToken = new Binder();
private static String TAG = "AudioManager";
- AudioPortEventHandler mAudioPortEventHandler;
+ private static final AudioPortEventHandler sAudioPortEventHandler = new AudioPortEventHandler();
/**
* Broadcast intent, a hint for applications that audio is about to become
@@ -646,9 +646,9 @@ public class AudioManager {
com.android.internal.R.bool.config_useMasterVolume);
mUseVolumeKeySounds = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_useVolumeKeySounds);
- mAudioPortEventHandler = new AudioPortEventHandler(this);
mUseFixedVolume = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_useFixedVolume);
+ sAudioPortEventHandler.init();
}
private static IAudioService getService()
@@ -3607,7 +3607,7 @@ public class AudioManager {
* @hide
*/
public void registerAudioPortUpdateListener(OnAudioPortUpdateListener l) {
- mAudioPortEventHandler.registerListener(l);
+ sAudioPortEventHandler.registerListener(l);
}
/**
@@ -3615,7 +3615,7 @@ public class AudioManager {
* @hide
*/
public void unregisterAudioPortUpdateListener(OnAudioPortUpdateListener l) {
- mAudioPortEventHandler.unregisterListener(l);
+ sAudioPortEventHandler.unregisterListener(l);
}
//
@@ -3623,23 +3623,23 @@ public class AudioManager {
//
static final int AUDIOPORT_GENERATION_INIT = 0;
- Integer mAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT);
- ArrayList<AudioPort> mAudioPortsCached = new ArrayList<AudioPort>();
- ArrayList<AudioPatch> mAudioPatchesCached = new ArrayList<AudioPatch>();
+ static Integer sAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT);
+ static ArrayList<AudioPort> sAudioPortsCached = new ArrayList<AudioPort>();
+ static ArrayList<AudioPatch> sAudioPatchesCached = new ArrayList<AudioPatch>();
- int resetAudioPortGeneration() {
+ static int resetAudioPortGeneration() {
int generation;
- synchronized (mAudioPortGeneration) {
- generation = mAudioPortGeneration;
- mAudioPortGeneration = AUDIOPORT_GENERATION_INIT;
+ synchronized (sAudioPortGeneration) {
+ generation = sAudioPortGeneration;
+ sAudioPortGeneration = AUDIOPORT_GENERATION_INIT;
}
return generation;
}
- int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches) {
- synchronized (mAudioPortGeneration) {
+ static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches) {
+ synchronized (sAudioPortGeneration) {
- if (mAudioPortGeneration == AUDIOPORT_GENERATION_INIT) {
+ if (sAudioPortGeneration == AUDIOPORT_GENERATION_INIT) {
int[] patchGeneration = new int[1];
int[] portGeneration = new int[1];
int status;
@@ -3678,23 +3678,23 @@ public class AudioManager {
}
}
- mAudioPortsCached = newPorts;
- mAudioPatchesCached = newPatches;
- mAudioPortGeneration = portGeneration[0];
+ sAudioPortsCached = newPorts;
+ sAudioPatchesCached = newPatches;
+ sAudioPortGeneration = portGeneration[0];
}
if (ports != null) {
ports.clear();
- ports.addAll(mAudioPortsCached);
+ ports.addAll(sAudioPortsCached);
}
if (patches != null) {
patches.clear();
- patches.addAll(mAudioPatchesCached);
+ patches.addAll(sAudioPatchesCached);
}
}
return SUCCESS;
}
- AudioPortConfig updatePortConfig(AudioPortConfig portCfg, ArrayList<AudioPort> ports) {
+ static AudioPortConfig updatePortConfig(AudioPortConfig portCfg, ArrayList<AudioPort> ports) {
AudioPort port = portCfg.port();
int k;
for (k = 0; k < ports.size(); k++) {
diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java
index 9db49949baf9..ba2a59d0e301 100644
--- a/media/java/android/media/AudioPortEventHandler.java
+++ b/media/java/android/media/AudioPortEventHandler.java
@@ -31,94 +31,96 @@ import java.lang.ref.WeakReference;
*/
class AudioPortEventHandler {
- private final Handler mHandler;
- private ArrayList<AudioManager.OnAudioPortUpdateListener> mListeners;
- private AudioManager mAudioManager;
+ private Handler mHandler;
+ private final ArrayList<AudioManager.OnAudioPortUpdateListener> mListeners =
+ new ArrayList<AudioManager.OnAudioPortUpdateListener>();
- private static String TAG = "AudioPortEventHandler";
+ private static final String TAG = "AudioPortEventHandler";
private static final int AUDIOPORT_EVENT_PORT_LIST_UPDATED = 1;
private static final int AUDIOPORT_EVENT_PATCH_LIST_UPDATED = 2;
private static final int AUDIOPORT_EVENT_SERVICE_DIED = 3;
private static final int AUDIOPORT_EVENT_NEW_LISTENER = 4;
- AudioPortEventHandler(AudioManager audioManager) {
- mAudioManager = audioManager;
- mListeners = new ArrayList<AudioManager.OnAudioPortUpdateListener>();
-
- // find the looper for our new event handler
- Looper looper = Looper.getMainLooper();
-
- if (looper != null) {
- mHandler = new Handler(looper) {
- @Override
- public void handleMessage(Message msg) {
- ArrayList<AudioManager.OnAudioPortUpdateListener> listeners;
- synchronized (this) {
- if (msg.what == AUDIOPORT_EVENT_NEW_LISTENER) {
- listeners = new ArrayList<AudioManager.OnAudioPortUpdateListener>();
- if (mListeners.contains(msg.obj)) {
- listeners.add((AudioManager.OnAudioPortUpdateListener)msg.obj);
+ void init() {
+ synchronized (this) {
+ if (mHandler != null) {
+ return;
+ }
+ // find the looper for our new event handler
+ Looper looper = Looper.getMainLooper();
+
+ if (looper != null) {
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ ArrayList<AudioManager.OnAudioPortUpdateListener> listeners;
+ synchronized (this) {
+ if (msg.what == AUDIOPORT_EVENT_NEW_LISTENER) {
+ listeners = new ArrayList<AudioManager.OnAudioPortUpdateListener>();
+ if (mListeners.contains(msg.obj)) {
+ listeners.add((AudioManager.OnAudioPortUpdateListener)msg.obj);
+ }
+ } else {
+ listeners = mListeners;
}
- } else {
- listeners = mListeners;
}
- }
- if (listeners.isEmpty()) {
- return;
- }
- // reset audio port cache if the event corresponds to a change coming
- // from audio policy service or if mediaserver process died.
- if (msg.what == AUDIOPORT_EVENT_PORT_LIST_UPDATED ||
- msg.what == AUDIOPORT_EVENT_PATCH_LIST_UPDATED ||
- msg.what == AUDIOPORT_EVENT_SERVICE_DIED) {
- mAudioManager.resetAudioPortGeneration();
- }
- ArrayList<AudioPort> ports = new ArrayList<AudioPort>();
- ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>();
- if (msg.what != AUDIOPORT_EVENT_SERVICE_DIED) {
- int status = mAudioManager.updateAudioPortCache(ports, patches);
- if (status != AudioManager.SUCCESS) {
+ if (listeners.isEmpty()) {
return;
}
- }
-
- switch (msg.what) {
- case AUDIOPORT_EVENT_NEW_LISTENER:
- case AUDIOPORT_EVENT_PORT_LIST_UPDATED:
- AudioPort[] portList = ports.toArray(new AudioPort[0]);
- for (int i = 0; i < listeners.size(); i++) {
- listeners.get(i).onAudioPortListUpdate(portList);
+ // reset audio port cache if the event corresponds to a change coming
+ // from audio policy service or if mediaserver process died.
+ if (msg.what == AUDIOPORT_EVENT_PORT_LIST_UPDATED ||
+ msg.what == AUDIOPORT_EVENT_PATCH_LIST_UPDATED ||
+ msg.what == AUDIOPORT_EVENT_SERVICE_DIED) {
+ AudioManager.resetAudioPortGeneration();
}
- if (msg.what == AUDIOPORT_EVENT_PORT_LIST_UPDATED) {
- break;
+ ArrayList<AudioPort> ports = new ArrayList<AudioPort>();
+ ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>();
+ if (msg.what != AUDIOPORT_EVENT_SERVICE_DIED) {
+ int status = AudioManager.updateAudioPortCache(ports, patches);
+ if (status != AudioManager.SUCCESS) {
+ return;
+ }
}
- // FALL THROUGH
- case AUDIOPORT_EVENT_PATCH_LIST_UPDATED:
- AudioPatch[] patchList = patches.toArray(new AudioPatch[0]);
- for (int i = 0; i < listeners.size(); i++) {
- listeners.get(i).onAudioPatchListUpdate(patchList);
- }
- break;
+ switch (msg.what) {
+ case AUDIOPORT_EVENT_NEW_LISTENER:
+ case AUDIOPORT_EVENT_PORT_LIST_UPDATED:
+ AudioPort[] portList = ports.toArray(new AudioPort[0]);
+ for (int i = 0; i < listeners.size(); i++) {
+ listeners.get(i).onAudioPortListUpdate(portList);
+ }
+ if (msg.what == AUDIOPORT_EVENT_PORT_LIST_UPDATED) {
+ break;
+ }
+ // FALL THROUGH
- case AUDIOPORT_EVENT_SERVICE_DIED:
- for (int i = 0; i < listeners.size(); i++) {
- listeners.get(i).onServiceDied();
- }
- break;
+ case AUDIOPORT_EVENT_PATCH_LIST_UPDATED:
+ AudioPatch[] patchList = patches.toArray(new AudioPatch[0]);
+ for (int i = 0; i < listeners.size(); i++) {
+ listeners.get(i).onAudioPatchListUpdate(patchList);
+ }
+ break;
+
+ case AUDIOPORT_EVENT_SERVICE_DIED:
+ for (int i = 0; i < listeners.size(); i++) {
+ listeners.get(i).onServiceDied();
+ }
+ break;
- default:
- break;
+ default:
+ break;
+ }
}
- }
- };
- } else {
- mHandler = null;
+ };
+ native_setup(new WeakReference<AudioPortEventHandler>(this));
+ } else {
+ mHandler = null;
+ }
}
-
- native_setup(new WeakReference<AudioPortEventHandler>(this));
}
+
private native void native_setup(Object module_this);
@Override