AudioParam: value 属性

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

AudioParam 接口的 value 属性用于获取或设置该 AudioParam 在当前时间的参数值。初始时,该值会被设置为 AudioParam.defaultValue

设置 value 与调用 AudioParam.setValueAtTime 的效果相同,此时的时间参数为 AudioContextcurrentTime 属性返回的时间。

一个浮点型 Number,表示参数在当前时间的取值。此值介于 minValuemaxValue 属性指定的值之间。

描述

值的精度和变化

内部用于存储 value 的数据类型是单精度(32 位)浮点数,而 JavaScript 使用的是 64 位双精度浮点数。因此,您从 value 属性读取的值可能并不总是与您设置的值完全相等。

考虑以下示例

js
const source = new AudioBufferSourceNode(/* … */);
const rate = 5.3;
source.playbackRate.value = rate;
console.log(source.playbackRate.value === rate);

控制台输出将是 false,因为播放速率参数 rate 被转换为最接近 5.3 的 32 位浮点数,结果是 5.300000190734863。一个解决方案是使用 Math.fround() 方法,该方法返回指定 64 位 JavaScript 值等效的单精度值——在设置 value 时,例如:

js
const source = new AudioBufferSourceNode(/* … */);
const rate = Math.fround(5.3);
source.playbackRate.value = rate;
console.log(source.playbackRate.value === rate);

在这种情况下,控制台输出将是 true

随时间变化的属性值

AudioParamvalue 可以是固定的,也可以随时间变化。这反映在 value getter 中,它返回参数在音频渲染引擎最近一次 **render quantum**(音频缓冲区处理和更新的时刻)时的值。除了处理音频缓冲区外,每次 render quantum 都会根据当前时间和任何已建立的基于时间的参数值更改来更新每个 AudioParamvalue

在首次创建参数时,其值设置为由 AudioParam.defaultValue 指定的默认值。这是参数在时间 0.0 秒时的值,并且将保持此值,直到第一次修改参数值的 render quantum 发生。

在每个 render quantum 中,浏览器会执行以下与管理参数值相关的操作:

  • 如果使用了 value setter,参数的值将被更改为指定的值。
  • 如果当前时间等于或超过先前调用 setValueAtTime() 指定的时间,则 value 将更改为传递给 setValueAtTime() 的值。
  • 如果调用了任何渐变或斜坡值更改方法,并且当前时间在渐变变化应发生的事件范围内,则值将根据适当的算法进行更新。这些斜坡或渐变值更改方法包括 linearRampToValueAtTime()setTargetAtTime()setValueCurveAtTime()

因此,参数的 value 会被维护,以准确反映参数随时间的状态。

示例

此示例将 GainNode 的音量立即更改为 40%。

js
const audioCtx = new AudioContext();
const gainNode = audioCtx.createGain();
gainNode.gain.value = 0.4;
// which is identical to:
gainNode.gain.setValueAtTime(0.4, audioCtx.currentTime);

规范

规范
Web Audio API
# dom-audioparam-value

浏览器兼容性

另见