143 lines
4.9 KiB
C++
143 lines
4.9 KiB
C++
|
/*
|
||
|
* Copyright (C) 2018 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
//#define LOG_NDEBUG 0
|
||
|
#define LOG_TAG "StreamDefaultEffect-JNI"
|
||
|
|
||
|
#include <utils/Errors.h>
|
||
|
#include <utils/Log.h>
|
||
|
#include <jni.h>
|
||
|
#include <nativehelper/JNIHelp.h>
|
||
|
#include <android_runtime/AndroidRuntime.h>
|
||
|
#include "media/AudioEffect.h"
|
||
|
|
||
|
#include <nativehelper/ScopedUtfChars.h>
|
||
|
|
||
|
#include "android_media_AudioEffect.h"
|
||
|
|
||
|
using namespace android;
|
||
|
|
||
|
static const char* const kClassPathName = "android/media/audiofx/StreamDefaultEffect";
|
||
|
|
||
|
static jint android_media_StreamDefaultEffect_native_setup(JNIEnv *env,
|
||
|
jobject /*thiz*/,
|
||
|
jstring type,
|
||
|
jstring uuid,
|
||
|
jint priority,
|
||
|
jint streamUsage,
|
||
|
jstring opPackageName,
|
||
|
jintArray jId)
|
||
|
{
|
||
|
ALOGV("android_media_StreamDefaultEffect_native_setup");
|
||
|
status_t lStatus = NO_ERROR;
|
||
|
jint* nId = NULL;
|
||
|
const char *typeStr = NULL;
|
||
|
const char *uuidStr = NULL;
|
||
|
|
||
|
ScopedUtfChars opPackageNameStr(env, opPackageName);
|
||
|
|
||
|
if (type != NULL) {
|
||
|
typeStr = env->GetStringUTFChars(type, NULL);
|
||
|
if (typeStr == NULL) { // Out of memory
|
||
|
lStatus = NO_MEMORY;
|
||
|
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
|
||
|
goto setup_exit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (uuid != NULL) {
|
||
|
uuidStr = env->GetStringUTFChars(uuid, NULL);
|
||
|
if (uuidStr == NULL) { // Out of memory
|
||
|
lStatus = NO_MEMORY;
|
||
|
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
|
||
|
goto setup_exit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeStr == NULL && uuidStr == NULL) {
|
||
|
lStatus = BAD_VALUE;
|
||
|
goto setup_exit;
|
||
|
}
|
||
|
|
||
|
nId = reinterpret_cast<jint *>(env->GetPrimitiveArrayCritical(jId, NULL));
|
||
|
if (nId == NULL) {
|
||
|
ALOGE("setup: Error retrieving id pointer");
|
||
|
lStatus = BAD_VALUE;
|
||
|
goto setup_exit;
|
||
|
}
|
||
|
|
||
|
// create the native StreamDefaultEffect.
|
||
|
audio_unique_id_t id;
|
||
|
lStatus = AudioEffect::addStreamDefaultEffect(typeStr,
|
||
|
String16(opPackageNameStr.c_str()),
|
||
|
uuidStr,
|
||
|
priority,
|
||
|
static_cast<audio_usage_t>(streamUsage),
|
||
|
&id);
|
||
|
if (lStatus != NO_ERROR) {
|
||
|
ALOGE("setup: Error adding StreamDefaultEffect");
|
||
|
goto setup_exit;
|
||
|
}
|
||
|
|
||
|
nId[0] = static_cast<jint>(id);
|
||
|
|
||
|
setup_exit:
|
||
|
// Final cleanup and return.
|
||
|
|
||
|
if (nId != NULL) {
|
||
|
env->ReleasePrimitiveArrayCritical(jId, nId, 0);
|
||
|
nId = NULL;
|
||
|
}
|
||
|
|
||
|
if (uuidStr != NULL) {
|
||
|
env->ReleaseStringUTFChars(uuid, uuidStr);
|
||
|
uuidStr = NULL;
|
||
|
}
|
||
|
|
||
|
if (typeStr != NULL) {
|
||
|
env->ReleaseStringUTFChars(type, typeStr);
|
||
|
typeStr = NULL;
|
||
|
}
|
||
|
|
||
|
return AudioEffectJni::translateNativeErrorToJava(lStatus);
|
||
|
}
|
||
|
|
||
|
static void android_media_StreamDefaultEffect_native_release(JNIEnv */*env*/,
|
||
|
jobject /*thiz*/,
|
||
|
jint id) {
|
||
|
status_t lStatus = AudioEffect::removeStreamDefaultEffect(id);
|
||
|
if (lStatus != NO_ERROR) {
|
||
|
ALOGW("Error releasing StreamDefaultEffect: %d", lStatus);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
// Dalvik VM type signatures
|
||
|
static const JNINativeMethod gMethods[] = {
|
||
|
{"native_setup", "(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;[I)I",
|
||
|
(void *)android_media_StreamDefaultEffect_native_setup},
|
||
|
{"native_release", "(I)V", (void *)android_media_StreamDefaultEffect_native_release},
|
||
|
};
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
int register_android_media_StreamDefaultEffect(JNIEnv *env)
|
||
|
{
|
||
|
return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
|
||
|
}
|