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

Commit f8274c19 authored by Dichen Zhang's avatar Dichen Zhang Committed by Android (Google) Code Review
Browse files

Merge "MediaPlayer2: directly pass AudioAttributes to AudioTrack without native parcel conversion"

parents ba92a60c c2465c59
Loading
Loading
Loading
Loading
+14 −7
Original line number Original line Diff line number Diff line
@@ -35,7 +35,7 @@ JAudioTrack::JAudioTrack( // < Usages of the argumen
        void* user,                                   // Offload
        void* user,                                   // Offload
        size_t frameCount,                            // bufferSizeInBytes
        size_t frameCount,                            // bufferSizeInBytes
        audio_session_t sessionId,                    // AudioTrack
        audio_session_t sessionId,                    // AudioTrack
        const audio_attributes_t* pAttributes,        // AudioAttributes
        const jobject attributes,                     // AudioAttributes
        float maxRequiredSpeed) {                     // bufferSizeInBytes
        float maxRequiredSpeed) {                     // bufferSizeInBytes


    JNIEnv *env = JavaVMHelper::getJNIEnv();
    JNIEnv *env = JavaVMHelper::getJNIEnv();
@@ -65,13 +65,17 @@ JAudioTrack::JAudioTrack( // < Usages of the argumen
    jmethodID jBuilderCtor = env->GetMethodID(jBuilderCls, "<init>", "()V");
    jmethodID jBuilderCtor = env->GetMethodID(jBuilderCls, "<init>", "()V");
    jobject jBuilderObj = env->NewObject(jBuilderCls, jBuilderCtor);
    jobject jBuilderObj = env->NewObject(jBuilderCls, jBuilderCtor);


    jobject jAudioAttributesObj = JAudioAttributes::createAudioAttributesObj(env, pAttributes);
    if (attributes != NULL) {
    mAudioAttributesObj = reinterpret_cast<jobject>(env->NewGlobalRef(jAudioAttributesObj));
        mAudioAttributesObj = new JObjectHolder(attributes);
    env->DeleteLocalRef(jAudioAttributesObj);
    } else {
        mAudioAttributesObj = new JObjectHolder(
                JAudioAttributes::createAudioAttributesObj(env, NULL));
    }


    jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
    jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
            "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
            "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
    jBuilderObj = env->CallObjectMethod(jBuilderObj, jSetAudioAttributes, mAudioAttributesObj);
    jBuilderObj = env->CallObjectMethod(jBuilderObj,
            jSetAudioAttributes, mAudioAttributesObj->getJObject());


    jmethodID jSetAudioFormat = env->GetMethodID(jBuilderCls, "setAudioFormat",
    jmethodID jSetAudioFormat = env->GetMethodID(jBuilderCls, "setAudioFormat",
            "(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;");
            "(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;");
@@ -125,7 +129,6 @@ JAudioTrack::~JAudioTrack() {
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    env->DeleteGlobalRef(mAudioTrackCls);
    env->DeleteGlobalRef(mAudioTrackCls);
    env->DeleteGlobalRef(mAudioTrackObj);
    env->DeleteGlobalRef(mAudioTrackObj);
    env->DeleteGlobalRef(mAudioAttributesObj);
}
}


size_t JAudioTrack::frameCount() {
size_t JAudioTrack::frameCount() {
@@ -509,11 +512,15 @@ status_t JAudioTrack::setPreferredDevice(jobject device) {
}
}


audio_stream_type_t JAudioTrack::getAudioStreamType() {
audio_stream_type_t JAudioTrack::getAudioStreamType() {
    if (mAudioAttributesObj == NULL) {
        return AUDIO_STREAM_DEFAULT;
    }
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    JNIEnv *env = JavaVMHelper::getJNIEnv();
    jclass jAudioAttributesCls = env->FindClass("android/media/AudioAttributes");
    jclass jAudioAttributesCls = env->FindClass("android/media/AudioAttributes");
    jmethodID jGetVolumeControlStream = env->GetMethodID(jAudioAttributesCls,
    jmethodID jGetVolumeControlStream = env->GetMethodID(jAudioAttributesCls,
            "getVolumeControlStream", "()I");
            "getVolumeControlStream", "()I");
    int javaAudioStreamType = env->CallIntMethod(mAudioAttributesObj, jGetVolumeControlStream);
    int javaAudioStreamType = env->CallIntMethod(
            mAudioAttributesObj->getJObject(), jGetVolumeControlStream);
    return (audio_stream_type_t)javaAudioStreamType;
    return (audio_stream_type_t)javaAudioStreamType;
}
}


+15 −20
Original line number Original line Diff line number Diff line
@@ -60,7 +60,7 @@ status_t MediaPlayer2AudioOutput::dump(int fd, const Vector<String16>& args) con
}
}


