summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-03-30 14:36:54 -0700
committerMarco Nelissen <marcone@google.com>2012-03-30 21:21:36 -0700
commita1472d9883e35edd280201c8be3191695007dfd4 (patch)
tree22d33eed0e95560b5fe989ace6a2e0f53aff3790 /services
parent40a1da57d21bbc883630e7a854a279685fe1fa61 (diff)
downloadframeworks_av-a1472d9883e35edd280201c8be3191695007dfd4.zip
frameworks_av-a1472d9883e35edd280201c8be3191695007dfd4.tar.gz
frameworks_av-a1472d9883e35edd280201c8be3191695007dfd4.tar.bz2
Make AudioTrack/AudioRecord handle more than 2^32 frames
b/6160363 Change-Id: I471815012c6a113ec2c4dd7676e8fa288a70bc76
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/AudioFlinger.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 8662cb5..83af5f3 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -3409,6 +3409,11 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
// clear all buffers
mCblk->frameCount = frameCount;
mCblk->sampleRate = sampleRate;
+// uncomment the following lines to quickly test 32-bit wraparound
+// mCblk->user = 0xffff0000;
+// mCblk->server = 0xffff0000;
+// mCblk->userBase = 0xffff0000;
+// mCblk->serverBase = 0xffff0000;
mChannelCount = channelCount;
mChannelMask = channelMask;
if (sharedBuffer == 0) {
@@ -3434,6 +3439,11 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
// clear all buffers
mCblk->frameCount = frameCount;
mCblk->sampleRate = sampleRate;
+// uncomment the following lines to quickly test 32-bit wraparound
+// mCblk->user = 0xffff0000;
+// mCblk->server = 0xffff0000;
+// mCblk->userBase = 0xffff0000;
+// mCblk->serverBase = 0xffff0000;
mChannelCount = channelCount;
mChannelMask = channelMask;
mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
@@ -3513,7 +3523,7 @@ void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t f
if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||
((unsigned long)bufferStart & (unsigned long)(frameSize - 1))) {
ALOGE("TrackBase::getBuffer buffer out of range:\n start: %p, end %p , mBuffer %p mBufferEnd %p\n \
- server %d, serverBase %d, user %d, userBase %d",
+ server %u, serverBase %u, user %u, userBase %u",
bufferStart, bufferEnd, mBuffer, mBufferEnd,
cblk->server, cblk->serverBase, cblk->user, cblk->userBase);
return NULL;
@@ -3656,7 +3666,7 @@ status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(
if (framesReq > framesReady) {
framesReq = framesReady;
}
- if (s + framesReq > bufferEnd) {
+ if (framesReq > bufferEnd - s) {
framesReq = bufferEnd - s;
}
@@ -4323,7 +4333,7 @@ status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvi
if (framesReq > framesAvail) {
framesReq = framesAvail;
}
- if (s + framesReq > bufferEnd) {
+ if (framesReq > bufferEnd - s) {
framesReq = bufferEnd - s;
}
@@ -4596,7 +4606,7 @@ status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer(AudioBufferProv
uint32_t u = cblk->user;
uint32_t bufferEnd = cblk->userBase + cblk->frameCount;
- if (u + framesReq > bufferEnd) {
+ if (framesReq > bufferEnd - u) {
framesReq = bufferEnd - u;
}