WASAPI 共享模式:音频引擎期望的振幅是多少?

WASAPI shared mode: What amplitude does the audio engine expect?

我之前把这个问题搞砸了。我听起来好像是在询问我的特定实现,但我的问题实际上是关于一般主题的。我非常有信心,我的实施没问题。所以我重写了这个问题:

WASAPI 提供有关音频引擎在共享模式下接受的音频格式的信息。我知道我提供给缓冲区的样本的预期位深度。 我不知道的是样本中信号幅度的预期表示。例如,如果音频引擎需要 32 位样本,这是否意味着我应该表示一个正弦波幅度为:

max = std::numeric_limits<type>::max()C++ 中的 min = ...::min()

到目前为止,我一直在通过试错法用不同的值对此进行试验。似乎只有当我的样本包含数字 max/2-min/2(作为 long)交替(与其他数字一起)时,它才会发出声音。即使是接近这些的数字(+- 几个整数)也会产生相同的结果。当样本中不存在这两个数字(或接近它们的数字)时,无论我做什么结果都是沉默。

这可能无关紧要,但我注意到,这些数字的(max/2min/2)位表示(如 longs)与 IEEE float 相同2.0-2.0 的位表示。对我来说仍然没有意义,为什么它会这样工作。

典型的表示是float -1到1缩放到定点表示。对于 32 位签名,您理想情况下希望 1 映射到 0x7fffffff,-1 映射到 0x8000000。但是,您需要记住,在 0 附近存在不对称性,因此负值比正值多一个。换句话说,你不应该使用 0x80000000 否则你将面临正面溢出的风险。

int xfixed = (int)(xfloat * 0x7fffffff);

更明确地说:

int xfixed = (int)(xfloat * ((1<<(32-1)) - 1));

在深入研究 WAVEFORMATEXTENSIBLE 结构后我发现,我需要的信息可能存储在 SubFormat 属性 中。就我而言,它是 KSDATAFORMAT_SUBTYPE_IEEE_FLOAT。所以音频引擎期望 [-1, +1] 范围内的 32 位 floats。出于某种原因,我之前对浮点值的测试没有成功,所以我继续尝试使用整数。现在 [-1, +1] 范围内的简单正弦函数提供了正确的结果。声音有一些小毛病,但这可能与等待缓冲区时的一些时间问题有关。