summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2012-12-04 12:12:34 -0800
committerGlenn Kasten <gkasten@google.com>2012-12-12 09:38:48 -0800
commit5736c35b841de56ce394b4879389f669b61425e6 (patch)
treeb14624b7de512d74aab43e22b1f84fe08c29f647 /services
parentefc0cfb61e34c3bc688a7cbcc1ccef23922251c1 (diff)
downloadframeworks_av-5736c35b841de56ce394b4879389f669b61425e6.zip
frameworks_av-5736c35b841de56ce394b4879389f669b61425e6.tar.gz
frameworks_av-5736c35b841de56ce394b4879389f669b61425e6.tar.bz2
Prepare for track invalidation to be done by proxy
Don't rely on control block to determine whether track has been marked invalid. Instead, use a local flag that can't be corrupted by client. Change-Id: I783dafe828f93c1c3d2d0e5a08105ea536436efb
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/PlaybackTracks.h3
-rw-r--r--services/audioflinger/Threads.cpp9
-rw-r--r--services/audioflinger/Tracks.cpp11
3 files changed, 16 insertions, 7 deletions
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 37e39a0..aaa5333 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -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 {
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index a285e6c..d2b2931 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -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();
}
}
}
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index e8ca5ee..9b611d2 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -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>