android_media_Visualizer.cpp revision 67a12184776605b6e6ddc01ca91b533a2e37a40b
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> 26449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman#include <utils/threads.h> 27df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#include "media/Visualizer.h" 28df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 29df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentusing namespace android; 30df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 31df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_SUCCESS 0 32df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR -1 33df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_ALREADY_EXISTS -2 34df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_NO_INIT -3 35df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_BAD_VALUE -4 36df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_INVALID_OPERATION -5 37df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_NO_MEMORY -6 38df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define VISUALIZER_ERROR_DEAD_OBJECT -7 39df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 40df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define NATIVE_EVENT_PCM_CAPTURE 0 41df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent#define NATIVE_EVENT_FFT_CAPTURE 1 423540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman#define NATIVE_EVENT_SERVER_DIED 2 43df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 44df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 451a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentstatic const char* const kClassPathName = "android/media/audiofx/Visualizer"; 46df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 47df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstruct fields_t { 48df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // these fields provide access from C++ to the... 49df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass clazzEffect; // Visualizer class 50df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jmethodID midPostNativeEvent; // event post callback method 51df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jfieldID fidNativeVisualizer; // stores in Java the native Visualizer object 52df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jfieldID fidJniData; // stores in Java additional resources used by the native Visualizer 53df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 54df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic fields_t fields; 55df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 56df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstruct visualizer_callback_cookie { 57df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass visualizer_class; // Visualizer class 58df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jobject visualizer_ref; // Visualizer object instance 59449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 60449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // Lazily allocated arrays used to hold callback data provided to java 61449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // applications. These arrays are allocated during the first callback and 62449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // reallocated when the size of the callback data changes. Allocating on 63449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // demand and saving the arrays means that applications cannot safely hold a 64449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // reference to the provided data (they need to make a copy if they want to 65449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // hold onto outside of the callback scope), but it avoids GC thrash caused 66449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // by constantly allocating and releasing arrays to hold callback data. 67449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman Mutex callback_data_lock; 68449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jbyteArray waveform_data; 69449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jbyteArray fft_data; 70449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 71449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman visualizer_callback_cookie() { 72449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman waveform_data = NULL; 73449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman fft_data = NULL; 74449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 75449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 76449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman ~visualizer_callback_cookie() { 77449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman cleanupBuffers(); 78449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 79449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 80449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman void cleanupBuffers() { 81449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman AutoMutex lock(&callback_data_lock); 82449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (waveform_data || fft_data) { 83449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman JNIEnv *env = AndroidRuntime::getJNIEnv(); 84449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 85449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (waveform_data) { 86449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman env->DeleteGlobalRef(waveform_data); 87449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman waveform_data = NULL; 88449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 89449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 90449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (fft_data) { 91449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman env->DeleteGlobalRef(fft_data); 92449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman fft_data = NULL; 93449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 94449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 95449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 96df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent }; 97df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 98df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 99df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentclass visualizerJniStorage { 100df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent public: 101df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizer_callback_cookie mCallbackData; 102df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 103df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage() { 104df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 105df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 106df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent ~visualizerJniStorage() { 107df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 108df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 109df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 110df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 111df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint translateError(int code) { 112df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent switch(code) { 113df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_ERROR: 114df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_SUCCESS; 115df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case ALREADY_EXISTS: 116df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_ALREADY_EXISTS; 117df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_INIT: 118df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 119df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case BAD_VALUE: 120df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_BAD_VALUE; 121df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case INVALID_OPERATION: 122df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_INVALID_OPERATION; 123df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case NO_MEMORY: 124df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 125df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent case DEAD_OBJECT: 126df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_DEAD_OBJECT; 127df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent default: 128df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR; 129df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 130df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 131df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 132df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 133df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 134449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossmanstatic void ensureArraySize(JNIEnv *env, jbyteArray *array, uint32_t size) { 135449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (NULL != *array) { 136449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman uint32_t len = env->GetArrayLength(*array); 137449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (len == size) 138449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman return; 139449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 140449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman env->DeleteGlobalRef(*array); 141449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman *array = NULL; 142449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 143449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 144449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jbyteArray localRef = env->NewByteArray(size); 145449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (NULL != localRef) { 146449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // Promote to global ref. 147449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman *array = (jbyteArray)env->NewGlobalRef(localRef); 148449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 149449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman // Release our (now pointless) local ref. 150449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman env->DeleteLocalRef(localRef); 151449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 152449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman} 153449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 154df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void captureCallback(void* user, 155df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t waveformSize, 156df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint8_t *waveform, 157df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t fftSize, 158df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint8_t *fft, 159df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t samplingrate) { 160df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 161df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int arg1 = 0; 162df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int arg2 = 0; 163df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent size_t size; 164df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 165df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizer_callback_cookie *callbackInfo = (visualizer_callback_cookie *)user; 166df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent JNIEnv *env = AndroidRuntime::getJNIEnv(); 16767a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen 16867a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen if (!user || !env) { 16967a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen ALOGW("captureCallback error user %p, env %p", user, env); 17067a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen return; 17167a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen } 172df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 17371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("captureCallback: callbackInfo %p, visualizer_ref %p visualizer_class %p", 174df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo, 175df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 176df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class); 177df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 17867a12184776605b6e6ddc01ca91b533a2e37a40bMike J. Chen AutoMutex lock(&callbackInfo->callback_data_lock); 179df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 180df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (waveformSize != 0 && waveform != NULL) { 181449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jbyteArray jArray; 182449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 183449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman ensureArraySize(env, &callbackInfo->waveform_data, waveformSize); 184449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jArray = callbackInfo->waveform_data; 185449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 186df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jArray != NULL) { 187df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte *nArray = env->GetByteArrayElements(jArray, NULL); 188df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent memcpy(nArray, waveform, waveformSize); 189df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseByteArrayElements(jArray, nArray, 0); 190df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->CallStaticVoidMethod( 191df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class, 192df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent, 193df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 194df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NATIVE_EVENT_PCM_CAPTURE, 195df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent samplingrate, 196df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 0, 197df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jArray); 198df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 199df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 200df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 201df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fftSize != 0 && fft != NULL) { 202449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jbyteArray jArray; 203449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 204449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman ensureArraySize(env, &callbackInfo->fft_data, fftSize); 205449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jArray = callbackInfo->fft_data; 206449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 207df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jArray != NULL) { 208df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte *nArray = env->GetByteArrayElements(jArray, NULL); 209df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent memcpy(nArray, fft, fftSize); 210df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseByteArrayElements(jArray, nArray, 0); 211df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->CallStaticVoidMethod( 212df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_class, 213df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent, 214df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent callbackInfo->visualizer_ref, 215df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent NATIVE_EVENT_FFT_CAPTURE, 216df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent samplingrate, 217df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 0, 218df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jArray); 219df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 220df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 221df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 222df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (env->ExceptionCheck()) { 223df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionDescribe(); 224df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ExceptionClear(); 225df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 226df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 227df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 228df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic Visualizer *getVisualizer(JNIEnv* env, jobject thiz) 229df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 230df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer *v = (Visualizer *)env->GetIntField( 231df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 232df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (v == NULL) { 233df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", 234df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "Unable to retrieve Visualizer pointer"); 235df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 236df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return v; 237df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 238df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 239df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 240df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// This function gets some field IDs, which in turn causes class initialization. 241df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// It is called from a static block in Visualizer, which won't run until the 242df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// first time an instance of this class is used. 243df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void 244df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_init(JNIEnv *env) 245df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 246df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 24771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_init"); 248df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 249df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = NULL; 250df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 251df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the Visualizer class 252df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jclass clazz = env->FindClass(kClassPathName); 253df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (clazz == NULL) { 2543762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find %s", kClassPathName); 255df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 256df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 257df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 258df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect = (jclass)env->NewGlobalRef(clazz); 259df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 260df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the postEvent method 261df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.midPostNativeEvent = env->GetStaticMethodID( 262df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 263df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 264df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.midPostNativeEvent == NULL) { 2653762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find Visualizer.%s", "postEventFromNative"); 266df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 267df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 268df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 269df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // Get the variables fields 270df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // nativeTrackInJavaObj 271df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidNativeVisualizer = env->GetFieldID( 272df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 273df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mNativeVisualizer", "I"); 274df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidNativeVisualizer == NULL) { 2753762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find Visualizer.%s", "mNativeVisualizer"); 276df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 277df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 278df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // fidJniData; 279df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData = env->GetFieldID( 280df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.clazzEffect, 281df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent "mJniData", "I"); 282df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (fields.fidJniData == NULL) { 2833762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find Visualizer.%s", "mJniData"); 284df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return; 285df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 286df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 287df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 288df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 2893540a0197f56c4bcd7d7419f4502bfca34257de2John Grossmanstatic void android_media_visualizer_effect_callback(int32_t event, 2903540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman void *user, 2913540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman void *info) { 2923540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman if ((event == AudioEffect::EVENT_ERROR) && 2933540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman (*((status_t*)info) == DEAD_OBJECT)) { 2943540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman visualizerJniStorage* lpJniStorage = (visualizerJniStorage*)user; 2953540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman visualizer_callback_cookie* callbackInfo = &lpJniStorage->mCallbackData; 2963540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman JNIEnv *env = AndroidRuntime::getJNIEnv(); 2973540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman 2983540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman env->CallStaticVoidMethod( 2993540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman callbackInfo->visualizer_class, 3003540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman fields.midPostNativeEvent, 3013540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman callbackInfo->visualizer_ref, 3023540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman NATIVE_EVENT_SERVER_DIED, 3033540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman 0, 0, 0); 3043540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman } 3053540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman} 306df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 307df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 308df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, 309df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint sessionId, jintArray jId) 310df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 31171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_setup"); 312df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = NULL; 313df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent int lStatus = VISUALIZER_ERROR_NO_MEMORY; 314df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = NULL; 315df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint* nId = NULL; 316df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 317df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage = new visualizerJniStorage(); 318df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 3193762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("setup: Error creating JNI Storage"); 320df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 321df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 322df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 323df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class = (jclass)env->NewGlobalRef(fields.clazzEffect); 324df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // we use a weak reference so the Visualizer object can be garbage collected. 325df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref = env->NewGlobalRef(weak_this); 326df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 32771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setup: lpJniStorage: %p visualizer_ref %p visualizer_class %p, &mCallbackData %p", 328df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage, 329df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_ref, 330df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpJniStorage->mCallbackData.visualizer_class, 331df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData); 332df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 3332fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (jId == NULL) { 3343762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("setup: NULL java array for id pointer"); 335df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 336df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 337df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 338df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 339df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // create the native Visualizer object 340df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lpVisualizer = new Visualizer(0, 3413540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman android_media_visualizer_effect_callback, 3423540a0197f56c4bcd7d7419f4502bfca34257de2John Grossman lpJniStorage, 343df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent sessionId); 344df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 3453762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Error creating Visualizer"); 346df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 347df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 348df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 349df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent lStatus = translateError(lpVisualizer->initCheck()); 350df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) { 3513762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Visualizer initCheck failed %d", lStatus); 352df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent goto setup_failure; 353df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 354df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 3552fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL); 3562fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent if (nId == NULL) { 3573762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("setup: Error retrieving id pointer"); 3582fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent lStatus = VISUALIZER_ERROR_BAD_VALUE; 3592fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent goto setup_failure; 3602fb43ef8c0b922c1bd0d7cb6867e30d702d4bdb8Eric Laurent } 361df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId[0] = lpVisualizer->id(); 362df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 363df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nId = NULL; 364df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 365df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, (int)lpVisualizer); 366df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 367df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, (int)lpJniStorage); 368df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 369df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_SUCCESS; 370df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 371df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // failures: 372df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentsetup_failure: 373df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 374df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nId != NULL) { 375df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jId, nId, 0); 376df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 377df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 378df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 379df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 380df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 381df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 382df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 383df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 384df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 385df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 386df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 387df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 388df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lStatus; 389df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 390df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 391df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 392df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { 39371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("android_media_visualizer_native_finalize jobject: %x\n", (int)thiz); 394df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 395df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the Visualizer object 396df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = (Visualizer *)env->GetIntField( 397df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidNativeVisualizer); 398df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer) { 39971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("deleting Visualizer: %x\n", (int)lpVisualizer); 400df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpVisualizer; 401df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 402df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 403df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // delete the JNI data 404df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField( 405df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent thiz, fields.fidJniData); 406df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage) { 40771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("deleting pJniStorage: %x\n", (int)lpJniStorage); 408df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent delete lpJniStorage; 409df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 410df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 411df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 412df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 413df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { 414df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 415df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // do everything a call to finalize would 416df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent android_media_visualizer_native_finalize(env, thiz); 417df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // + reset the native resources in the Java object so any attempt to access 418df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent // them after a call to release fails. 419df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidNativeVisualizer, 0); 420df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->SetIntField(thiz, fields.fidJniData, 0); 421df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 422df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 423df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 424df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) 425df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 426df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 427df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 428df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 429df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 430df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 431449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman jint retVal = translateError(lpVisualizer->setEnabled(enabled)); 432449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 433449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (!enabled) { 434449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField( 435449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman thiz, fields.fidJniData); 436449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 437449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman if (NULL != lpJniStorage) 438449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman lpJniStorage->mCallbackData.cleanupBuffers(); 439449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman } 440449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman 441449725f9aa67136a38c7554ba76ac4e27e5e3bd3John Grossman return retVal; 442df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 443df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 444df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jboolean 445df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getEnabled(JNIEnv *env, jobject thiz) 446df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 447df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 448df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 449df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return false; 450df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 451df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 452df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return (jboolean)lpVisualizer->getEnabled(); 453df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 454df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 455df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jintArray 456df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSizeRange(JNIEnv *env, jobject thiz) 457df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 458df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jintArray jRange = env->NewIntArray(2); 459df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint *nRange = env->GetIntArrayElements(jRange, NULL); 460df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[0] = Visualizer::getMinCaptureSize(); 461df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent nRange[1] = Visualizer::getMaxCaptureSize(); 46271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCaptureSizeRange() min %d max %d", nRange[0], nRange[1]); 463df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleaseIntArrayElements(jRange, nRange, 0); 464df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return jRange; 465df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 466df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 467df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 468df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getMaxCaptureRate(JNIEnv *env, jobject thiz) 469df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 470df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return Visualizer::getMaxCaptureRate(); 471df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 472df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 473df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 474df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint size) 475df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 476df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 477df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 478df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 479df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 480df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 481df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureSize(size)); 482df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 483df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 484df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 485df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) 486df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 487df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 488df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 489df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 490df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 491df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getCaptureSize(); 492df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 493df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 494df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 495e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Triviandroid_media_visualizer_native_setScalingMode(JNIEnv *env, jobject thiz, jint mode) 496e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi{ 497e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi Visualizer* lpVisualizer = getVisualizer(env, thiz); 498e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi if (lpVisualizer == NULL) { 499e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi return VISUALIZER_ERROR_NO_INIT; 500e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi } 501e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi 502e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi return translateError(lpVisualizer->setScalingMode(mode)); 503e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi} 504e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi 505e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivistatic jint 506e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Triviandroid_media_visualizer_native_getScalingMode(JNIEnv *env, jobject thiz) 507e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi{ 508e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi Visualizer* lpVisualizer = getVisualizer(env, thiz); 509e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi if (lpVisualizer == NULL) { 510e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi return -1; 511e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi } 512e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi return lpVisualizer->getScalingMode(); 513e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi} 514e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi 515e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivistatic jint 516df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) 517df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 518df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 519df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 520df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return -1; 521df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 522df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return lpVisualizer->getSamplingRate(); 523df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 524df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 525df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 526df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArray jWaveform) 527df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 528df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 529df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 530df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 531df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 532df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 533df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nWaveform = (jbyte *) env->GetPrimitiveArrayCritical(jWaveform, NULL); 534df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nWaveform == NULL) { 535df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 536df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 537df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getWaveForm((uint8_t *)nWaveform)); 538df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 539df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jWaveform, nWaveform, 0); 540df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 541df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 542df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 543df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 544df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFft) 545df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 546df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 547df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 548df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 549df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 550df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 551df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jbyte* nFft = (jbyte *) env->GetPrimitiveArrayCritical(jFft, NULL); 552df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (nFft == NULL) { 553df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_MEMORY; 554df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 555df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jint status = translateError(lpVisualizer->getFft((uint8_t *)nFft)); 556df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 557df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent env->ReleasePrimitiveArrayCritical(jFft, nFft, 0); 558df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 559df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return status; 560df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 561df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 562df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic jint 563df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentandroid_media_setPeriodicCapture(JNIEnv *env, jobject thiz, jint rate, jboolean jWaveform, jboolean jFft) 564df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 565df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer* lpVisualizer = getVisualizer(env, thiz); 566df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpVisualizer == NULL) { 567df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 568df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 569df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetIntField(thiz, 570df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent fields.fidJniData); 571df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (lpJniStorage == NULL) { 572df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return VISUALIZER_ERROR_NO_INIT; 573df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent } 574df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 57571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setPeriodicCapture: rate %d, jWaveform %d jFft %d", 576df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate, 577df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jWaveform, 578df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent jFft); 579df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 580df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent uint32_t flags = Visualizer::CAPTURE_CALL_JAVA; 581df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jWaveform) flags |= Visualizer::CAPTURE_WAVEFORM; 582df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (jFft) flags |= Visualizer::CAPTURE_FFT; 583df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent Visualizer::capture_cbk_t cbk = captureCallback; 584df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent if (!jWaveform && !jFft) cbk = NULL; 585df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 586df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return translateError(lpVisualizer->setCaptureCallBack(cbk, 587df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent &lpJniStorage->mCallbackData, 588df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent flags, 589df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent rate)); 590df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 591df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 592df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 593df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 594df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// Dalvik VM type signatures 595df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentstatic JNINativeMethod gMethods[] = { 596df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_init", "()V", (void *)android_media_visualizer_native_init}, 597df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setup", "(Ljava/lang/Object;I[I)I", 598df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent (void *)android_media_visualizer_native_setup}, 599df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_finalize", "()V", (void *)android_media_visualizer_native_finalize}, 600df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_release", "()V", (void *)android_media_visualizer_native_release}, 601df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setEnabled", "(Z)I", (void *)android_media_visualizer_native_setEnabled}, 602df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getEnabled", "()Z", (void *)android_media_visualizer_native_getEnabled}, 603df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getCaptureSizeRange", "()[I", (void *)android_media_visualizer_native_getCaptureSizeRange}, 604df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"getMaxCaptureRate", "()I", (void *)android_media_visualizer_native_getMaxCaptureRate}, 605df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setCaptureSize", "(I)I", (void *)android_media_visualizer_native_setCaptureSize}, 606df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getCaptureSize", "()I", (void *)android_media_visualizer_native_getCaptureSize}, 607e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi {"native_setScalingMode", "(I)I", (void *)android_media_visualizer_native_setScalingMode}, 608e1123e7f36723a8b888501c9a22a589297849ca2Jean-Michel Trivi {"native_getScalingMode", "()I", (void *)android_media_visualizer_native_getScalingMode}, 609df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getSamplingRate", "()I", (void *)android_media_visualizer_native_getSamplingRate}, 610df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getWaveForm", "([B)I", (void *)android_media_visualizer_native_getWaveForm}, 611df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_getFft", "([B)I", (void *)android_media_visualizer_native_getFft}, 612df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent {"native_setPeriodicCapture","(IZZ)I",(void *)android_media_setPeriodicCapture}, 613df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent}; 614df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 615df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent// ---------------------------------------------------------------------------- 616df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 617df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurentint register_android_media_visualizer(JNIEnv *env) 618df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent{ 619df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 620df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent} 621df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent 622