WASAPI共享模式:音频引擎期望什么幅度?

时间:2018-08-25 19:25:16

标签: c++ audio wasapi

我以前弄错了这个问题。我听起来好像是在问我的特定实现,但实际上我的问题是关于一般主题的。我非常有信心,我的实现还可以。所以我要重写这个问题:

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

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

({{1}中的max = std::numeric_limits<type>::max()min = ...::min()

到目前为止,我已经通过试错法尝试了不同的值。看来,只有当我的样本包含数字C++max/2(作为-min/2)(与其他数字)交替出现时,它才会发出声音。偶数接近这些数值(+-几个整数)会产生相同的结果。当样本中不存在这两个数字(或接近它们的数字)时,无论我做什么,结果都是寂静。

可能无关紧要,但我注意到,这些数字的(longmax/2)位表示(如min/2 s)与long位表示相同IEEE float2.0中的第一个。对于我来说仍然没有意义,为什么它会那样工作。

2 个答案:

答案 0 :(得分:1)

典型表示形式是浮点数-1到1,缩放为定点表示形式。对于32位带符号,理想情况下,您希望将1映射到0x7fffffff,将-1映射到0x8000000。但是,您需要记住,在0附近存在不对称性,因此负值比正值多一个。换句话说,您不应该使用0x80000000,否则您将有可能在正向溢出。

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

更明确地:

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

答案 1 :(得分:0)

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