Fix failure at AudioTrack_ListenerTest#testAudioTrackCallback

After cold start, running the test will cause failure. The reason is
that with cold start, the buffer is being processed faster than the
position callback.
Calling the callback earlier at the very start will fix this issue.

Bug: 63056426
Test: adb shell am instrument -e class 'android.media.cts.AudioTrack_ListenerTest#testAudioTrackCallback'
      -w 'android.media.cts/android.support.test.runner.AndroidJUnitRunner'

Change-Id: I7416cecb2837fac4a966e832412948c357e7b8dc
gugelfrei
jiabin 7 years ago
parent da071c34f3
commit c7bb8324c7

@ -2086,7 +2086,14 @@ nsecs_t AudioTrack::processAudioBuffer()
// Convert frame units to time units
nsecs_t ns = NS_WHENEVER;
if (minFrames != (uint32_t) ~0) {
ns = framesToNanoseconds(minFrames, sampleRate, speed) + kWaitPeriodNs;
// AudioFlinger consumption of client data may be irregular when coming out of device
// standby since the kernel buffers require filling. This is throttled to no more than 2x
// the expected rate in the MixerThread. Hence, we reduce the estimated time to wait by one
// half (but no more than half a second) to improve callback accuracy during these temporary
// data surges.
const nsecs_t estimatedNs = framesToNanoseconds(minFrames, sampleRate, speed);
constexpr nsecs_t maxThrottleCompensationNs = 500000000LL;
ns = estimatedNs - min(estimatedNs / 2, maxThrottleCompensationNs) + kWaitPeriodNs;
ns -= (timeAfterCallbacks - timeBeforeCallbacks); // account for callback time
// TODO: Should we warn if the callback time is too long?
if (ns < 0) ns = 0;

Loading…
Cancel
Save