Home | History | Annotate | Download | only in audioeffect
      1 /*
      2  * Copyright (C) 2018 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 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "SourceDefaultEffect-JNI"
     19 
     20 #include <utils/Errors.h>
     21 #include <utils/Log.h>
     22 #include <jni.h>
     23 #include <nativehelper/JNIHelp.h>
     24 #include <android_runtime/AndroidRuntime.h>
     25 #include "media/AudioEffect.h"
     26 
     27 #include <nativehelper/ScopedUtfChars.h>
     28 
     29 #include "android_media_AudioEffect.h"
     30 
     31 using namespace android;
     32 
     33 static const char* const kClassPathName = "android/media/audiofx/SourceDefaultEffect";
     34 
     35 static jint android_media_SourceDefaultEffect_native_setup(JNIEnv *env,
     36                                                            jobject /*thiz*/,
     37                                                            jstring type,
     38                                                            jstring uuid,
     39                                                            jint priority,
     40                                                            jint source,
     41                                                            jstring opPackageName,
     42                                                            jintArray jId)
     43 {
     44     ALOGV("android_media_SourceDefaultEffect_native_setup");
     45     status_t lStatus = NO_ERROR;
     46     jint* nId = NULL;
     47     const char *typeStr = NULL;
     48     const char *uuidStr = NULL;
     49 
     50     ScopedUtfChars opPackageNameStr(env, opPackageName);
     51 
     52     if (type != NULL) {
     53         typeStr = env->GetStringUTFChars(type, NULL);
     54         if (typeStr == NULL) {  // Out of memory
     55             lStatus = NO_MEMORY;
     56             jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
     57             goto setup_exit;
     58         }
     59     }
     60 
     61     if (uuid != NULL) {
     62         uuidStr = env->GetStringUTFChars(uuid, NULL);
     63         if (uuidStr == NULL) {  // Out of memory
     64             lStatus = NO_MEMORY;
     65             jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
     66             goto setup_exit;
     67         }
     68     }
     69 
     70     if (typeStr == NULL && uuidStr == NULL) {
     71         lStatus = BAD_VALUE;
     72         goto setup_exit;
     73     }
     74 
     75     nId = reinterpret_cast<jint *>(env->GetPrimitiveArrayCritical(jId, NULL));
     76     if (nId == NULL) {
     77         ALOGE("setup: Error retrieving id pointer");
     78         lStatus = BAD_VALUE;
     79         goto setup_exit;
     80     }
     81 
     82     // create the native SourceDefaultEffect.
     83     audio_unique_id_t id;
     84     lStatus = AudioEffect::addSourceDefaultEffect(typeStr,
     85                                                   String16(opPackageNameStr.c_str()),
     86                                                   uuidStr,
     87                                                   priority,
     88                                                   static_cast<audio_source_t>(source),
     89                                                   &id);
     90     if (lStatus != NO_ERROR) {
     91         ALOGE("setup: Error adding SourceDefaultEffect");
     92         goto setup_exit;
     93     }
     94 
     95     nId[0] = static_cast<jint>(id);
     96 
     97 setup_exit:
     98     // Final cleanup and return.
     99 
    100     if (nId != NULL) {
    101         env->ReleasePrimitiveArrayCritical(jId, nId, 0);
    102         nId = NULL;
    103     }
    104 
    105     if (uuidStr != NULL) {
    106         env->ReleaseStringUTFChars(uuid, uuidStr);
    107         uuidStr = NULL;
    108     }
    109 
    110     if (typeStr != NULL) {
    111         env->ReleaseStringUTFChars(type, typeStr);
    112         typeStr = NULL;
    113     }
    114 
    115     return AudioEffectJni::translateNativeErrorToJava(lStatus);
    116 }
    117 
    118 static void android_media_SourceDefaultEffect_native_release(JNIEnv */*env*/,
    119                                                              jobject /*thiz*/,
    120                                                              jint id) {
    121     status_t lStatus = AudioEffect::removeSourceDefaultEffect(id);
    122     if (lStatus != NO_ERROR) {
    123         ALOGW("Error releasing SourceDefaultEffect: %d", lStatus);
    124     }
    125 }
    126 
    127 // ----------------------------------------------------------------------------
    128 
    129 // Dalvik VM type signatures
    130 static const JNINativeMethod gMethods[] = {
    131     {"native_setup",         "(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;[I)I",
    132                                          (void *)android_media_SourceDefaultEffect_native_setup},
    133     {"native_release",       "(I)V",      (void *)android_media_SourceDefaultEffect_native_release},
    134 };
    135 
    136 
    137 // ----------------------------------------------------------------------------
    138 
    139 int register_android_media_SourceDefaultEffect(JNIEnv *env)
    140 {
    141     return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
    142 }
    143