我遵循了一种使用Webaudio将声音附加到对象的模式。它运作良好,但是,如果我在页面上生成多个项目并附加此脚本,则会得到console.log,该控制台表明我已经超过了每个页面可用的audioContexts的最大数量。

我的理解是,该行声明audioContext附加到窗口的AudioContext,而不是声明一个新的。我怎么问窗口是否已经有一个AudioContext并简单地在其图形中添加音频节点?

var that = this
  , audioContext = window.AudioContext || window.webkitAudioContext;

if (!audioContext) {
  console.warn("Web Audio API not supported in this browser.");
  return;
}

this.context = new audioContext();

最佳答案

我不确定我是否理解您的问题。有一个原因为什么您不能只在脚本顶部创建一个音频上下文,然后让其余代码引用它?

为了始终提供答案,您可以执行以下操作:

var getContext = function() {
  var ac = null;
  if ( !window.AudioContext && !window.webkitAudioContext ) {
    console.warn('Web Audio API not supported in this browser');
  } else {
    ac = new ( window.AudioContext || window.webkitAudioContext )();
  }
  return function() {
    return ac;
  };
}();

然后,每次需要上下文时,只需调用此函数:
var ctx = getContext(),
  osc = ctx.createOscillator();
osc.connect(ctx.destination);

10-07 23:19