From 28f1351369682801e1bb40a835bdae3c97b73c1c Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Wed, 31 Jul 2013 12:27:26 -0700 Subject: AudioRecord callback thread waits for priority boost Change-Id: Iae38fa4ac20a45751566169213a08a15deb0a2f6 --- media/libmedia/AudioRecord.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'media/libmedia/AudioRecord.cpp') diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 0e7e17f..7be7529 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -665,6 +665,26 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize) nsecs_t AudioRecord::processAudioBuffer(const sp& thread) { mLock.lock(); + if (mAwaitBoost) { + mAwaitBoost = false; + mLock.unlock(); + static const int32_t kMaxTries = 5; + int32_t tryCounter = kMaxTries; + uint32_t pollUs = 10000; + do { + int policy = sched_getscheduler(0); + if (policy == SCHED_FIFO || policy == SCHED_RR) { + break; + } + usleep(pollUs); + pollUs <<= 1; + } while (tryCounter-- > 0); + if (tryCounter < 0) { + ALOGE("did not receive expected priority boost on time"); + } + // Run again immediately + return 0; + } // Can only reference mCblk while locked int32_t flags = android_atomic_and(~CBLK_OVERRUN, &mCblk->mFlags); -- cgit v1.1