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

Commit c3d62f99 authored by Andy Hung's avatar Andy Hung
Browse files

Do not count invalid or terminated tracks for audio session purposes.

Test: CTS audio effect tests. SoloTester.
Bug: 128623061
Change-Id: I3f8d34d82aec14fe6ac9496c0e02726d94acdf85
parent 0a2fc30b
Loading
Loading
Loading
Loading
+0 −65
Original line number Original line Diff line number Diff line
@@ -2788,28 +2788,6 @@ status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, ui
    }
    }
}
}


// hasAudioSession_l() must be called with ThreadBase::mLock held
uint32_t AudioFlinger::PlaybackThread::hasAudioSession_l(audio_session_t sessionId) const
{
    uint32_t result = 0;
    if (getEffectChain_l(sessionId) != 0) {
        result = EFFECT_SESSION;
    }

    for (size_t i = 0; i < mTracks.size(); ++i) {
        sp<Track> track = mTracks[i];
        if (sessionId == track->sessionId() && !track->isInvalid()) {
            result |= TRACK_SESSION;
            if (track->isFastTrack()) {
                result |= FAST_SESSION;
            }
            break;
        }
    }

    return result;
}

uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(audio_session_t sessionId)
uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(audio_session_t sessionId)
{
{
    // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
    // session AUDIO_SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
@@ -8219,27 +8197,6 @@ uint32_t AudioFlinger::RecordThread::getInputFramesLost()
    return 0;
    return 0;
}
}


// hasAudioSession_l() must be called with ThreadBase::mLock held
uint32_t AudioFlinger::RecordThread::hasAudioSession_l(audio_session_t sessionId) const
{
    uint32_t result = 0;
    if (getEffectChain_l(sessionId) != 0) {
        result = EFFECT_SESSION;
    }

    for (size_t i = 0; i < mTracks.size(); ++i) {
        if (sessionId == mTracks[i]->sessionId()) {
            result |= TRACK_SESSION;
            if (mTracks[i]->isFastTrack()) {
                result |= FAST_SESSION;
            }
            break;
        }
    }

    return result;
}

KeyedVector<audio_session_t, bool> AudioFlinger::RecordThread::sessionIds() const
KeyedVector<audio_session_t, bool> AudioFlinger::RecordThread::sessionIds() const
{
{
    KeyedVector<audio_session_t, bool> ids;
    KeyedVector<audio_session_t, bool> ids;
@@ -9048,28 +9005,6 @@ size_t AudioFlinger::MmapThread::removeEffectChain_l(const sp<EffectChain>& chai
    return mEffectChains.size();
    return mEffectChains.size();
}
}


// hasAudioSession_l() must be called with ThreadBase::mLock held
uint32_t AudioFlinger::MmapThread::hasAudioSession_l(audio_session_t sessionId) const
{
    uint32_t result = 0;
    if (getEffectChain_l(sessionId) != 0) {
        result = EFFECT_SESSION;
    }

    for (size_t i = 0; i < mActiveTracks.size(); i++) {
        sp<MmapTrack> track = mActiveTracks[i];
        if (sessionId == track->sessionId()) {
            result |= TRACK_SESSION;
            if (track->isFastTrack()) {
                result |= FAST_SESSION;
            }
            break;
        }
    }

    return result;
}

void AudioFlinger::MmapThread::threadLoop_standby()
void AudioFlinger::MmapThread::threadLoop_standby()
{
{
    mHalStream->standby();
    mHalStream->standby();
+31 −3
Original line number Original line Diff line number Diff line
@@ -356,6 +356,27 @@ public:
                    return hasAudioSession_l(sessionId);
                    return hasAudioSession_l(sessionId);
                }
                }


                template <typename T>
                uint32_t hasAudioSession_l(audio_session_t sessionId, const T& tracks) const {
                    uint32_t result = 0;
                    if (getEffectChain_l(sessionId) != 0) {
                        result = EFFECT_SESSION;
                    }
                    for (size_t i = 0; i < tracks.size(); ++i) {
                        const sp<TrackBase>& track = tracks[i];
                        if (sessionId == track->sessionId()
                                && !track->isInvalid()       // not yet removed from tracks.
                                && !track->isTerminated()) {
                            result |= TRACK_SESSION;
                            if (track->isFastTrack()) {
                                result |= FAST_SESSION;  // caution, only represents first track.
                            }
                            break;
                        }
                    }
                    return result;
                }

                // the value returned by default implementation is not important as the
                // the value returned by default implementation is not important as the
                // strategy is only meaningful for PlaybackThread which implements this method
                // strategy is only meaningful for PlaybackThread which implements this method
                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId __unused)
                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId __unused)
@@ -810,7 +831,9 @@ public:


                virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
                virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
                virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
                virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
                virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const;
                        uint32_t hasAudioSession_l(audio_session_t sessionId) const override {
                            return ThreadBase::hasAudioSession_l(sessionId, mTracks);
                        }
                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId);
                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId);




@@ -1550,7 +1573,9 @@ public:


    virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
    virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
    virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
    virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
    virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const;
            uint32_t hasAudioSession_l(audio_session_t sessionId) const override {
                         return ThreadBase::hasAudioSession_l(sessionId, mTracks);
                     }


            // Return the set of unique session IDs across all tracks.
            // Return the set of unique session IDs across all tracks.
            // The keys are the session IDs, and the associated values are meaningless.
            // The keys are the session IDs, and the associated values are meaningless.
@@ -1725,7 +1750,10 @@ class MmapThread : public ThreadBase
    virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
    virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
                                                               audio_session_t sessionId);
                                                               audio_session_t sessionId);


    virtual     uint32_t    hasAudioSession_l(audio_session_t sessionId) const;
                uint32_t    hasAudioSession_l(audio_session_t sessionId) const override {
                                // Note: using mActiveTracks as no mTracks here.
                                return ThreadBase::hasAudioSession_l(sessionId, mActiveTracks);
                            }
    virtual     status_t    setSyncEvent(const sp<SyncEvent>& event);
    virtual     status_t    setSyncEvent(const sp<SyncEvent>& event);
    virtual     bool        isValidSyncEvent(const sp<SyncEvent>& event) const;
    virtual     bool        isValidSyncEvent(const sp<SyncEvent>& event) const;


+3 −8
Original line number Original line Diff line number Diff line
@@ -94,6 +94,9 @@ public:
    virtual void        invalidate() { mIsInvalid = true; }
    virtual void        invalidate() { mIsInvalid = true; }
            bool        isInvalid() const { return mIsInvalid; }
            bool        isInvalid() const { return mIsInvalid; }


            void        terminate() { mTerminated = true; }
            bool        isTerminated() const { return mTerminated; }

    audio_attributes_t  attributes() const { return mAttr; }
    audio_attributes_t  attributes() const { return mAttr; }


#ifdef TEE_SINK
#ifdef TEE_SINK
@@ -228,14 +231,6 @@ protected:
        return mState == STOPPING_2;
        return mState == STOPPING_2;
    }
    }


    bool isTerminated() const {
        return mTerminated;
    }

    void terminate() {
        mTerminated = true;
    }

    // Upper case characters are final states.
    // Upper case characters are final states.
    // Lower case characters are transitory.
    // Lower case characters are transitory.
    const char *getTrackStateString() const {
    const char *getTrackStateString() const {