什么是 AudioFlinger,为什么它会失败 TONE_PROP_ACK?

Posted

技术标签:

【中文标题】什么是 AudioFlinger,为什么它会失败 TONE_PROP_ACK?【英文标题】:What is AudioFlinger and why does it fail TONE_PROP_ACK? 【发布时间】:2012-06-28 10:55:15 【问题描述】:

在我的申请中,我发出以下声明:

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);

在运行 android 2.3.3 的廉价 LG LS670 上运行良好,但在我拥有的所有其他手机(从 Android 2.2.1 到 Android 2.3.4)上完全没有声音。

所以我知道操作系统版本在这里不起作用(我还在文档中验证了它从 API 1 开始就受支持)。

此外,铃声音量和媒体音量都设置为最大,并且toneGenerator 初始化为:

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100);

我确认Settings.System.DTMF_TONE_WHEN_DIALING 设置为 1。

对这种不一致的行为(跨不同手机)感到困惑,我检查了发生这种情况时的系统日志,我发现的唯一可疑差异是那些未能发出声音的手机@987654326 @在他们的日志中有这一行:

AudioFlinger    setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121

AudioFlinger 的用途是什么?它与静音TONE_PROP_ACK 有什么关系?

任何idea 如何修复我的代码以使 TONE_PROP_ACK 始终响起,无论手机型号如何?

【问题讨论】:

Audio flinger 是一个系统组件,用于管理来自 android userpsace 的音频,然后将其交给内核驱动程序。您是否能够从任何音调功能中获得声音?您是否看到 API 文档中关于音频路由可变的部分?无论如何,您真正想要完成什么 - 您知道这些音调不会通过呼叫上行链路,对吧? @ChrisStratton 是的,我知道这些音调不会通过呼叫上行链路。这实际上是我的首选行为,因为我只是想给出一个声音提示(不一定是 DTMF)。当我使用电话的拨号活动时,我能够从提示音功能中获得声音。您能否详细说明“音频路由可变”?我在 API 文档中的哪里可以找到该部分?直接 URL 将是超级的。谢谢+1。 routing=0 for io 25 意味着 AudioFlinger 正在告诉一个特定的音频流(在这种情况下我猜是 AudiostreamOut)它应该路由到“无处”。音频 HAL 将如何处理是特定于实现的 - 所以它可能是例如保持该流的路由不变。 【参考方案1】:

一种解决方法是在 Audacity 之类的东西中生成音调,然后通过 SoundPool 或您选择的 api 播放。

根据 Android 文档 ToneGenerator.TONE_PROP_ACK 是:

1200Hz,100ms 开启,100ms 关闭 2 个脉冲

如果您选择 SoundPool,我建议以 ogg 文件格式保存并循环播放声音直到完成。这同时以非常小的剪辑提供无缝音频,并且不使用大量资源。

【讨论】:

【参考方案2】:

解析/解码由Stage fright处理,由 媒体播放器服务。解码后的数据写入音轨 通过音频接收器,然后轨道由 Audio Flinger 的混音器线程并写入输出流 (音频硬件)。输出流对象填满自己的缓冲区 然后将数据写入 PCM 输出设备文件(可能或 可能不是 ALSA 驱动程序)。

【讨论】:

以上是关于什么是 AudioFlinger,为什么它会失败 TONE_PROP_ACK?的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX:AudioFlinger 无法创建轨道,状态 -12

AudioFlinger启动过程分析(android_audio)

什么是“嵌套量词”,为什么它会导致我的正则表达式失败?

Android音频系统之AudioFlinger

Android SoundPool:AudioFlinger 错误

Android 9 Audio系统笔记:AudioPolicy&AudioFlinger初始化