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

时间:2018-09-16 05:19:24

标签: android asynchronous audiotrack

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

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

但是,waitForWrite上没有AudioTrack或类似的方法可供我使用;如果我只是进行非阻塞写入,则第二帧将替换中间的第一帧,即假设20ms帧的合成需要5毫秒,那么第一帧将播放5ms,然后被第二帧替换5ms以后等等,这显然不是我想要的。

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

1 个答案:

答案 0 :(得分:1)

您误解了流式传输模式。写操作不会花费播放时间。写将其复制到另一个缓冲区。在阻塞模式下,它将等待直到整个缓冲区被复制,而不是直到其被播放。在非阻止模式下,它将立即复制尽可能多的副本并立即返回。无需等待它在任一模式下播放,也没有理由。