Javascript 使用WebAudio API,轮询是观察AudioParam值变化的唯一方法吗?

Javascript 使用WebAudio API,轮询是观察AudioParam值变化的唯一方法吗?,javascript,web-audio-api,observers,Javascript,Web Audio Api,Observers,我认为我们只能通过轮询AudioParams来观察其值的变化,这是正确的吗 AudioParam作为AudioNode的属性创建,例如: var gainNode = audioContext.createGain(); var param = gainNode.gain; param是一个对象,具有一系列用于控制节点增益的方法和属性。要观察更改,我们需要观察param的“value”属性 问题是Object.observe以静默方式失败: Object.observe(param, func

我认为我们只能通过轮询AudioParams来观察其值的变化,这是正确的吗

AudioParam作为AudioNode的属性创建,例如:

var gainNode = audioContext.createGain();
var param = gainNode.gain;
param是一个对象,具有一系列用于控制节点增益的方法和属性。要观察更改,我们需要观察param的“value”属性

问题是Object.observe以静默方式失败:

Object.observe(param, function(changes){
    console.log(changes);
});
这里永远不会调用回调

您还可以将“value”属性重新配置为getter/setter,并在设置值时调用观察代码——但这也会以静默方式失败。属性是可配置的,您可以在其上设置一个值,但是音频节点似乎没有使用getter来获取该值,因此它没有使用我们设置的值。因此,我认为它应该是不可配置的

我能理解为什么这些方法不可取——AudioParam值可以以采样率更新,因此这些观察者可能每秒被调用数千次

因此,问题是,我们是否简化为轮询来观察AudioParam对象的值的变化(尽管是在requestAnimationFrame上,但仍然是轮询),还是有更好的方法


(几天前我在公共音频邮件列表上问了这个问题:。目前没有答复。)

我们不确定如何做到这一点,因为这会对性能产生严重影响。同时,我建议您只需重新实现AudioParam包装器,即可在主线程上为您提供价值。

我删除了我的答案,因为它不正确。我不确定我的解释是否正确,但这项功能似乎只对原始ECMAScript对象起作用——我不是有意粗鲁,但谁是“我们”?我不确定我是否理解你关于制作包装的评论。如果我制作了一个包装器,包装器仍然必须以某种方式侦听参数上的更改。重点是捕捉不是我做的更改——例如,由自动化方法做的更改。我们是Web Audio API的实现者和编辑(我在Mozilla处理Web Audio API,在W3C编辑规范)。我的建议就是包装AudioParam的自动化方法。哦,我明白了!是的,我想这是另一种选择。谢谢你的澄清。