如何更快地在Android上播放声音?

时间:2015-01-29 00:34:46

标签: android linux performance alsa

我正在努力为Android平台添加一项功能,以便以尽可能低的延迟从扬声器播放声音。我在tinyplay.c外部项目中找到tinyalsa,我将其用作模型。我想打开pcm设备播放声音并在可能的情况下在10 ms内关闭它。

现在,当我拨打pcm_params_getpcm_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正在返回,而扬声器实际上没有发出声音。那是为什么?

1 个答案:

答案 0 :(得分:0)

解决方案有两个方面:

  1. 这需要平台级权限:将平台中的kDefaultStandbyTimeInNsecs修改为较低的值。平台源还提到了属性ro.audio.flinger_standbytime_ms
  2. 使用与平台相同的采样率:48Khz