182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* 282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * you may not use this file except in compliance with the License. 682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * You may obtain a copy of the License at 782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 1082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * See the License for the specific language governing permissions and 1482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * limitations under the License. 1582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten */ 1682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 1782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* BassBoost implementation */ 1882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 1982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "sles_allinclusive.h" 2062b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#ifdef ANDROID 2196309256bf532b3ce5ad706d7eb60b1dd70bf4b3Eric Laurent#include <audio_effects/effect_bassboost.h> 2262b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#endif 2382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 24339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#define BASSBOOST_STRENGTH_MIN 0 25339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#define BASSBOOST_STRENGTH_MAX 1000 26f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 27f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi 280b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID) 29f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi/** 30f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi * returns true if this interface is not associated with an initialized BassBoost effect 31f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi */ 32f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivistatic inline bool NO_BASSBOOST(IBassBoost* v) { 33f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi return (v->mBassBoostEffect == 0); 34f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi} 35bc1596c33e134859d3ae3182d641b2dd03405b5dGlenn Kasten#endif 36f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi 37f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi 3882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IBassBoost_SetEnabled(SLBassBoostItf self, SLboolean enabled) 3982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 40f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 41f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 4250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 4350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 4450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mEnabled = (SLboolean) enabled; 450b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID) 46f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 47339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#else 4850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (NO_BASSBOOST(thiz)) { 49339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 50339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 5150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten android::status_t status = thiz->mBassBoostEffect->setEnabled((bool) thiz->mEnabled); 52339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = android_fx_statusToResult(status); 53339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 54339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 5550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 56f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 57f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 5882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 5982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 60f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 6182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IBassBoost_IsEnabled(SLBassBoostItf self, SLboolean *pEnabled) 6282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 63f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 64f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 65f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pEnabled) { 66f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 67f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 6850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 6950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 7050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten SLboolean enabled = thiz->mEnabled; 710b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID) 72f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten *pEnabled = enabled; 73f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 74339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#else 7550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (NO_BASSBOOST(thiz)) { 76339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 77339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 7850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten *pEnabled = (SLboolean) thiz->mBassBoostEffect->getEnabled(); 79339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_SUCCESS; 80339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 81339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 8250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 83f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 84f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 85f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 8682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 8782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 88f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 8982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IBassBoost_SetStrength(SLBassBoostItf self, SLpermille strength) 9082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 91f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 92f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 93339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if ((BASSBOOST_STRENGTH_MIN > strength) || (BASSBOOST_STRENGTH_MAX < strength)) { 94f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 95f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 9650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 9750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 980b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID) 9950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mStrength = strength; 100f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 101339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#else 10250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (NO_BASSBOOST(thiz)) { 103339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 104339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 105339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi android::status_t status = 10650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten android_bb_setParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength); 107339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = android_fx_statusToResult(status); 108339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 109339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 11050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 111f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 112f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 113f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 11482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 11582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 116f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 117437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IBassBoost_GetRoundedStrength(SLBassBoostItf self, SLpermille *pStrength) 11882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 119f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 120f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 121f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pStrength) { 122f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 123f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 12450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 12550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 12650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten SLpermille strength = thiz->mStrength;; 1270b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID) 128f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 129339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#else 13050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (NO_BASSBOOST(thiz)) { 131339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 132339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 133339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi android::status_t status = 13450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten android_bb_getParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength); 135339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = android_fx_statusToResult(status); 136339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 137339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 13850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 139339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi *pStrength = strength; 140f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 141f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 142f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 14382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 14482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 145f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 146437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IBassBoost_IsStrengthSupported(SLBassBoostItf self, SLboolean *pSupported) 14782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 148f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 149f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 150f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pSupported) { 151f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 152f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 1530b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID) 154f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten *pSupported = SL_BOOLEAN_TRUE; 155f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 156339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#else 15750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 158339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi int32_t supported = 0; 15950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 16050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (NO_BASSBOOST(thiz)) { 161339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 162339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 163339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi android::status_t status = 16450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten android_bb_getParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH_SUPPORTED, 165339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi &supported); 166339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = android_fx_statusToResult(status); 167339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 16850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 169f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi *pSupported = (SLboolean) (supported != 0); 170339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 171f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 172f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 173f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 17482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 17582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 176f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 17782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic const struct SLBassBoostItf_ IBassBoost_Itf = { 17882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten IBassBoost_SetEnabled, 17982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten IBassBoost_IsEnabled, 18082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten IBassBoost_SetStrength, 18182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten IBassBoost_GetRoundedStrength, 18282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten IBassBoost_IsStrengthSupported 18382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}; 18482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 18582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenvoid IBassBoost_init(void *self) 18682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 18750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 18850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mItf = &IBassBoost_Itf; 18950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mEnabled = SL_BOOLEAN_FALSE; 19050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mStrength = 0; 1910b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID) 19250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten memset(&thiz->mBassBoostDescriptor, 0, sizeof(effect_descriptor_t)); 1932a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // placement new (explicit constructor) 19450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten (void) new (&thiz->mBassBoostEffect) android::sp<android::AudioEffect>(); 1952a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif 1962a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten} 197339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 1982a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenvoid IBassBoost_deinit(void *self) 1992a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{ 2000b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID) 20150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 2022a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten // explicit destructor 20350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mBassBoostEffect.~sp(); 2042a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif 2052a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten} 2062a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten 2072a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenbool IBassBoost_Expose(void *self) 2082a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{ 2090b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID) 21050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten IBassBoost *thiz = (IBassBoost *) self; 21150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten if (!android_fx_initEffectDescriptor(SL_IID_BASSBOOST, &thiz->mBassBoostDescriptor)) { 212339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SL_LOGE("BassBoost initialization failed."); 2132a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten return false; 214339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 215339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#endif 2162a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten return true; 21782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 218