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

时间:2012-06-27 03:18:21

标签: android android-audiomanager dtmf audioflinger

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

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);

在廉价的运行Android 2.3.3的LG LS670上效果非常好,但在我拥有的所有其他手机上都没有声音,从Android 2.2.1到Android 2.3.4。

所以我知道操作系统版本在这里没有发挥作用(我在文档中验证了它自API 1以来一直受到支持)。

此外,Ringer音量和媒体音量都设置为最大值,toneGenerator初始化为:

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

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

由于这种不一致的行为(在不同的手机上)感到困惑,我在发生这种情况时检查了系统日志,我能找到的唯一可疑差异是失败发出声音的电话{{ 1}}在他们的日志中有这一行:

TONE_PROP_ACK

AudioFlinger的目的是什么?它与静音AudioFlinger setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121 的关系是什么?

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

2 个答案:

答案 0 :(得分:1)

一种解决方法是在Audacity中产生音调,并通过SoundPool或您选择的api播放。

根据Android文档,ToneGenerator.TONE_PROP_ACK是:

1200Hz,100ms ON,100ms OFF 2突发

如果你选择SoundPool,我建议保存ogg文件格式并循环调整直到完成。同时使用非常小的剪辑提供无缝音频,而不是使用大量资源。

答案 1 :(得分:0)

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