0

I am currently playing around with outputting FP32 samples via the old MME API (waveOutXxx functions). The problem I've bumped into is that if I provide a buffer length that does not evenly divide the sample rate, certain audible clicks appear in the audio stream; when recorded, it looks like some of the samples are lost (I'm generating a sine wave for the test). Currently I am using the "magic" value of 2205 samples per buffer for 44100 sample rate.

The question is, does anybody know the reason for these dropouts and if there is some magic formula that provides a way to compute the "proper" buffer size?

4

2 回答 2

2

数据缓冲区的安全对齐是结构的nBlockAlignWAVEFORMATEX

软件必须一次处理多个 nBlockAlign 字节的数据。写入和读取设备的数据必须始终从块的开头开始。例如,在样本中间(即在非块对齐边界上)开始播放 PCM 数据是非法的。

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

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

于 2013-05-05T16:38:19.203 回答
0

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

于 2013-05-05T15:16:15.917 回答