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

Commit b059fcc4 authored by Jan Sebechlebsky's avatar Jan Sebechlebsky
Browse files

Pass AttributionSource from Context to native AudioTrack

Bug: 261698699
Bug: 249777386
Bug: 182469354
Test: atest AudioTrackTest
Change-Id: Ifb71dc8ba7c4858717c43bf06f0a844cd1f94180
parent 69ef7084
Loading
Loading
Loading
Loading
+26 −26
Original line number Diff line number Diff line
@@ -19,18 +19,18 @@

#include "android_media_AudioTrack.h"

#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include "core_jni_helpers.h"

#include <utils/Log.h>
#include <android-base/macros.h>
#include <android_os_Parcel.h>
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
#include <media/AudioParameter.h>
#include <media/AudioSystem.h>
#include <media/AudioTrack.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <utils/Log.h>

#include <android-base/macros.h>
#include <binder/MemoryHeapBase.h>
#include <binder/MemoryBase.h>
#include <cinttypes>

#include "android_media_AudioAttributes.h"
#include "android_media_AudioErrors.h"
@@ -41,8 +41,7 @@
#include "android_media_MediaMetricsJNI.h"
#include "android_media_PlaybackParams.h"
#include "android_media_VolumeShaper.h"

#include <cinttypes>
#include "core_jni_helpers.h"

// ----------------------------------------------------------------------------

@@ -245,9 +244,10 @@ static jint android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject we
                                           jobject jaa, jintArray jSampleRate,
                                           jint channelPositionMask, jint channelIndexMask,
                                           jint audioFormat, jint buffSizeInBytes, jint memoryMode,
                                           jintArray jSession, jlong nativeAudioTrack,
                                           jboolean offload, jint encapsulationMode,
                                           jobject tunerConfiguration, jstring opPackageName) {
                                           jintArray jSession, jobject jAttributionSource,
                                           jlong nativeAudioTrack, jboolean offload,
                                           jint encapsulationMode, jobject tunerConfiguration,
                                           jstring opPackageName) {
    ALOGV("sampleRates=%p, channel mask=%x, index mask=%x, audioFormat(Java)=%d, buffSize=%d,"
          " nativeAudioTrack=0x%" PRIX64 ", offload=%d encapsulationMode=%d tuner=%p",
          jSampleRate, channelPositionMask, channelIndexMask, audioFormat, buffSizeInBytes,
@@ -323,10 +323,9 @@ static jint android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject we

        // create the native AudioTrack object
        ScopedUtfChars opPackageNameStr(env, opPackageName);
        // TODO b/182469354: make consistent with AudioRecord
        AttributionSourceState attributionSource;
        attributionSource.packageName = std::string(opPackageNameStr.c_str());
        attributionSource.token = sp<BBinder>::make();

        android::content::AttributionSourceState attributionSource;
        attributionSource.readFromParcel(parcelForJavaObject(env, jAttributionSource));
        lpTrack = sp<AudioTrack>::make(attributionSource);

        // read the AudioAttributes values
@@ -382,7 +381,7 @@ static jint android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject we
                                  offload ? AudioTrack::TRANSFER_SYNC_NOTIF_CALLBACK
                                          : AudioTrack::TRANSFER_SYNC,
                                  (offload || encapsulationMode) ? &offloadInfo : NULL,
                                  AttributionSourceState(), // default uid, pid values
                                  attributionSource, // Passed from Java
                                  paa.get());
            break;

@@ -408,7 +407,7 @@ static jint android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject we
                                  sessionId, // audio session ID
                                  AudioTrack::TRANSFER_SHARED,
                                  nullptr,           // default offloadInfo
                                  AttributionSourceState(), // default uid, pid values
                                  attributionSource, // Passed from Java
                                  paa.get());
            break;
        }
