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;
};
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.
Found this related issue on GitHub: https://github.com/bp74/StageXL/issues/52
Try it in Chrome & FF: http://jsbin.com/loburu/8/edit?js,output
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.