防止多个AudioContexts

时间:2014-02-23 13:51:33

标签: javascript html5 web-audio

我使用了一种模式,使用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();

1 个答案:

答案 0 :(得分:3)

我不完全确定我理解你的问题。您是否有理由不能在脚本顶部创建单个音频上下文,然后让其余代码参考它?

无论如何,为了提供答案,你可以这样做:

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);