Loading media/java/android/media/MediaPlayer2.java +36 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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. Loading Loading @@ -410,6 +418,11 @@ public class MediaPlayer2 implements AutoCloseable resetDrmState(); native_release(); synchronized (mSessionIdLock) { mDummyAudioTrack.release(); } mReleased = true; } Loading Loading @@ -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); Loading Loading @@ -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() { Loading Loading @@ -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); } } } media/jni/android_media_MediaPlayer2.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}, Loading Loading
media/java/android/media/MediaPlayer2.java +36 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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. Loading Loading @@ -410,6 +418,11 @@ public class MediaPlayer2 implements AutoCloseable resetDrmState(); native_release(); synchronized (mSessionIdLock) { mDummyAudioTrack.release(); } mReleased = true; } Loading Loading @@ -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); Loading Loading @@ -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() { Loading Loading @@ -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); } } }
media/jni/android_media_MediaPlayer2.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}, Loading