android auto ack响应不完整,会导致音频焦点请求响应慢,影响用户体验,PCTS测试音频焦点测试部分基本都过不了,这个是很重要的一部分。当时遇到这个问题,无从下手,又是自动测试,没有什么log,后面花了不少时间才定位到问题。Ack响应的在AudioPlay.java这个文件。接受到数据就会ack响应。接受端跟响应端没有同步上就不会响应全部的Ack。在ackAFrame方法中framesToAck.getAndDecrement()获取后减一这个会导致不同步,需要让它值大于0的时候才减。
private void ackAFrame() {
Pair<Integer, AtomicInteger> pair = getSessionPairForFirstSession();
if (pair == null) {
return;
}
AtomicInteger framesToAck = pair.second;
int ackOld = 0;
if (framesToAck.get() > 0) {
ackOld = framesToAck.getAndDecrement();
}
if (ackOld > 0) {
mAudioSink.ackFrames(pair.first, 1);
} else {
Log.w(TAG, "try to ack frame while ack <= 0");
}
}