1 /*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /* BassBoost implementation */
18
19 #include "sles_allinclusive.h"
20
21 #define BASSBOOST_STRENGTH_MIN 0
22 #define BASSBOOST_STRENGTH_MAX 1000
23
24
25 #if defined(ANDROID) && !defined(USE_BACKPORT)
26 /**
27 * returns true if this interface is not associated with an initialized BassBoost effect
28 */
NO_BASSBOOST(IBassBoost * v)29 static inline bool NO_BASSBOOST(IBassBoost* v) {
30 return (v->mBassBoostEffect == 0);
31 }
32 #endif
33
34
IBassBoost_SetEnabled(SLBassBoostItf self,SLboolean enabled)35 static SLresult IBassBoost_SetEnabled(SLBassBoostItf self, SLboolean enabled)
36 {
37 SL_ENTER_INTERFACE
38
39 IBassBoost *this = (IBassBoost *) self;
40 interface_lock_exclusive(this);
41 this->mEnabled = (SLboolean) enabled;
42 #if !defined(ANDROID) || defined(USE_BACKPORT)
43 result = SL_RESULT_SUCCESS;
44 #else
45 if (NO_BASSBOOST(this)) {
46 result = SL_RESULT_CONTROL_LOST;
47 } else {
48 android::status_t status = this->mBassBoostEffect->setEnabled((bool) this->mEnabled);
49 result = android_fx_statusToResult(status);
50 }
51 #endif
52 interface_unlock_exclusive(this);
53
54 SL_LEAVE_INTERFACE
55 }
56
57
IBassBoost_IsEnabled(SLBassBoostItf self,SLboolean * pEnabled)58 static SLresult IBassBoost_IsEnabled(SLBassBoostItf self, SLboolean *pEnabled)
59 {
60 SL_ENTER_INTERFACE
61
62 if (NULL == pEnabled) {
63 result = SL_RESULT_PARAMETER_INVALID;
64 } else {
65 IBassBoost *this = (IBassBoost *) self;
66 interface_lock_exclusive(this);
67 SLboolean enabled = this->mEnabled;
68 #if !defined(ANDROID) || defined(USE_BACKPORT)
69 *pEnabled = enabled;
70 result = SL_RESULT_SUCCESS;
71 #else
72 if (NO_BASSBOOST(this)) {
73 result = SL_RESULT_CONTROL_LOST;
74 } else {
75 *pEnabled = (SLboolean) this->mBassBoostEffect->getEnabled();
76 result = SL_RESULT_SUCCESS;
77 }
78 #endif
79 interface_unlock_exclusive(this);
80 }
81
82 SL_LEAVE_INTERFACE
83 }
84
85
IBassBoost_SetStrength(SLBassBoostItf self,SLpermille strength)86 static SLresult IBassBoost_SetStrength(SLBassBoostItf self, SLpermille strength)
87 {
88 SL_ENTER_INTERFACE
89
90 if ((BASSBOOST_STRENGTH_MIN > strength) || (BASSBOOST_STRENGTH_MAX < strength)) {
91 result = SL_RESULT_PARAMETER_INVALID;
92 } else {
93 IBassBoost *this = (IBassBoost *) self;
94 interface_lock_exclusive(this);
95 #if !defined(ANDROID) || defined(USE_BACKPORT)
96 this->mStrength = strength;
97 result = SL_RESULT_SUCCESS;
98 #else
99 if (NO_BASSBOOST(this)) {
100 result = SL_RESULT_CONTROL_LOST;
101 } else {
102 android::status_t status =
103 android_bb_setParam(this->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength);
104 result = android_fx_statusToResult(status);
105 }
106 #endif
107 interface_unlock_exclusive(this);
108 }
109
110 SL_LEAVE_INTERFACE
111 }
112
113
IBassBoost_GetRoundedStrength(SLBassBoostItf self,SLpermille * pStrength)114 static SLresult IBassBoost_GetRoundedStrength(SLBassBoostItf self, SLpermille *pStrength)
115 {
116 SL_ENTER_INTERFACE
117
118 if (NULL == pStrength) {
119 result = SL_RESULT_PARAMETER_INVALID;
120 } else {
121 IBassBoost *this = (IBassBoost *) self;
122 interface_lock_exclusive(this);
123 SLpermille strength = this->mStrength;;
124 #if !defined(ANDROID) || defined(USE_BACKPORT)
125 result = SL_RESULT_SUCCESS;
126 #else
127 if (NO_BASSBOOST(this)) {
128 result = SL_RESULT_CONTROL_LOST;
129 } else {
130 android::status_t status =
131 android_bb_getParam(this->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH, &strength);
132 result = android_fx_statusToResult(status);
133 }
134 #endif
135 interface_unlock_exclusive(this);
136 *pStrength = strength;
137 }
138
139 SL_LEAVE_INTERFACE
140 }
141
142
IBassBoost_IsStrengthSupported(SLBassBoostItf self,SLboolean * pSupported)143 static SLresult IBassBoost_IsStrengthSupported(SLBassBoostItf self, SLboolean *pSupported)
144 {
145 SL_ENTER_INTERFACE
146
147 if (NULL == pSupported) {
148 result = SL_RESULT_PARAMETER_INVALID;
149 } else {
150 #if !defined(ANDROID) || defined(USE_BACKPORT)
151 *pSupported = SL_BOOLEAN_TRUE;
152 result = SL_RESULT_SUCCESS;
153 #else
154 IBassBoost *this = (IBassBoost *) self;
155 int32_t supported = 0;
156 interface_lock_exclusive(this);
157 if (NO_BASSBOOST(this)) {
158 result = SL_RESULT_CONTROL_LOST;
159 } else {
160 android::status_t status =
161 android_bb_getParam(this->mBassBoostEffect, BASSBOOST_PARAM_STRENGTH_SUPPORTED,
162 &supported);
163 result = android_fx_statusToResult(status);
164 }
165 interface_unlock_exclusive(this);
166 *pSupported = (SLboolean) (supported != 0);
167 #endif
168 }
169
170 SL_LEAVE_INTERFACE
171 }
172
173
174 static const struct SLBassBoostItf_ IBassBoost_Itf = {
175 IBassBoost_SetEnabled,
176 IBassBoost_IsEnabled,
177 IBassBoost_SetStrength,
178 IBassBoost_GetRoundedStrength,
179 IBassBoost_IsStrengthSupported
180 };
181
IBassBoost_init(void * self)182 void IBassBoost_init(void *self)
183 {
184 IBassBoost *this = (IBassBoost *) self;
185 this->mItf = &IBassBoost_Itf;
186 this->mEnabled = SL_BOOLEAN_FALSE;
187 this->mStrength = 0;
188 #if defined(ANDROID) && !defined(USE_BACKPORT)
189 memset(&this->mBassBoostDescriptor, 0, sizeof(effect_descriptor_t));
190 // placement new (explicit constructor)
191 (void) new (&this->mBassBoostEffect) android::sp<android::AudioEffect>();
192 #endif
193 }
194
IBassBoost_deinit(void * self)195 void IBassBoost_deinit(void *self)
196 {
197 #if defined(ANDROID) && !defined(USE_BACKPORT)
198 IBassBoost *this = (IBassBoost *) self;
199 // explicit destructor
200 this->mBassBoostEffect.~sp();
201 #endif
202 }
203
IBassBoost_Expose(void * self)204 bool IBassBoost_Expose(void *self)
205 {
206 #if defined(ANDROID) && !defined(USE_BACKPORT)
207 IBassBoost *this = (IBassBoost *) self;
208 if (!android_fx_initEffectDescriptor(SL_IID_BASSBOOST, &this->mBassBoostDescriptor)) {
209 SL_LOGE("BassBoost initialization failed.");
210 return false;
211 }
212 #endif
213 return true;
214 }
215