OSDN Git Service

Prepare for track invalidation to be done by proxy
authorGlenn Kasten <gkasten@google.com>
Tue, 4 Dec 2012 20:12:34 +0000 (12:12 -0800)
committerGlenn Kasten <gkasten@google.com>
Wed, 12 Dec 2012 17:38:48 +0000 (09:38 -0800)
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

services/audioflinger/PlaybackTracks.h
services/audioflinger/Threads.cpp
services/audioflinger/Tracks.cpp

index 37e39a0..aaa5333 100644 (file)
@@ -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 {
index a285e6c..d2b2931 100644 (file)
@@ -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();
         }
     }
 }
index e8ca5ee..9b611d2 100644 (file)
@@ -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>