diff options
| author | John Grossman <johngro@google.com> | 2012-04-19 12:08:17 -0700 |
|---|---|---|
| committer | John Grossman <johngro@google.com> | 2012-04-20 10:09:25 -0700 |
| commit | 8d314b709fdd81bb64bdaa8d72a0b19c355cefb9 (patch) | |
| tree | e76be79a37ce2a3985bc0361c28d794136624b3e | |
| parent | 21e8c50bd13ebe44f3088e26c9c6df0e163c469c (diff) | |
| download | frameworks_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.cpp | 13 |
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; |
