2 * Copyright (C) 2011, Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "WaveShaperDSPKernel.h"
31 #include "WaveShaperProcessor.h"
38 void WaveShaperDSPKernel::process(const float* source, float* destination, size_t framesToProcess)
40 ASSERT(source && destination && waveShaperProcessor());
42 Float32Array* curve = waveShaperProcessor()->curve();
44 // Act as "straight wire" pass-through if no curve is set.
45 memcpy(destination, source, sizeof(float) * framesToProcess);
49 float* curveData = curve->data();
50 int curveLength = curve->length();
54 if (!curveData || !curveLength) {
55 memcpy(destination, source, sizeof(float) * framesToProcess);
59 // Apply waveshaping curve.
60 for (unsigned i = 0; i < framesToProcess; ++i) {
61 const float input = source[i];
63 // Calculate an index based on input -1 -> +1 with 0 being at the center of the curve data.
64 int index = curveLength * 0.5 * (input + 1);
66 // Clip index to the input range of the curve.
67 // This takes care of input outside of nominal range -1 -> +1
68 index = max(index, 0);
69 index = min(index, curveLength - 1);
70 destination[i] = curveData[index];
74 } // namespace WebCore
76 #endif // ENABLE(WEB_AUDIO)