MediaPlayer2AudioOutput::MediaPlayer2AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
MediaPlayer2AudioOutput::MediaPlayer2AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
        const audio_attributes_t* attr, std::vector<jobject>& routingDelegatesBackup)
        const jobject attributes, std::vector<jobject>& routingDelegatesBackup)
    : mCallback(nullptr),
    : mCallback(nullptr),
      mCallbackCookie(nullptr),
      mCallbackCookie(nullptr),
      mCallbackData(nullptr),
      mCallbackData(nullptr),
@@ -76,13 +76,12 @@ MediaPlayer2AudioOutput::MediaPlayer2AudioOutput(audio_session_t sessionId, uid_
      mAuxEffectId(0),
      mAuxEffectId(0),
      mFlags(AUDIO_OUTPUT_FLAG_NONE) {
      mFlags(AUDIO_OUTPUT_FLAG_NONE) {
    ALOGV("MediaPlayer2AudioOutput(%d)", sessionId);
    ALOGV("MediaPlayer2AudioOutput(%d)", sessionId);
    if (attr != nullptr) {

        mAttributes = (audio_attributes_t *) calloc(1, sizeof(audio_attributes_t));
    if (mAttributes != nullptr) {
    if (mAttributes != nullptr) {
            memcpy(mAttributes, attr, sizeof(audio_attributes_t));
        mAttributes->~JObjectHolder();
    }
    }
    } else {
    if (attributes != nullptr) {
        mAttributes = nullptr;
        mAttributes = new JObjectHolder(attributes);
    }
    }


    setMinBufferCount();
    setMinBufferCount();
@@ -99,7 +98,6 @@ MediaPlayer2AudioOutput::~MediaPlayer2AudioOutput() {
        JAudioTrack::removeGlobalRef(routingDelegate.second);
        JAudioTrack::removeGlobalRef(routingDelegate.second);
    }
    }
    close();
    close();
    free(mAttributes);
    delete mCallbackData;
    delete mCallbackData;
}
}


@@ -251,16 +249,13 @@ status_t MediaPlayer2AudioOutput::getFramesWritten(uint32_t *frameswritten) cons
    return status;
    return status;
}
}


void MediaPlayer2AudioOutput::setAudioAttributes(const audio_attributes_t * attributes) {
void MediaPlayer2AudioOutput::setAudioAttributes(const jobject attributes) {
    Mutex::Autolock lock(mLock);
    Mutex::Autolock lock(mLock);
    if (attributes == nullptr) {
    if (mAttributes != nullptr) {
        free(mAttributes);
        mAttributes->~JObjectHolder();
        mAttributes = nullptr;
    } else {
        if (mAttributes == nullptr) {
            mAttributes = (audio_attributes_t *) calloc(1, sizeof(audio_attributes_t));
    }
    }
        memcpy(mAttributes, attributes, sizeof(audio_attributes_t));
    if (attributes != nullptr) {
        mAttributes = new JObjectHolder(attributes);
    }
    }
}
}


