Loading services/audioflinger/PlaybackTracks.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading services/audioflinger/Threads.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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()); } } Loading Loading @@ -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(); } } } Loading services/audioflinger/Tracks.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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> Loading Loading
services/audioflinger/PlaybackTracks.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading
services/audioflinger/Threads.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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()); } } Loading Loading @@ -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(); } } } Loading
services/audioflinger/Tracks.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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> Loading