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