diff options
author | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-07-12 22:34:18 -0400 |
---|---|---|
committer | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-08-30 21:28:29 -0400 |
commit | 88a07f99f3b086f00cf0b12711d8342c2e49a12d (patch) | |
tree | f652ae0a5a60c95a3fa4c1be30824ced8bf8cdbb /src/library_sdl.js | |
parent | 4d09c1a7930c80f8edce2bf825a09a11e1ee1cc3 (diff) |
Current WebAudio experiments
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r-- | src/library_sdl.js | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 9109ea3a..5dd7783e 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1224,9 +1224,45 @@ var LibrarySDL = { } // Either play the element, or load the dynamic data into it if (info.buffer) { + var contextCtor = null; if (audio && ('mozSetup' in audio)) { // Audio Data API audio['mozSetup'](audio.getAttribute("data-numchannels"), audio.getAttribute("data-frequency")); audio["mozWriteAudio"](info.buffer); + } else if (contextCtor = (window.AudioContext || // WebAudio API + window.webkitAudioContext)) { + var currentIndex = 0; + var numChannels = parseInt(audio.getAttribute("data-numchannels")); + var context = new contextCtor(); + var source = context.createBufferSource(); + source.loop = false; + source.buffer = context.createBuffer(numChannels, 1, audio.getAttribute("data-frequency")); + var jsNode = context.createJavaScriptNode(2048, numChannels, numChannels); + jsNode.onaudioprocess = function(event) { + var buffers = new Array(numChannels); + for (var i = 0; i < numChannels; ++i) { + buffers[i] = event.outputBuffer.getChannelData(i); + } + var remaining = info.buffer.length - currentIndex; + if (remaining > 2048) { + remaining = 2048; + } + for (var i = 0; i < remaining;) { + for (var j = 0; j < numChannels; ++j) { + buffers[j][i] = info.buffer[currentIndex + i + j] * audio.volume; + } + i += j; + } + currentIndex += remaining * numChannels; + for (var i = remaining; i < 2048;) { + for (var j = 0; j < numChannels; ++j) { + buffers[j][i] = 0; // silence + } + i += j; + } + }; + source.connect(jsNode); + jsNode.connect(context.destination); + source.noteOn(0); } } else { audio.play(); |