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



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

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

  • long范围[min, max]
  • unsigned long范围[0, max]
  • float范围[min, max]
  • 甚至是float范围内[-1, 1]的东西?

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

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

这可能无关紧要,但我注意到,这些数字的(max/2min/2(位表示(如longs(与2.0-2.0的位表示相同IEEE 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]范围内的简单正弦函数可提供正确的结果。声音中有一些故障,但这可能与等待缓冲区时的某些计时问题有关。

最新更新