Merge "Fix MediaPlayer construction with AUDIO_SESSION_ALLOCATE."

This commit is contained in:
Ján Sebechlebský
2023-01-13 08:55:17 +00:00
committed by Android (Google) Code Review
3 changed files with 13 additions and 11 deletions

View File

@@ -708,12 +708,10 @@ public class MediaPlayer extends PlayerBase
* It's easier to create it here than in C++.
*/
try (ScopedParcelState attributionSourceState = attributionSource.asScopedParcelState()) {
native_setup(new WeakReference<MediaPlayer>(this), attributionSourceState.getParcel());
native_setup(new WeakReference<>(this), attributionSourceState.getParcel(),
resolvePlaybackSessionId(context, sessionId));
}
int effectiveSessionId = resolvePlaybackSessionId(context, sessionId);
baseRegisterPlayer(effectiveSessionId);
native_setAudioSessionId(effectiveSessionId);
baseRegisterPlayer(getAudioSessionId());
}
private Parcel createPlayerIIdParcel() {
@@ -1022,8 +1020,6 @@ public class MediaPlayer extends PlayerBase
final AudioAttributes aa = audioAttributes != null ? audioAttributes :
new AudioAttributes.Builder().build();
mp.setAudioAttributes(aa);
mp.native_setAudioSessionId(audioSessionId);
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
@@ -2521,7 +2517,7 @@ public class MediaPlayer extends PlayerBase
private static native final void native_init();
private native void native_setup(Object mediaplayerThis,
@NonNull Parcel attributionSource);
@NonNull Parcel attributionSource, int audioSessionId);
private native final void native_finalize();
/**

View File

@@ -956,14 +956,16 @@ android_media_MediaPlayer_native_init(JNIEnv *env)
static void
android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
jobject jAttributionSource)
jobject jAttributionSource,
jint jAudioSessionId)
{
ALOGV("native_setup");
Parcel* parcel = parcelForJavaObject(env, jAttributionSource);
android::content::AttributionSourceState attributionSource;
attributionSource.readFromParcel(parcel);
sp<MediaPlayer> mp = sp<MediaPlayer>::make(attributionSource);
sp<MediaPlayer> mp = sp<MediaPlayer>::make(
attributionSource, static_cast<audio_session_t>(jAudioSessionId));
if (mp == NULL) {
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
return;
@@ -1419,7 +1421,9 @@ static const JNINativeMethod gMethods[] = {
{"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter},
{"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata},
{"native_init", "()V", (void *)android_media_MediaPlayer_native_init},
{"native_setup", "(Ljava/lang/Object;Landroid/os/Parcel;)V",(void *)android_media_MediaPlayer_native_setup},
{"native_setup",
"(Ljava/lang/Object;Landroid/os/Parcel;I)V",
(void *)android_media_MediaPlayer_native_setup},
{"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize},
{"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id},
{"native_setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id},

View File

@@ -23,6 +23,7 @@ import static android.media.AudioManager.AUDIO_SESSION_ID_GENERATE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -56,6 +57,7 @@ public class MediaPlayerUnitTest {
MediaPlayer mediaPlayer = new MediaPlayer(virtualDeviceContext);
assertNotEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
assertTrue(mediaPlayer.getAudioSessionId() > 0);
}
@Test