WASAPI 共享模式:音频引擎期望的振幅是多少?
WASAPI shared mode: What amplitude does the audio engine expect?
我之前把这个问题搞砸了。我听起来好像是在询问我的特定实现,但我的问题实际上是关于一般主题的。我非常有信心,我的实施没问题。所以我重写了这个问题:
WASAPI 提供有关音频引擎在共享模式下接受的音频格式的信息。我知道我提供给缓冲区的样本的预期位深度。 我不知道的是样本中信号幅度的预期表示。例如,如果音频引擎需要 32 位样本,这是否意味着我应该表示一个正弦波幅度为:
long
范围 [min, max]
unsigned long
范围 [0, max]
float
在 [min, max]
范围内
- 甚至
float
范围内的 [-1, 1]
?
(max = std::numeric_limits<type>::max()
和 C++
中的 min = ...::min()
)
到目前为止,我一直在通过试错法用不同的值对此进行试验。似乎只有当我的样本包含数字 max/2
或 -min/2
(作为 long
)交替(与其他数字一起)时,它才会发出声音。即使是接近这些的数字(+- 几个整数)也会产生相同的结果。当样本中不存在这两个数字(或接近它们的数字)时,无论我做什么结果都是沉默。
这可能无关紧要,但我注意到,这些数字的(max/2
和 min/2
)位表示(如 long
s)与 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 位 float
s。出于某种原因,我之前对浮点值的测试没有成功,所以我继续尝试使用整数。现在 [-1, +1]
范围内的简单正弦函数提供了正确的结果。声音有一些小毛病,但这可能与等待缓冲区时的一些时间问题有关。
我之前把这个问题搞砸了。我听起来好像是在询问我的特定实现,但我的问题实际上是关于一般主题的。我非常有信心,我的实施没问题。所以我重写了这个问题:
WASAPI 提供有关音频引擎在共享模式下接受的音频格式的信息。我知道我提供给缓冲区的样本的预期位深度。 我不知道的是样本中信号幅度的预期表示。例如,如果音频引擎需要 32 位样本,这是否意味着我应该表示一个正弦波幅度为:
long
范围[min, max]
unsigned long
范围[0, max]
float
在[min, max]
范围内
- 甚至
float
范围内的[-1, 1]
?
(max = std::numeric_limits<type>::max()
和 C++
中的 min = ...::min()
)
到目前为止,我一直在通过试错法用不同的值对此进行试验。似乎只有当我的样本包含数字 max/2
或 -min/2
(作为 long
)交替(与其他数字一起)时,它才会发出声音。即使是接近这些的数字(+- 几个整数)也会产生相同的结果。当样本中不存在这两个数字(或接近它们的数字)时,无论我做什么结果都是沉默。
这可能无关紧要,但我注意到,这些数字的(max/2
和 min/2
)位表示(如 long
s)与 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 位 float
s。出于某种原因,我之前对浮点值的测试没有成功,所以我继续尝试使用整数。现在 [-1, +1]
范围内的简单正弦函数提供了正确的结果。声音有一些小毛病,但这可能与等待缓冲区时的一些时间问题有关。