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/* BassBoost implementation */
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
2063c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#ifdef ANDROID
21ea429ee1007c36ade812199ad365c0e659e8053fEric Laurent#include <audio_effects/effect_bassboost.h>
2263c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#endif
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#define BASSBOOST_STRENGTH_MIN 0
259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#define BASSBOOST_STRENGTH_MAX 1000
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
27cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
28faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
29cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi/**
30cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi * returns true if this interface is not associated with an initialized BassBoost effect
31cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi */
32cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivistatic inline bool NO_BASSBOOST(IBassBoost* v) {
33cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi    return (v->mBassBoostEffect == 0);
34cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi}
35768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten#endif
36cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
37cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi
38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IBassBoost_SetEnabled(SLBassBoostItf self, SLboolean enabled)
39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
42bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IBassBoost *thiz = (IBassBoost *) self;
43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_exclusive(thiz);
44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mEnabled = (SLboolean) enabled;
45faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
479cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#else
48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (NO_BASSBOOST(thiz)) {
499cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        result = SL_RESULT_CONTROL_LOST;
509cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    } else {
51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        android::status_t status = thiz->mBassBoostEffect->setEnabled((bool) thiz->mEnabled);
529cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        result = android_fx_statusToResult(status);
539cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
549cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_exclusive(thiz);
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IBassBoost_IsEnabled(SLBassBoostItf self, SLboolean *pEnabled)
62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pEnabled) {
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IBassBoost *thiz = (IBassBoost *) self;
69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
70faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
7162496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        SLboolean enabled = thiz->mEnabled;
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pEnabled = enabled;
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
749cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#else
75bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_BASSBOOST(thiz)) {
769cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
779cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            *pEnabled = (SLboolean) thiz->mBassBoostEffect->getEnabled();
799cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_SUCCESS;
809cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
819cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
82bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
86a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
87a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IBassBoost_SetStrength(SLBassBoostItf self, SLpermille strength)
90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if ((BASSBOOST_STRENGTH_MIN > strength) || (BASSBOOST_STRENGTH_MAX < strength)) {
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
96bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IBassBoost *thiz = (IBassBoost *) self;
97bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
98faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
99bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mStrength = strength;
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
1019cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#else
102bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_BASSBOOST(thiz)) {
1039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
1049cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
1059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                android_bb_setParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength);
1079cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
1089cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
1099cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
110bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
114a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
115a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
117d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IBassBoost_GetRoundedStrength(SLBassBoostItf self, SLpermille *pStrength)
118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pStrength) {
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
124bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IBassBoost *thiz = (IBassBoost *) self;
125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille strength = thiz->mStrength;;
127faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
1299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#else
130bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_BASSBOOST(thiz)) {
1319cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
1329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
1339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
134bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                   android_bb_getParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength);
1359cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
1369cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
1379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
1399cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        *pStrength = strength;
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
146d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IBassBoost_IsStrengthSupported(SLBassBoostItf self, SLboolean *pSupported)
147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pSupported) {
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
153faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pSupported = SL_BOOLEAN_TRUE;
155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
1569cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#else
157bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IBassBoost *thiz = (IBassBoost *) self;
1589cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t supported = 0;
159bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
160bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_BASSBOOST(thiz)) {
1619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
1629cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        } else {
1639cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            android::status_t status =
164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                android_bb_getParam(thiz->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH_SUPPORTED,
1659cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi                        &supported);
1669cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            result = android_fx_statusToResult(status);
1679cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
168bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
169cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi        *pSupported = (SLboolean) (supported != 0);
1709cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
175a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
177a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLBassBoostItf_ IBassBoost_Itf = {
178a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IBassBoost_SetEnabled,
179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IBassBoost_IsEnabled,
180a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IBassBoost_SetStrength,
181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IBassBoost_GetRoundedStrength,
182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IBassBoost_IsStrengthSupported
183a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IBassBoost_init(void *self)
186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
187bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IBassBoost *thiz = (IBassBoost *) self;
188bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IBassBoost_Itf;
189bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mEnabled = SL_BOOLEAN_FALSE;
190bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mStrength = 0;
191faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
192bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    memset(&thiz->mBassBoostDescriptor, 0, sizeof(effect_descriptor_t));
193a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // placement new (explicit constructor)
194bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    (void) new (&thiz->mBassBoostEffect) android::sp<android::AudioEffect>();
195a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
196a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
1979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
198a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IBassBoost_deinit(void *self)
199a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
200faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
201bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IBassBoost *thiz = (IBassBoost *) self;
202a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // explicit destructor
203bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mBassBoostEffect.~sp();
204a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
205a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
206a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
207a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IBassBoost_Expose(void *self)
208a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
209faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
210bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IBassBoost *thiz = (IBassBoost *) self;
211bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!android_fx_initEffectDescriptor(SL_IID_BASSBOOST, &thiz->mBassBoostDescriptor)) {
2129cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        SL_LOGE("BassBoost initialization failed.");
213a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten        return false;
2149cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
216a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    return true;
217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
218