From 40dc8487f45631c67a10efeb0fc6c3f7e6e17200 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum <eric.rosenbaum@gmail.com> Date: Mon, 22 Jul 2019 17:47:44 -0400 Subject: [PATCH] Fix off-by-one error in reverse effect, add a test --- src/lib/audio/audio-effects.js | 2 +- test/unit/util/audio-effects.test.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib/audio/audio-effects.js b/src/lib/audio/audio-effects.js index b62f55788..8dd551f38 100644 --- a/src/lib/audio/audio-effects.js +++ b/src/lib/audio/audio-effects.js @@ -83,7 +83,7 @@ class AudioEffects { const endSamples = Math.floor(this.trimEndSeconds * buffer.sampleRate); let counter = 0; for (let i = 0; i < bufferLength; i++) { - if (i > startSamples && i < endSamples) { + if (i >= startSamples && i < endSamples) { newBufferData[i] = originalBufferData[endSamples - counter - 1]; counter++; } else { diff --git a/test/unit/util/audio-effects.test.js b/test/unit/util/audio-effects.test.js index ac34f286f..f3d52152a 100644 --- a/test/unit/util/audio-effects.test.js +++ b/test/unit/util/audio-effects.test.js @@ -31,6 +31,25 @@ describe('Audio Effects manager', () => { test.skip('process starts the offline rendering context and returns a promise', () => { // @todo haven't been able to get web audio test api to actually run render }); + + test('reverse effect strictly reverses the samples', () => { + const fakeSound = [1, 2, 3, 4, 5, 6, 7, 8]; + + const fakeBuffer = audioContext.createBuffer(1, 8, 44100); + const bufferData = fakeBuffer.getChannelData(0); + fakeSound.forEach((sample, index) => { + bufferData[index] = sample; + }); + + // Reverse the entire sound + const reverseAll = new AudioEffects(fakeBuffer, 'reverse', 0, 1); + expect(Array.from(reverseAll.buffer.getChannelData(0))).toEqual(fakeSound.reverse()); + + // Reverse part of the sound + const reverseSelection = new AudioEffects(fakeBuffer, 'reverse', 0.25, 0.75); + const selectionReversed = [1, 2, 6, 5, 4, 3, 7, 8]; + expect(Array.from(reverseSelection.buffer.getChannelData(0))).toEqual(selectionReversed); + }); }); describe('Effects', () => { -- GitLab