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

Commit 640adb3c authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

Cache audio attributes when player not available

Cache the audio attributes stored in a Parcel in the client-side
 MediaPlayer object if they are set through setParameter()
 before the server-side MediaPlayer is available. Apply them when
 the player is prepared.

Bug 17280746

Change-Id: I72f1a7fc4e2b076fae8cbdede77a2f74e98b2a03
parent f2a2d0d6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -278,6 +278,7 @@ private:
    bool                        mPrepareSync;
    status_t                    mPrepareStatus;
    audio_stream_type_t         mStreamType;
    Parcel*                     mAudioAttributesParcel;
    bool                        mLoop;
    float                       mLeftVolume;
    float                       mRightVolume;
+19 −2
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ MediaPlayer::MediaPlayer()
    mListener = NULL;
    mCookie = NULL;
    mStreamType = AUDIO_STREAM_MUSIC;
    mAudioAttributesParcel = NULL;
    mCurrentPosition = -1;
    mSeekPosition = -1;
    mCurrentState = MEDIA_PLAYER_IDLE;
@@ -68,6 +69,10 @@ MediaPlayer::MediaPlayer()
MediaPlayer::~MediaPlayer()
{
    ALOGV("destructor");
    if (mAudioAttributesParcel != NULL) {
        delete mAudioAttributesParcel;
        mAudioAttributesParcel = NULL;
    }
    AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
    disconnect();
    IPCThreadState::self()->flushCommands();
@@ -237,6 +242,9 @@ status_t MediaPlayer::prepareAsync_l()
{
    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {
        mPlayer->setAudioStreamType(mStreamType);
        if (mAudioAttributesParcel != NULL) {
            mPlayer->setParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES, *mAudioAttributesParcel);
        }
        mCurrentState = MEDIA_PLAYER_PREPARING;
        return mPlayer->prepareAsync();
    }
@@ -662,9 +670,18 @@ status_t MediaPlayer::setParameter(int key, const Parcel& request)
    if (mPlayer != NULL) {
        return  mPlayer->setParameter(key, request);
    }
    switch (key) {
    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
        // no player, save the marshalled audio attributes
        if (mAudioAttributesParcel != NULL) { delete mAudioAttributesParcel; };
        mAudioAttributesParcel = new Parcel();
        mAudioAttributesParcel->appendFrom(&request, 0, request.dataSize());
        return OK;
    default:
        ALOGV("setParameter: no active player");
        return INVALID_OPERATION;
    }
}

status_t MediaPlayer::getParameter(int key, Parcel *reply)
{