繁体   English   中英

opensl es:音频回调模式

[英]opensl es : audio callback patterns

我正在某些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”是扬声器回调。

您可以在README.md中查看音频回声示例,其中也提到了回调的不规则性。 将您的音频放入平台中,快速的音频路径将改善回调异常,这取决于平台,可能值得一试。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM