Audio 究竟什么是",;“沉默”;SDL音频API中的值?

Audio 究竟什么是",;“沉默”;SDL音频API中的值?,audio,sdl,Audio,Sdl,在SDL中,当您设置音频输出设备时,您和SDL必须就音频格式达成一致,例如44.1KHz立体声16位带符号little endian。那很好。但除了最终商定的格式外,您还可以得到一个计算出的“静默”值,该值似乎没有很好的文档记录 无声声音样本显然是由相同的样本值反复重复组成的,您希望它处于“零”级别。从某种意义上说,任何常数都可以,但你必须同意一个值(这样当切换到不同的声音时你就不会得到砰砰声),在一个理智的世界里,你想在你的样本值范围的中心选择一个值 因此,如果您碰巧对0.的采样值范围使用了无

在SDL中,当您设置音频输出设备时,您和SDL必须就音频格式达成一致,例如44.1KHz立体声16位带符号little endian。那很好。但除了最终商定的格式外,您还可以得到一个计算出的“静默”值,该值似乎没有很好的文档记录

无声声音样本显然是由相同的样本值反复重复组成的,您希望它处于“零”级别。从某种意义上说,任何常数都可以,但你必须同意一个值(这样当切换到不同的声音时你就不会得到砰砰声),在一个理智的世界里,你想在你的样本值范围的中心选择一个值

因此,如果您碰巧对0.的采样值范围使用了无符号格式,则静默值将为(whatever/2)

编辑-在下面插入“未签名”以避免混淆

没关系。但是给定的静默值是一个无符号8位整数。如果您想要无符号16位采样,那么这种方法不太好——0x8000的逻辑静默值需要两个不同的字节值,并且需要它们的正确endian顺序

因此,从SDL获得的静默值似乎没有多大意义。例如,如果不处理额外的复杂问题,不进行推断,就不能使用它来擦除缓冲区,这几乎使预先计算的静默值毫无意义

当然,这意味着我误解了这一点


因此-如果这不是静默值的使用方式,应该如何使用它?

我没有证据支持这一点,但我认为这里的假设是“静默”可以解释为“普通声卡格式的静默”。这些是:

  • 无符号8位整数
  • 有符号16位整数
  • 有符号32位整数(用于24位音频数据)
  • 标准化32位浮点
  • 标准化64位浮点

  • 在除无符号8位以外的所有情况下,零(0)是“零振幅”值。因此,返回的无符号8位整数包含这些格式的所有可能的“零振幅”值

    细微的挑剔,但如果您使用的是16位有符号音频数据,正确的静音值不是0x0000吗,因为范围是从-32k到+32k?但是,我认为对于未签名的音频数据,您有一个有效点。我对SDL的沉默价值的看法是,它可能只是无用的遗产,你应该悄悄地忘记你曾经见过的东西,计算你自己的,然后快乐地走下去。:)SDL支持16位有符号和无符号、大尾数和小尾数。前面的段落建立了一个使用无符号格式0..whatever作为样本值的上下文。但是我可以说得更明确一些——will fix。当然,对于有符号的样本,零就像你说的那样工作——但是如果所有格式都希望使用零表示静默,那么使用calculate静默值是没有意义的。虽然。。。现在您提到它,我不是100%认为16位样本可以是无符号的(可能只有8位)。我必须再检查一遍,但没时间了——稍后再来。@cecilkorik——关于“legacy cruft”——也许你是对的,但多平台的一个问题是,在你的平台上进行的测试并不意味着其他地方可以用。我倾向于假设我错过了某件事的要点,因为如果我依赖于一个在某个地方有效的假设。。。如果您依赖于在Linux上初始化没有图形的SDL音频,则可能是一个SDL示例。转到Windows,DirectX依赖项生效,这显然意味着必须初始化图形组件。当然,这很容易解决,但一些错误的假设是致命的。听起来似乎有道理,所以被接受。从这一点上,我想我可能会用我期望的一致性检查它(零或否)。