Firefox Web Audio: source.start() broken by unrelated synchronous ajax call
-
21-12-2019 - |
Вопрос
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.