我有一个应用程序,其中音频播放可能开始和停止,并且有UI控件将增益渐变到零或非零值。我正在使用
AudioBufferSourceNode.start
AudioParam.linearRampToValueAtTime
这是一个测试用例:我们创建一个1秒的噪声缓冲区并播放它,同时将增益降到零。如果在渐变结束后(1秒)计划播放,则增益值永远不会设置,并保持在默认值,即非零值。
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);