diff --git a/src/ArrayBufferStream.js b/src/ArrayBufferStream.js index 86d62f2..92a3e1a 100644 --- a/src/ArrayBufferStream.js +++ b/src/ArrayBufferStream.js @@ -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; } diff --git a/src/AudioEngine.js b/src/AudioEngine.js index db3ddad..c4e5805 100644 --- a/src/AudioEngine.js +++ b/src/AudioEngine.js @@ -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'