blob: a9b7062509b28ef7e6b4db0f5f6a8e4d11ef7b2a [file] [log] [blame]
Eric Laurent948235c2010-06-09 00:17:29 -07001/*
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#include <stdio.h>
18
19//#define LOG_NDEBUG 0
20#define LOG_TAG "AudioEffects-JNI"
21
22#include <utils/Log.h>
23#include <nativehelper/jni.h>
24#include <nativehelper/JNIHelp.h>
25#include <android_runtime/AndroidRuntime.h>
26#include "media/AudioEffect.h"
27
Svet Ganovfa5ecdc2015-04-28 12:03:28 -070028#include <ScopedUtfChars.h>
29
Eric Laurent948235c2010-06-09 00:17:29 -070030using namespace android;
31
32#define AUDIOEFFECT_SUCCESS 0
Chih-Hung Hsieh0ca16ef2016-05-19 15:14:54 -070033#define AUDIOEFFECT_ERROR (-1)
34#define AUDIOEFFECT_ERROR_ALREADY_EXISTS (-2)
35#define AUDIOEFFECT_ERROR_NO_INIT (-3)
36#define AUDIOEFFECT_ERROR_BAD_VALUE (-4)
37#define AUDIOEFFECT_ERROR_INVALID_OPERATION (-5)
38#define AUDIOEFFECT_ERROR_NO_MEMORY (-6)
39#define AUDIOEFFECT_ERROR_DEAD_OBJECT (-7)
Eric Laurent948235c2010-06-09 00:17:29 -070040
41// ----------------------------------------------------------------------------
Eric Laurent1a5149e2010-09-21 18:18:20 -070042static const char* const kClassPathName = "android/media/audiofx/AudioEffect";
Eric Laurent948235c2010-06-09 00:17:29 -070043
44struct fields_t {
45 // these fields provide access from C++ to the...
46 jclass clazzEffect; // AudioEffect class
47 jmethodID midPostNativeEvent; // event post callback method
48 jfieldID fidNativeAudioEffect; // stores in Java the native AudioEffect object
49 jfieldID fidJniData; // stores in Java additional resources used by the native AudioEffect
50 jclass clazzDesc; // AudioEffect.Descriptor class
51 jmethodID midDescCstor; // AudioEffect.Descriptor class constructor
52};
53static fields_t fields;
54
55struct effect_callback_cookie {
56 jclass audioEffect_class; // AudioEffect class
57 jobject audioEffect_ref; // AudioEffect object instance
58 };
59
60// ----------------------------------------------------------------------------
61class AudioEffectJniStorage {
62 public:
63 effect_callback_cookie mCallbackData;
64
65 AudioEffectJniStorage() {
66 }
67
68 ~AudioEffectJniStorage() {
69 }
70
71};
72
73
74static jint translateError(int code) {
75 switch(code) {
76 case NO_ERROR:
77 return AUDIOEFFECT_SUCCESS;
78 case ALREADY_EXISTS:
79 return AUDIOEFFECT_ERROR_ALREADY_EXISTS;
80 case NO_INIT:
81 return AUDIOEFFECT_ERROR_NO_INIT;
82 case BAD_VALUE:
83 return AUDIOEFFECT_ERROR_BAD_VALUE;
84 case INVALID_OPERATION:
85 return AUDIOEFFECT_ERROR_INVALID_OPERATION;
86 case NO_MEMORY:
87 return AUDIOEFFECT_ERROR_NO_MEMORY;
88 case DEAD_OBJECT:
89 return AUDIOEFFECT_ERROR_DEAD_OBJECT;
90 default:
91 return AUDIOEFFECT_ERROR;
92 }
93}
94
Eric Laurent76f81332015-06-04 16:20:47 -070095static Mutex sLock;
Eric Laurent948235c2010-06-09 00:17:29 -070096
97// ----------------------------------------------------------------------------
98static void effectCallback(int event, void* user, void *info) {
99
100 effect_param_t *p;
101 int arg1 = 0;
102 int arg2 = 0;
103 jobject obj = NULL;
104 jbyteArray array = NULL;
105 jbyte *bytes;
106 bool param;
107 size_t size;
108
109 effect_callback_cookie *callbackInfo = (effect_callback_cookie *)user;
110 JNIEnv *env = AndroidRuntime::getJNIEnv();
111
Steve Block71f2cf12011-10-20 11:56:00 +0100112 ALOGV("effectCallback: callbackInfo %p, audioEffect_ref %p audioEffect_class %p",
Eric Laurent948235c2010-06-09 00:17:29 -0700113 callbackInfo,
114 callbackInfo->audioEffect_ref,
115 callbackInfo->audioEffect_class);
116
117 if (!user || !env) {
Steve Block8564c8d2012-01-05 23:22:43 +0000118 ALOGW("effectCallback error user %p, env %p", user, env);
Eric Laurent948235c2010-06-09 00:17:29 -0700119 return;
120 }
121
122 switch (event) {
123 case AudioEffect::EVENT_CONTROL_STATUS_CHANGED:
124 if (info == 0) {
Steve Block8564c8d2012-01-05 23:22:43 +0000125 ALOGW("EVENT_CONTROL_STATUS_CHANGED info == NULL");
Eric Laurent948235c2010-06-09 00:17:29 -0700126 goto effectCallback_Exit;
127 }
128 param = *(bool *)info;
129 arg1 = (int)param;
Steve Block71f2cf12011-10-20 11:56:00 +0100130 ALOGV("EVENT_CONTROL_STATUS_CHANGED");
Eric Laurent948235c2010-06-09 00:17:29 -0700131 break;
132 case AudioEffect::EVENT_ENABLE_STATUS_CHANGED:
133 if (info == 0) {
Steve Block8564c8d2012-01-05 23:22:43 +0000134 ALOGW("EVENT_ENABLE_STATUS_CHANGED info == NULL");
Eric Laurent948235c2010-06-09 00:17:29 -0700135 goto effectCallback_Exit;
136 }
137 param = *(bool *)info;
138 arg1 = (int)param;
Steve Block71f2cf12011-10-20 11:56:00 +0100139 ALOGV("EVENT_ENABLE_STATUS_CHANGED");
Eric Laurent948235c2010-06-09 00:17:29 -0700140 break;
141 case AudioEffect::EVENT_PARAMETER_CHANGED:
142 if (info == 0) {
Steve Block8564c8d2012-01-05 23:22:43 +0000143 ALOGW("EVENT_PARAMETER_CHANGED info == NULL");
Eric Laurent948235c2010-06-09 00:17:29 -0700144 goto effectCallback_Exit;
145 }
146 p = (effect_param_t *)info;
147 if (p->psize == 0 || p->vsize == 0) {
148 goto effectCallback_Exit;
149 }
150 // arg1 contains offset of parameter value from start of byte array
151 arg1 = sizeof(effect_param_t) + ((p->psize - 1) / sizeof(int) + 1) * sizeof(int);
152 size = arg1 + p->vsize;
153 array = env->NewByteArray(size);
154 if (array == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000155 ALOGE("effectCallback: Couldn't allocate byte array for parameter data");
Eric Laurent948235c2010-06-09 00:17:29 -0700156 goto effectCallback_Exit;
157 }
158 bytes = env->GetByteArrayElements(array, NULL);
159 memcpy(bytes, p, size);
160 env->ReleaseByteArrayElements(array, bytes, 0);
161 obj = array;
Steve Block71f2cf12011-10-20 11:56:00 +0100162 ALOGV("EVENT_PARAMETER_CHANGED");
Eric Laurent948235c2010-06-09 00:17:29 -0700163 break;
164 case AudioEffect::EVENT_ERROR:
Steve Block8564c8d2012-01-05 23:22:43 +0000165 ALOGW("EVENT_ERROR");
Eric Laurent948235c2010-06-09 00:17:29 -0700166 break;
167 }
168
169 env->CallStaticVoidMethod(
170 callbackInfo->audioEffect_class,
171 fields.midPostNativeEvent,
172 callbackInfo->audioEffect_ref, event, arg1, arg2, obj);
173
174effectCallback_Exit:
175 if (array) {
176 env->DeleteLocalRef(array);
177 }
178
179 if (env->ExceptionCheck()) {
180 env->ExceptionDescribe();
181 env->ExceptionClear();
182 }
183}
184
185// ----------------------------------------------------------------------------
Eric Laurent76f81332015-06-04 16:20:47 -0700186
187static sp<AudioEffect> getAudioEffect(JNIEnv* env, jobject thiz)
188{
189 Mutex::Autolock l(sLock);
190 AudioEffect* const ae =
191 (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect);
192 return sp<AudioEffect>(ae);
193}
194
195static sp<AudioEffect> setAudioEffect(JNIEnv* env, jobject thiz,
196 const sp<AudioEffect>& ae)
197{
198 Mutex::Autolock l(sLock);
199 sp<AudioEffect> old =
200 (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect);
201 if (ae.get()) {
202 ae->incStrong((void*)setAudioEffect);
203 }
204 if (old != 0) {
205 old->decStrong((void*)setAudioEffect);
206 }
207 env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)ae.get());
208 return old;
209}
210
211// ----------------------------------------------------------------------------
Eric Laurent948235c2010-06-09 00:17:29 -0700212// This function gets some field IDs, which in turn causes class initialization.
213// It is called from a static block in AudioEffect, which won't run until the
214// first time an instance of this class is used.
215static void
216android_media_AudioEffect_native_init(JNIEnv *env)
217{
218
Steve Block71f2cf12011-10-20 11:56:00 +0100219 ALOGV("android_media_AudioEffect_native_init");
Eric Laurent948235c2010-06-09 00:17:29 -0700220
221 fields.clazzEffect = NULL;
222 fields.clazzDesc = NULL;
223
224 // Get the AudioEffect class
225 jclass clazz = env->FindClass(kClassPathName);
226 if (clazz == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000227 ALOGE("Can't find %s", kClassPathName);
Eric Laurent948235c2010-06-09 00:17:29 -0700228 return;
229 }
230
231 fields.clazzEffect = (jclass)env->NewGlobalRef(clazz);
232
233 // Get the postEvent method
234 fields.midPostNativeEvent = env->GetStaticMethodID(
235 fields.clazzEffect,
236 "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V");
237 if (fields.midPostNativeEvent == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000238 ALOGE("Can't find AudioEffect.%s", "postEventFromNative");
Eric Laurent948235c2010-06-09 00:17:29 -0700239 return;
240 }
241
242 // Get the variables fields
243 // nativeTrackInJavaObj
244 fields.fidNativeAudioEffect = env->GetFieldID(
245 fields.clazzEffect,
Ashok Bhatea7861c2013-12-17 12:42:00 +0000246 "mNativeAudioEffect", "J");
Eric Laurent948235c2010-06-09 00:17:29 -0700247 if (fields.fidNativeAudioEffect == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000248 ALOGE("Can't find AudioEffect.%s", "mNativeAudioEffect");
Eric Laurent948235c2010-06-09 00:17:29 -0700249 return;
250 }
251 // fidJniData;
252 fields.fidJniData = env->GetFieldID(
253 fields.clazzEffect,
Ashok Bhatea7861c2013-12-17 12:42:00 +0000254 "mJniData", "J");
Eric Laurent948235c2010-06-09 00:17:29 -0700255 if (fields.fidJniData == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000256 ALOGE("Can't find AudioEffect.%s", "mJniData");
Eric Laurent948235c2010-06-09 00:17:29 -0700257 return;
258 }
259
Eric Laurent1a5149e2010-09-21 18:18:20 -0700260 clazz = env->FindClass("android/media/audiofx/AudioEffect$Descriptor");
Eric Laurent948235c2010-06-09 00:17:29 -0700261 if (clazz == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000262 ALOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class");
Eric Laurent948235c2010-06-09 00:17:29 -0700263 return;
264 }
265 fields.clazzDesc = (jclass)env->NewGlobalRef(clazz);
266
267 fields.midDescCstor
268 = env->GetMethodID(
269 fields.clazzDesc,
270 "<init>",
271 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
272 if (fields.midDescCstor == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000273 ALOGE("Can't find android/media/audiofx/AudioEffect$Descriptor class constructor");
Eric Laurent948235c2010-06-09 00:17:29 -0700274 return;
275 }
276}
277
278
279static jint
280android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
Svet Ganovfa5ecdc2015-04-28 12:03:28 -0700281 jstring type, jstring uuid, jint priority, jint sessionId, jintArray jId,
282 jobjectArray javadesc, jstring opPackageName)
Eric Laurent948235c2010-06-09 00:17:29 -0700283{
Steve Block71f2cf12011-10-20 11:56:00 +0100284 ALOGV("android_media_AudioEffect_native_setup");
Eric Laurent948235c2010-06-09 00:17:29 -0700285 AudioEffectJniStorage* lpJniStorage = NULL;
286 int lStatus = AUDIOEFFECT_ERROR_NO_MEMORY;
Eric Laurent76f81332015-06-04 16:20:47 -0700287 sp<AudioEffect> lpAudioEffect;
Eric Laurent948235c2010-06-09 00:17:29 -0700288 jint* nId = NULL;
289 const char *typeStr = NULL;
290 const char *uuidStr = NULL;
291 effect_descriptor_t desc;
292 jobject jdesc;
293 char str[EFFECT_STRING_LEN_MAX];
294 jstring jdescType;
295 jstring jdescUuid;
296 jstring jdescConnect;
297 jstring jdescName;
298 jstring jdescImplementor;
299
Svet Ganovfa5ecdc2015-04-28 12:03:28 -0700300 ScopedUtfChars opPackageNameStr(env, opPackageName);
301
Eric Laurent76f81332015-06-04 16:20:47 -0700302 setAudioEffect(env, thiz, 0);
303
Eric Laurent948235c2010-06-09 00:17:29 -0700304 if (type != NULL) {
305 typeStr = env->GetStringUTFChars(type, NULL);
306 if (typeStr == NULL) { // Out of memory
307 jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
308 goto setup_failure;
309 }
310 }
311
312 if (uuid != NULL) {
313 uuidStr = env->GetStringUTFChars(uuid, NULL);
314 if (uuidStr == NULL) { // Out of memory
315 jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
316 goto setup_failure;
317 }
318 }
319
320 if (typeStr == NULL && uuidStr == NULL) {
321 lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
322 goto setup_failure;
323 }
324
325 lpJniStorage = new AudioEffectJniStorage();
326 if (lpJniStorage == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000327 ALOGE("setup: Error creating JNI Storage");
Eric Laurent948235c2010-06-09 00:17:29 -0700328 goto setup_failure;
329 }
330
331 lpJniStorage->mCallbackData.audioEffect_class = (jclass)env->NewGlobalRef(fields.clazzEffect);
332 // we use a weak reference so the AudioEffect object can be garbage collected.
333 lpJniStorage->mCallbackData.audioEffect_ref = env->NewGlobalRef(weak_this);
334
Steve Block71f2cf12011-10-20 11:56:00 +0100335 ALOGV("setup: lpJniStorage: %p audioEffect_ref %p audioEffect_class %p, &mCallbackData %p",
Eric Laurent948235c2010-06-09 00:17:29 -0700336 lpJniStorage,
337 lpJniStorage->mCallbackData.audioEffect_ref,
338 lpJniStorage->mCallbackData.audioEffect_class,
339 &lpJniStorage->mCallbackData);
340
Eric Laurent2fb43ef2010-09-24 12:03:36 -0700341 if (jId == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000342 ALOGE("setup: NULL java array for id pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700343 lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
344 goto setup_failure;
345 }
346
347 // create the native AudioEffect object
348 lpAudioEffect = new AudioEffect(typeStr,
Svet Ganovfa5ecdc2015-04-28 12:03:28 -0700349 String16(opPackageNameStr.c_str()),
Eric Laurent948235c2010-06-09 00:17:29 -0700350 uuidStr,
351 priority,
352 effectCallback,
353 &lpJniStorage->mCallbackData,
Glenn Kasten33b84042016-03-08 12:02:55 -0800354 (audio_session_t) sessionId,
Jean-Michel Trivi4cb15cf2010-07-09 12:11:49 -0700355 0);
Eric Laurent76f81332015-06-04 16:20:47 -0700356 if (lpAudioEffect == 0) {
Steve Block3762c312012-01-06 19:20:56 +0000357 ALOGE("Error creating AudioEffect");
Eric Laurent948235c2010-06-09 00:17:29 -0700358 goto setup_failure;
359 }
360
361 lStatus = translateError(lpAudioEffect->initCheck());
362 if (lStatus != AUDIOEFFECT_SUCCESS && lStatus != AUDIOEFFECT_ERROR_ALREADY_EXISTS) {
Steve Block3762c312012-01-06 19:20:56 +0000363 ALOGE("AudioEffect initCheck failed %d", lStatus);
Eric Laurent948235c2010-06-09 00:17:29 -0700364 goto setup_failure;
365 }
366
Eric Laurent2fb43ef2010-09-24 12:03:36 -0700367 nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL);
368 if (nId == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000369 ALOGE("setup: Error retrieving id pointer");
Eric Laurent2fb43ef2010-09-24 12:03:36 -0700370 lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
371 goto setup_failure;
372 }
Eric Laurent948235c2010-06-09 00:17:29 -0700373 nId[0] = lpAudioEffect->id();
Eric Laurent948235c2010-06-09 00:17:29 -0700374 env->ReleasePrimitiveArrayCritical(jId, nId, 0);
375 nId = NULL;
376
377 if (typeStr) {
378 env->ReleaseStringUTFChars(type, typeStr);
379 typeStr = NULL;
380 }
381
382 if (uuidStr) {
383 env->ReleaseStringUTFChars(uuid, uuidStr);
384 uuidStr = NULL;
385 }
386
387 // get the effect descriptor
388 desc = lpAudioEffect->descriptor();
389
390 AudioEffect::guidToString(&desc.type, str, EFFECT_STRING_LEN_MAX);
391 jdescType = env->NewStringUTF(str);
392
393 AudioEffect::guidToString(&desc.uuid, str, EFFECT_STRING_LEN_MAX);
394 jdescUuid = env->NewStringUTF(str);
395
396 if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
397 jdescConnect = env->NewStringUTF("Auxiliary");
Eric Laurent09f17352011-08-11 17:06:10 -0700398 } else if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC) {
399 jdescConnect = env->NewStringUTF("Pre Processing");
Eric Laurent948235c2010-06-09 00:17:29 -0700400 } else {
401 jdescConnect = env->NewStringUTF("Insert");
402 }
403
404 jdescName = env->NewStringUTF(desc.name);
405 jdescImplementor = env->NewStringUTF(desc.implementor);
406
407 jdesc = env->NewObject(fields.clazzDesc,
408 fields.midDescCstor,
409 jdescType,
410 jdescUuid,
411 jdescConnect,
412 jdescName,
413 jdescImplementor);
414 env->DeleteLocalRef(jdescType);
415 env->DeleteLocalRef(jdescUuid);
416 env->DeleteLocalRef(jdescConnect);
417 env->DeleteLocalRef(jdescName);
418 env->DeleteLocalRef(jdescImplementor);
419 if (jdesc == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000420 ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
Eric Laurent948235c2010-06-09 00:17:29 -0700421 goto setup_failure;
422 }
423
424 env->SetObjectArrayElement(javadesc, 0, jdesc);
425
Eric Laurent76f81332015-06-04 16:20:47 -0700426 setAudioEffect(env, thiz, lpAudioEffect);
Eric Laurent948235c2010-06-09 00:17:29 -0700427
Ashok Bhatea7861c2013-12-17 12:42:00 +0000428 env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage);
Eric Laurent948235c2010-06-09 00:17:29 -0700429
Ashok Bhatea7861c2013-12-17 12:42:00 +0000430 return (jint) AUDIOEFFECT_SUCCESS;
Eric Laurent948235c2010-06-09 00:17:29 -0700431
432 // failures:
433setup_failure:
434
435 if (nId != NULL) {
436 env->ReleasePrimitiveArrayCritical(jId, nId, 0);
437 }
438
Eric Laurent948235c2010-06-09 00:17:29 -0700439 if (lpJniStorage) {
Eric Laurent76f81332015-06-04 16:20:47 -0700440 env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class);
441 env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref);
Eric Laurent948235c2010-06-09 00:17:29 -0700442 delete lpJniStorage;
443 }
Ashok Bhatea7861c2013-12-17 12:42:00 +0000444 env->SetLongField(thiz, fields.fidJniData, 0);
Eric Laurent948235c2010-06-09 00:17:29 -0700445
446 if (uuidStr != NULL) {
447 env->ReleaseStringUTFChars(uuid, uuidStr);
448 }
449
450 if (typeStr != NULL) {
451 env->ReleaseStringUTFChars(type, typeStr);
452 }
453
Ashok Bhatea7861c2013-12-17 12:42:00 +0000454 return (jint)lStatus;
Eric Laurent948235c2010-06-09 00:17:29 -0700455}
456
457
458// ----------------------------------------------------------------------------
Eric Laurent76f81332015-06-04 16:20:47 -0700459static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) {
460 sp<AudioEffect> lpAudioEffect = setAudioEffect(env, thiz, 0);
461 if (lpAudioEffect == 0) {
462 return;
Eric Laurent948235c2010-06-09 00:17:29 -0700463 }
464
465 // delete the JNI data
Eric Laurent76f81332015-06-04 16:20:47 -0700466 AudioEffectJniStorage* lpJniStorage =
467 (AudioEffectJniStorage *)env->GetLongField(thiz, fields.fidJniData);
468
469 // reset the native resources in the Java object so any attempt to access
470 // them after a call to release fails.
471 env->SetLongField(thiz, fields.fidJniData, 0);
472
Eric Laurent948235c2010-06-09 00:17:29 -0700473 if (lpJniStorage) {
Ashok Bhatea7861c2013-12-17 12:42:00 +0000474 ALOGV("deleting pJniStorage: %p\n", lpJniStorage);
Eric Laurent07799982015-06-19 09:13:02 -0700475 env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class);
476 env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref);
Eric Laurent948235c2010-06-09 00:17:29 -0700477 delete lpJniStorage;
478 }
479}
480
481// ----------------------------------------------------------------------------
Eric Laurent76f81332015-06-04 16:20:47 -0700482static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) {
483 ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz);
484 android_media_AudioEffect_native_release(env, thiz);
Eric Laurent948235c2010-06-09 00:17:29 -0700485}
486
Eric Laurent948235c2010-06-09 00:17:29 -0700487static jint
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700488android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled)
Eric Laurent948235c2010-06-09 00:17:29 -0700489{
Eric Laurent76f81332015-06-04 16:20:47 -0700490 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
491 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700492 jniThrowException(env, "java/lang/IllegalStateException",
493 "Unable to retrieve AudioEffect pointer for enable()");
494 return AUDIOEFFECT_ERROR_NO_INIT;
495 }
496
Ashok Bhatea7861c2013-12-17 12:42:00 +0000497 return (jint) translateError(lpAudioEffect->setEnabled(enabled));
Eric Laurent948235c2010-06-09 00:17:29 -0700498}
499
Eric Laurent948235c2010-06-09 00:17:29 -0700500static jboolean
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700501android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz)
Eric Laurent948235c2010-06-09 00:17:29 -0700502{
Eric Laurent76f81332015-06-04 16:20:47 -0700503 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
504 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700505 jniThrowException(env, "java/lang/IllegalStateException",
506 "Unable to retrieve AudioEffect pointer for getEnabled()");
Ashok Bhatea7861c2013-12-17 12:42:00 +0000507 return JNI_FALSE;
Eric Laurent948235c2010-06-09 00:17:29 -0700508 }
509
Ashok Bhatea7861c2013-12-17 12:42:00 +0000510 if (lpAudioEffect->getEnabled()) {
511 return JNI_TRUE;
512 } else {
513 return JNI_FALSE;
514 }
Eric Laurent948235c2010-06-09 00:17:29 -0700515}
516
517
518static jboolean
519android_media_AudioEffect_native_hasControl(JNIEnv *env, jobject thiz)
520{
Eric Laurent76f81332015-06-04 16:20:47 -0700521 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
522 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700523 jniThrowException(env, "java/lang/IllegalStateException",
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700524 "Unable to retrieve AudioEffect pointer for hasControl()");
Ashok Bhatea7861c2013-12-17 12:42:00 +0000525 return JNI_FALSE;
Eric Laurent948235c2010-06-09 00:17:29 -0700526 }
527
528 if (lpAudioEffect->initCheck() == NO_ERROR) {
Ashok Bhatea7861c2013-12-17 12:42:00 +0000529 return JNI_TRUE;
Eric Laurent948235c2010-06-09 00:17:29 -0700530 } else {
Ashok Bhatea7861c2013-12-17 12:42:00 +0000531 return JNI_FALSE;
Eric Laurent948235c2010-06-09 00:17:29 -0700532 }
533}
534
535static jint android_media_AudioEffect_native_setParameter(JNIEnv *env,
Ashok Bhatea7861c2013-12-17 12:42:00 +0000536 jobject thiz, jint psize, jbyteArray pJavaParam, jint vsize,
Eric Laurent948235c2010-06-09 00:17:29 -0700537 jbyteArray pJavaValue) {
538 // retrieve the AudioEffect object
539 jbyte* lpValue = NULL;
540 jbyte* lpParam = NULL;
541 jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
542 effect_param_t *p;
543 int voffset;
544
Eric Laurent76f81332015-06-04 16:20:47 -0700545 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
546 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700547 jniThrowException(env, "java/lang/IllegalStateException",
548 "Unable to retrieve AudioEffect pointer for setParameter()");
549 return AUDIOEFFECT_ERROR_NO_INIT;
550 }
551
552 if (psize == 0 || vsize == 0 || pJavaParam == NULL || pJavaValue == NULL) {
553 return AUDIOEFFECT_ERROR_BAD_VALUE;
554 }
555
556 // get the pointer for the param from the java array
557 lpParam = (jbyte *) env->GetPrimitiveArrayCritical(pJavaParam, NULL);
558 if (lpParam == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000559 ALOGE("setParameter: Error retrieving param pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700560 goto setParameter_Exit;
561 }
562
563 // get the pointer for the value from the java array
564 lpValue = (jbyte *) env->GetPrimitiveArrayCritical(pJavaValue, NULL);
565 if (lpValue == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000566 ALOGE("setParameter: Error retrieving value pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700567 goto setParameter_Exit;
568 }
569
570 voffset = ((psize - 1) / sizeof(int) + 1) * sizeof(int);
571 p = (effect_param_t *) malloc(sizeof(effect_param_t) + voffset + vsize);
572 memcpy(p->data, lpParam, psize);
573 p->psize = psize;
Eric Laurentca57d1c2010-07-23 00:19:11 -0700574 memcpy(p->data + voffset, lpValue, vsize);
Eric Laurent948235c2010-06-09 00:17:29 -0700575 p->vsize = vsize;
576
577 lStatus = lpAudioEffect->setParameter(p);
578 if (lStatus == NO_ERROR) {
579 lStatus = p->status;
580 }
581
582 free(p);
583
584setParameter_Exit:
585
586 if (lpParam != NULL) {
587 env->ReleasePrimitiveArrayCritical(pJavaParam, lpParam, 0);
588 }
589 if (lpValue != NULL) {
590 env->ReleasePrimitiveArrayCritical(pJavaValue, lpValue, 0);
591 }
Ashok Bhatea7861c2013-12-17 12:42:00 +0000592 return (jint) translateError(lStatus);
Eric Laurent948235c2010-06-09 00:17:29 -0700593}
594
595static jint
596android_media_AudioEffect_native_getParameter(JNIEnv *env,
Eric Laurent602b3282011-03-18 08:33:14 -0700597 jobject thiz, jint psize, jbyteArray pJavaParam,
598 jint vsize, jbyteArray pJavaValue) {
Eric Laurent948235c2010-06-09 00:17:29 -0700599 // retrieve the AudioEffect object
600 jbyte* lpParam = NULL;
601 jbyte* lpValue = NULL;
Eric Laurent948235c2010-06-09 00:17:29 -0700602 jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
603 effect_param_t *p;
604 int voffset;
605
Eric Laurent76f81332015-06-04 16:20:47 -0700606 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
607 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700608 jniThrowException(env, "java/lang/IllegalStateException",
609 "Unable to retrieve AudioEffect pointer for getParameter()");
610 return AUDIOEFFECT_ERROR_NO_INIT;
611 }
612
Eric Laurent602b3282011-03-18 08:33:14 -0700613 if (psize == 0 || vsize == 0 || pJavaParam == NULL || pJavaValue == NULL) {
Eric Laurent948235c2010-06-09 00:17:29 -0700614 return AUDIOEFFECT_ERROR_BAD_VALUE;
615 }
616
617 // get the pointer for the param from the java array
618 lpParam = (jbyte *) env->GetPrimitiveArrayCritical(pJavaParam, NULL);
619 if (lpParam == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000620 ALOGE("getParameter: Error retrieving param pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700621 goto getParameter_Exit;
622 }
623
624 // get the pointer for the value from the java array
625 lpValue = (jbyte *) env->GetPrimitiveArrayCritical(pJavaValue, NULL);
626 if (lpValue == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000627 ALOGE("getParameter: Error retrieving value pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700628 goto getParameter_Exit;
629 }
630
Eric Laurent948235c2010-06-09 00:17:29 -0700631 voffset = ((psize - 1) / sizeof(int) + 1) * sizeof(int);
Eric Laurent602b3282011-03-18 08:33:14 -0700632 p = (effect_param_t *) malloc(sizeof(effect_param_t) + voffset + vsize);
Eric Laurent948235c2010-06-09 00:17:29 -0700633 memcpy(p->data, lpParam, psize);
634 p->psize = psize;
Eric Laurent602b3282011-03-18 08:33:14 -0700635 p->vsize = vsize;
Eric Laurent948235c2010-06-09 00:17:29 -0700636
637 lStatus = lpAudioEffect->getParameter(p);
638 if (lStatus == NO_ERROR) {
639 lStatus = p->status;
640 if (lStatus == NO_ERROR) {
641 memcpy(lpValue, p->data + voffset, p->vsize);
Eric Laurent602b3282011-03-18 08:33:14 -0700642 vsize = p->vsize;
Eric Laurent948235c2010-06-09 00:17:29 -0700643 }
644 }
645
646 free(p);
647
648getParameter_Exit:
649
650 if (lpParam != NULL) {
651 env->ReleasePrimitiveArrayCritical(pJavaParam, lpParam, 0);
652 }
653 if (lpValue != NULL) {
654 env->ReleasePrimitiveArrayCritical(pJavaValue, lpValue, 0);
655 }
Eric Laurent948235c2010-06-09 00:17:29 -0700656
Eric Laurent602b3282011-03-18 08:33:14 -0700657 if (lStatus == NO_ERROR) {
658 return vsize;
659 }
Ashok Bhatea7861c2013-12-17 12:42:00 +0000660 return (jint) translateError(lStatus);
Eric Laurent948235c2010-06-09 00:17:29 -0700661}
662
663static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz,
Eric Laurent602b3282011-03-18 08:33:14 -0700664 jint cmdCode, jint cmdSize, jbyteArray jCmdData, jint replySize,
Eric Laurent948235c2010-06-09 00:17:29 -0700665 jbyteArray jReplyData) {
666 jbyte* pCmdData = NULL;
667 jbyte* pReplyData = NULL;
Eric Laurent948235c2010-06-09 00:17:29 -0700668 jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE;
669
Eric Laurent76f81332015-06-04 16:20:47 -0700670 sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz);
671 if (lpAudioEffect == 0) {
Eric Laurent948235c2010-06-09 00:17:29 -0700672 jniThrowException(env, "java/lang/IllegalStateException",
673 "Unable to retrieve AudioEffect pointer for setParameter()");
674 return AUDIOEFFECT_ERROR_NO_INIT;
675 }
676
Eric Laurent602b3282011-03-18 08:33:14 -0700677 if ((cmdSize != 0 && jCmdData == NULL) || (replySize != 0 && jReplyData == NULL)) {
Eric Laurent948235c2010-06-09 00:17:29 -0700678 return AUDIOEFFECT_ERROR_BAD_VALUE;
679 }
680
681 // get the pointer for the command from the java array
682 if (cmdSize != 0) {
683 pCmdData = (jbyte *) env->GetPrimitiveArrayCritical(jCmdData, NULL);
684 if (pCmdData == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000685 ALOGE("setParameter: Error retrieving command pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700686 goto command_Exit;
687 }
688 }
689
Eric Laurent948235c2010-06-09 00:17:29 -0700690 // get the pointer for the reply from the java array
Eric Laurent602b3282011-03-18 08:33:14 -0700691 if (replySize != 0 && jReplyData != NULL) {
Eric Laurent948235c2010-06-09 00:17:29 -0700692 pReplyData = (jbyte *) env->GetPrimitiveArrayCritical(jReplyData, NULL);
693 if (pReplyData == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000694 ALOGE("setParameter: Error retrieving reply pointer");
Eric Laurent948235c2010-06-09 00:17:29 -0700695 goto command_Exit;
696 }
697 }
698
Eric Laurenta4c72ac2010-07-28 05:40:18 -0700699 lStatus = translateError(lpAudioEffect->command((uint32_t)cmdCode,
700 (uint32_t)cmdSize,
701 pCmdData,
Eric Laurent602b3282011-03-18 08:33:14 -0700702 (uint32_t *)&replySize,
Eric Laurenta4c72ac2010-07-28 05:40:18 -0700703 pReplyData));
Eric Laurent948235c2010-06-09 00:17:29 -0700704
705command_Exit:
706
707 if (pCmdData != NULL) {
708 env->ReleasePrimitiveArrayCritical(jCmdData, pCmdData, 0);
709 }
710 if (pReplyData != NULL) {
711 env->ReleasePrimitiveArrayCritical(jReplyData, pReplyData, 0);
712 }
Eric Laurent948235c2010-06-09 00:17:29 -0700713
Eric Laurent602b3282011-03-18 08:33:14 -0700714 if (lStatus == NO_ERROR) {
715 return replySize;
716 }
Eric Laurent948235c2010-06-09 00:17:29 -0700717 return lStatus;
718}
719
720static jobjectArray
Eric Laurent4fc28d72014-09-10 15:05:03 -0700721android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz __unused)
Eric Laurent948235c2010-06-09 00:17:29 -0700722{
723 effect_descriptor_t desc;
724 char str[EFFECT_STRING_LEN_MAX];
Eric Laurent4fc28d72014-09-10 15:05:03 -0700725 uint32_t totalEffectsCount = 0;
726 uint32_t returnedEffectsCount = 0;
Eric Laurent948235c2010-06-09 00:17:29 -0700727 uint32_t i = 0;
728 jstring jdescType;
729 jstring jdescUuid;
730 jstring jdescConnect;
731 jstring jdescName;
732 jstring jdescImplementor;
733 jobject jdesc;
Eric Laurent4fc28d72014-09-10 15:05:03 -0700734 jobjectArray ret;
Eric Laurent948235c2010-06-09 00:17:29 -0700735
Eric Laurent4fc28d72014-09-10 15:05:03 -0700736 if (AudioEffect::queryNumberEffects(&totalEffectsCount) != NO_ERROR) {
Peter Karlsson4526f0d2012-11-16 16:14:15 +0100737 return NULL;
738 }
739
Eric Laurent4fc28d72014-09-10 15:05:03 -0700740 jobjectArray temp = env->NewObjectArray(totalEffectsCount, fields.clazzDesc, NULL);
741 if (temp == NULL) {
742 return temp;
Eric Laurent948235c2010-06-09 00:17:29 -0700743 }
744
Eric Laurent4fc28d72014-09-10 15:05:03 -0700745 ALOGV("queryEffects() totalEffectsCount: %d", totalEffectsCount);
Eric Laurent948235c2010-06-09 00:17:29 -0700746
Eric Laurent4fc28d72014-09-10 15:05:03 -0700747 for (i = 0; i < totalEffectsCount; i++) {
Eric Laurent53334cd2010-06-23 17:38:20 -0700748 if (AudioEffect::queryEffect(i, &desc) != NO_ERROR) {
Eric Laurent948235c2010-06-09 00:17:29 -0700749 goto queryEffects_failure;
750 }
751
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700752 if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
753 jdescConnect = env->NewStringUTF("Auxiliary");
754 } else if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_INSERT) {
755 jdescConnect = env->NewStringUTF("Insert");
756 } else if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC) {
757 jdescConnect = env->NewStringUTF("Pre Processing");
758 } else {
759 continue;
760 }
761
Eric Laurent948235c2010-06-09 00:17:29 -0700762 AudioEffect::guidToString(&desc.type, str, EFFECT_STRING_LEN_MAX);
763 jdescType = env->NewStringUTF(str);
764
765 AudioEffect::guidToString(&desc.uuid, str, EFFECT_STRING_LEN_MAX);
766 jdescUuid = env->NewStringUTF(str);
767
Eric Laurent948235c2010-06-09 00:17:29 -0700768 jdescName = env->NewStringUTF(desc.name);
769 jdescImplementor = env->NewStringUTF(desc.implementor);
770
771 jdesc = env->NewObject(fields.clazzDesc,
772 fields.midDescCstor,
773 jdescType,
774 jdescUuid,
775 jdescConnect,
776 jdescName,
777 jdescImplementor);
778 env->DeleteLocalRef(jdescType);
779 env->DeleteLocalRef(jdescUuid);
780 env->DeleteLocalRef(jdescConnect);
781 env->DeleteLocalRef(jdescName);
782 env->DeleteLocalRef(jdescImplementor);
783 if (jdesc == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000784 ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
Eric Laurent948235c2010-06-09 00:17:29 -0700785 goto queryEffects_failure;
786 }
787
Eric Laurent4fc28d72014-09-10 15:05:03 -0700788 env->SetObjectArrayElement(temp, returnedEffectsCount++, jdesc);
Eric Laurent948235c2010-06-09 00:17:29 -0700789 }
790
Eric Laurent4fc28d72014-09-10 15:05:03 -0700791 if (returnedEffectsCount == 0) {
792 goto queryEffects_failure;
793 }
794 ret = env->NewObjectArray(returnedEffectsCount, fields.clazzDesc, NULL);
795 if (ret == NULL) {
796 goto queryEffects_failure;
797 }
798 for (i = 0; i < returnedEffectsCount; i++) {
799 env->SetObjectArrayElement(ret, i, env->GetObjectArrayElement(temp, i));
800 }
801 env->DeleteLocalRef(temp);
Eric Laurent948235c2010-06-09 00:17:29 -0700802 return ret;
803
804queryEffects_failure:
805
Eric Laurent4fc28d72014-09-10 15:05:03 -0700806 if (temp != NULL) {
807 env->DeleteLocalRef(temp);
Eric Laurent948235c2010-06-09 00:17:29 -0700808 }
809 return NULL;
810
811}
812
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700813
814
815static jobjectArray
Eric Laurent4fc28d72014-09-10 15:05:03 -0700816android_media_AudioEffect_native_queryPreProcessings(JNIEnv *env, jclass clazz __unused,
817 jint audioSession)
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700818{
Eric Laurentb27a8a52014-11-05 12:18:05 -0800819 effect_descriptor_t *descriptors = new effect_descriptor_t[AudioEffect::kMaxPreProcessing];
820 uint32_t numEffects = AudioEffect::kMaxPreProcessing;
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700821
Glenn Kasten33b84042016-03-08 12:02:55 -0800822 status_t status = AudioEffect::queryDefaultPreProcessing((audio_session_t) audioSession,
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700823 descriptors,
824 &numEffects);
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700825 if (status != NO_ERROR || numEffects == 0) {
826 delete[] descriptors;
827 return NULL;
828 }
Steve Block71f2cf12011-10-20 11:56:00 +0100829 ALOGV("queryDefaultPreProcessing() got %d effects", numEffects);
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700830
831 jobjectArray ret = env->NewObjectArray(numEffects, fields.clazzDesc, NULL);
832 if (ret == NULL) {
833 delete[] descriptors;
834 return ret;
835 }
836
837 char str[EFFECT_STRING_LEN_MAX];
838 jstring jdescType;
839 jstring jdescUuid;
840 jstring jdescConnect;
841 jstring jdescName;
842 jstring jdescImplementor;
843 jobject jdesc;
844
845 for (uint32_t i = 0; i < numEffects; i++) {
846
847 AudioEffect::guidToString(&descriptors[i].type, str, EFFECT_STRING_LEN_MAX);
848 jdescType = env->NewStringUTF(str);
849 AudioEffect::guidToString(&descriptors[i].uuid, str, EFFECT_STRING_LEN_MAX);
850 jdescUuid = env->NewStringUTF(str);
851 jdescConnect = env->NewStringUTF("Pre Processing");
852 jdescName = env->NewStringUTF(descriptors[i].name);
853 jdescImplementor = env->NewStringUTF(descriptors[i].implementor);
854
855 jdesc = env->NewObject(fields.clazzDesc,
856 fields.midDescCstor,
857 jdescType,
858 jdescUuid,
859 jdescConnect,
860 jdescName,
861 jdescImplementor);
862 env->DeleteLocalRef(jdescType);
863 env->DeleteLocalRef(jdescUuid);
864 env->DeleteLocalRef(jdescConnect);
865 env->DeleteLocalRef(jdescName);
866 env->DeleteLocalRef(jdescImplementor);
867 if (jdesc == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000868 ALOGE("env->NewObject(fields.clazzDesc, fields.midDescCstor)");
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700869 env->DeleteLocalRef(ret);
870 return NULL;;
871 }
872
873 env->SetObjectArrayElement(ret, i, jdesc);
874 }
875
876 return ret;
877}
878
Eric Laurent948235c2010-06-09 00:17:29 -0700879// ----------------------------------------------------------------------------
880
881// Dalvik VM type signatures
Daniel Micay76f6a862015-09-19 17:31:01 -0400882static const JNINativeMethod gMethods[] = {
Eric Laurent948235c2010-06-09 00:17:29 -0700883 {"native_init", "()V", (void *)android_media_AudioEffect_native_init},
Svet Ganovfa5ecdc2015-04-28 12:03:28 -0700884 {"native_setup", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;II[I[Ljava/lang/Object;Ljava/lang/String;)I",
Eric Laurent948235c2010-06-09 00:17:29 -0700885 (void *)android_media_AudioEffect_native_setup},
886 {"native_finalize", "()V", (void *)android_media_AudioEffect_native_finalize},
887 {"native_release", "()V", (void *)android_media_AudioEffect_native_release},
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700888 {"native_setEnabled", "(Z)I", (void *)android_media_AudioEffect_native_setEnabled},
889 {"native_getEnabled", "()Z", (void *)android_media_AudioEffect_native_getEnabled},
Eric Laurent948235c2010-06-09 00:17:29 -0700890 {"native_hasControl", "()Z", (void *)android_media_AudioEffect_native_hasControl},
891 {"native_setParameter", "(I[BI[B)I", (void *)android_media_AudioEffect_native_setParameter},
Eric Laurent602b3282011-03-18 08:33:14 -0700892 {"native_getParameter", "(I[BI[B)I", (void *)android_media_AudioEffect_native_getParameter},
893 {"native_command", "(II[BI[B)I", (void *)android_media_AudioEffect_native_command},
Eric Laurent948235c2010-06-09 00:17:29 -0700894 {"native_query_effects", "()[Ljava/lang/Object;", (void *)android_media_AudioEffect_native_queryEffects},
Eric Laurent0f7f4ec2011-07-24 13:36:09 -0700895 {"native_query_pre_processing", "(I)[Ljava/lang/Object;",
896 (void *)android_media_AudioEffect_native_queryPreProcessings},
Eric Laurent948235c2010-06-09 00:17:29 -0700897};
898
899
900// ----------------------------------------------------------------------------
901
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700902extern int register_android_media_visualizer(JNIEnv *env);
903
Eric Laurent948235c2010-06-09 00:17:29 -0700904int register_android_media_AudioEffect(JNIEnv *env)
905{
906 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
907}
908
Eric Laurent4fc28d72014-09-10 15:05:03 -0700909jint JNI_OnLoad(JavaVM* vm, void* reserved __unused)
Eric Laurent948235c2010-06-09 00:17:29 -0700910{
911
912 JNIEnv* env = NULL;
913 jint result = -1;
914
915 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
Steve Block3762c312012-01-06 19:20:56 +0000916 ALOGE("ERROR: GetEnv failed\n");
Eric Laurent948235c2010-06-09 00:17:29 -0700917 goto bail;
918 }
919 assert(env != NULL);
920
921 if (register_android_media_AudioEffect(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +0000922 ALOGE("ERROR: AudioEffect native registration failed\n");
Eric Laurent948235c2010-06-09 00:17:29 -0700923 goto bail;
924 }
925
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700926 if (register_android_media_visualizer(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +0000927 ALOGE("ERROR: Visualizer native registration failed\n");
Eric Laurentdf9b81c2010-07-02 08:12:41 -0700928 goto bail;
929 }
930
Eric Laurent948235c2010-06-09 00:17:29 -0700931 /* success -- return valid version number */
932 result = JNI_VERSION_1_4;
933
934bail:
935 return result;
936}
937