代码之家  ›  专栏  ›  技术社区  ›  egst

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

  •  1
  • egst  · 技术社区  · 8 年前

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

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

    • long 范围内 [min, max]
    • unsigned long 范围内 [0, max]
    • float 范围内 [最小,最大]
    • 或者类似的东西 浮动 范围内 [-1, 1] ?

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

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

    这也许无关紧要,但我注意到,这些数字( 最大/2 min/2 )位表示(作为 长的 s) 与 IEEE float 位表示 2.0 -2.0 . 我还是不明白,为什么会这样。

    2 回复  |  直到 8 年前
        1
  •  1
  •   jaket    8 年前

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

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

    更明确地说:

    int xfixed = (int)(xfloat * ((1<<(32-1)) - 1));
    
        2
  •  0
  •   egst    8 年前

    在深入调查 WAVEFORMATEXTENSIBLE 我发现,我需要的信息可能存储在 SubFormat 财产。在我看来 KSDATAFORMAT_SUBTYPE_IEEE_FLOAT . 所以音频引擎需要32位 float s在一个范围内 [-1, +1] . 由于某种原因,我以前对浮点值的测试不成功,所以我继续尝试使用整数。一个简单的正弦函数 [-1,+1] 范围提供正确的结果。声音中有一些小故障,但这可能与等待缓冲区时的一些计时问题有关。

    推荐文章