MME音频输出缓冲区大小

时间:2013-05-05 14:30:56

标签: windows audio

我目前正在使用旧的MME API(waveOutXxx函数)输出FP32样本。我遇到的问题是,如果我提供的缓冲区长度不能均匀地划分采样率,则音频流中会出现某些可听见的咔嗒声;当录制时,看起来有些样本丢失了(我正在为测试生成正弦波)。目前,我使用每个缓冲区2205个样本的“魔术”值,44100采样率。

问题是,有没有人知道这些辍学的原因,是否有一些神奇的公式提供了一种计算“适当”缓冲区大小的方法?

2 个答案:

答案 0 :(得分:2)

数据缓冲区的安全对齐是WAVEFORMATEX结构的nBlockAlign的值。

  

软件必须在a处理多个nBlockAlign字节数据   时间。 写入设备和从设备读取的数据必须始终从   阻止开始。例如,开始播放是非法的   PCM数据位于样本中间(即,在非块对齐的情况下)   边界)。

对于PCM格式,这是所有通道中单个样本的字节数。非PCM格式具有它们自己的对齐,通常等于格式特定块的长度,例如, 20毫秒。

waveOutXxx是音频的主要API时,及时携带未对齐的字节是API的不合理负担和不必要的性能开销。现在这个API是在其他音频API之上的兼容层,我认为未对齐的字节只是被剥离以仍然播放剩余的内容,否则由于这个小故障可能会被完全拒绝,这可能只是一个较小且非致命的来电者不准确。

答案 1 :(得分:0)

如果用正弦样本​​填充音频缓冲区并播放它,很容易点击,除非缓冲区长度不是频率的倍数,正如你所说的......听到的咔嗒声实际上是不连续的wave ...一个先进的技术是用dinamically填充缓冲区,也就是说,你应该在缓冲区指针前进时设置一个回调通知,并在适当的偏移处用适当的数据填充缓冲区。我会使用更大的缓冲区,因为2205太短而无法获得异步通知,计算数据和写入缓冲区,所有这些都在播放时,但它将取决于CPU功率