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:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user