aboutsummaryrefslogtreecommitdiff
path: root/src/library_sdl.js
diff options
context:
space:
mode:
authorEhsan Akhgari <ehsan.akhgari@gmail.com>2012-07-12 22:34:18 -0400
committerEhsan Akhgari <ehsan.akhgari@gmail.com>2012-08-30 21:28:29 -0400
commit88a07f99f3b086f00cf0b12711d8342c2e49a12d (patch)
treef652ae0a5a60c95a3fa4c1be30824ced8bf8cdbb /src/library_sdl.js
parent4d09c1a7930c80f8edce2bf825a09a11e1ee1cc3 (diff)
Current WebAudio experiments
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r--src/library_sdl.js36
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();