Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bbdb71a authored by Jan Sebechlebsky's avatar Jan Sebechlebsky
Browse files

Fix MediaPlayer construction with AUDIO_SESSION_ALLOCATE.

When AUDIO_SESSION_ALLOCATE is used during construction, the media
player should allocate new unique session id. However, the previous
call to native_set_session id tried to acquire session_id with value 0,
which correspond to restricted OUTPUT_MIX session and caused failure
during initialization.

The topic also modifies the native initizalization code, so it's possible
to pass explicit session id during construction of native MediaPlayer
instance (prior to this change, the native constructor would always
allocate new session id from audio server, even though in some cases it
might have been immediately changed to exliplicitly requested session id).

Bug: 263373078
Bug: 263362598
Test: atest MediaPlayerUnitTest
Test: atest CtsMediaAudioTestCases CtsMediaPlayerTestCases

Change-Id: I92b085e23c72e0b9d21e12792bf67c2497aa0e25
parent 714a0f90
Loading
Loading
Loading
Loading
+4 −8
Original line number Original line Diff line number Diff line
@@ -708,12 +708,10 @@ public class MediaPlayer extends PlayerBase
         * It's easier to create it here than in C++.
         * It's easier to create it here than in C++.
         */
         */
        try (ScopedParcelState attributionSourceState = attributionSource.asScopedParcelState()) {
        try (ScopedParcelState attributionSourceState = attributionSource.asScopedParcelState()) {
            native_setup(new WeakReference<MediaPlayer>(this), attributionSourceState.getParcel());
            native_setup(new WeakReference<>(this), attributionSourceState.getParcel(),
                    resolvePlaybackSessionId(context, sessionId));
        }
        }

        baseRegisterPlayer(getAudioSessionId());
        int effectiveSessionId = resolvePlaybackSessionId(context, sessionId);
        baseRegisterPlayer(effectiveSessionId);
        native_setAudioSessionId(effectiveSessionId);
    }
    }


    private Parcel createPlayerIIdParcel() {
    private Parcel createPlayerIIdParcel() {
@@ -1022,8 +1020,6 @@ public class MediaPlayer extends PlayerBase
            final AudioAttributes aa = audioAttributes != null ? audioAttributes :
            final AudioAttributes aa = audioAttributes != null ? audioAttributes :
                new AudioAttributes.Builder().build();
                new AudioAttributes.Builder().build();
            mp.setAudioAttributes(aa);
            mp.setAudioAttributes(aa);
            mp.native_setAudioSessionId(audioSessionId);

            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            afd.close();
            afd.close();
            mp.prepare();
            mp.prepare();
@@ -2521,7 +2517,7 @@ public class MediaPlayer extends PlayerBase


    private static native final void native_init();
    private static native final void native_init();
    private native void native_setup(Object mediaplayerThis,
    private native void native_setup(Object mediaplayerThis,
            @NonNull Parcel attributionSource);
            @NonNull Parcel attributionSource, int audioSessionId);
    private native final void native_finalize();
    private native final void native_finalize();


    /**
    /**
+7 −3
Original line number Original line Diff line number Diff line
@@ -956,14 +956,16 @@ android_media_MediaPlayer_native_init(JNIEnv *env)


static void
static void
android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
                                       jobject jAttributionSource)
                                       jobject jAttributionSource,
                                       jint jAudioSessionId)
{
{
    ALOGV("native_setup");
    ALOGV("native_setup");


    Parcel* parcel = parcelForJavaObject(env, jAttributionSource);
    Parcel* parcel = parcelForJavaObject(env, jAttributionSource);
    android::content::AttributionSourceState attributionSource;
    android::content::AttributionSourceState attributionSource;
    attributionSource.readFromParcel(parcel);
    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) {
    if (mp == NULL) {
        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
        return;
        return;
@@ -1419,7 +1421,9 @@ static const JNINativeMethod gMethods[] = {
    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
    {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},
    {"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},
    {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},
    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
    {"native_setAudioSessionId",   "(I)V",                      (void *)android_media_MediaPlayer_set_audio_session_id},
    {"native_setAudioSessionId",   "(I)V",                      (void *)android_media_MediaPlayer_set_audio_session_id},
+2 −0
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.media.AudioManager.AUDIO_SESSION_ID_GENERATE;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;
@@ -56,6 +57,7 @@ public class MediaPlayerUnitTest {
        MediaPlayer mediaPlayer = new MediaPlayer(virtualDeviceContext);
        MediaPlayer mediaPlayer = new MediaPlayer(virtualDeviceContext);


        assertNotEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
        assertNotEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
        assertTrue(mediaPlayer.getAudioSessionId() > 0);
    }
    }


    @Test
    @Test