2017-08-04 41 views
0

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

这是一个测试案例:我们创建一个一秒钟的噪声缓冲区并播放它,同时也将增益增加到零。如果在加减速结束后(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); 

回答

0

夫妇的问题在这里:

  1. linearRampToValueAtTime没有在前一个自动化事件的行为本来是没有得到很好的规定。这已经在WebAudio规范中得到修复。不知道这个上的各种浏览器的状态,但我认为Chrome正确地做到了这一点。
  2. 增益节点的自动化应该按照您的预期工作。如果它没有对您的浏览器供应商提出错误。