IEqualizer.cpp revision cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/*
2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License.
6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at
7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and
14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License.
15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */
16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* Equalizer implementation */
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten// FIXME move to platform-specific configuration
220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
233a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_PRESETS 3
243a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
2514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi// FIXME needs to be defined in a platform-dependent manner
273a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic const struct EqualizerBand EqualizerBands[MAX_EQ_BANDS] = {
280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {1000, 1500, 2000},
290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {2000, 3000, 4000},
300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {4000, 5500, 7000},
310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    {7000, 8000, 9000}
320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
343a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic const struct EqualizerPreset {
353a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    const char *mName;
363a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
373a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten} EqualizerPresets[MAX_EQ_PRESETS] = {
383a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    {"Default", {0, 0, 0, 0}},
393a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    {"Bass", {500, 200, 100, 0}},
403a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    {"Treble", {0, 100, 200, 500}}
410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
45cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi/**
46cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi * returns true if this interface is not associated with an initialized Equalizer effect
47cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi */
48cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivistatic inline bool NO_EQ(IEqualizer* v) {
49cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi    return (v->mEqEffect == 0);
50cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi}
51cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
52cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_SetEnabled(SLEqualizerItf self, SLboolean enabled)
54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    interface_lock_exclusive(this);
59cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi    this->mEnabled = (SLboolean) enabled;
6014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
63cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi    if (NO_EQ(this)) {
64cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        result = SL_RESULT_CONTROL_LOST;
654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    } else {
66cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        android::status_t status =
67cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi                this->mEqEffect->setEnabled((bool) this->mEnabled);
68cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        result = android_fx_statusToResult(status);
694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    interface_unlock_exclusive(this);
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
75a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_IsEnabled(SLEqualizerItf self, SLboolean *pEnabled)
78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
81cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi      if (NULL == pEnabled) {
82cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          result = SL_RESULT_PARAMETER_INVALID;
83cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi      } else {
84cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          IEqualizer *this = (IEqualizer *) self;
85cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          interface_lock_exclusive(this);
86cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          SLboolean enabled = this->mEnabled;
87cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi  #if !defined(ANDROID) || defined(USE_BACKPORT)
88cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          *pEnabled = enabled;
89cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          result = SL_RESULT_SUCCESS;
90cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi  #else
91cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          if (NO_EQ(this)) {
92cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi              result = SL_RESULT_CONTROL_LOST;
93cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          } else {
94cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi              *pEnabled = (SLboolean) this->mEqEffect->getEnabled();
95cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi              result = SL_RESULT_SUCCESS;
96cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          }
97cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi  #endif
98cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi          interface_unlock_exclusive(this);
99cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi      }
100cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
101cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi      SL_LEAVE_INTERFACE
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
103a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1053a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult IEqualizer_GetNumberOfBands(SLEqualizerItf self, SLuint16 *pNumBands)
106a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumBands) {
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // Note: no lock, but OK because it is const
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumBands = this->mNumBands;
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
122e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IEqualizer_GetBandLevelRange(SLEqualizerItf self, SLmillibel *pMin,
123e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillibel *pMax)
124a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMin && NULL == pMax) {
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // Note: no lock, but OK because it is const
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL != pMin)
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pMin = this->mBandLevelRangeMin;
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL != pMax)
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pMax = this->mBandLevelRangeMax;
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
140a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
141a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1433a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult IEqualizer_SetBandLevel(SLEqualizerItf self, SLuint16 band, SLmillibel level)
144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(this->mBandLevelRangeMin <= level && level <= this->mBandLevelRangeMax) ||
1494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            (band >= this->mNumBands)) {
150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_exclusive(this);
15314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        this->mLevels[band] = level;
155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        this->mPreset = SL_EQUALIZER_UNDEFINED;
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
1574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
158cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        if (NO_EQ(this)) {
1599cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
1604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                android_eq_setParam(this->mEqEffect, EQ_PARAM_BAND_LEVEL, band, &level);
1619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
1629cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
1639cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
1649cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
1654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
1664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        interface_unlock_exclusive(this);
167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
170a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
171a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
173d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEqualizer_GetBandLevel(SLEqualizerItf self, SLuint16 band, SLmillibel *pLevel)
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pLevel) {
178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, no lock needed
182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (band >= this->mNumBands) {
183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
1859cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            SLmillibel level = 0;
1864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_lock_shared(this);
18714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
1884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            level = this->mLevels[band];
189ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
1904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
191cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi            if (NO_EQ(this)) {
1929cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                android::status_t status =
1934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    android_eq_getParam(this->mEqEffect, EQ_PARAM_BAND_LEVEL, band, &level);
1949cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = android_fx_statusToResult(status);
1959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            } else {
1969cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = SL_RESULT_CONTROL_LOST;
1979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            }
1984be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
1994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_unlock_shared(this);
2004be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            *pLevel = level;
201ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
202ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
204ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
205a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
206a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
207ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2083a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult IEqualizer_GetCenterFreq(SLEqualizerItf self, SLuint16 band, SLmilliHertz *pCenter)
209a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
210ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
211ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
212ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pCenter) {
213ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
214ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (band >= this->mNumBands) {
217ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
218ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
21914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
220ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            // Note: no lock, but OK because it is const
221ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pCenter = this->mBands[band].mCenter;
222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
2234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
2249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            SLmilliHertz center = 0;
2254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_lock_shared(this);
226cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi            if (NO_EQ(this)) {
2279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                android::status_t status =
2284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    android_eq_getParam(this->mEqEffect, EQ_PARAM_CENTER_FREQ, band, &center);
2299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = android_fx_statusToResult(status);
2309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            } else {
2319cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = SL_RESULT_CONTROL_LOST;
2329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            }
2334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_unlock_shared(this);
2344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            *pCenter = center;
2354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
236ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
237ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
239ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
240a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
241a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
243a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetBandFreqRange(SLEqualizerItf self, SLuint16 band,
244a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmilliHertz *pMin, SLmilliHertz *pMax)
245a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
247ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
248ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMin && NULL == pMax) {
249ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
250ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
252ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (band >= this->mNumBands) {
253ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
25514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
256ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            // Note: no lock, but OK because it is const
257ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (NULL != pMin)
258ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                *pMin = this->mBands[band].mMin;
259ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (NULL != pMax)
260ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                *pMax = this->mBands[band].mMax;
261ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
2624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
2639cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            SLmilliHertz range[2] = {0, 0}; // SLmilliHertz is SLuint32
2644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_lock_shared(this);
265cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi            if (NO_EQ(this)) {
2669cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                android::status_t status =
2674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    android_eq_getParam(this->mEqEffect, EQ_PARAM_BAND_FREQ_RANGE, band, range);
2689cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = android_fx_statusToResult(status);
2699cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            } else {
2709cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                result = SL_RESULT_CONTROL_LOST;
2719cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            }
2724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            interface_unlock_shared(this);
2734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            if (NULL != pMin) {
2744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                *pMin = range[0];
2754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            }
2764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            if (NULL != pMax) {
2774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                *pMax = range[1];
2784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            }
2794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
280ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
282ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
284a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
285a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
286ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2873a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult IEqualizer_GetBand(SLEqualizerItf self, SLmilliHertz frequency, SLuint16 *pBand)
288a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
289ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
290ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
291ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pBand) {
292ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
293ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
294ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
29514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
296ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // search for band whose center frequency has the closest ratio to 1.0
297ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // assumes bands are unsorted (a pessimistic assumption)
298ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // assumes bands can overlap (a pessimistic assumption)
299ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // assumes a small number of bands, so no need for a fancier algorithm
300ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        const struct EqualizerBand *band;
301ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        float floatFreq = (float) frequency;
302ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        float bestRatio = 0.0;
303ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint16 bestBand = SL_EQUALIZER_UNDEFINED;
304ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        for (band = this->mBands; band < &this->mBands[this->mNumBands]; ++band) {
305ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (!(band->mMin <= frequency && frequency <= band->mMax))
306ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                continue;
307ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            assert(band->mMin <= band->mCenter && band->mCenter <= band->mMax);
308ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            assert(band->mCenter != 0);
309ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            float ratio = frequency <= band->mCenter ?
310ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                floatFreq / band->mCenter : band->mCenter / floatFreq;
311ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (ratio > bestRatio) {
312ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                bestRatio = ratio;
313ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                bestBand = band - this->mBands;
314ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
315a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        }
3167c3fe21525e62f24acc9d391f9d396ce2d7e57acGlenn Kasten        *pBand = bestBand;
317ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
3184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
3199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        uint16_t band = 0;
3204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        interface_lock_shared(this);
321cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        if (NO_EQ(this)) {
3229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
3239cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                android_eq_getParam(this->mEqEffect, EQ_PARAM_GET_BAND, frequency, &band);
3249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
3259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
3269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
3279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
3284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        interface_unlock_shared(this);
3294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        *pBand = (SLuint16)band;
3304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
331a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    }
332ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
333ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
334a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
335a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
336ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
337d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEqualizer_GetCurrentPreset(SLEqualizerItf self, SLuint16 *pPreset)
338a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
339ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
340ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
341ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pPreset) {
342ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
343ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
344ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
345ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_shared(this);
34614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
347ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint16 preset = this->mPreset;
348ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_shared(this);
349ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pPreset = preset;
350ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
3514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
3529cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        uint16_t preset = 0;
353cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        if (NO_EQ(this)) {
3549cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
3559cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                    android_eq_getParam(this->mEqEffect, EQ_PARAM_CUR_PRESET, 0, &preset);
3569cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
3579cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
3589cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
3599cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
3604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        interface_unlock_shared(this);
3619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
3624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        if (preset < 0) {
3634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            *pPreset = SL_EQUALIZER_UNDEFINED;
3644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        } else {
3654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            *pPreset = (SLuint16) preset;
3664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        }
3674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
3684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
369ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
370ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
371ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
372a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
373a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
374ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
375a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_UsePreset(SLEqualizerItf self, SLuint16 index)
376a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
377ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
378ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
379a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
380ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (index >= this->mNumPresets) {
381ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
382ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
383ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_exclusive(this);
38414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
385ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint16 band;
386ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        for (band = 0; band < this->mNumBands; ++band)
387ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            this->mLevels[band] = EqualizerPresets[index].mLevels[band];
388ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        this->mPreset = index;
389ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_exclusive(this);
390ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
3914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
392cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        if (NO_EQ(this)) {
3939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
394b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent                android_eq_setParam(this->mEqEffect, EQ_PARAM_CUR_PRESET, 0, &index);
3959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
3969cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
3979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
3989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
3994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        interface_unlock_shared(this);
4004be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
401ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
402ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
403ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
404a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
405a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
406ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
407d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEqualizer_GetNumberOfPresets(SLEqualizerItf self, SLuint16 *pNumPresets)
408a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
409ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
410ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
411ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumPresets) {
412ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
413ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
414ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
415ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // Note: no lock, but OK because it is const
41614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
417ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumPresets = this->mNumPresets;
4184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
4194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        *pNumPresets = this->mThis->mEngine->mEqNumPresets;
4204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
421ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
422ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
423ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
424ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
425a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
426a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
427ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
428e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IEqualizer_GetPresetName(SLEqualizerItf self, SLuint16 index, const SLchar **ppName)
429a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
430ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
431ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
432ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == ppName) {
433ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
434ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
435ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IEqualizer *this = (IEqualizer *) self;
43614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
437ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (index >= this->mNumPresets) {
438ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
439ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
440ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *ppName = (SLchar *) this->mPresets[index].mName;
441ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
442ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
4434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
4444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        if (index >= this->mThis->mEngine->mEqNumPresets) {
4454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
4464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        } else {
4474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            *ppName = (SLchar *) this->mThis->mEngine->mEqPresetNames[index];
4484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
4494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        }
4504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
451ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
452ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
453ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
454a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
455a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
456ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
457a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLEqualizerItf_ IEqualizer_Itf = {
458a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_SetEnabled,
459a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_IsEnabled,
460a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetNumberOfBands,
461a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandLevelRange,
462a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_SetBandLevel,
463a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandLevel,
464a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetCenterFreq,
465a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandFreqRange,
466a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBand,
467a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetCurrentPreset,
468a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_UsePreset,
469a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetNumberOfPresets,
470a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetPresetName
471a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
472a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
473a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IEqualizer_init(void *self)
474a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
475a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
476a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mItf = &IEqualizer_Itf;
477a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mEnabled = SL_BOOLEAN_FALSE;
4783a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    this->mPreset = SL_EQUALIZER_UNDEFINED;
4794b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#if (0 < MAX_EQ_BANDS)
4800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    unsigned band;
4813a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    for (band = 0; band < MAX_EQ_BANDS; ++band)
4820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        this->mLevels[band] = 0;
4834b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
4843a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    // const fields
4854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    this->mNumPresets = 0;
4864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    this->mNumBands = 0;
48714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
4883a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    this->mBands = EqualizerBands;
4893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    this->mPresets = EqualizerPresets;
4904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
4914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    this->mBandLevelRangeMin = 0;
4924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    this->mBandLevelRangeMax = 0;
4934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
49414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
4954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
496f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (!android_fx_initEffectDescriptor(SL_IID_EQUALIZER, &this->mEqDescriptor)) {
497f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        // EQ init failed
498f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        this->mNumPresets = 0;
499f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        this->mNumBands = 0;
500f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        this->mBandLevelRangeMin = 0;
501f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        this->mBandLevelRangeMax = 0;
502f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
5034be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
504a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
505