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 /* Virtualizer implementation */
18
19 #include "sles_allinclusive.h"
20 #ifdef ANDROID
21 #include <audio_effects/effect_virtualizer.h>
22 #endif
23
24 #define VIRTUALIZER_STRENGTH_MIN 0
25 #define VIRTUALIZER_STRENGTH_MAX 1000
26
27
28 #if defined(ANDROID)
29 /**
30 * returns true if this interface is not associated with an initialized Virtualizer effect
31 */
NO_VIRTUALIZER(IVirtualizer * v)32 static inline bool NO_VIRTUALIZER(IVirtualizer* v) {
33 return (v->mVirtualizerEffect == 0);
34 }
35 #endif
36
37
IVirtualizer_SetEnabled(SLVirtualizerItf self,SLboolean enabled)38 static SLresult IVirtualizer_SetEnabled(SLVirtualizerItf self, SLboolean enabled)
39 {
40 SL_ENTER_INTERFACE
41
42 IVirtualizer *thiz = (IVirtualizer *) self;
43 interface_lock_exclusive(thiz);
44 thiz->mEnabled = (SLboolean) enabled;
45 #if !defined(ANDROID)
46 result = SL_RESULT_SUCCESS;
47 #else
48 if (NO_VIRTUALIZER(thiz)) {
49 result = SL_RESULT_CONTROL_LOST;
50 } else {
51 android::status_t status =
52 thiz->mVirtualizerEffect->setEnabled((bool) thiz->mEnabled);
53 result = android_fx_statusToResult(status);
54 }
55 #endif
56 interface_unlock_exclusive(thiz);
57
58 SL_LEAVE_INTERFACE
59
60 }
61
62
IVirtualizer_IsEnabled(SLVirtualizerItf self,SLboolean * pEnabled)63 static SLresult IVirtualizer_IsEnabled(SLVirtualizerItf self, SLboolean *pEnabled)
64 {
65 SL_ENTER_INTERFACE
66
67 if (NULL == pEnabled) {
68 result = SL_RESULT_PARAMETER_INVALID;
69 } else {
70 IVirtualizer *thiz = (IVirtualizer *) self;
71 interface_lock_exclusive(thiz);
72 SLboolean enabled = thiz->mEnabled;
73 #if !defined(ANDROID)
74 *pEnabled = enabled;
75 result = SL_RESULT_SUCCESS;
76 #else
77 if (NO_VIRTUALIZER(thiz)) {
78 result = SL_RESULT_CONTROL_LOST;
79 } else {
80 *pEnabled = (SLboolean) thiz->mVirtualizerEffect->getEnabled();
81 result = SL_RESULT_SUCCESS;
82 }
83 #endif
84 interface_unlock_exclusive(thiz);
85 }
86
87 SL_LEAVE_INTERFACE
88 }
89
90
IVirtualizer_SetStrength(SLVirtualizerItf self,SLpermille strength)91 static SLresult IVirtualizer_SetStrength(SLVirtualizerItf self, SLpermille strength)
92 {
93 SL_ENTER_INTERFACE
94
95 if ((VIRTUALIZER_STRENGTH_MIN > strength) || (VIRTUALIZER_STRENGTH_MAX < strength)) {
96 result = SL_RESULT_PARAMETER_INVALID;
97 } else {
98 IVirtualizer *thiz = (IVirtualizer *) self;
99 interface_lock_exclusive(thiz);
100 #if !defined(ANDROID)
101 thiz->mStrength = strength;
102 result = SL_RESULT_SUCCESS;
103 #else
104 if (NO_VIRTUALIZER(thiz)) {
105 result = SL_RESULT_CONTROL_LOST;
106 } else {
107 android::status_t status = android_virt_setParam(thiz->mVirtualizerEffect,
108 VIRTUALIZER_PARAM_STRENGTH, &strength);
109 result = android_fx_statusToResult(status);
110 }
111 #endif
112 interface_unlock_exclusive(thiz);
113 }
114
115 SL_LEAVE_INTERFACE
116 }
117
118
IVirtualizer_GetRoundedStrength(SLVirtualizerItf self,SLpermille * pStrength)119 static SLresult IVirtualizer_GetRoundedStrength(SLVirtualizerItf self, SLpermille *pStrength)
120 {
121 SL_ENTER_INTERFACE
122
123 if (NULL == pStrength) {
124 result = SL_RESULT_PARAMETER_INVALID;
125 } else {
126 IVirtualizer *thiz = (IVirtualizer *) self;
127 interface_lock_exclusive(thiz);
128 SLpermille strength = thiz->mStrength;;
129 #if !defined(ANDROID)
130 result = SL_RESULT_SUCCESS;
131 #else
132 if (NO_VIRTUALIZER(thiz)) {
133 result = SL_RESULT_CONTROL_LOST;
134 } else {
135 android::status_t status = android_virt_getParam(thiz->mVirtualizerEffect,
136 VIRTUALIZER_PARAM_STRENGTH, &strength);
137 result = android_fx_statusToResult(status);
138 }
139 #endif
140 interface_unlock_exclusive(thiz);
141 *pStrength = strength;
142 }
143
144 SL_LEAVE_INTERFACE
145 }
146
147
IVirtualizer_IsStrengthSupported(SLVirtualizerItf self,SLboolean * pSupported)148 static SLresult IVirtualizer_IsStrengthSupported(SLVirtualizerItf self, SLboolean *pSupported)
149 {
150 SL_ENTER_INTERFACE
151
152 if (NULL == pSupported) {
153 result = SL_RESULT_PARAMETER_INVALID;
154 } else {
155 #if !defined(ANDROID)
156 *pSupported = SL_BOOLEAN_TRUE;
157 result = SL_RESULT_SUCCESS;
158 #else
159 IVirtualizer *thiz = (IVirtualizer *) self;
160 int32_t supported = 0;
161 interface_lock_exclusive(thiz);
162 if (NO_VIRTUALIZER(thiz)) {
163 result = SL_RESULT_CONTROL_LOST;
164 } else {
165 android::status_t status =
166 android_virt_getParam(thiz->mVirtualizerEffect,
167 VIRTUALIZER_PARAM_STRENGTH_SUPPORTED, &supported);
168 result = android_fx_statusToResult(status);
169 }
170 interface_unlock_exclusive(thiz);
171 *pSupported = (SLboolean) (supported != 0);
172 #endif
173 }
174
175 SL_LEAVE_INTERFACE
176 }
177
178
179 static const struct SLVirtualizerItf_ IVirtualizer_Itf = {
180 IVirtualizer_SetEnabled,
181 IVirtualizer_IsEnabled,
182 IVirtualizer_SetStrength,
183 IVirtualizer_GetRoundedStrength,
184 IVirtualizer_IsStrengthSupported
185 };
186
IVirtualizer_init(void * self)187 void IVirtualizer_init(void *self)
188 {
189 IVirtualizer *thiz = (IVirtualizer *) self;
190 thiz->mItf = &IVirtualizer_Itf;
191 thiz->mEnabled = SL_BOOLEAN_FALSE;
192 thiz->mStrength = 0;
193 #if defined(ANDROID)
194 memset(&thiz->mVirtualizerDescriptor, 0, sizeof(effect_descriptor_t));
195 // placement new (explicit constructor)
196 (void) new (&thiz->mVirtualizerEffect) android::sp<android::AudioEffect>();
197 #endif
198 }
199
IVirtualizer_deinit(void * self)200 void IVirtualizer_deinit(void *self)
201 {
202 #if defined(ANDROID)
203 IVirtualizer *thiz = (IVirtualizer *) self;
204 // explicit destructor
205 thiz->mVirtualizerEffect.~sp();
206 #endif
207 }
208
IVirtualizer_Expose(void * self)209 bool IVirtualizer_Expose(void *self)
210 {
211 #if defined(ANDROID)
212 IVirtualizer *thiz = (IVirtualizer *) self;
213 if (!android_fx_initEffectDescriptor(SL_IID_VIRTUALIZER, &thiz->mVirtualizerDescriptor)) {
214 SL_LOGE("Virtualizer initialization failed.");
215 return false;
216 }
217 #endif
218 return true;
219 }
220