如何等待异步 AudioTrack.write 完成?

How to wait for an asynchronous AudioTrack.write to finish?

我想播放以 1/50 秒为增量合成的音频。使用 AudioTrack 的异步流接口,我的计划基本上是执行以下操作:

while (!done)
{
  frame = synthesize();
  audio.waitForWrite(); // XXX
  audio.write(frame, 0, frameSize, WRITE_NON_BLOCKING);
}
audio.waitForWrite(); // XXX

但是,waitForWriteAudioTrack 上没有我可以在这里使用的类似方法;如果我只是进行非阻塞写入,第二帧将替换中间的第一帧,也就是说,合成一个 20 毫秒的帧需要 5 毫秒,那么第一帧将播放 5 毫秒,然后被第二帧替换5ms后一个等等,这显然不是我想要的。

另一方面,如果我使用阻塞写入,那么当上一帧已经在播放时我无法合成下一帧。

你误解了流媒体模式。写入不会花费播放它所需的时间。 Write 将其复制到另一个缓冲区。在阻塞模式下,它将等到整个缓冲区被复制,但不会等到播放。在非阻塞模式下,它会立即复制尽可能多的内容并立即 return 。在任何一种模式下都无需等待播放,也没有理由。