opensl es:音频回调模式

时间:2014-02-28 07:25:12

标签: android c audio signal-processing opensl

我正在开发一些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'是扬声器回调。

2 个答案:

答案 0 :(得分:2)

你可以查看audio-echo样本,在README.md中,回调的不规则性也是那里提到的一个因素。将您的音频放入平台快速的音频路径将改善回调的不规则性,它是平台依赖的,可能值得一试。

答案 1 :(得分:0)

我刚刚开始使用OpenSL ES,所以这可能会变成一个愚蠢/不正确的答案,但是......不要使用扬声器回调。然后你的环形缓冲区也消失了。只需将播放缓冲区直接排入麦克风回调中即可。

这至少可以解决由不规则回调引起的一些问题。我认为你仍然需要某种同步逻辑来控制麦克风和扬声器之间的延迟。不规则的回调听起来像性能问题的迹象,尝试提高线程优先级。当然,由于Android / Linux不是实时系统,你的应用程序仍然偶尔需要处理回调中的间隙或突发(如果太多则抛弃数据,如果太少则抛弃)。读取缓冲区队列状态以查看其缓冲区的填充程度。