Fix issue 3435692

The problem is that the AudioService is not notified of the death of
IAudioFlinger binder interface because no methods was called on AudioFlinger
from system_server since the device booted. Therefore, AudioSystem did not created any
IAudioFlinger interface in the system_server process.
The root cause was always present but more likely to happen on a tablet than on a phone
as for instance no beeps are played when volume is adjusted.

The fix consists in having AudioSystem explicitly call a method on AudioFlinger when a
callback is installed to make sure that an IAudioFlinger binder interface is created
regardless of any other activity in the client process.

Change-Id: I9df34a36825af0b25cd0246dd02edbd712263f41
This commit is contained in:
Eric Laurent
2011-02-10 11:04:34 -08:00
parent c77d7b42ab
commit a25c5d88d1
2 changed files with 19 additions and 5 deletions

View File

@@ -218,13 +218,26 @@ public class AudioSystem
*/
public static void setErrorCallback(ErrorCallback cb)
{
mErrorCallback = cb;
synchronized (AudioSystem.class) {
mErrorCallback = cb;
}
// Calling a method on AudioFlinger here makes sure that we bind to IAudioFlinger
// binder interface death. Not doing that would result in not being notified of
// media_server process death if no other method is called on AudioSystem that reaches
// to AudioFlinger.
isMicrophoneMuted();
}
private static void errorCallbackFromNative(int error)
{
if (mErrorCallback != null) {
mErrorCallback.onError(error);
ErrorCallback errorCallback = null;
synchronized (AudioSystem.class) {
if (mErrorCallback != null) {
errorCallback = mErrorCallback;
}
}
if (errorCallback != null) {
errorCallback.onError(error);
}
}