diff options
Diffstat (limited to 'src/library_browser.js')
-rw-r--r-- | src/library_browser.js | 107 |
1 files changed, 80 insertions, 27 deletions
diff --git a/src/library_browser.js b/src/library_browser.js index ce59dbdd..3ac61dc5 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -23,10 +23,39 @@ mergeInto(LibraryManager.library, { } Browser.mainLoop.shouldPause = false; }, + updateStatus: function() { + if (Module['setStatus']) { + var remaining = Browser.mainLoop.remainingBlockers; + var expected = Browser.mainLoop.expectedBlockers; + if (remaining) { + if (remaining < expected) { + Module['setStatus']('Please wait... (' + (expected - remaining) + '/' + expected + ')'); + } else { + Module['setStatus']('Please wait...'); + } + } else { + Module['setStatus'](''); + } + } + } }, pointerLock: false, moduleContextCreatedCallbacks: [], + ensureObjects: function() { + if (Browser.ensured) return; + Browser.ensured = true; + try { + new Blob(); + Browser.hasBlobConstructor = true; + } catch(e) { + Browser.hasBlobConstructor = false; + console.log("warning: no blob constructor, cannot create blobs with mimetypes"); + } + Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : console.log("warning: cannot build blobs")); + Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs"); + }, + createContext: function(canvas, useWebGL, setInModule) { #if !USE_TYPED_ARRAYS if (useWebGL) { @@ -172,38 +201,52 @@ mergeInto(LibraryManager.library, { xhr.send(null); }, - asyncLoad: function(url, callback) { + asyncLoad: function(url, onload, onerror) { Browser.xhrLoad(url, function(arrayBuffer) { assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - callback(new Uint8Array(arrayBuffer)); - removeRunDependency(); + onload(new Uint8Array(arrayBuffer)); + removeRunDependency('al ' + url); }, function(event) { - throw 'Loading data file "' + url + '" failed.'; + if (onerror) { + onerror(); + } else { + throw 'Loading data file "' + url + '" failed.'; + } }); - addRunDependency(); - } + addRunDependency('al ' + url); + }, + + isImageFile: function(name) { + return name.substr(-4) in { '.jpg': 1, '.png': 1, '.bmp': 1 }; + }, + + isAudioFile: function(name) { + return name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; + }, + + getAudioMimetype: function(name) { + var ret = { 'ogg': 'audio/ogg', 'wav': 'audio/wav', 'mp3': 'audio/mpeg' }[name.substr(-3)]; + assert(ret); + return ret; + }, + }, emscripten_async_wget: function(url, file, onload, onerror) { - url = Pointer_stringify(url); - - Browser.xhrLoad(url, function(response) { - var absolute = Pointer_stringify(file); - var index = absolute.lastIndexOf('/'); - FS.createDataFile( - absolute.substr(0, index), - absolute.substr(index +1), - new Uint8Array(response), - true, true); - - if (onload) { + var _url = Pointer_stringify(url); + var _file = Pointer_stringify(file); + var index = _file.lastIndexOf('/'); + FS.createPreloadedFile( + _file.substr(0, index), + _file.substr(index +1), + _url, true, true, + function() { FUNCTION_TABLE[onload](file); - } - }, function(event) { - if (onerror) { + }, + function() { FUNCTION_TABLE[onerror](file); } - }); + ); }, emscripten_async_run_script__deps: ['emscripten_run_script'], @@ -222,8 +265,12 @@ mergeInto(LibraryManager.library, { var jsFunc = FUNCTION_TABLE[func]; var wrapper = function() { if (Browser.mainLoop.queue.length > 0) { - Browser.mainLoop.queue.shift()(); - if (Browser.mainLoop.queue.length == 0 && Module['setStatus']) Module['setStatus'](''); + var start = Date.now(); + var blocker = Browser.mainLoop.queue.shift(); + blocker.func(); + console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); + if (Browser.mainLoop.remainingBlockers) Browser.mainLoop.remainingBlockers--; + Browser.mainLoop.updateStatus(); setTimeout(wrapper, 0); return; } @@ -267,9 +314,15 @@ mergeInto(LibraryManager.library, { Browser.mainLoop.resume(); }, - emscripten_push_main_loop_blocker: function(func) { - if (Module['setStatus']) Module['setStatus']('Please wait..'); - Browser.mainLoop.queue.push(FUNCTION_TABLE[func]); + _emscripten_push_main_loop_blocker: function(func, name) { + Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], name: Pointer_stringify(name) }); + Browser.mainLoop.updateStatus(); + }, + + emscripten_set_main_loop_expected_blockers: function(num) { + Browser.mainLoop.expectedBlockers = num; + Browser.mainLoop.remainingBlockers = num; + Browser.mainLoop.updateStatus(); }, emscripten_async_call: function(func, millis) { |