aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorILOVEPIE <thehairyrock@gmail.com>2013-03-21 10:26:51 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-09-24 16:56:44 -0700
commit0462f14bd6b6bdd9ad6adee0e30bddebab6da144 (patch)
tree6ebdb36381fed047a2e0b634d4f9a91705b4ca9e
parentabeaac2b2c9560cfb6cd6f00249e098ad733cc0e (diff)
Rewritten with audioBuffers
Added myself to AUTHORS Signed-off-by: ILOVEPIE <thehairyrock@gmail.com>
-rw-r--r--AUTHORS1
-rw-r--r--src/library_sdl.js62
2 files changed, 35 insertions, 28 deletions
diff --git a/AUTHORS b/AUTHORS
index 604bd6bd..8a4dc9d3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -97,4 +97,5 @@ a license to everyone to use it as detailed in LICENSE.)
* Charlie Birks <admin@daftgames.net>
* Ranger Harke <ranger.harke@autodesk.com> (copyright owned by Autodesk, Inc.)
* Tobias Vrinssen <tobias@vrinssen.de>
+* Patrick R. Martin <patrick.martin.r@gmail.com>
diff --git a/src/library_sdl.js b/src/library_sdl.js
index c5bbb989..a2d0457b 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -1489,8 +1489,8 @@ var LibrarySDL = {
// Mozilla Audio API/WebAudioAPI
try {
SDL.audio.audioOutput = new Audio();
- SDL.audio.hasWebkitAudio = ((typeof(AudioContext) === "function")||(typeof(webkitAudioContext) === "function"));
- if(typeof(SDL.audio.audioOutput['mozSetup'])==="function"||!SDL.audio.hasWebkitAudio){
+ SDL.audio.hasWebAudio = ((typeof(AudioContext) === "function")||(typeof(webkitAudioContext) === "function"));
+ if(!SDL.audio.hasWebAudio&&(typeof(SDL.audio.audioOutput['mozSetup'])==="function")){
SDL.audio.audioOutput['mozSetup'](SDL.audio.channels, SDL.audio.freq); // use string attributes on mozOutput for closure compiler
SDL.audio.mozBuffer = new Float32Array(totalSamples);
SDL.audio.pushAudio = function(ptr, size) {
@@ -1503,36 +1503,42 @@ var LibrarySDL = {
}else{
if (typeof(AudioContext) === "function") {
SDL.audio.context = new AudioContext();
+ SDL.audio.soundSource = SDL.audio.context.createBufferSource();
} else if (typeof(webkitAudioContext) === "function") {
SDL.audio.context = new webkitAudioContext();
}
+ SDL.audio.nextSoundSource = 0;
+ SDL.audio.soundSource = new Array();
+ SDL.audio.nextPlayTime = 0;
SDL.audio.pushAudio=function(ptr,size){
- SDL.audio.soundSource = SDL.audio.context.createBufferSource(1,SDL.audio.samples,SDL.audio.freq);
- if(typeof(SDL.audio.context.createScriptProcessor) === "function"){
- SDL.audio.soundInjector = SDL.audio.context.createScriptProcessor(SDL.audio.samples,1,SDL.audio.channels);
- }else{
- SDL.audio.soundInjector = SDL.audio.context.createJavaScriptNode(SDL.audio.samples,1,SDL.audio.channels);
- }
- SDL.audio.soundInjector.onaudioprocess = function(e) {
- SDL.audio.webAudioFunc(SDL.audio.buffer,e);
- }
- SDL.audio.soundSource.connect(SDL.audio.soundInjector);
- SDL.audio.soundInjector.connect(SDL.audio.context.destination);
- if(typeof(SDL.audio.soundSource.start)=== "function"){
- SDL.audio.soundSource.start(0);
- }else{
- SDL.audio.soundSource.noteOn(0);
- }
- }
- SDL.audio.webAudioFunc = function(ptr,e){
- for(var j = 0; i<e.outputBuffer.numberOfChannels; j++){
- var webaudioBuffer = e.outputBuffer.getChannelData(j);
- var q = 0
- for (var i = j*SDL.audio.samples; i < ((j*SDL.audio.samples)+SDL.audio.samples); i++) {
- webaudioBuffer[q] = ({{{ makeGetValue('ptr', 'i*2', 'i16', 0, 0) }}}) / 0x8000; // hardcoded 16-bit audio, signed (TODO: reSign if not ta2?)
- q++;
- }
- }
+ if(SDL.audio.lastSoundSource>-1){
+ if(SDL.audio.soundSource[SDL.audio.lastSoundSource].playbackState === 3){
+ SDL.audio.soundSource = new Array();
+ SDL.audio.nextPlayTime = 0;
+ SDL.audio.lastSoundSource = -1;
+ SDL.audio.nextSoundSource = 0;
+ }
+ }
+ SDL.audio.soundSource[SDL.audio.nextSoundSource] = SDL.audio.context.createBufferSource();
+ SDL.audio.soundSource[SDL.audio.nextSoundSource].connect(SDL.audio.context.destination);
+ SDL.audio.soundSource[SDL.audio.nextSoundSource].buffer = SDL.audio.context.createBuffer(SDL.audio.channels,(size / totalSamples),SDL.audio.freq);
+ for(var j = 0; j<SDL.audio.channels; j++){
+ var channelData = SDL.audio.SoundSource[SDL.audio.nextSoundSource].buffer.getChannelData(j);
+ var samples = SDL.audio.samples;
+ for(var i = 0; i<samples; i++){
+ channelData[i] = ({{{ makeGetValue('ptr', '(i+samples*j)*2', 'i16', 0, 0) }}}) / 0x8000; // hardcoded 16-bit audio, signed (TODO: reSign if not ta2?)
+ }
+ }
+ SDL.audio.nextPlayTime = SDL.audio.context.currentTime+SDL.audio.soundSource[SDL.audio.nextSoundSource].buffer.duration;
+
+ if(typeof(SDL.audio.soundSource.start)=== "function"){
+ SDL.audio.soundSource[SDL.audio.nextSoundSource].start(SDL.audio.nextPlayTime);
+ }else{
+ SDL.audio.soundSource[SDL.audio.nextSoundSource].noteOn(SDL.audio.nextPlayTime);
+ }
+
+ SDL.audio.lastSoundSource = SDL.Audio.nextSoundSource;
+ SDL.Audio.nextSoundSource++;
}
}
} catch(e) {