質問

The below method works as written in Chrome, but not at all in Firefox 30 & 31, even when I replace src.start(startTime) with src.start(0). However, if I set a breakpoint and manually call src.start(0), the sound plays. What am I missing? No errors are thrown.

this.play = function (soundName, waitTime, callbackEnd, callbackStart) {
  //plays sound now or at specific time
  var ctxt = manager.context;
  if (typeof waitTime === 'undefined') waitTime = 0;

  var src = ctxt.createBufferSource();
  src.buffer = manager.buffers[soundName];

  src.onended = callbackEnd;
  src.connect(ctxt.destination);

  var startTime = ctxt.currentTime + waitTime;
  src.start(startTime);
  if (typeof callbackStart !== 'undefined') {
    window.setTimeout(callbackStart, waitTime*1000);
  }

  //return when the sound will start (seconds)
  return startTime;
};

Update

The issue appears to be that earlier in page execution, Backbone.model.fetch() is used in synchronous mode. After Firefox warns about synchronous ajax deprecation, it refuses to play audio.

Update 2

Found this related issue on GitHub: https://github.com/bp74/StageXL/issues/52

Test-Case

Try it in Chrome & FF: http://jsbin.com/loburu/8/edit?js,output

役に立ちましたか?

解決 2

It appears this is an quirk of Firefox 30 and 31 - if you plan to play any audio through the Web Audio API, avoid synchronous ajax (which you should do any way). However, as @padenot mentioned, the bug seems to be fixed in future versions.

他のヒント

This works in last Firefox (Nightly) with and without the async: false option.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top