summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Grossman <johngro@google.com>2012-04-19 12:08:17 -0700
committerJohn Grossman <johngro@google.com>2012-04-20 10:09:25 -0700
commit8d314b709fdd81bb64bdaa8d72a0b19c355cefb9 (patch)
treee76be79a37ce2a3985bc0361c28d794136624b3e
parent21e8c50bd13ebe44f3088e26c9c6df0e163c469c (diff)
downloadframeworks_av-8d314b709fdd81bb64bdaa8d72a0b19c355cefb9.zip
frameworks_av-8d314b709fdd81bb64bdaa8d72a0b19c355cefb9.tar.gz
frameworks_av-8d314b709fdd81bb64bdaa8d72a0b19c355cefb9.tar.bz2
TimedAudioTrack: Fix continuity threshold handling.
Hand merge from ics-aah > TimedAudioTrack: Fix continuity threshold handling. > > Fix issues with continuity threshold handling; notably > + If the steady-state continuity threshold is exceeded, be sure to > clear the on-time flag. Failure to do this will result in the > system picking a new mix point which simply satisfies the > steady-state continuity threshold instead of the startup threshold. > Since we are putting a discontinuity in presentation anyway, we > really want to pick a perfect point, not just an OK point. > + Tighten the steady-state continuity threshold. It was currently set > to 100mSec which is enormous. 4mSec (the new setting) is much more > appropriate. On systems with a VCXO (like tungsten) this should > never be wrong by more than a sample. If TimedAudioTracks are ever > to be used on VCXO-less systems, this threshold should probably be a > a parameter configurable by applications on a track by track basis > so they can make the tradeoff between allowed error and frequency of > disruptive corrections. > + Reset the on-time flag if the mixer provides no PTS during a mix > operation. This makes for a convenient way for the HAL to reset > timed tracks when it makes changes for delay compensation across > multiple outputs. > > Change-Id: I2cb23de5a3d1f75618abc1c8ab903db883837aa8 > Signed-off-by: John Grossman <johngro@google.com> Change-Id: Ibd28c9d290494b0b19eb01caf2d9bfdef606a9b4 Signed-off-by: John Grossman <johngro@google.com>
-rw-r--r--services/audioflinger/AudioFlinger.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 99dcf45..3a6e476 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -4111,6 +4111,7 @@ status_t AudioFlinger::PlaybackThread::TimedTrack::getNextBuffer(
if (pts == AudioBufferProvider::kInvalidPTS) {
buffer->raw = 0;
buffer->frameCount = 0;
+ mTimedAudioOutputOnTime = false;
return INVALID_OPERATION;
}
@@ -4203,14 +4204,14 @@ status_t AudioFlinger::PlaybackThread::TimedTrack::getNextBuffer(
// the current output position is within this threshold, then we will
// concatenate the next input samples to the previous output
const int64_t kSampleContinuityThreshold =
- (static_cast<int64_t>(sampleRate()) << 32) / 10;
+ (static_cast<int64_t>(sampleRate()) << 32) / 250;
// if this is the first buffer of audio that we're emitting from this track
// then it should be almost exactly on time.
const int64_t kSampleStartupThreshold = 1LL << 32;
if ((mTimedAudioOutputOnTime && llabs(sampleDelta) <= kSampleContinuityThreshold) ||
- (!mTimedAudioOutputOnTime && llabs(sampleDelta) <= kSampleStartupThreshold)) {
+ (!mTimedAudioOutputOnTime && llabs(sampleDelta) <= kSampleStartupThreshold)) {
// the next input is close enough to being on time, so concatenate it
// with the last output
timedYieldSamples_l(buffer);
@@ -4218,7 +4219,13 @@ status_t AudioFlinger::PlaybackThread::TimedTrack::getNextBuffer(
ALOGVV("*** on time: head.pos=%d frameCount=%u",
head.position(), buffer->frameCount);
return NO_ERROR;
- } else if (sampleDelta > 0) {
+ }
+
+ // Looks like our output is not on time. Reset our on timed status.
+ // Next time we mix samples from our input queue, then should be within
+ // the StartupThreshold.
+ mTimedAudioOutputOnTime = false;
+ if (sampleDelta > 0) {
// the gap between the current output position and the proper start of
// the next input sample is too big, so fill it with silence
uint32_t framesUntilNextInput = (sampleDelta + 0x80000000) >> 32;