Java 音轨写块与写块与非写块

Java 音轨写块与写块与非写块,java,android,audio,signal-processing,audiotrack,Java,Android,Audio,Signal Processing,Audiotrack,我正试图弄清楚Android AudioTrack是如何工作的。我感到困惑的一点是写入模式 指示您可以通过写入模式 根据描述,在播放所有数据之前,是否写入_阻塞块?例如,如果我有一个大小为2048个样本的44100单声道音频缓冲区,调用write with write_BLOCKING将阻塞2048*(1000.0/44100)毫秒?这是否意味着一旦写入完成,您就立即处于缓冲区不足的情况下?正如@Michael所提到的,它会一直阻塞,直到数据排队。这与WRITE_BLOCKING的说明中的含义相

我正试图弄清楚Android AudioTrack是如何工作的。我感到困惑的一点是写入模式

指示您可以通过写入模式


根据描述,在播放所有数据之前,是否写入_阻塞块?例如,如果我有一个大小为2048个样本的44100单声道音频缓冲区,调用write with write_BLOCKING将阻塞2048*(1000.0/44100)毫秒?这是否意味着一旦写入完成,您就立即处于缓冲区不足的情况下?

正如@Michael所提到的,它会一直阻塞,直到数据排队。这与
WRITE_BLOCKING
的说明中的含义相同;它会一直阻塞,直到数据写入内部缓冲区(在构造期间为其指定大小的缓冲区)

write(…,2048,write_BLOCKING)
将阻塞大约2048*(1000.0/44100)秒,如果缓冲区已满(数据尚未播放)。如果
write()。在没有任何进一步的
write()s
的情况下,
AudioTrack
将继续向混音器提供音频输出,直到内部缓冲区耗尽


此设计(内部缓冲区)旨在帮助您避免缓冲区不足。您的缓冲区越大,不使用
write()

AudioTrack.write的文档说明“如果写入模式为
write\u BLOCKING
,写入通常会阻塞,直到所有数据都排队等待播放”。这并不意味着该数据的实际回放已经开始。它可能位于缓冲区中,等待混频器处理。在WRITE_阻塞描述中,使用单词“WRITE”代替“enqueued”。这些多个术语让我有点困惑,到底在幕后发生了什么。好吧,Android是开源的,如果你想进一步调查的话。例如,你可以用谷歌搜索“android googlesource AudioTrack.java”和“android googlesource AudioTrack.cpp.ya”,这是一个终极选择。因此,如果我总是使用getPlaybackHeadPosition正确地计算缓冲区中的可用空间,并且只写大小合适的缓冲区,那么写块就永远不会真正阻塞?如果只有5帧的空间,而我只写5帧,它就不会阻塞。