blob: aabb77803a765f0882bff86a456f95644b550af2 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/* //device/libs/android_runtime/android_media_AudioSystem.cpp
2 **
3 ** Copyright 2008, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18#define LOG_TAG "ToneGenerator"
19
20#include <stdio.h>
21#include <unistd.h>
22#include <fcntl.h>
23
24#include "jni.h"
25#include "JNIHelp.h"
26#include "android_runtime/AndroidRuntime.h"
27
28#include "utils/Log.h"
29#include "media/AudioSystem.h"
30#include "media/ToneGenerator.h"
31
32// ----------------------------------------------------------------------------
33
34using namespace android;
35
36struct fields_t {
37 jfieldID context;
38};
39static fields_t fields;
40
Eric Laurent96c08a62009-09-07 08:38:38 -070041static jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, jint toneType, jint durationMs) {
Glenn Kasten0765c442012-01-27 15:24:38 -080042 ALOGV("android_media_ToneGenerator_startTone: %x", (int)thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043
44 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz,
45 fields.context);
46 if (lpToneGen == NULL) {
Elliott Hughes69a017b2011-04-08 14:10:28 -070047 jniThrowRuntimeException(env, "Method called after release()");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048 return false;
49 }
50
Glenn Kasten23f7ad32012-01-27 15:25:25 -080051 return lpToneGen->startTone((ToneGenerator::tone_type) toneType, durationMs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052}
53
54static void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) {
Glenn Kasten0765c442012-01-27 15:24:38 -080055 ALOGV("android_media_ToneGenerator_stopTone: %x", (int)thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056
57 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz,
58 fields.context);
59
Glenn Kasten0765c442012-01-27 15:24:38 -080060 ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080061 if (lpToneGen == NULL) {
Elliott Hughes69a017b2011-04-08 14:10:28 -070062 jniThrowRuntimeException(env, "Method called after release()");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063 return;
64 }
65 lpToneGen->stopTone();
66}
67
68static void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) {
69 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz,
70 fields.context);
Glenn Kasten0765c442012-01-27 15:24:38 -080071 ALOGV("android_media_ToneGenerator_release lpToneGen: %x", (int)lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080072
73 env->SetIntField(thiz, fields.context, 0);
74
75 if (lpToneGen) {
76 delete lpToneGen;
77 }
78}
79
80static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz,
81 jint streamType, jint volume) {
Glenn Kastenbc1d77b2012-01-12 16:38:12 -080082 ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083
84 env->SetIntField(thiz, fields.context, 0);
85
Glenn Kasten0765c442012-01-27 15:24:38 -080086 ALOGV("android_media_ToneGenerator_native_setup jobject: %x", (int)thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080087
88 if (lpToneGen == NULL) {
Glenn Kasten0765c442012-01-27 15:24:38 -080089 ALOGE("ToneGenerator creation failed");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080090 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
91 return;
92 }
Glenn Kasten0765c442012-01-27 15:24:38 -080093 ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094
95 if (!lpToneGen->isInited()) {
Glenn Kasten0765c442012-01-27 15:24:38 -080096 ALOGE("ToneGenerator init failed");
Elliott Hughes69a017b2011-04-08 14:10:28 -070097 jniThrowRuntimeException(env, "Init failed");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098 return;
99 }
100
101 // Stow our new C++ ToneGenerator in an opaque field in the Java object.
102 env->SetIntField(thiz, fields.context, (int)lpToneGen);
103
Glenn Kasten0765c442012-01-27 15:24:38 -0800104 ALOGV("ToneGenerator fields.context: %x", env->GetIntField(thiz, fields.context));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800105}
106
107static void android_media_ToneGenerator_native_finalize(JNIEnv *env,
108 jobject thiz) {
Glenn Kasten0765c442012-01-27 15:24:38 -0800109 ALOGV("android_media_ToneGenerator_native_finalize jobject: %x", (int)thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800110
111 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz,
112 fields.context);
113
Glenn Kasten0765c442012-01-27 15:24:38 -0800114 if (lpToneGen != NULL) {
115 ALOGV("delete lpToneGen: %p", lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116 delete lpToneGen;
117 }
118}
119
120// ----------------------------------------------------------------------------
121
122static JNINativeMethod gMethods[] = {
Eric Laurent96c08a62009-09-07 08:38:38 -0700123 { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124 { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone },
125 { "release", "()V", (void *)android_media_ToneGenerator_release },
126 { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup },
127 { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize }
128};
129
130
131int register_android_media_ToneGenerator(JNIEnv *env) {
132 jclass clazz;
133
134 clazz = env->FindClass("android/media/ToneGenerator");
135 if (clazz == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000136 ALOGE("Can't find %s", "android/media/ToneGenerator");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137 return -1;
138 }
139
140 fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
141 if (fields.context == NULL) {
Steve Block3762c312012-01-06 19:20:56 +0000142 ALOGE("Can't find ToneGenerator.mNativeContext");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143 return -1;
144 }
Steve Block71f2cf12011-10-20 11:56:00 +0100145 ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %x", (unsigned int)fields.context);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800146
147 return AndroidRuntime::registerNativeMethods(env,
148 "android/media/ToneGenerator", gMethods, NELEM(gMethods));
149}