gpt4 book ai didi

c++ - WASAPI 共享模式 : What amplitude does the audio engine expect?

转载 作者:行者123 更新时间:2023-11-30 04:57:24 25 4
gpt4 key购买 nike

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

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 )的位表示(如 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));

关于c++ - WASAPI 共享模式 : What amplitude does the audio engine expect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com