android_media_Visualizer.cpp revision 2fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8
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 110df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("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); 134df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 135df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 136df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 137df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fftSize != 0 && fft != NULL) { 138df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyteArray jArray = env->NewByteArray(fftSize); 139df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jArray != NULL) { 140df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte *nArray = env->GetByteArrayElements(jArray, NULL); 141df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent memcpy(nArray, fft, fftSize); 142df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseByteArrayElements(jArray, nArray, 0); 143df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->CallStaticVoidMethod( 144df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class, 145df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent, 146df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 147df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NATIVE_EVENT_FFT_CAPTURE, 148df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent samplingrate, 149df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 0, 150df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jArray); 151df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->DeleteLocalRef(jArray); 152df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 153df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 154df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 155df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (env->ExceptionCheck()) { 156df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionDescribe(); 157df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionClear(); 158df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 159df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 160df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 161df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic Visualizer *getVisualizer(JNIEnv* env, jobject thiz) 162df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 163df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer *v = (Visualizer *)env->GetIntField( 164df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 165df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (v == NULL) { 166df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", 167df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "Unable to retrieve Visualizer pointer"); 168df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 169df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return v; 170df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 171df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 172df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 173df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// This function gets some field IDs, which in turn causes class initialization. 174df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// It is called from a static block in Visualizer, which won't run until the 175df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// first time an instance of this class is used. 176df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void 177df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_init(JNIEnv *env) 178df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 179df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 180df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("android_media_visualizer_native_init"); 181df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 182df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = NULL; 183df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 184df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the Visualizer class 185df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass clazz = env->FindClass(kClassPathName); 186df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (clazz == NULL) { 187df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find %s", kClassPathName); 188df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 189df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 190df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 191df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = (jclass)env->NewGlobalRef(clazz); 192df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 193df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the postEvent method 194df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent = env->GetStaticMethodID( 195df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 196df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 197df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.midPostNativeEvent == NULL) { 198df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "postEventFromNative"); 199df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 200df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 201df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 202df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the variables fields 203df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // nativeTrackInJavaObj 204df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidNativeVisualizer = env->GetFieldID( 205df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 206df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mNativeVisualizer", "I"); 207df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidNativeVisualizer == NULL) { 208df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "mNativeVisualizer"); 209df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 210df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 211df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // fidJniData; 212df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData = env->GetFieldID( 213df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 214df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mJniData", "I"); 215df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidJniData == NULL) { 216df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Can't find Visualizer.%s", "mJniData"); 217df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 218df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 219df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 220df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 221df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 222df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 223df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 224df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, 225df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint sessionId, jintArray jId) 226df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 227df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("android_media_visualizer_native_setup"); 228df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = NULL; 229df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int lStatus = VISUALIZER_ERROR_NO_MEMORY; 230df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = NULL; 231df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint* nId = NULL; 232df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 233df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage = new visualizerJniStorage(); 234df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 235df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("setup: Error creating JNI Storage"); 236df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 237df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 238df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 239df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class = (jclass)env->NewGlobalRef(fields.clazzEffect); 240df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // we use a weak reference so the Visualizer object can be garbage collected. 241df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref = env->NewGlobalRef(weak_this); 242df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 243df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("setup: lpJniStorage: %p visualizer_ref %p visualizer_class %p, &mCallbackData %p", 244df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage, 245df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref, 246df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class, 247df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData); 248df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 2492fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (jId == NULL) { 250df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("setup: NULL java array for id pointer"); 251df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 252df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 253df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 254df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 255df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // create the native Visualizer object 256df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpVisualizer = new Visualizer(0, 257df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NULL, 258df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NULL, 259df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent sessionId); 260df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 261df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Error creating Visualizer"); 262df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 263df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 264df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 265df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = translateError(lpVisualizer->initCheck()); 266df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) { 267df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGE("Visualizer initCheck failed %d", lStatus); 268df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 269df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 270df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 2712fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL); 2722fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (nId == NULL) { 2732fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent LOGE("setup: Error retrieving id pointer"); 2742fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 2752fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent goto setup_failure; 2762fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent } 277df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId[0] = lpVisualizer->id(); 278df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 279df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId = NULL; 280df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 281df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, (int)lpVisualizer); 282df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 283df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, (int)lpJniStorage); 284df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 285df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_SUCCESS; 286df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 287df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // failures: 288df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentsetup_failure: 289df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 290df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nId != NULL) { 291df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 292df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 293df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 294df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 295df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 296df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 297df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 298df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 299df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 300df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 301df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 302df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 303df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 304df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lStatus; 305df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 306df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 307df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 308df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { 309df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("android_media_visualizer_native_finalize jobject: %x\n", (int)thiz); 310df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 311df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the Visualizer object 312df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = (Visualizer *)env->GetIntField( 313df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 314df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 315df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("deleting Visualizer: %x\n", (int)lpVisualizer); 316df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 317df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 318df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 319df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the JNI data 320df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField( 321df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidJniData); 322df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 323df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("deleting pJniStorage: %x\n", (int)lpJniStorage); 324df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 325df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 326df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 327df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 328df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 329df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { 330df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 331df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // do everything a call to finalize would 332df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent android_media_visualizer_native_finalize(env, thiz); 333df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // + reset the native resources in the Java object so any attempt to access 334df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // them after a call to release fails. 335df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 336df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 337df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 338df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 339df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 340df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) 341df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 342df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 343df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 344df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 345df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 346df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 347df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setEnabled(enabled)); 348df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 349df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 350df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jboolean 351df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getEnabled(JNIEnv *env, jobject thiz) 352df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 353df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 354df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 355df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return false; 356df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 357df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 358df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return (jboolean)lpVisualizer->getEnabled(); 359df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 360df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 361df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jintArray 362df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSizeRange(JNIEnv *env, jobject thiz) 363df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 364df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jintArray jRange = env->NewIntArray(2); 365df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint *nRange = env->GetIntArrayElements(jRange, NULL); 366df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[0] = Visualizer::getMinCaptureSize(); 367df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[1] = Visualizer::getMaxCaptureSize(); 368df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("getCaptureSizeRange() min %d max %d", nRange[0], nRange[1]); 369df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseIntArrayElements(jRange, nRange, 0); 370df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return jRange; 371df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 372df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 373df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 374df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getMaxCaptureRate(JNIEnv *env, jobject thiz) 375df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 376df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return Visualizer::getMaxCaptureRate(); 377df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 378df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 379df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 380df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint size) 381df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 382df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 383df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 384df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 385df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 386df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 387df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureSize(size)); 388df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 389df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 390df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 391df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) 392df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 393df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 394df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 395df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 396df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 397df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getCaptureSize(); 398df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 399df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 400df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 401df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) 402df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 403df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 404df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 405df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 406df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 407df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getSamplingRate(); 408df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 409df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 410df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 411df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArray jWaveform) 412df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 413df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 414df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 415df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 416df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 417df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 418df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nWaveform = (jbyte *) env->GetPrimitiveArrayCritical(jWaveform, NULL); 419df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nWaveform == NULL) { 420df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 421df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 422df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getWaveForm((uint8_t *)nWaveform)); 423df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 424df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jWaveform, nWaveform, 0); 425df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 426df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 427df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 428df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 429df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFft) 430df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 431df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 432df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 433df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 434df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 435df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 436df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nFft = (jbyte *) env->GetPrimitiveArrayCritical(jFft, NULL); 437df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nFft == NULL) { 438df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 439df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 440df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getFft((uint8_t *)nFft)); 441df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 442df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jFft, nFft, 0); 443df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 444df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 445df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 446df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 447df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 448df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_setPeriodicCapture(JNIEnv *env, jobject thiz, jint rate, jboolean jWaveform, jboolean jFft) 449df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 450df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 451df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 452df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 453df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 454df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField(thiz, 455df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData); 456df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 457df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 458df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 459df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 460df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent LOGV("setPeriodicCapture: rate %d, jWaveform %d jFft %d", 461df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate, 462df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jWaveform, 463df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jFft); 464df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 465df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t flags = Visualizer::CAPTURE_CALL_JAVA; 466df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jWaveform) flags |= Visualizer::CAPTURE_WAVEFORM; 467df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jFft) flags |= Visualizer::CAPTURE_FFT; 468df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer::capture_cbk_t cbk = captureCallback; 469df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (!jWaveform && !jFft) cbk = NULL; 470df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 471df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureCallBack(cbk, 472df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData, 473df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent flags, 474df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate)); 475df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 476df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 477df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 478df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 479df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// Dalvik VM type signatures 480df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic JNINativeMethod gMethods[] = { 481df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_init", "()V", (void *)android_media_visualizer_native_init}, 482df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setup", "(Ljava/lang/Object;I[I)I", 483df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent (void *)android_media_visualizer_native_setup}, 484df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_finalize", "()V", (void *)android_media_visualizer_native_finalize}, 485df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_release", "()V", (void *)android_media_visualizer_native_release}, 486df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setEnabled", "(Z)I", (void *)android_media_visualizer_native_setEnabled}, 487df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getEnabled", "()Z", (void *)android_media_visualizer_native_getEnabled}, 488df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getCaptureSizeRange", "()[I", (void *)android_media_visualizer_native_getCaptureSizeRange}, 489df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getMaxCaptureRate", "()I", (void *)android_media_visualizer_native_getMaxCaptureRate}, 490df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setCaptureSize", "(I)I", (void *)android_media_visualizer_native_setCaptureSize}, 491df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getCaptureSize", "()I", (void *)android_media_visualizer_native_getCaptureSize}, 492df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getSamplingRate", "()I", (void *)android_media_visualizer_native_getSamplingRate}, 493df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getWaveForm", "([B)I", (void *)android_media_visualizer_native_getWaveForm}, 494df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getFft", "([B)I", (void *)android_media_visualizer_native_getFft}, 495df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setPeriodicCapture","(IZZ)I",(void *)android_media_setPeriodicCapture}, 496df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 497df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 498df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 499df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 500df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentint register_android_media_visualizer(JNIEnv *env) 501df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 502df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 503df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 504df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 505