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

Commit b98daa99 authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Automerger Merge Worker
Browse files

Merge changes from topic "tpb_race_fix" into main am: 21883171 am: ae495344

parents c813fb6d ae495344
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -158,6 +158,7 @@ cc_library {
        "framework-permission-aidl-cpp",
        "framework-permission-aidl-cpp",
        "libbinder",
        "libbinder",
        "libmediametrics",
        "libmediametrics",
        "libmediautils",
        "spatializer-aidl-cpp",
        "spatializer-aidl-cpp",
    ],
    ],


+22 −20
Original line number Original line Diff line number Diff line
@@ -38,12 +38,12 @@ void TrackPlayerBase::init(const sp<AudioTrack>& pat,
                           player_type_t playerType, audio_usage_t usage,
                           player_type_t playerType, audio_usage_t usage,
                           audio_session_t sessionId) {
                           audio_session_t sessionId) {
    PlayerBase::init(playerType, usage, sessionId);
    PlayerBase::init(playerType, usage, sessionId);
    mAudioTrack = pat;
    mAudioTrack.store(pat);
    if (mAudioTrack != 0) {
    if (pat != 0) {
        mCallbackHandle = callback;
        mCallbackHandle = callback;
        mSelfAudioDeviceCallback = new SelfAudioDeviceCallback(*this);
        mSelfAudioDeviceCallback = new SelfAudioDeviceCallback(*this);
        mAudioTrack->addAudioDeviceCallback(mSelfAudioDeviceCallback);
        pat->addAudioDeviceCallback(mSelfAudioDeviceCallback);
        mAudioTrack->setPlayerIId(mPIId); // set in PlayerBase::init().
        pat->setPlayerIId(mPIId);  // set in PlayerBase::init().
    }
    }
}
}


@@ -65,12 +65,15 @@ void TrackPlayerBase::SelfAudioDeviceCallback::onAudioDeviceUpdate(audio_io_hand
}
}


void TrackPlayerBase::doDestroy() {
void TrackPlayerBase::doDestroy() {
    if (mAudioTrack != 0) {
    sp<AudioTrack> audioTrack = getAudioTrack();
        mAudioTrack->stop();

        mAudioTrack->removeAudioDeviceCallback(mSelfAudioDeviceCallback);
        mSelfAudioDeviceCallback.clear();
    // Note that there may still be another reference in post-unlock phase of SetPlayState
    // Note that there may still be another reference in post-unlock phase of SetPlayState
        mAudioTrack.clear();
    clearAudioTrack();

    if (audioTrack != 0) {
        audioTrack->stop();
        audioTrack->removeAudioDeviceCallback(mSelfAudioDeviceCallback);
        mSelfAudioDeviceCallback.clear();
    }
    }
}
}


