2

在我的对象中,我有一个AudioBufferSourceNode对象this.bSrcthis.audioDestinationAudioBufferthis.audioBuffer

如果this.audioDestination连接到音频上下文最终目的地并且我在我的对象 ( ) 上this.mainContext.destination调用该start(0)方法,它将正常播放。AudioBufferSourceNodethis.bSrc

相反,如果this.audioDestination尚未连接到 Audio Context 最终目的地,则缓冲区将不会播放(这没关系),但其播放将延迟到建立连接(从而使任何关于 AudioBufferSourceNode 何时完成播放的假设无效) .

我目前正在实现一个插件架构,其中每个插件都有其 audioDestination 增益节点,并且不(也不能)知道它是否间接连接到最终的音频上下文目标。在我看来合乎逻辑的是 AudioBufferSourceNode 应该立即“播放”并完成,即使它没有连接到最终的音频上下文目标。但它似乎不像这样工作。我是对的还是我弄错了?有没有办法改变这种行为?

代码:

/* Create the audio Context. */
this.mainContext = new webkitAudioContext;

/* Create an audio gain node */
this.audioDestination = this.mainContext.createGainNode();

/* [...] An AudioBuffer gets decoded and stored into this.audioBuffer*/

/* Create an AudioBufferSourceNode and try to play it immediately */
this.bSrc = this.audioContext.createBufferSource();
this.bSrc.connect (this.audioDestination);
this.bSrc.buffer = this.audioBuffer;
this.bSrc.start(0);

/* Create a callback for when the AudioBufferSourceNode finishes playing */
if (!this.bSrc.loop) {
       var pbTimer = setTimeout(function() {
            this.playFinishedCallback();
        }.bind(this), this.audioBuffer.duration * 1000 / this.bSrc.playbackRate.value);
    }

 /* Connect this.audioDestination to the final AudioContext destination */
 /* If this statement is executed after the previous ones, playback will start NOW */
 this.audioDestination.connect(this.mainContext.destination);
4

2 回答 2

2

这是当前在 Chrome 中实现 Web Audio API 的方式,以及其中使用的设计。有人说要改变它;实际上,我是您描述的“音频电缆模型”的支持者。:) 不过,这不是唯一理智的模型。在当前的实现中没有任何方法可以改变这种行为。

但是,有一个简单的解决方法 - 只需将一个归零的增益节点连接到 context.destination,并将所有 ABSN 连接到该节点,以及它们(最终)连接到 context.destination。

于 2013-01-31T22:22:20.357 回答
0

这是有道理的。将 context.destination 视为标准输出。如果没有连接到 context.destination,音频就无处可去。如果您将最后一行(连接到 context.destination)移动到创建增益节点之后,我认为您不会有延迟。

于 2013-01-31T13:34:05.747 回答