@@ -1456,7 +1455,8 @@ static const JNINativeMethod gMethods[] = {
        {"native_pause", "()V", (void *)android_media_AudioTrack_pause},
        {"native_flush", "()V", (void *)android_media_AudioTrack_flush},
        {"native_setup",
         "(Ljava/lang/Object;Ljava/lang/Object;[IIIIII[IJZILjava/lang/Object;Ljava/lang/String;)I",
         "(Ljava/lang/Object;Ljava/lang/Object;[IIIIII[ILandroid/os/Parcel;"
         "JZILjava/lang/Object;Ljava/lang/String;)I",
         (void *)android_media_AudioTrack_setup},
        {"native_finalize", "()V", (void *)android_media_AudioTrack_finalize},
        {"native_release", "()V", (void *)android_media_AudioTrack_release},
+40 −28
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.AttributionSource;
import android.content.AttributionSource.ScopedParcelState;
import android.content.Context;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioMixingRule;
@@ -39,6 +41,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
import android.os.PersistableBundle;
import android.util.ArrayMap;
import android.util.Log;
@@ -822,16 +825,21 @@ public class AudioTrack extends PlayerBase
        int[] session = new int[1];
        session[0] = resolvePlaybackSessionId(context, sessionId);

        AttributionSource attributionSource = context == null
                ? AttributionSource.myAttributionSource() : context.getAttributionSource();

        // native initialization
        try (ScopedParcelState attributionSourceState = attributionSource.asScopedParcelState()) {
            int initResult = native_setup(new WeakReference<AudioTrack>(this), mAttributes,
                    sampleRate, mChannelMask, mChannelIndexMask, mAudioFormat,
                mNativeBufferSizeInBytes, mDataLoadMode, session, 0 /*nativeTrackInJavaObj*/,
                offload, encapsulationMode, tunerConfiguration,
                getCurrentOpPackageName());
                    mNativeBufferSizeInBytes, mDataLoadMode, session,
                    attributionSourceState.getParcel(), 0 /*nativeTrackInJavaObj*/, offload,
                    encapsulationMode, tunerConfiguration, getCurrentOpPackageName());
            if (initResult != SUCCESS) {
                loge("Error code " + initResult + " when initializing AudioTrack.");
                return; // with mState == STATE_UNINITIALIZED
            }
        }

        mSampleRate = sampleRate[0];
        mSessionId = session[0];
@@ -902,6 +910,8 @@ public class AudioTrack extends PlayerBase
            // *Native* AudioTrack, so the attributes parameters to native_setup() are ignored.
            int[] session = { 0 };
            int[] rates = { 0 };
            try (ScopedParcelState attributionSourceState =
                         AttributionSource.myAttributionSource().asScopedParcelState()) {
                int initResult = native_setup(new WeakReference<AudioTrack>(this),
                        null /*mAttributes - NA*/,
                        rates /*sampleRate - NA*/,
@@ -911,6 +921,7 @@ public class AudioTrack extends PlayerBase
                        0 /*mNativeBufferSizeInBytes - NA*/,
                        0 /*mDataLoadMode - NA*/,
                        session,
                        attributionSourceState.getParcel(),
                        nativeTrackInJavaObj,
                        false /*offload*/,
                        ENCAPSULATION_MODE_NONE,
@@ -920,6 +931,7 @@ public class AudioTrack extends PlayerBase
                    loge("Error code " + initResult + " when initializing AudioTrack.");
                    return; // with mState == STATE_UNINITIALIZED
                }
            }

            mSessionId = session[0];

@@ -4371,9 +4383,9 @@ public class AudioTrack extends PlayerBase
    private native final int native_setup(Object /*WeakReference<AudioTrack>*/ audiotrack_this,
            Object /*AudioAttributes*/ attributes,
            int[] sampleRate, int channelMask, int channelIndexMask, int audioFormat,
            int buffSizeInBytes, int mode, int[] sessionId, long nativeAudioTrack,
            boolean offload, int encapsulationMode, Object tunerConfiguration,
            @NonNull String opPackageName);
            int buffSizeInBytes, int mode, int[] sessionId, @NonNull Parcel attributionSource,
            long nativeAudioTrack, boolean offload, int encapsulationMode,
            Object tunerConfiguration, @NonNull String opPackageName);

    private native final void native_finalize();