我正在一些 Android 平台 (>= 4.1.1) 上工作,其中 openSL ES 音频驱动程序表现出非常不规则的回调模式。
我的期望是,如果我将音频驱动程序配置为每 10 毫秒给我一次回调,我会大约每 10 毫秒得到一次回调(给或需要几毫秒)。理想情况下,回调模式看起来像这样:
t = 0ms : 扬声器回调
t = 1ms : 麦克风回调
t = 10ms : 扬声器回调
t = 11ms : 麦克风回调
t = 20ms : 扬声器回调
t = 21ms : 麦克风回调
t = 30ms : 扬声器回调
t = 31ms : 麦克风回调
麦克风回调获取接收到的麦克风数据并将其写入环形缓冲区。然后它向另一个线程发送一个“信号”以唤醒并处理麦克风数据。麦克风数据的处理会产生 10ms 的说话人数据。该扬声器数据被写入扬声器环缓冲区,扬声器回调从中读取。
如果回调模式看起来像我上面描述的扬声器和麦克风回调轮流进行的情况,那么一切正常。
但是,如果回调模式不规则,事情就会开始变得混乱。例如:一连串的麦克风回调将推动扬声器环形缓冲区的大小通过屋顶。如果我 - 无论出于何种原因 - 没有得到相同类型的扬声器回调突发,我突然在扬声器路径中有很大的延迟。
另一个问题是,如果我收到大量的扬声器回调。在这种情况下,扬声器环形缓冲区将耗尽样本,我将不得不返回静音数据包。
所以我想知道这类问题是否有某种标准解决方案?我什么都想不出来。
以下链接是回调模式的示例:
http://wikisend.com/download/143908/timestamps.txt
其中“1”是麦克风回调,“2”是扬声器回调。