Created
February 2, 2014 20:21
-
-
Save dreamlayers/8774307 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/library_sdl.js b/src/library_sdl.js | |
index 80734d9..7bed46c 100644 | |
--- a/src/library_sdl.js | |
+++ b/src/library_sdl.js | |
@@ -1723,6 +1723,7 @@ var LibrarySDL = { | |
SDL.audio.pushAudio=function(ptr,sizeBytes) { | |
try { | |
--SDL.audio.numAudioTimersPending; | |
+ if (SDL.audio.paused) return; | |
var sizeSamples = sizeBytes / SDL.audio.bytesPerSample; // How many samples fit in the callback buffer? | |
var sizeSamplesPerChannel = sizeSamples / SDL.audio.channels; // How many samples per a single channel fit in the cb buffer? | |
@@ -1773,18 +1774,18 @@ var LibrarySDL = { | |
SDL.audio.soundSource[SDL.audio.nextSoundSource]['start'](playtime); | |
var buffer_duration = sizeSamplesPerChannel / SDL.audio.freq; | |
SDL.audio.nextPlayTime = playtime + buffer_duration; | |
- SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % 4; | |
+ // Timer will be scheduled before the buffer completed playing. | |
+ // Extra buffers are needed to avoid disturbing playing buffer. | |
+ SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % (SDL.audio.numSimultaneouslyQueuedBuffers + 2); | |
var secsUntilNextCall = playtime-curtime; | |
// Queue the next audio frame push to be performed when the previously queued buffer has finished playing. | |
- if (SDL.audio.numAudioTimersPending == 0) { | |
- var preemptBufferFeedMSecs = buffer_duration/2.0; | |
- SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
- ++SDL.audio.numAudioTimersPending; | |
- } | |
+ var preemptBufferFeedMSecs = 1000*buffer_duration/2.0; | |
+ SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
+ ++SDL.audio.numAudioTimersPending; | |
// If we are risking starving, immediately queue extra buffers. | |
- if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
+ if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
++SDL.audio.numAudioTimersPending; | |
Browser.safeSetTimeout(SDL.audio.caller, 1.0); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/library_sdl.js b/src/library_sdl.js | |
index 80734d9..780e25e 100644 | |
--- a/src/library_sdl.js | |
+++ b/src/library_sdl.js | |
@@ -1723,6 +1723,7 @@ var LibrarySDL = { | |
SDL.audio.pushAudio=function(ptr,sizeBytes) { | |
try { | |
--SDL.audio.numAudioTimersPending; | |
+ if (SDL.audio.paused) return; | |
var sizeSamples = sizeBytes / SDL.audio.bytesPerSample; // How many samples fit in the callback buffer? | |
var sizeSamplesPerChannel = sizeSamples / SDL.audio.channels; // How many samples per a single channel fit in the cb buffer? | |
@@ -1773,18 +1774,18 @@ var LibrarySDL = { | |
SDL.audio.soundSource[SDL.audio.nextSoundSource]['start'](playtime); | |
var buffer_duration = sizeSamplesPerChannel / SDL.audio.freq; | |
SDL.audio.nextPlayTime = playtime + buffer_duration; | |
- SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % 4; | |
+ // Timer will be scheduled before the buffer completed playing. | |
+ // One extra buffer is needed to avoid disturbing playing buffer. | |
+ SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % (SDL.audio.numSimultaneouslyQueuedBuffers + 1); | |
var secsUntilNextCall = playtime-curtime; | |
// Queue the next audio frame push to be performed when the previously queued buffer has finished playing. | |
- if (SDL.audio.numAudioTimersPending == 0) { | |
var preemptBufferFeedMSecs = buffer_duration/2.0; | |
SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
++SDL.audio.numAudioTimersPending; | |
- } | |
// If we are risking starving, immediately queue extra buffers. | |
- if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
+ if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
++SDL.audio.numAudioTimersPending; | |
Browser.safeSetTimeout(SDL.audio.caller, 1.0); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/library_sdl.js b/src/library_sdl.js | |
index 80734d9..3c1f830 100644 | |
--- a/src/library_sdl.js | |
+++ b/src/library_sdl.js | |
@@ -1722,8 +1722,6 @@ var LibrarySDL = { | |
// The pushAudio function with a new audio buffer whenever there is new audio data to schedule to be played back on the device. | |
SDL.audio.pushAudio=function(ptr,sizeBytes) { | |
try { | |
- --SDL.audio.numAudioTimersPending; | |
- | |
var sizeSamples = sizeBytes / SDL.audio.bytesPerSample; // How many samples fit in the callback buffer? | |
var sizeSamplesPerChannel = sizeSamples / SDL.audio.channels; // How many samples per a single channel fit in the cb buffer? | |
if (sizeSamplesPerChannel != SDL.audio.samples) { | |
@@ -1773,21 +1771,12 @@ var LibrarySDL = { | |
SDL.audio.soundSource[SDL.audio.nextSoundSource]['start'](playtime); | |
var buffer_duration = sizeSamplesPerChannel / SDL.audio.freq; | |
SDL.audio.nextPlayTime = playtime + buffer_duration; | |
- SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % 4; | |
+ SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % (SDL.audio.numSimultaneouslyQueuedBuffers + 2); | |
var secsUntilNextCall = playtime-curtime; | |
- | |
- // Queue the next audio frame push to be performed when the previously queued buffer has finished playing. | |
- if (SDL.audio.numAudioTimersPending == 0) { | |
- var preemptBufferFeedMSecs = buffer_duration/2.0; | |
- SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
- ++SDL.audio.numAudioTimersPending; | |
- } | |
- // If we are risking starving, immediately queue extra buffers. | |
- if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
- ++SDL.audio.numAudioTimersPending; | |
- Browser.safeSetTimeout(SDL.audio.caller, 1.0); | |
- } | |
+ // Queue the next audio frame push to be performed when the previously queued buffer has finished playing. | |
+ var preemptBufferFeedMSecs = 1000 * buffer_duration * SDL.audio.numSimultaneouslyQueuedBuffers; | |
+ SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
} catch(e) { | |
console.log('Web Audio API error playing back audio: ' + e.toString()); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/library_sdl.js b/src/library_sdl.js | |
index 80734d9..101785a 100644 | |
@@ -1723,6 +1724,7 @@ var LibrarySDL = { | |
SDL.audio.pushAudio=function(ptr,sizeBytes) { | |
try { | |
--SDL.audio.numAudioTimersPending; | |
+ if (SDL.audio.paused) return; | |
var sizeSamples = sizeBytes / SDL.audio.bytesPerSample; // How many samples fit in the callback buffer? | |
var sizeSamplesPerChannel = sizeSamples / SDL.audio.channels; // How many samples per a single channel fit in the cb buffer? | |
@@ -1773,18 +1775,16 @@ var LibrarySDL = { | |
SDL.audio.soundSource[SDL.audio.nextSoundSource]['start'](playtime); | |
var buffer_duration = sizeSamplesPerChannel / SDL.audio.freq; | |
SDL.audio.nextPlayTime = playtime + buffer_duration; | |
- SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % 4; | |
+ SDL.audio.nextSoundSource = (SDL.audio.nextSoundSource + 1) % SDL.audio.numSimultaneouslyQueuedBuffers; | |
var secsUntilNextCall = playtime-curtime; | |
// Queue the next audio frame push to be performed when the previously queued buffer has finished playing. | |
- if (SDL.audio.numAudioTimersPending == 0) { | |
var preemptBufferFeedMSecs = buffer_duration/2.0; | |
SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*secsUntilNextCall-preemptBufferFeedMSecs)); | |
++SDL.audio.numAudioTimersPending; | |
- } | |
// If we are risking starving, immediately queue extra buffers. | |
- if (secsUntilNextCall <= buffer_duration && SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
+ if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) { | |
++SDL.audio.numAudioTimersPending; | |
Browser.safeSetTimeout(SDL.audio.caller, 1.0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment