summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2013-08-05 19:47:51 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-08-05 19:47:51 +0000
commitf86b18b1ce3cf20a39aea1fcaf90ec66f9d6d63e (patch)
treeffcd083e96e9edaa7e8a597165584bfd5d3eb43f
parent13c34e09fdfe0bcd2053368df4dd26028004d18f (diff)
parent28f1351369682801e1bb40a835bdae3c97b73c1c (diff)
downloadframeworks_av-f86b18b1ce3cf20a39aea1fcaf90ec66f9d6d63e.zip
frameworks_av-f86b18b1ce3cf20a39aea1fcaf90ec66f9d6d63e.tar.gz
frameworks_av-f86b18b1ce3cf20a39aea1fcaf90ec66f9d6d63e.tar.bz2
Merge "AudioRecord callback thread waits for priority boost"
-rw-r--r--include/media/AudioRecord.h1
-rw-r--r--media/libmedia/AudioRecord.cpp20
2 files changed, 21 insertions, 0 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h
index aa56deb..d245414 100644
--- a/include/media/AudioRecord.h
+++ b/include/media/AudioRecord.h
@@ -474,6 +474,7 @@ private:
int mPreviousPriority; // before start()
SchedPolicy mPreviousSchedulingGroup;
+ bool mAwaitBoost; // thread should wait for priority boost before running
// The proxy should only be referenced while a lock is held because the proxy isn't
// multi-thread safe.
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index 2cffaeb..d88c1ed 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -662,6 +662,26 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize)
nsecs_t AudioRecord::processAudioBuffer(const sp<AudioRecordThread>& 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);