IEqualizer.cpp revision a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697
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
21a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_SetEnabled(SLEqualizerItf self, SLboolean enabled)
22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
25a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mEnabled = enabled;
26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
30a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_IsEnabled(SLEqualizerItf self, SLboolean *pEnabled)
31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
32a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pEnabled)
33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
35a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
36a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLboolean enabled = this->mEnabled;
37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pEnabled = enabled;
39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetNumberOfBands(SLEqualizerItf self,
43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint16 *pNumBands)
44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
45a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pNumBands)
46a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
47a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
48a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // Note: no lock, but OK because it is const
49a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pNumBands = this->mNumBands;
50a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
51a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetBandLevelRange(SLEqualizerItf self,
54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillibel *pMin, SLmillibel *pMax)
55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pMin && NULL == pMax)
57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // Note: no lock, but OK because it is const
60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL != pMin)
61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        *pMin = this->mMin;
62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL != pMax)
63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        *pMax = this->mMax;
64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
65a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_SetBandLevel(SLEqualizerItf self, SLuint16 band,
68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillibel level)
69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
71a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (band >= this->mNumBands)
72a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mLevels[band] = level;
75a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
79a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetBandLevel(SLEqualizerItf self, SLuint16 band,
80a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillibel *pLevel)
81a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
82a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pLevel)
83a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
84a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
85a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (band >= this->mNumBands)
86a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
87a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
88a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillibel level = this->mLevels[band];
89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pLevel = level;
91a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
92a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetCenterFreq(SLEqualizerItf self, SLuint16 band,
95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmilliHertz *pCenter)
96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pCenter)
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (band >= this->mNumBands)
101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // Note: no lock, but OK because it is const
103a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pCenter = this->mBands[band].mCenter;
104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
105a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
106a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
107a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetBandFreqRange(SLEqualizerItf self, SLuint16 band,
108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmilliHertz *pMin, SLmilliHertz *pMax)
109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
110a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pMin && NULL == pMax)
111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
112a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
113a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (band >= this->mNumBands)
114a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
115a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // Note: no lock, but OK because it is const
116a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL != pMin)
117a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        *pMin = this->mBands[band].mMin;
118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL != pMax)
119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        *pMax = this->mBands[band].mMax;
120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetBand(SLEqualizerItf self, SLmilliHertz frequency,
124a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint16 *pBand)
125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
126a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pBand)
127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
128a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
129a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // search for band whose center frequency has the closest ratio to 1.0
130a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // assumes bands are unsorted (a pessimistic assumption)
131a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // assumes bands can overlap (a pessimistic assumption)
132a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // assumes a small number of bands, so no need for a fancier algorithm
133a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    const struct EqualizerBand *band;
134a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    float floatFreq = (float) frequency;
135a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    float bestRatio = 0.0;
136a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint16 bestBand = SL_EQUALIZER_UNDEFINED;
137a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    for (band = this->mBands; band < &this->mBands[this->mNumBands]; ++band) {
138a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        if (!(band->mMin <= frequency && frequency <= band->mMax))
139a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten            continue;
140a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        assert(band->mMin <= band->mCenter && band->mCenter <= band->mMax);
141a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        assert(band->mCenter != 0);
142a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        float ratio = frequency <= band->mCenter ?
143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten            floatFreq / band->mCenter : band->mCenter / floatFreq;
144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        if (ratio > bestRatio) {
145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten            bestRatio = ratio;
146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten            bestBand = band - this->mBands;
147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        }
148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    }
149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pBand = band - this->mBands;
150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
151a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
152a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
153a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetCurrentPreset(SLEqualizerItf self,
154a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint16 *pPreset)
155a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pPreset)
157a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
158a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
159a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pPreset = this->mPreset;
161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
163a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
164a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
165a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_UsePreset(SLEqualizerItf self, SLuint16 index)
166a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
167a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
168a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (index >= this->mNumPresets)
169a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
170a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
171a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mPreset = index;
172a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
173a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
175a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
176a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetNumberOfPresets(SLEqualizerItf self,
177a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint16 *pNumPresets)
178a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pNumPresets)
180a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    // Note: no lock, but OK because it is const
183a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pNumPresets = this->mNumPresets;
184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
187a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEqualizer_GetPresetName(SLEqualizerItf self, SLuint16 index,
188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    const SLchar ** ppName)
189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
190a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == ppName)
191a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
192a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (index >= this->mNumPresets)
194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
195a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *ppName = this->mPresetNames[index];
196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
198a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
199a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLEqualizerItf_ IEqualizer_Itf = {
200a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_SetEnabled,
201a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_IsEnabled,
202a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetNumberOfBands,
203a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandLevelRange,
204a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_SetBandLevel,
205a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandLevel,
206a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetCenterFreq,
207a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBandFreqRange,
208a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetBand,
209a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetCurrentPreset,
210a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_UsePreset,
211a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetNumberOfPresets,
212a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer_GetPresetName
213a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
215a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IEqualizer_init(void *self)
216a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEqualizer *this = (IEqualizer *) self;
218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mItf = &IEqualizer_Itf;
219a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mEnabled = SL_BOOLEAN_FALSE;
220a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mNumBands = 4;
221a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mBandLevelRangeMin = 0;
222a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mBandLevelRangeMax = 1000;
223a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    struct EqualizerBand *band = this->mBands;
224a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    unsigned i;
225a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    for (i = 0; i < this->mNumBands; ++i, ++band) {
226a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        this->mBands[i].mLevel = 0;
227a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        this->mBands[i].mCenter = 0;
228a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        this->mBands[i].mMin = 0;
229a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        this->mBands[i].mMax = 0;
230a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    }
231a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mPreset = 0;
232a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
233