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

How to play sounds on android faster?

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

现在当我调用 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. 这需要平台级别的权限:将平台中的kDefaultStandbyTimeInNsecs修改为较低的值。平台来源还提到了 属性 ro.audio.flinger_standbytime_ms.
  2. 使用与平台相同的采样率:48Khz