summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2012-11-06 16:15:41 -0800
committerGlenn Kasten <gkasten@google.com>2012-11-07 08:32:40 -0800
commitba85098eb31bd2637db49816f0591361211024f2 (patch)
treeac7f6e3c4d620dbbc87991dbb41944c53245c72a /services
parent891b11da870ad3f860c1d2610ef4d8836ed6c590 (diff)
downloadframeworks_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.cpp25
-rw-r--r--services/audioflinger/AudioFlinger.h6
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