diff options
author | Glenn Kasten <gkasten@google.com> | 2013-08-05 19:47:51 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-08-05 19:47:51 +0000 |
commit | f86b18b1ce3cf20a39aea1fcaf90ec66f9d6d63e (patch) | |
tree | ffcd083e96e9edaa7e8a597165584bfd5d3eb43f | |
parent | 13c34e09fdfe0bcd2053368df4dd26028004d18f (diff) | |
parent | 28f1351369682801e1bb40a835bdae3c97b73c1c (diff) | |
download | frameworks_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.h | 1 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 20 |
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); |