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>
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 @@
     if (pts == AudioBufferProvider::kInvalidPTS) {
         buffer->raw = 0;
         buffer->frameCount = 0;
+        mTimedAudioOutputOnTime = false;
         return INVALID_OPERATION;
     }
 
@@ -4203,14 +4204,14 @@
         // 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 @@
             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;