Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4fc28d78 authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioEffect JNI: fix queryEffects()

Some effects supported by the platform may not be
returned to JAVA layer because not visible by applications.
The size of the array of effect descriptors
returned must be adjusted so that no entry in the array is null.

Bug: 17453177.
Change-Id: I3baaacf24bcb0fa45ce50461a1ac3d6eaa67f4b9
parent 6cb95276
Loading
Loading
Loading
Loading
+27 −13
Original line number Diff line number Diff line
@@ -705,11 +705,12 @@ command_Exit:
}

static jobjectArray
android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz)
android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz __unused)
{
    effect_descriptor_t desc;
    char str[EFFECT_STRING_LEN_MAX];
    uint32_t numEffects = 0;
    uint32_t totalEffectsCount = 0;
    uint32_t returnedEffectsCount = 0;
    uint32_t i = 0;
    jstring jdescType;
    jstring jdescUuid;
@@ -717,19 +718,20 @@ android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz)
    jstring jdescName;
    jstring jdescImplementor;
    jobject jdesc;
    jobjectArray ret;

    if (AudioEffect::queryNumberEffects(&numEffects) != NO_ERROR) {
    if (AudioEffect::queryNumberEffects(&totalEffectsCount) != NO_ERROR) {
        return NULL;
    }

    jobjectArray ret = env->NewObjectArray(numEffects, fields.clazzDesc, NULL);
    if (ret == NULL) {
        return ret;
    jobjectArray temp = env->NewObjectArray(totalEffectsCount, fields.clazzDesc, NULL);
    if (temp == NULL) {
        return temp;
    }

    ALOGV("queryEffects() numEffects: %d", numEffects);
    ALOGV("queryEffects() totalEffectsCount: %d", totalEffectsCount);

    for (i = 0; i < numEffects; i++) {
    for (i = 0; i < totalEffectsCount; i++) {
        if (AudioEffect::queryEffect(i, &desc) != NO_ERROR) {
            goto queryEffects_failure;
        }
@@ -770,15 +772,26 @@ android_media_AudioEffect_native_queryEffects(JNIEnv *env, jclass clazz)
            goto queryEffects_failure;
        }

        env->SetObjectArrayElement(ret, i, jdesc);
        env->SetObjectArrayElement(temp, returnedEffectsCount++, jdesc);
   }

    if (returnedEffectsCount == 0) {
        goto queryEffects_failure;
    }
    ret = env->NewObjectArray(returnedEffectsCount, fields.clazzDesc, NULL);
    if (ret == NULL) {
        goto queryEffects_failure;
    }
    for (i = 0; i < returnedEffectsCount; i++) {
        env->SetObjectArrayElement(ret, i, env->GetObjectArrayElement(temp, i));
    }
    env->DeleteLocalRef(temp);
    return ret;

queryEffects_failure:

    if (ret != NULL) {
        env->DeleteLocalRef(ret);
    if (temp != NULL) {
        env->DeleteLocalRef(temp);
    }
    return NULL;

@@ -787,7 +800,8 @@ queryEffects_failure:


static jobjectArray
android_media_AudioEffect_native_queryPreProcessings(JNIEnv *env, jclass clazz, jint audioSession)
android_media_AudioEffect_native_queryPreProcessings(JNIEnv *env, jclass clazz __unused,
                                                     jint audioSession)
{
    // kDefaultNumEffects is a "reasonable" value ensuring that only one query will be enough on
    // most devices to get all active audio pre processing on a given session.
@@ -895,7 +909,7 @@ int register_android_media_AudioEffect(JNIEnv *env)
    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
}

jint JNI_OnLoad(JavaVM* vm, void* reserved)
jint JNI_OnLoad(JavaVM* vm, void* reserved __unused)
{

    JNIEnv* env = NULL;