Merge pull request #114 from LLK/bugfix/handle-broken-sounds

Handle empty and unusually formatted sounds that caused crashes
This commit is contained in:
Paul Kaplan 2019-01-08 13:05:05 -05:00 committed by GitHub
commit 9a2332e56b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 1 deletions

View file

@ -150,7 +150,16 @@ class ArrayBufferStream {
* @return {number} the next 32 bit integer in the stream
*/
readInt32 () {
const val = new Int32Array(this.arrayBuffer, this._position, 1)[0];
let val;
if (this._position % 4 === 0) {
val = new Int32Array(this.arrayBuffer, this._position, 1)[0];
} else {
// Cannot read Int32 directly out because offset is not multiple of 4
// Need to slice out the values first
val = new Int32Array(
this.arrayBuffer.slice(this._position, this._position + 4)
)[0];
}
this._position += 4; // one 32 bit int is 4 bytes
return val;
}

View file

@ -154,6 +154,11 @@ class AudioEngine {
// decoder If that fails, attempt to decode as ADPCM
const decoding = decodeAudioData(this.audioContext, bufferCopy1)
.catch(() => {
// If the file is empty, create an empty sound
if (sound.data.length === 0) {
return Promise.resolve(this.audioContext.createBuffer(1, 1, this.audioContext.sampleRate));
}
// The audio context failed to parse the sound data
// we gave it, so try to decode as 'adpcm'