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

19

在我的应用程序中,我发出以下语句:

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);

这在一款廉价的LG LS670智能手机上运行得非常好,该手机运行的是Android 2.3.3版本,但在其他所有手机上都没有声音,这些手机涵盖了从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。

在不同的手机上出现这种不一致的行为时感到困惑,因此我检查了系统日志,在出现这种情况时我能够找到的唯一可疑的差异是那些无法播放TONE_PROP_ACK声音的手机在其日志中有这样一行:

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

AudioFlinger 的目的是什么?它与静音 TONE_PROP_ACK 有什么关联?

有没有任何想法如何修复我的代码,使得无论手机型号如何,TONE_PROP_ACK 总是能发出声音?


3
音频传送器(Audio flinger)是Android系统中的一个组件,它负责管理来自用户空间的音频并将其交给内核驱动程序。你能否从任何音调功能中听到声音?你是否看到API文档中关于音频路由可变的部分?无论如何,你真正想要实现什么目标——你知道这些音调不会通过呼叫上行链路吧? - Chris Stratton
@ChrisStratton 是的,我知道这些音调不会通过呼叫上行链路传输。实际上,这是我首选的行为,因为我只是想给出一个听得见的提示音(它不必是DTMF)。当我使用手机的拨号活动时,我能够从音调函数中获得声音。您能详细说明一下“音频路由是可变的”吗?在API文档中哪里可以找到该部分?直接URL将非常好。谢谢+1。 - Eternal Learner
routing=0对于io 25来说意味着AudioFlinger告诉特定的音频流(在这种情况下,我猜是一个AudioStreamOut)它应该路由到“无处”。音频HAL将如何处理这个问题取决于实现方式 - 所以它可能会保持该流的路由不变。 - Michael
2个回答

1

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

根据Android文档,ToneGenerator.TONE_PROP_ACK是:

1200Hz,100ms开,100ms关,2个爆发

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接