【发布时间】:2017-08-04 22:40:35
【问题描述】:
我有一个应用程序可以开始和停止音频播放,并且有 UI 控件可以将增益提升到零或非零值。我正在使用AudioBufferSourceNode.start 安排播放,并使用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);
【问题讨论】: