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
This commit is contained in:
Eric Laurent
2014-06-02 09:16:02 -07:00
parent 58136d0211
commit ddc93ce343

View File

@@ -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) {
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;
}
}
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_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;
}
// 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;
case AUDIOPORT_EVENT_SERVICE_DIED:
for (int i = 0; i < listeners.size(); i++) {
listeners.get(i).OnServiceDied();
}
break;
default:
break;
}
}
};
};
} else {
mHandler = null;
}
native_setup(new WeakReference<AudioPortEventHandler>(this));
}