aaudio: use xruns detected in the service
The service knows when an actual xrun occurs so we pass
that value to the client.
Bug: 38512417
Test: write_sine_callback -pl -n1 -s20 -c2 -u
Change-Id: I9e5ff1edd2e9378957309280162d7cda855f5adb
diff --git a/services/oboeservice/AAudioServiceEndpointPlay.cpp b/services/oboeservice/AAudioServiceEndpointPlay.cpp
index c2feb6b..2601f3f 100644
--- a/services/oboeservice/AAudioServiceEndpointPlay.cpp
+++ b/services/oboeservice/AAudioServiceEndpointPlay.cpp
@@ -34,6 +34,7 @@
#include "AAudioServiceStreamShared.h"
#include "AAudioServiceEndpointPlay.h"
#include "AAudioServiceEndpointShared.h"
+#include "AAudioServiceStreamBase.h"
using namespace android; // TODO just import names needed
using namespace aaudio; // TODO just import names needed
@@ -108,9 +109,19 @@
int64_t positionOffset = mmapFramesWritten - clientFramesRead;
streamShared->setTimestampPositionOffset(positionOffset);
- bool underflowed = mMixer.mix(index, fifo, allowUnderflow);
- if (underflowed) {
- streamShared->incrementXRunCount();
+ int32_t framesMixed = mMixer.mix(index, fifo, allowUnderflow);
+
+ if (streamShared->isFlowing()) {
+ // Consider it an underflow if we got less than a burst
+ // after the data started flowing.
+ bool underflowed = allowUnderflow
+ && framesMixed < mMixer.getFramesPerBurst();
+ if (underflowed) {
+ streamShared->incrementXRunCount();
+ }
+ } else if (framesMixed > 0) {
+ // Mark beginning of data flow after a start.
+ streamShared->setFlowing(true);
}
clientFramesRead = fifo->getReadCounter();
}