@@ -325,7 +320,7 @@ status_t MediaPlayer2AudioOutput::open(
                 newcbd,
                 newcbd,
                 frameCount,
                 frameCount,
                 mSessionId,
                 mSessionId,
                 mAttributes,
                 mAttributes != nullptr ? mAttributes->getJObject() : nullptr,
                 1.0f);  // default value for maxRequiredSpeed
                 1.0f);  // default value for maxRequiredSpeed
    } else {
    } else {
        // TODO: Due to buffer memory concerns, we use a max target playback speed
        // TODO: Due to buffer memory concerns, we use a max target playback speed
@@ -344,7 +339,7 @@ status_t MediaPlayer2AudioOutput::open(
                 nullptr,
                 nullptr,
                 frameCount,
                 frameCount,
                 mSessionId,
                 mSessionId,
                 mAttributes,
                 mAttributes != nullptr ? mAttributes->getJObject() : nullptr,
                 targetSpeed);
                 targetSpeed);
    }
    }


+3 −3
Original line number Original line Diff line number Diff line
@@ -25,7 +25,7 @@
#include <media/VolumeShaper.h>
#include <media/VolumeShaper.h>
#include <system/audio.h>
#include <system/audio.h>
#include <utils/Errors.h>
#include <utils/Errors.h>

#include <mediaplayer2/JObjectHolder.h>
#include <media/AudioTimestamp.h>   // It has dependency on audio.h/Errors.h, but doesn't
#include <media/AudioTimestamp.h>   // It has dependency on audio.h/Errors.h, but doesn't
                                    // include them in it. Therefore it is included here at last.
                                    // include them in it. Therefore it is included here at last.


