summaryrefslogtreecommitdiffstats
path: root/media/libeffects/testlibs/AudioCoefInterpolator.cpp
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2010-07-09 12:28:50 -0700
committerEric Laurent <elaurent@google.com>2010-07-17 06:33:00 -0700
commit2c8e5cab3faa6d360e222b7a6c40a80083d021ac (patch)
treefd19b8baa829edb78116b089d1122ea4ef0921e1 /media/libeffects/testlibs/AudioCoefInterpolator.cpp
parentada2ac8e09b6d3f2b3c3155a852ba0fffae1b592 (diff)
downloadframeworks_av-2c8e5cab3faa6d360e222b7a6c40a80083d021ac.zip
frameworks_av-2c8e5cab3faa6d360e222b7a6c40a80083d021ac.tar.gz
frameworks_av-2c8e5cab3faa6d360e222b7a6c40a80083d021ac.tar.bz2
First submission of audio effect library from NXP software.
This CL contains the first open sourceable version of the audio effect library from NXP software. The effects implemented are: - Bass boost - Virtualizer (stereo widening) - Equalizer - Spectrum analyzer Source file for the effect engines are located under libeffects/lvm/lib The wrapper implementing the interface with the audio effect framework in under libeffects/lvm/wrapper The code of other effect libraries has also been reorganized fo clarity: - the effect factory is now under libeffects/factory - the test equalizer and reverb effects are under libeffect/testlibs - the visualizer is under libeffects/virtualizer Change-Id: I8d91e2181f81b89f8fc0c1e1e6bf552c5809b2eb
Diffstat (limited to 'media/libeffects/testlibs/AudioCoefInterpolator.cpp')
-rw-r--r--media/libeffects/testlibs/AudioCoefInterpolator.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/media/libeffects/testlibs/AudioCoefInterpolator.cpp b/media/libeffects/testlibs/AudioCoefInterpolator.cpp
new file mode 100644
index 0000000..039ab9f
--- /dev/null
+++ b/media/libeffects/testlibs/AudioCoefInterpolator.cpp
@@ -0,0 +1,84 @@
+/* //device/servers/AudioFlinger/AudioCoefInterpolator.cpp
+ **
+ ** Copyright 2008, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include <string.h>
+#include "AudioCoefInterpolator.h"
+
+#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
+#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
+
+namespace android {
+
+AudioCoefInterpolator::AudioCoefInterpolator(size_t nInDims,
+ const size_t inDims[],
+ size_t nOutDims,
+ const audio_coef_t * table) {
+ mNumInDims = nInDims;
+ memcpy(mInDims, inDims, nInDims * sizeof(size_t));
+ mNumOutDims = nOutDims;
+ mTable = table;
+ // Initialize offsets array
+ size_t dim = nInDims - 1;
+ mInDimOffsets[nInDims - 1] = nOutDims;
+ while (dim-- > 0) {
+ mInDimOffsets[dim] = mInDimOffsets[dim + 1] * mInDims[dim + 1];
+ }
+}
+
+void AudioCoefInterpolator::getCoef(const int intCoord[], uint32_t fracCoord[],
+ audio_coef_t out[]) {
+ size_t index = 0;
+ size_t dim = mNumInDims;
+ while (dim-- > 0) {
+ if (UNLIKELY(intCoord[dim] < 0)) {
+ fracCoord[dim] = 0;
+ } else if (UNLIKELY(intCoord[dim] >= (int)mInDims[dim] - 1)) {
+ fracCoord[dim] = 0;
+ index += mInDimOffsets[dim] * (mInDims[dim] - 1);
+ } else {
+ index += mInDimOffsets[dim] * intCoord[dim];
+ }
+ }
+ getCoefRecurse(index, fracCoord, out, 0);
+}
+
+void AudioCoefInterpolator::getCoefRecurse(size_t index,
+ const uint32_t fracCoord[],
+ audio_coef_t out[], size_t dim) {
+ if (dim == mNumInDims) {
+ memcpy(out, mTable + index, mNumOutDims * sizeof(audio_coef_t));
+ } else {
+ getCoefRecurse(index, fracCoord, out, dim + 1);
+ if (LIKELY(fracCoord != 0)) {
+ audio_coef_t tempCoef[MAX_OUT_DIMS];
+ getCoefRecurse(index + mInDimOffsets[dim], fracCoord, tempCoef,
+ dim + 1);
+ size_t d = mNumOutDims;
+ while (d-- > 0) {
+ out[d] = interp(out[d], tempCoef[d], fracCoord[dim]);
+ }
+ }
+ }
+}
+
+audio_coef_t AudioCoefInterpolator::interp(audio_coef_t lo, audio_coef_t hi,
+ uint32_t frac) {
+ int64_t delta = static_cast<int64_t>(hi-lo) * frac;
+ return lo + static_cast<audio_coef_t> (delta >> 32);
+}
+
+}