我正在努力为Android平台添加一项功能,以便以尽可能低的延迟从扬声器播放声音。我在tinyplay.c
外部项目中找到tinyalsa
,我将其用作模型。我想打开pcm设备播放声音并在可能的情况下在10 ms内关闭它。
现在,当我拨打pcm_params_get
或pcm_open
时,它有时只需要几毫秒,但有时需要4秒钟!我相信如果最近播放了一个Android声音需要更长的时间。如果我提前打开然后使用pcm_write
音频播放速度非常快,只需几毫秒。我怎样才能保证pcm_open
更快的时间,以便我能更早地开始游戏?有没有办法迫使它以某种方式更快地打开?我不介意我必须提前打开几百毫米,但是4秒太长了。
我意识到虽然我打开了这个,但我却垄断了音频驱动程序,这完全没问题。我只是不想永远垄断它。
更新
我已将AudioFlinger修改为非待机状态,并且消除了pcm_open
慢度。现在我看到在呼叫pcm_write
时声音从扬声器发出之前的延迟:
01-23 06:01:29.728: PCM write 16384
01-23 06:01:29.742: PCM write 16384
01-23 06:01:29.832: PCM write 16384
01-23 06:01:29.925: PCM write 16384
01-23 06:01:30.017: PCM write 6280
请注意,第一个pcm_write
只需要14毫秒,但其他需要约90毫秒。根据我的测量结果,似乎第一个pcm_write
正在返回,而扬声器实际上没有发出声音。那是为什么?
答案 0 :(得分:0)
解决方案有两个方面:
kDefaultStandbyTimeInNsecs
修改为较低的值。平台源还提到了属性ro.audio.flinger_standbytime_ms
。