@@ -87,16 +90,16 @@ void TrackPlayerBase::setPlayerVolume(float vl, float vr) {
// Implementation of IPlayer
// Implementation of IPlayer
status_t TrackPlayerBase::playerStart() {
status_t TrackPlayerBase::playerStart() {
    status_t status = NO_INIT;
    status_t status = NO_INIT;
    if (mAudioTrack != 0) {
    if (sp<AudioTrack> audioTrack = getAudioTrack(); audioTrack != 0) {
        status = mAudioTrack->start();
        status = audioTrack->start();
    }
    }
    return status;
    return status;
}
}


status_t TrackPlayerBase::playerPause() {
status_t TrackPlayerBase::playerPause() {
    status_t status = NO_INIT;
    status_t status = NO_INIT;
    if (mAudioTrack != 0) {
    if (sp<AudioTrack> audioTrack = getAudioTrack(); audioTrack != 0) {
        mAudioTrack->pause();
        audioTrack->pause();
        status = NO_ERROR;
        status = NO_ERROR;
    }
    }
    return status;
    return status;
@@ -105,8 +108,8 @@ status_t TrackPlayerBase::playerPause() {


status_t TrackPlayerBase::playerStop() {
status_t TrackPlayerBase::playerStop() {
    status_t status = NO_INIT;
    status_t status = NO_INIT;
    if (mAudioTrack != 0) {
    if (sp<AudioTrack> audioTrack = getAudioTrack(); audioTrack != 0) {
        mAudioTrack->stop();
        audioTrack->stop();
        status = NO_ERROR;
        status = NO_ERROR;
    }
    }
    return status;
    return status;
@@ -118,10 +121,10 @@ status_t TrackPlayerBase::playerSetVolume() {


status_t TrackPlayerBase::doSetVolume() {
status_t TrackPlayerBase::doSetVolume() {
    status_t status = NO_INIT;
    status_t status = NO_INIT;
    if (mAudioTrack != 0) {
    if (sp<AudioTrack> audioTrack = getAudioTrack(); audioTrack != 0) {
        float tl = mPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
        float tl = mPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
        float tr = mPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
        float tr = mPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
        mAudioTrack->setVolume(tl, tr);
        audioTrack->setVolume(tl, tr);
        status = NO_ERROR;
        status = NO_ERROR;
    }
    }
    return status;
    return status;
@@ -140,10 +143,9 @@ binder::Status TrackPlayerBase::applyVolumeShaper(
    if (s != OK) {
    if (s != OK) {
        return binderStatusFromStatusT(s);
        return binderStatusFromStatusT(s);
    }
    }

    if (sp<AudioTrack> audioTrack = getAudioTrack(); audioTrack != 0) {
    if (mAudioTrack != 0) {
        ALOGD("TrackPlayerBase::applyVolumeShaper() from IPlayer");
        ALOGD("TrackPlayerBase::applyVolumeShaper() from IPlayer");
        VolumeShaper::Status status = mAudioTrack->applyVolumeShaper(spConfiguration, spOperation);
        VolumeShaper::Status status = audioTrack->applyVolumeShaper(spConfiguration, spOperation);
        if (status < 0) { // a non-negative value is the volume shaper id.
        if (status < 0) { // a non-negative value is the volume shaper id.
            ALOGE("TrackPlayerBase::applyVolumeShaper() failed with status %d", status);
            ALOGE("TrackPlayerBase::applyVolumeShaper() failed with status %d", status);
        }
        }
+6 −3
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@


#include <media/AudioTrack.h>
#include <media/AudioTrack.h>
#include <media/PlayerBase.h>
#include <media/PlayerBase.h>
#include <mediautils/Synchronization.h>


namespace android {
namespace android {


@@ -37,8 +38,9 @@ public:
            const media::VolumeShaperConfiguration& configuration,
            const media::VolumeShaperConfiguration& configuration,
            const media::VolumeShaperOperation& operation);
            const media::VolumeShaperOperation& operation);


    //FIXME move to protected field, so far made public to minimize changes to AudioTrack logic
    sp<AudioTrack> getAudioTrack() { return mAudioTrack.load(); }
    sp<AudioTrack> mAudioTrack;

    void clearAudioTrack() { mAudioTrack.store(nullptr); }


    void setPlayerVolume(float vl, float vr);
    void setPlayerVolume(float vl, float vr);


@@ -68,6 +70,7 @@ private:
    float mPlayerVolumeL, mPlayerVolumeR;
    float mPlayerVolumeL, mPlayerVolumeR;
    sp<AudioTrack::IAudioTrackCallback> mCallbackHandle;
    sp<AudioTrack::IAudioTrackCallback> mCallbackHandle;
    sp<SelfAudioDeviceCallback> mSelfAudioDeviceCallback;
    sp<SelfAudioDeviceCallback> mSelfAudioDeviceCallback;
    mediautils::atomic_sp<AudioTrack> mAudioTrack;
};
};


} // namespace android
} // namespace android
+2 −2
Original line number Original line Diff line number Diff line
@@ -54,7 +54,7 @@ class TrackPlayerBaseTest
        mPlayer = new TrackPlayer();
        mPlayer = new TrackPlayer();
        mPlayer->init(track.get(), mPlayer, PLAYER_TYPE_AAUDIO, AUDIO_USAGE_MEDIA,
        mPlayer->init(track.get(), mPlayer, PLAYER_TYPE_AAUDIO, AUDIO_USAGE_MEDIA,
                      AUDIO_SESSION_NONE);
                      AUDIO_SESSION_NONE);
        sp<AudioTrack> playerTrack = mPlayer->mAudioTrack;
        sp<AudioTrack> playerTrack = mPlayer->getAudioTrack();
        ASSERT_EQ(playerTrack->initCheck(), NO_ERROR);
        ASSERT_EQ(playerTrack->initCheck(), NO_ERROR);


        mBufferSize = mFrameCount * playerTrack->frameSize();
        mBufferSize = mFrameCount * playerTrack->frameSize();
@@ -74,7 +74,7 @@ class TrackPlayerBaseTest


    void playBuffer() {
    void playBuffer() {
        bool blocking = true;
        bool blocking = true;
        ssize_t nbytes = mPlayer->mAudioTrack->write(mBuffer.data(), mBufferSize, blocking);
        ssize_t nbytes = mPlayer->getAudioTrack()->write(mBuffer.data(), mBufferSize, blocking);
        EXPECT_EQ(nbytes, mBufferSize) << "Did not write all data in blocking mode";
        EXPECT_EQ(nbytes, mBufferSize) << "Did not write all data in blocking mode";
    }
    }