diff options
author | Eric Laurent <elaurent@google.com> | 2014-06-02 09:16:02 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2014-06-02 09:16:02 -0700 |
commit | ddc93ce3438618a15f30fc20d45634325f8ce84f (patch) | |
tree | 00c3d0c863b6f1890390acbc3feba31d21e6ba60 | |
parent | 58136d02113ae768dc2cdf871a773bd34cc71583 (diff) | |
download | frameworks_base-ddc93ce3438618a15f30fc20d45634325f8ce84f.zip frameworks_base-ddc93ce3438618a15f30fc20d45634325f8ce84f.tar.gz frameworks_base-ddc93ce3438618a15f30fc20d45634325f8ce84f.tar.bz2 |
AudioManager: do not mandate a looper
Having a listener for audio port updates is not mandatory.
do not throw an excepion when AudioManager is contructed
from a thread without looper.
Bug: 15368707.
Change-Id: If5ce54bf4efdff8b785098649fa1cd0564861e1e
-rw-r--r-- | media/java/android/media/AudioPortEventHandler.java | 114 |
1 files changed, 59 insertions, 55 deletions
diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java index cd9a4de..782ecd8 100644 --- a/media/java/android/media/AudioPortEventHandler.java +++ b/media/java/android/media/AudioPortEventHandler.java @@ -49,73 +49,77 @@ class AudioPortEventHandler { // find the looper for our new event handler Looper looper = Looper.myLooper(); if (looper == null) { - throw new IllegalArgumentException("Calling thread not associated with a looper"); + looper = Looper.getMainLooper(); } - mHandler = new Handler(looper) { - @Override - public void handleMessage(Message msg) { - Log.i(TAG, "handleMessage: "+msg.what); - 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); + if (looper != null) { + mHandler = new Handler(looper) { + @Override + public void handleMessage(Message msg) { + Log.i(TAG, "handleMessage: "+msg.what); + 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) { + mAudioManager.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 = mAudioManager.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)); } |