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

Commit 2f55c2c0 authored by Glenn Kasten's avatar Glenn Kasten Committed by Android (Google) Code Review
Browse files

Merge "Simplify AudioTrack stream end and fix race" into klp-dev

parents 5874615f dcec9035
Loading
Loading
Loading
Loading
+15 −17
Original line number Original line Diff line number Diff line
@@ -1445,6 +1445,7 @@ nsecs_t AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
    }
    }
    size_t misalignment = mProxy->getMisalignment();
    size_t misalignment = mProxy->getMisalignment();
    uint32_t sequence = mSequence;
    uint32_t sequence = mSequence;
    sp<AudioTrackClientProxy> proxy = mProxy;


    // These fields don't need to be cached, because they are assigned only by set():
    // These fields don't need to be cached, because they are assigned only by set():
    //     mTransfer, mCbf, mUserData, mFormat, mFrameSize, mFrameSizeAF, mFlags
    //     mTransfer, mCbf, mUserData, mFormat, mFrameSize, mFrameSizeAF, mFlags
@@ -1453,35 +1454,32 @@ nsecs_t AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
    mLock.unlock();
    mLock.unlock();


    if (waitStreamEnd) {
    if (waitStreamEnd) {
        AutoMutex lock(mLock);

        sp<AudioTrackClientProxy> proxy = mProxy;
        sp<IMemory> iMem = mCblkMemory;

        struct timespec timeout;
        struct timespec timeout;
        timeout.tv_sec = WAIT_STREAM_END_TIMEOUT_SEC;
        timeout.tv_sec = WAIT_STREAM_END_TIMEOUT_SEC;
        timeout.tv_nsec = 0;
        timeout.tv_nsec = 0;


        mLock.unlock();
        status_t status = proxy->waitStreamEndDone(&timeout);
        status_t status = mProxy->waitStreamEndDone(&timeout);
        mLock.lock();
        switch (status) {
        switch (status) {
        case NO_ERROR:
        case NO_ERROR:
        case DEAD_OBJECT:
        case DEAD_OBJECT:
        case TIMED_OUT:
        case TIMED_OUT:
            mLock.unlock();
            mCbf(EVENT_STREAM_END, mUserData, NULL);
            mCbf(EVENT_STREAM_END, mUserData, NULL);
            mLock.lock();
            {
            if (mState == STATE_STOPPING) {
                AutoMutex lock(mLock);
                // The previously assigned value of waitStreamEnd is no longer valid,
                // since the mutex has been unlocked and either the callback handler
                // or another thread could have re-started the AudioTrack during that time.
                waitStreamEnd = mState == STATE_STOPPING;
                if (waitStreamEnd) {
                    mState = STATE_STOPPED;
                    mState = STATE_STOPPED;
                if (status != DEAD_OBJECT) {
                }
            }
            if (waitStreamEnd && status != DEAD_OBJECT) {
               return NS_INACTIVE;
               return NS_INACTIVE;
            }
            }
            break;
        }
        }
        return 0;
        return 0;
        default:
            return 0;
        }
    }
    }


    // perform callbacks while unlocked
    // perform callbacks while unlocked