summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/MediaPlayer2.java38
-rw-r--r--media/jni/android_media_MediaPlayer2.cpp7
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},