summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorChris Elliott <chriselliott@google.com>2014-10-15 20:46:15 +0000
committerChris Elliott <chriselliott@google.com>2014-10-15 20:49:02 +0000
commit620208dc0bbd7a0792702df3ab08800fdad60cec (patch)
treec079d953bc10a492f8145a3984a929bb9b936254 /media
parent2feb18ddfdbd20941ebcc3314780a582da5608e4 (diff)
downloadframeworks_av-620208dc0bbd7a0792702df3ab08800fdad60cec.zip
frameworks_av-620208dc0bbd7a0792702df3ab08800fdad60cec.tar.gz
frameworks_av-620208dc0bbd7a0792702df3ab08800fdad60cec.tar.bz2
audio: prevent larger than required sleeps - DO NOT MERGE
This will be cherry picked into P build after O completes for other devices. This reverts the revert from commit 2feb18ddfdbd20941ebcc3314780a582da5608e4. b/17962037 From: Haynes Mathew George <hgeorge@codeaurora.org> Date: Wed, 26 Mar 2014 16:18:42 -0700 Subject: [PATCH] AudioTrack: prevent larger than required sleeps AudioTrackThread can end up waiting for larger than necessary time for free space to be available in the cblk. Fix this by waiting on the cblk futex instead of the (internal) condition variable. Change-Id: Iba5b266f9b4082b3833f4abd52ebc6601c8e3034
Diffstat (limited to 'media')
-rw-r--r--media/libmedia/AudioTrack.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index e290627..4cc50cc 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -18,15 +18,21 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "AudioTrack"
+#define ATRACE_TAG ATRACE_TAG_AUDIO
#include <sys/resource.h>
#include <audio_utils/primitives.h>
#include <binder/IPCThreadState.h>
#include <media/AudioTrack.h>
#include <utils/Log.h>
+#include <utils/Trace.h>
#include <private/media/AudioTrackShared.h>
#include <media/IAudioFlinger.h>
+extern "C" {
+#include "../private/bionic_futex.h"
+}
+
#define WAIT_PERIOD_MS 10
#define WAIT_STREAM_END_TIMEOUT_SEC 120
@@ -1606,7 +1612,21 @@ nsecs_t AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
if (ns < 0 || myns < ns) {
ns = myns;
}
- return ns;
+ int32_t old = android_atomic_and(~CBLK_FUTEX_WAKE, &mCblk->mFutex);
+ char str[64] = {0};
+ struct timespec ts;
+
+ snprintf(str, sizeof(str), "futex_wait timeout %lld Us", ns/1000LL);
+
+ ATRACE_BEGIN(str);
+ ts.tv_sec = 0;
+ ts.tv_nsec = ns;
+ // wait for max ns allowing server to wake us up if possible
+ int ret = __futex_syscall4(&mCblk->mFutex,
+ FUTEX_WAIT,
+ old & ~CBLK_FUTEX_WAKE, &ts);
+ ATRACE_END();
+ return 0; //retry immediately as space (possibly) became available
}
}