Remove CBLK_DIRECTION from control block flags
This is part of a series to clean up the control block.
Change-Id: I0265fece3247356b585d4d48fbda6f37aea8a851
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 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 @@
}
// FIXME Same as above
- framesReady = cblk->framesReady();
+ framesReady = cblk->framesReadyOut();
if (CC_LIKELY(framesReady)) {
uint32_t s = cblk->server;
@@ -4580,7 +4580,7 @@
// 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 @@
return NO_ERROR;
}
+bool AudioFlinger::PlaybackThread::Track::isOut() const
+{
+ return true;
+}
+
// timed audio tracks
sp<AudioFlinger::PlaybackThread::TimedTrack>
@@ -5436,7 +5441,8 @@
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 @@
mCblk->frameCount);
}
+bool AudioFlinger::RecordThread::RecordTrack::isOut() const
+{
+ return false;
+}
// ----------------------------------------------------------------------------
@@ -5528,7 +5538,6 @@
{
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 @@
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 @@
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 @@
}
// 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 @@
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 @@
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 @@
static void appendDumpHeader(String8& result);
void dump(char* buffer, size_t size);
+ virtual bool isOut() const;
+
private:
friend class AudioFlinger; // for mState