diff options
| -rw-r--r-- | media/java/android/media/MediaPlayer2.java | 38 | ||||
| -rw-r--r-- | media/jni/android_media_MediaPlayer2.cpp | 7 |
2 files changed, 40 insertions, 5 deletions
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java index b9ace8fac50e..4c8decca1823 100644 --- a/media/java/android/media/MediaPlayer2.java +++ b/media/java/android/media/MediaPlayer2.java @@ -313,6 +313,11 @@ public class MediaPlayer2 implements AutoCloseable private ProvisioningThread mDrmProvisioningThread; //--- guarded by |mDrmLock| end + // Creating a dummy audio track, used for keeping session id alive + private final Object mSessionIdLock = new Object(); + @GuardedBy("mSessionIdLock") + private AudioTrack mDummyAudioTrack; + private HandlerThread mHandlerThread; private final TaskHandler mTaskHandler; private final Object mTaskLock = new Object(); @@ -347,14 +352,17 @@ public class MediaPlayer2 implements AutoCloseable mHandlerThread.start(); Looper looper = mHandlerThread.getLooper(); mTaskHandler = new TaskHandler(this, looper); + AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + int sessionId = am.generateAudioSessionId(); + keepAudioSessionIdAlive(sessionId); /* Native setup requires a weak reference to our object. * It's easier to create it here than in C++. */ - native_setup(new WeakReference<MediaPlayer2>(this)); + native_setup(sessionId, new WeakReference<MediaPlayer2>(this)); } - private native void native_setup(Object mediaplayer2This); + private native void native_setup(int sessionId, Object mediaplayer2This); /** * Releases the resources held by this {@code MediaPlayer2} object. @@ -410,6 +418,11 @@ public class MediaPlayer2 implements AutoCloseable resetDrmState(); native_release(); + + synchronized (mSessionIdLock) { + mDummyAudioTrack.release(); + } + mReleased = true; } @@ -454,6 +467,11 @@ public class MediaPlayer2 implements AutoCloseable stayAwake(false); native_reset(); + + AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); + int sessionId = am.generateAudioSessionId(); + keepAudioSessionIdAlive(sessionId); + // make sure none of the listeners get called anymore if (mTaskHandler != null) { mTaskHandler.removeCallbacksAndMessages(null); @@ -1748,6 +1766,7 @@ public class MediaPlayer2 implements AutoCloseable */ // This is an asynchronous call. public Object setAudioSessionId(int sessionId) { + keepAudioSessionIdAlive(sessionId); return addTask(new Task(CALL_COMPLETED_SET_AUDIO_SESSION_ID, false) { @Override void process() { @@ -4548,4 +4567,19 @@ public class MediaPlayer2 implements AutoCloseable public static final String ERROR_CODE = "android.media.mediaplayer.errcode"; } + + private void keepAudioSessionIdAlive(int sessionId) { + synchronized (mSessionIdLock) { + if (mDummyAudioTrack != null) { + if (mDummyAudioTrack.getAudioSessionId() == sessionId) { + return; + } + mDummyAudioTrack.release(); + } + // TODO: parameters can be optimized + mDummyAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, + AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 2, + AudioTrack.MODE_STATIC, sessionId); + } + } } diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index 59bdf879fddf..f7de2e78e822 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -1009,10 +1009,11 @@ android_media_MediaPlayer2_native_init(JNIEnv *env) } static void -android_media_MediaPlayer2_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) +android_media_MediaPlayer2_native_setup(JNIEnv *env, jobject thiz, + jint sessionId, jobject weak_this) { ALOGV("native_setup"); - sp<MediaPlayer2> mp = MediaPlayer2::Create(); + sp<MediaPlayer2> mp = MediaPlayer2::Create(sessionId); if (mp == NULL) { jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; @@ -1417,7 +1418,7 @@ static const JNINativeMethod gMethods[] = { {"native_setVolume", "(F)V", (void *)android_media_MediaPlayer2_setVolume}, {"native_invoke", "([B)[B", (void *)android_media_MediaPlayer2_invoke}, {"native_init", "()V", (void *)android_media_MediaPlayer2_native_init}, - {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer2_native_setup}, + {"native_setup", "(ILjava/lang/Object;)V", (void *)android_media_MediaPlayer2_native_setup}, {"native_finalize", "()V", (void *)android_media_MediaPlayer2_native_finalize}, {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer2_getAudioSessionId}, {"native_setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer2_setAudioSessionId}, |