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