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

gugelfrei
Andy Hung 5 years ago committed by Android (Google) Code Review
commit ede17f7293

@ -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)
{
// 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;
}
// 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> ids;
@ -9053,28 +9010,6 @@ size_t AudioFlinger::MmapThread::removeEffectChain_l(const sp<EffectChain>& chai
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()
{
mHalStream->standby();

@ -356,6 +356,27 @@ public:
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
// strategy is only meaningful for PlaybackThread which implements this method
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 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);
@ -1550,7 +1573,9 @@ public:
virtual status_t addEffectChain_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.
// 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,
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 bool isValidSyncEvent(const sp<SyncEvent>& event) const;

@ -94,6 +94,9 @@ public:
virtual void invalidate() { mIsInvalid = true; }
bool isInvalid() const { return mIsInvalid; }
void terminate() { mTerminated = true; }
bool isTerminated() const { return mTerminated; }
audio_attributes_t attributes() const { return mAttr; }
#ifdef TEE_SINK
@ -228,14 +231,6 @@ protected:
return mState == STOPPING_2;
}
bool isTerminated() const {
return mTerminated;
}
void terminate() {
mTerminated = true;
}
// Upper case characters are final states.
// Lower case characters are transitory.
const char *getTrackStateString() const {

Loading…
Cancel
Save