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

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

Merge "Prepare for track invalidation to be done by proxy"

parents db88c7da 5736c35b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ protected:

public:
    void triggerEvents(AudioSystem::sync_event_t type);
    void invalidate();
    bool isInvalid() const { return mIsInvalid; }
    virtual bool isTimedTrack() const { return false; }
    bool isFastTrack() const { return (mFlags & IAudioFlinger::TRACK_FAST) != 0; }
    virtual bool isOut() const;
@@ -143,6 +145,7 @@ private:
    volatile float      mCachedVolume;  // combined master volume and stream type volume;
                                        // 'volatile' means accessed without lock or
                                        // barrier, but is read/written atomically
    bool                mIsInvalid; // non-resettable latch, set by invalidate()
};  // end of Track

class TimedTrack : public Track {
+3 −6
Original line number Diff line number Diff line
@@ -1524,8 +1524,7 @@ uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const

    for (size_t i = 0; i < mTracks.size(); ++i) {
        sp<Track> track = mTracks[i];
        if (sessionId == track->sessionId() &&
                !(track->mCblk->flags & CBLK_INVALID)) {
        if (sessionId == track->sessionId() && !track->isInvalid()) {
            result |= TRACK_SESSION;
            break;
        }
@@ -1543,8 +1542,7 @@ uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
    }
    for (size_t i = 0; i < mTracks.size(); i++) {
        sp<Track> track = mTracks[i];
        if (sessionId == track->sessionId() &&
                !(track->mCblk->flags & CBLK_INVALID)) {
        if (sessionId == track->sessionId() && !track->isInvalid()) {
            return AudioSystem::getStrategyForStream(track->streamType());
        }
    }
@@ -1721,8 +1719,7 @@ void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamTy
    for (size_t i = 0; i < size; i++) {
        sp<Track> t = mTracks[i];
        if (t->streamType() == streamType) {
            android_atomic_or(CBLK_INVALID, &t->mCblk->flags);
            t->mCblk->cv.signal();
            t->invalidate();
        }
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -323,7 +323,8 @@ AudioFlinger::PlaybackThread::Track::Track(
    mFlags(flags),
    mFastIndex(-1),
    mUnderrunCount(0),
    mCachedVolume(1.0)
    mCachedVolume(1.0),
    mIsInvalid(false)
{
    if (mCblk != NULL) {
        // to avoid leaking a track name, do not allocate one unless there is an mCblk
@@ -834,6 +835,14 @@ bool AudioFlinger::PlaybackThread::Track::isOut() const
    return true;
}

void AudioFlinger::PlaybackThread::Track::invalidate()
{
    // FIXME should use proxy
    android_atomic_or(CBLK_INVALID, &mCblk->flags);
    mCblk->cv.signal();
    mIsInvalid = true;
}

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

sp<AudioFlinger::PlaybackThread::TimedTrack>