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, ¢er); 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