我想播放以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以后等等,这显然不是我想要的。
另一方面,如果我使用阻塞写入,那么当前一帧已经播放时,我将无法合成下一帧。
答案 0 :(得分:1)
您误解了流式传输模式。写操作不会花费播放时间。写将其复制到另一个缓冲区。在阻塞模式下,它将等待直到整个缓冲区被复制,而不是直到其被播放。在非阻止模式下,它将立即复制尽可能多的副本并立即返回。无需等待它在任一模式下播放,也没有理由。