在播放停止和开始时斜坡 WebAudio 增益?

Ramp WebAudio gain, while playback is stopping and starting?

我有一个应用程序可以开始和停止音频播放,并且有 UI 控件可以将增益调整为零或非零值。我正在使用 AudioBufferSourceNode.start, and modulating gain using AudioParam.linearRampToValueAtTime 安排播放。回放有时会安排在未来的某个时间。我遇到的问题是斜坡函数似乎只在当前正在播放时设置值;所以,如果我们尝试设置增益值,例如在安排播放和播放开始之间,新值将丢失。我可以做一堆时序检查,并根据播放是否发生来斜坡或直接设置增益,但这可能会变得混乱,我想知道是否有另一种方法可以独立于播放开始和停止。

这是一个测试用例:我们创建一个一秒的噪声缓冲区并播放它,同时将增益逐渐降低到零。如果计划在斜坡结束后(一秒)播放,则增益值永远不会设置并保持在默认的非零值。

var ctx = new AudioContext();
var SR = ctx.sampleRate;
var buffer = ctx.createBuffer(1, SR, SR);
var channelData = buffer.getChannelData(0);
for (var i=0; i<SR; i++) {
  channelData[i] = Math.random() * 2 - 1;
}
var bufferNode = ctx.createBufferSource();
var gainNode = ctx.createGain();
bufferNode.buffer = buffer;
bufferNode.connect(gainNode);
gainNode.connect(ctx.destination);
gainNode.gain.linearRampToValueAtTime(0, ctx.currentTime + 1);
//XXX if start_delay is greater than 1 (the ramp duration), 
// the gain is never changed and remains at 1.
var start_delay = 0;
bufferNode.start(ctx.currentTime + start_delay);

这里有几个问题:

  1. linearRampToValueAtTime 没有先行自动化事件的行为最初没有明确规定。这已在 WebAudio 规范中得到修复。不知道各种浏览器对此的状态,但我认为 Chrome 这样做是正确的。
  2. 增益节点的自动化应该按您预期的那样工作。如果它没有针对您的浏览器供应商提交错误。

我的问题似乎是由 Chrome 中的错误引起的,该错误已在 Chrome 57 中修复。这是错误报告:https://bugs.chromium.org/p/chromium/issues/detail?id=647974

以下评论有针对旧版本 Chrome 的解决方法:https://bugs.chromium.org/p/chromium/issues/detail?id=647974#c9