diff options
| -rw-r--r-- | media/java/android/media/AudioService.java | 5 | ||||
| -rw-r--r-- | media/java/android/media/AudioSystem.java | 19 |
2 files changed, 19 insertions, 5 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 6c85490bb1c5..1fe3ccc2c83c 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1945,10 +1945,11 @@ public class AudioService extends IAudioService.Stub { break; case MSG_MEDIA_SERVER_DIED: - // Force creation of new IAudioflinger interface if (!mMediaServerOk) { Log.e(TAG, "Media server died."); - AudioSystem.isMicrophoneMuted(); + // Force creation of new IAudioFlinger interface so that we are notified + // when new media_server process is back to life. + AudioSystem.setErrorCallback(mAudioSystemCallback); sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SHARED_MSG, SENDMSG_NOOP, 0, 0, null, 500); } diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index e20bb2510d9f..ca881afb9cf4 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -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); } } |