diff options
author | juj <jujjyl@gmail.com> | 2014-02-05 14:32:43 +0200 |
---|---|---|
committer | juj <jujjyl@gmail.com> | 2014-02-05 14:32:43 +0200 |
commit | e6d16cdb1a4c99ddb375854ceba00177e6f896b1 (patch) | |
tree | a001e4623b56e613cbb0367c28f977c68ca2a849 | |
parent | b51a2337e92afbfdcfcc21f2d5a64370b3320e89 (diff) | |
parent | c9f15262c672c894acd55373b47022b9cbdbc85a (diff) |
Merge pull request #2097 from dreamlayers/web_audio
Web Audio buffering improvement
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | src/library_sdl.js | 15 |
2 files changed, 9 insertions, 7 deletions
@@ -120,3 +120,4 @@ a license to everyone to use it as detailed in LICENSE.) * Jari Vetoniemi <mailroxas@gmail.com> * Sindre Sorhus <sindresorhus@gmail.com> * James S Urquhart <jamesu@gmail.com> +* Boris Gjenero <boris.gjenero@gmail.com> diff --git a/src/library_sdl.js b/src/library_sdl.js index 5d41618b..04e8fc18 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1727,6 +1727,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? @@ -1777,18 +1778,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); } |