diff options
author | Glenn Kasten <gkasten@google.com> | 2012-11-06 16:15:41 -0800 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2012-11-07 08:32:40 -0800 |
commit | ba85098eb31bd2637db49816f0591361211024f2 (patch) | |
tree | ac7f6e3c4d620dbbc87991dbb41944c53245c72a /services | |
parent | 891b11da870ad3f860c1d2610ef4d8836ed6c590 (diff) | |
download | frameworks_av-ba85098eb31bd2637db49816f0591361211024f2.zip frameworks_av-ba85098eb31bd2637db49816f0591361211024f2.tar.gz frameworks_av-ba85098eb31bd2637db49816f0591361211024f2.tar.bz2 |
Remove CBLK_DIRECTION from control block flags
This is part of a series to clean up the control block.
Change-Id: I0265fece3247356b585d4d48fbda6f37aea8a851
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 25 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.h | 6 |
2 files changed, 23 insertions, 8 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 379e936..69ac3e3 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -4286,7 +4286,7 @@ bool AudioFlinger::ThreadBase::TrackBase::step() { bool result; audio_track_cblk_t* cblk = this->cblk(); - result = cblk->stepServer(mFrameCount); + result = cblk->stepServer(mFrameCount, isOut()); if (!result) { ALOGV("stepServer failed acquiring cblk mutex"); mStepServerFailed = true; @@ -4545,7 +4545,7 @@ status_t AudioFlinger::PlaybackThread::Track::getNextBuffer( } // FIXME Same as above - framesReady = cblk->framesReady(); + framesReady = cblk->framesReadyOut(); if (CC_LIKELY(framesReady)) { uint32_t s = cblk->server; @@ -4580,7 +4580,7 @@ getNextBuffer_exit: // the tryLock() could block for up to 1 ms, and a sequence of these could delay fast mixer. // FIXME Replace AudioTrackShared control block implementation by a non-blocking FIFO queue. size_t AudioFlinger::PlaybackThread::Track::framesReady() const { - return mCblk->framesReady(); + return mCblk->framesReadyOut(); } // Don't call for fast tracks; the framesReady() could result in priority inversion @@ -4875,6 +4875,11 @@ status_t AudioFlinger::PlaybackThread::Track::setSyncEvent(const sp<SyncEvent>& return NO_ERROR; } +bool AudioFlinger::PlaybackThread::Track::isOut() const +{ + return true; +} + // timed audio tracks sp<AudioFlinger::PlaybackThread::TimedTrack> @@ -5436,7 +5441,8 @@ status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvi mStepServerFailed = false; } - framesAvail = cblk->framesAvailable_l(); + // FIXME lock is not actually held, so overrun is possible + framesAvail = cblk->framesAvailableIn_l(); if (CC_LIKELY(framesAvail)) { uint32_t s = cblk->server; @@ -5512,6 +5518,10 @@ void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size) mCblk->frameCount); } +bool AudioFlinger::RecordThread::RecordTrack::isOut() const +{ + return false; +} // ---------------------------------------------------------------------------- @@ -5528,7 +5538,6 @@ AudioFlinger::PlaybackThread::OutputTrack::OutputTrack( { if (mCblk != NULL) { - mCblk->flags |= CBLK_DIRECTION; mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t); mOutBuffer.frameCount = 0; playbackThread->mTracks.add(this); @@ -5631,7 +5640,7 @@ bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t fr uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount : pInBuffer->frameCount; memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * channelCount * sizeof(int16_t)); - mCblk->stepUser(outFrames); + mCblk->stepUserOut(outFrames); pInBuffer->frameCount -= outFrames; pInBuffer->i16 += outFrames * channelCount; mOutBuffer.frameCount -= outFrames; @@ -5702,7 +5711,7 @@ status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer( ALOGVV("OutputTrack::obtainBuffer user %d, server %d", cblk->user, cblk->server); buffer->frameCount = 0; - uint32_t framesAvail = cblk->framesAvailable(); + uint32_t framesAvail = cblk->framesAvailableOut(); if (framesAvail == 0) { @@ -5720,7 +5729,7 @@ status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer( } // read the server count again start_loop_here: - framesAvail = cblk->framesAvailable_l(); + framesAvail = cblk->framesAvailableOut_l(); } } diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index de2fbfa..1417105 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -456,6 +456,9 @@ private: bool step(); void reset(); + virtual bool isOut() const = 0; // true for Track and TimedTrack, false for RecordTrack, + // this could be a track type if needed later + const wp<ThreadBase> mThread; /*const*/ sp<Client> mClient; // see explanation at ~TrackBase() why not const sp<IMemory> mCblkMemory; @@ -859,6 +862,7 @@ private: void triggerEvents(AudioSystem::sync_event_t type); virtual bool isTimedTrack() const { return false; } bool isFastTrack() const { return (mFlags & IAudioFlinger::TRACK_FAST) != 0; } + virtual bool isOut() const; protected: @@ -1468,6 +1472,8 @@ public: static void appendDumpHeader(String8& result); void dump(char* buffer, size_t size); + virtual bool isOut() const; + private: friend class AudioFlinger; // for mState |