@@ -115,7 +115,7 @@ public:
                void* user,
                void* user,
                size_t frameCount = 0,
                size_t frameCount = 0,
                audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE,
                audio_session_t sessionId  = AUDIO_SESSION_ALLOCATE,
                const audio_attributes_t* pAttributes = NULL,
                const jobject pAttributes = NULL,
                float maxRequiredSpeed = 1.0f);
                float maxRequiredSpeed = 1.0f);


    /*
    /*
@@ -446,7 +446,7 @@ private:


    jclass mAudioTrackCls;
    jclass mAudioTrackCls;
    jobject mAudioTrackObj;
    jobject mAudioTrackObj;
    jobject mAudioAttributesObj;
    sp<JObjectHolder> mAudioAttributesObj;


    /* Creates a Java VolumeShaper.Configuration object from VolumeShaper::Configuration */
    /* Creates a Java VolumeShaper.Configuration object from VolumeShaper::Configuration */
    jobject createVolumeShaperConfigurationObj(
    jobject createVolumeShaperConfigurationObj(
+3 −3
Original line number Original line Diff line number Diff line
@@ -41,7 +41,7 @@ public:
    MediaPlayer2AudioOutput(audio_session_t sessionId,
    MediaPlayer2AudioOutput(audio_session_t sessionId,
                            uid_t uid,
                            uid_t uid,
                            int pid,
                            int pid,
                            const audio_attributes_t * attr,
                            const jobject attributes,
                            std::vector<jobject>& routingDelegatesBackup);
                            std::vector<jobject>& routingDelegatesBackup);
    virtual ~MediaPlayer2AudioOutput();
    virtual ~MediaPlayer2AudioOutput();


@@ -76,7 +76,7 @@ public:
    virtual void flush();
    virtual void flush();
    virtual void pause();
    virtual void pause();
    virtual void close();
    virtual void close();
    void setAudioAttributes(const audio_attributes_t * attributes);
    void setAudioAttributes(const jobject attributes);
    virtual audio_stream_type_t getAudioStreamType() const;
    virtual audio_stream_type_t getAudioStreamType() const;


    void setVolume(float volume);
    void setVolume(float volume);
@@ -112,7 +112,7 @@ private:
    AudioCallback           mCallback;
    AudioCallback           mCallback;
    void *                  mCallbackCookie;
    void *                  mCallbackCookie;
    CallbackData *          mCallbackData;
    CallbackData *          mCallbackData;
    audio_attributes_t *    mAttributes;
    sp<JObjectHolder>       mAttributes;
    float                   mVolume;
    float                   mVolume;
    AudioPlaybackRate       mPlaybackRate;
    AudioPlaybackRate       mPlaybackRate;
    uint32_t                mSampleRateHz; // sample rate of the content, as set in open()
    uint32_t                mSampleRateHz; // sample rate of the content, as set in open()
+6 −5
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@
#include <media/mediaplayer_common.h>
#include <media/mediaplayer_common.h>
#include <mediaplayer2/MediaPlayer2Interface.h>
#include <mediaplayer2/MediaPlayer2Interface.h>
#include <mediaplayer2/MediaPlayer2Types.h>
#include <mediaplayer2/MediaPlayer2Types.h>
#include <mediaplayer2/JObjectHolder.h>


#include <vector>
#include <vector>
#include <jni.h>
#include <jni.h>
@@ -100,7 +101,8 @@ public:
            audio_session_t getAudioSessionId();
            audio_session_t getAudioSessionId();
            status_t        setAuxEffectSendLevel(float level);
            status_t        setAuxEffectSendLevel(float level);
            status_t        attachAuxEffect(int effectId);
            status_t        attachAuxEffect(int effectId);
            status_t        setParameter(int key, const Parcel& request);
            status_t        setAudioAttributes(const jobject attributes);
            jobject         getAudioAttributes();
            status_t        getParameter(int key, Parcel* reply);
            status_t        getParameter(int key, Parcel* reply);


            // Modular DRM
            // Modular DRM
@@ -121,14 +123,14 @@ private:
    // Disconnect from the currently connected ANativeWindow.
    // Disconnect from the currently connected ANativeWindow.
    void disconnectNativeWindow_l();
    void disconnectNativeWindow_l();


    status_t setAudioAttributes_l(const Parcel &request);
    status_t setAudioAttributes_l(const jobject attributes);


    void clear_l();
    void clear_l();
    status_t seekTo_l(int64_t msec, MediaPlayer2SeekMode mode);
    status_t seekTo_l(int64_t msec, MediaPlayer2SeekMode mode);
    status_t prepareAsync_l();
    status_t prepareAsync_l();
    status_t getDuration_l(int64_t *msec);
    status_t getDuration_l(int64_t *msec);
    status_t reset_l();
    status_t reset_l();
    status_t checkStateForKeySet_l(int key);
    status_t checkState_l();


    pid_t                       mPid;
    pid_t                       mPid;
    uid_t                       mUid;
    uid_t                       mUid;
@@ -145,13 +147,12 @@ private:
    int64_t                     mSeekPosition;
    int64_t                     mSeekPosition;
    MediaPlayer2SeekMode        mSeekMode;
    MediaPlayer2SeekMode        mSeekMode;
    audio_stream_type_t         mStreamType;
    audio_stream_type_t         mStreamType;
    Parcel*                     mAudioAttributesParcel;
    bool                        mLoop;
    bool                        mLoop;
    float                       mVolume;
    float                       mVolume;
    int                         mVideoWidth;
    int                         mVideoWidth;
    int                         mVideoHeight;
    int                         mVideoHeight;
    audio_session_t             mAudioSessionId;
    audio_session_t             mAudioSessionId;
    audio_attributes_t *        mAudioAttributes;
    sp<JObjectHolder>           mAudioAttributes;
    float                       mSendLevel;
    float                       mSendLevel;
    std::vector<jobject>        mRoutingDelegates;
    std::vector<jobject>        mRoutingDelegates;
    sp<ANativeWindowWrapper>    mConnectedWindow;
    sp<ANativeWindowWrapper>    mConnectedWindow;
Loading