設備從 Android M 升級 N 過程中,騰訊視頻播放一段時間後出現「噠噠」彈跳噪音(pop-click),疑似音頻 UnderRun。
開啟 Verbose Log 復現,關鍵日誌:
V AudioFlinger: track(0xea5dda80) underrun, framesReady(1024) < framesDesired(1026)
V AudioFlinger: mixer(0xeb440000) throttle begin: ret(4096) deltaMs(0) requires sleep 10 ms
D AudioFlinger: mixer(0xeb440000) throttle end: throttle time(20)
證實:播放需 1026 幀,APP 僅準備 1024 幀,系統已觸發 throttle 機制(usleep 阻塞 PlaybackThread 讓 APP 補數據),但延遲仍不足。
核心邏輯位於 frameworks/av/services/audioflinger/Threads.cpp 的 AudioFlinger::PlaybackThread::threadLoop():
delta = now - mLastWriteTime 超過 maxPeriod 判定延遲寫入。kWarningThrottleNs (5ms),標記 Underrun 並記錄警告。mThreadThrottle 時,計算 throttleMs = mHalfBufferMs - deltaMs,呼叫 usleep(throttleMs * 1000) 阻塞線程。經測試,原有 throttle 時間對騰訊視頻仍不足。在 usleep((throttleMs + 3) * 1000) 中額外增加 3ms(註釋標註 20161216 修復該問題),重編系統鏡像燒錄驗證,噪音消失,問題解決。