diff options
| -rw-r--r-- | media/java/android/media/AudioManager.java | 40 | ||||
| -rw-r--r-- | media/java/android/media/AudioPortEventHandler.java | 140 |
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 |