android_media_Visualizer.cpp revision 71f2cf116aab893e224056c38ab146bd1538dd3e
1df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent/* 2df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * Copyright (C) 2010 The Android Open Source Project 3df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * 4df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * you may not use this file except in compliance with the License. 6df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * You may obtain a copy of the License at 7df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * 8df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * 10df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * Unless required by applicable law or agreed to in writing, software 11df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * See the License for the specific language governing permissions and 14df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent * limitations under the License. 15df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent */ 16df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 17df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include <stdio.h> 18df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 19df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent//#define LOG_NDEBUG 0 20df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define LOG_TAG "visualizers-JNI" 21df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 22df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include <utils/Log.h> 23df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include <nativehelper/jni.h> 24df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include <nativehelper/JNIHelp.h> 25df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include <android_runtime/AndroidRuntime.h> 26df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include "media/Visualizer.h" 27df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 28df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentusing namespace android; 29df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 30df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_SUCCESS 0 31df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR -1 32df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_ALREADY_EXISTS -2 33df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_NO_INIT -3 34df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_BAD_VALUE -4 35df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_INVALID_OPERATION -5 36df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_NO_MEMORY -6 37df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_DEAD_OBJECT -7 38df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 39df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define NATIVE_EVENT_PCM_CAPTURE 0 40df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define NATIVE_EVENT_FFT_CAPTURE 1 41df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 42df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 431a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentstatic const char* const kClassPathName = "android/media/audiofx/Visualizer"; 44df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 45df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstruct fields_t { 46df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // these fields provide access from C++ to the... 47df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass clazzEffect; // Visualizer class 48df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jmethodID midPostNativeEvent; // event post callback method 49df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jfieldID fidNativeVisualizer; // stores in Java the native Visualizer object 50df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jfieldID fidJniData; // stores in Java additional resources used by the native Visualizer 51df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 52df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic fields_t fields; 53df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 54df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstruct visualizer_callback_cookie { 55df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass visualizer_class; // Visualizer class 56df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jobject visualizer_ref; // Visualizer object instance 57df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent }; 58df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 59df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 60df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentclass visualizerJniStorage { 61df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent public: 62df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizer_callback_cookie mCallbackData; 63df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 64df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage() { 65df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 66df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 67df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent ~visualizerJniStorage() { 68df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 69df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 70df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 71df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 72df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 73df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint translateError(int code) { 74df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent switch(code) { 75df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_ERROR: 76df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_SUCCESS; 77df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case ALREADY_EXISTS: 78df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_ALREADY_EXISTS; 79df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_INIT: 80df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 81df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case BAD_VALUE: 82df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_BAD_VALUE; 83df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case INVALID_OPERATION: 84df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_INVALID_OPERATION; 85df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_MEMORY: 86df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 87df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case DEAD_OBJECT: 88df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_DEAD_OBJECT; 89df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent default: 90df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR; 91df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 92df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 93df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 94df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 95df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 96df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void captureCallback(void* user, 97df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t waveformSize, 98df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint8_t *waveform, 99df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t fftSize, 100df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint8_t *fft, 101df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t samplingrate) { 102df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 103df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int arg1 = 0; 104df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int arg2 = 0; 105df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent size_t size; 106df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 107df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizer_callback_cookie *callbackInfo = (visualizer_callback_cookie *)user; 108df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent JNIEnv *env = AndroidRuntime::getJNIEnv(); 109df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 11071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("captureCallback: callbackInfo %p, visualizer_ref %p visualizer_class %p", 111df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo, 112df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 113df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class); 114df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 115df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (!user || !env) { 116df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGW("captureCallback error user %p, env %p", user, env); 117df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 118df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 119df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 120df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (waveformSize != 0 && waveform != NULL) { 121df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyteArray jArray = env->NewByteArray(waveformSize); 122df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jArray != NULL) { 123df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte *nArray = env->GetByteArrayElements(jArray, NULL); 124df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent memcpy(nArray, waveform, waveformSize); 125df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseByteArrayElements(jArray, nArray, 0); 126df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->CallStaticVoidMethod( 127df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class, 128df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent, 129df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 130df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NATIVE_EVENT_PCM_CAPTURE, 131df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent samplingrate, 132df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 0, 133df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jArray); 134cc02ac54ac0758e6f44b2d8e5134ff1b2fa96409Eric Laurent env->DeleteLocalRef(jArray); 135df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 136df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 137df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 138df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fftSize != 0 && fft != NULL) { 139df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyteArray jArray = env->NewByteArray(fftSize); 140df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jArray != NULL) { 141df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte *nArray = env->GetByteArrayElements(jArray, NULL); 142df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent memcpy(nArray, fft, fftSize); 143df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseByteArrayElements(jArray, nArray, 0); 144df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->CallStaticVoidMethod( 145df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class, 146df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent, 147df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 148df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NATIVE_EVENT_FFT_CAPTURE, 149df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent samplingrate, 150df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 0, 151df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jArray); 152df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->DeleteLocalRef(jArray); 153df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 154df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 155df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 156df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (env->ExceptionCheck()) { 157df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionDescribe(); 158df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionClear(); 159df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 160df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 161df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 162df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic Visualizer *getVisualizer(JNIEnv* env, jobject thiz) 163df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 164df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer *v = (Visualizer *)env->GetIntField( 165df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 166df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (v == NULL) { 167df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", 168df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "Unable to retrieve Visualizer pointer"); 169df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 170df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return v; 171df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 172df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 173df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 174df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// This function gets some field IDs, which in turn causes class initialization. 175df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// It is called from a static block in Visualizer, which won't run until the 176df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// first time an instance of this class is used. 177df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void 178df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_init(JNIEnv *env) 179df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 180df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 18171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_init"); 182df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 183df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = NULL; 184df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 185df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the Visualizer class 186df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass clazz = env->FindClass(kClassPathName); 187df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (clazz == NULL) { 188df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find %s", kClassPathName); 189df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 190df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 191df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 192df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = (jclass)env->NewGlobalRef(clazz); 193df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 194df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the postEvent method 195df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent = env->GetStaticMethodID( 196df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 197df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 198df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.midPostNativeEvent == NULL) { 199df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "postEventFromNative"); 200df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 201df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 202df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 203df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the variables fields 204df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // nativeTrackInJavaObj 205df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidNativeVisualizer = env->GetFieldID( 206df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 207df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mNativeVisualizer", "I"); 208df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidNativeVisualizer == NULL) { 209df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "mNativeVisualizer"); 210df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 211df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 212df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // fidJniData; 213df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData = env->GetFieldID( 214df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 215df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mJniData", "I"); 216df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidJniData == NULL) { 217df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "mJniData"); 218df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 219df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 220df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 221df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 222df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 223df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 224df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 225df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, 226df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint sessionId, jintArray jId) 227df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 22871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_setup"); 229df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = NULL; 230df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int lStatus = VISUALIZER_ERROR_NO_MEMORY; 231df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = NULL; 232df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint* nId = NULL; 233df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 234df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage = new visualizerJniStorage(); 235df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 236df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("setup: Error creating JNI Storage"); 237df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 238df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 239df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 240df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class = (jclass)env->NewGlobalRef(fields.clazzEffect); 241df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // we use a weak reference so the Visualizer object can be garbage collected. 242df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref = env->NewGlobalRef(weak_this); 243df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 24471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setup: lpJniStorage: %p visualizer_ref %p visualizer_class %p, &mCallbackData %p", 245df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage, 246df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref, 247df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class, 248df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData); 249df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 2502fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (jId == NULL) { 251df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("setup: NULL java array for id pointer"); 252df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 253df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 254df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 255df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 256df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // create the native Visualizer object 257df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpVisualizer = new Visualizer(0, 258df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NULL, 259df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NULL, 260df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent sessionId); 261df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 262df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Error creating Visualizer"); 263df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 264df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 265df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 266df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = translateError(lpVisualizer->initCheck()); 267df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) { 268df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Visualizer initCheck failed %d", lStatus); 269df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 270df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 271df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 2722fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL); 2732fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (nId == NULL) { 2742fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent LOGE("setup: Error retrieving id pointer"); 2752fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 2762fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent goto setup_failure; 2772fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent } 278df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId[0] = lpVisualizer->id(); 279df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 280df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId = NULL; 281df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 282df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, (int)lpVisualizer); 283df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 284df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, (int)lpJniStorage); 285df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 286df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_SUCCESS; 287df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 288df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // failures: 289df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentsetup_failure: 290df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 291df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nId != NULL) { 292df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 293df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 294df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 295df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 296df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 297df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 298df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 299df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 300df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 301df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 302df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 303df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 304df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 305df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lStatus; 306df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 307df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 308df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 309df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { 31071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_finalize jobject: %x\n", (int)thiz); 311df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 312df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the Visualizer object 313df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = (Visualizer *)env->GetIntField( 314df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 315df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 31671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("deleting Visualizer: %x\n", (int)lpVisualizer); 317df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 318df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 319df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 320df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the JNI data 321df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField( 322df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidJniData); 323df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 32471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("deleting pJniStorage: %x\n", (int)lpJniStorage); 325df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 326df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 327df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 328df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 329df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 330df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { 331df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 332df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // do everything a call to finalize would 333df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent android_media_visualizer_native_finalize(env, thiz); 334df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // + reset the native resources in the Java object so any attempt to access 335df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // them after a call to release fails. 336df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 337df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 338df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 339df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 340df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 341df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) 342df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 343df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 344df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 345df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 346df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 347df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 348df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setEnabled(enabled)); 349df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 350df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 351df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jboolean 352df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getEnabled(JNIEnv *env, jobject thiz) 353df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 354df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 355df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 356df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return false; 357df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 358df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 359df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return (jboolean)lpVisualizer->getEnabled(); 360df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 361df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 362df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jintArray 363df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSizeRange(JNIEnv *env, jobject thiz) 364df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 365df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jintArray jRange = env->NewIntArray(2); 366df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint *nRange = env->GetIntArrayElements(jRange, NULL); 367df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[0] = Visualizer::getMinCaptureSize(); 368df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[1] = Visualizer::getMaxCaptureSize(); 36971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCaptureSizeRange() min %d max %d", nRange[0], nRange[1]); 370df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseIntArrayElements(jRange, nRange, 0); 371df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return jRange; 372df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 373df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 374df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 375df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getMaxCaptureRate(JNIEnv *env, jobject thiz) 376df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 377df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return Visualizer::getMaxCaptureRate(); 378df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 379df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 380df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 381df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint size) 382df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 383df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 384df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 385df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 386df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 387df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 388df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureSize(size)); 389df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 390df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 391df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 392df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) 393df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 394df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 395df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 396df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 397df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 398df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getCaptureSize(); 399df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 400df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 401df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 402df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) 403df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 404df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 405df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 406df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 407df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 408df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getSamplingRate(); 409df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 410df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 411df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 412df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArray jWaveform) 413df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 414df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 415df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 416df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 417df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 418df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 419df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nWaveform = (jbyte *) env->GetPrimitiveArrayCritical(jWaveform, NULL); 420df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nWaveform == NULL) { 421df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 422df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 423df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getWaveForm((uint8_t *)nWaveform)); 424df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 425df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jWaveform, nWaveform, 0); 426df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 427df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 428df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 429df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 430df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFft) 431df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 432df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 433df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 434df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 435df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 436df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 437df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nFft = (jbyte *) env->GetPrimitiveArrayCritical(jFft, NULL); 438df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nFft == NULL) { 439df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 440df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 441df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getFft((uint8_t *)nFft)); 442df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 443df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jFft, nFft, 0); 444df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 445df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 446df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 447df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 448df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 449df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_setPeriodicCapture(JNIEnv *env, jobject thiz, jint rate, jboolean jWaveform, jboolean jFft) 450df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 451df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 452df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 453df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 454df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 455df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField(thiz, 456df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData); 457df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 458df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 459df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 460df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 46171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setPeriodicCapture: rate %d, jWaveform %d jFft %d", 462df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate, 463df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jWaveform, 464df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jFft); 465df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 466df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t flags = Visualizer::CAPTURE_CALL_JAVA; 467df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jWaveform) flags |= Visualizer::CAPTURE_WAVEFORM; 468df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jFft) flags |= Visualizer::CAPTURE_FFT; 469df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer::capture_cbk_t cbk = captureCallback; 470df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (!jWaveform && !jFft) cbk = NULL; 471df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 472df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureCallBack(cbk, 473df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData, 474df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent flags, 475df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate)); 476df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 477df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 478df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 479df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 480df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// Dalvik VM type signatures 481df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic JNINativeMethod gMethods[] = { 482df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_init", "()V", (void *)android_media_visualizer_native_init}, 483df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setup", "(Ljava/lang/Object;I[I)I", 484df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent (void *)android_media_visualizer_native_setup}, 485df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_finalize", "()V", (void *)android_media_visualizer_native_finalize}, 486df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_release", "()V", (void *)android_media_visualizer_native_release}, 487df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setEnabled", "(Z)I", (void *)android_media_visualizer_native_setEnabled}, 488df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getEnabled", "()Z", (void *)android_media_visualizer_native_getEnabled}, 489df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getCaptureSizeRange", "()[I", (void *)android_media_visualizer_native_getCaptureSizeRange}, 490df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getMaxCaptureRate", "()I", (void *)android_media_visualizer_native_getMaxCaptureRate}, 491df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setCaptureSize", "(I)I", (void *)android_media_visualizer_native_setCaptureSize}, 492df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getCaptureSize", "()I", (void *)android_media_visualizer_native_getCaptureSize}, 493df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getSamplingRate", "()I", (void *)android_media_visualizer_native_getSamplingRate}, 494df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getWaveForm", "([B)I", (void *)android_media_visualizer_native_getWaveForm}, 495df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getFft", "([B)I", (void *)android_media_visualizer_native_getFft}, 496df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setPeriodicCapture","(IZZ)I",(void *)android_media_setPeriodicCapture}, 497df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 498df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 499df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 500df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 501df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentint register_android_media_visualizer(JNIEnv *env) 502df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 503df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 504df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 505df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 506