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