blob: ecb3cd60c42f07704414dcbafb5c70d958c4fcc8 [file] [log] [blame]
Glenn Kastenb3db2132012-01-19 08:59:58 -08001/*
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002 **
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
Glenn Kastenc81d31c2012-03-13 14:46:23 -070024#include <jni.h>
Steven Moreland2279b252017-07-19 09:50:45 -070025#include <nativehelper/JNIHelp.h>
Andreas Gampeed6b9df2014-11-20 22:02:20 -080026#include "core_jni_helpers.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027
Glenn Kastenc81d31c2012-03-13 14:46:23 -070028#include <utils/Log.h>
29#include <media/AudioSystem.h>
30#include <media/ToneGenerator.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031
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) {
Ashok Bhat075e9a12014-01-06 13:45:09 +000042 ALOGV("android_media_ToneGenerator_startTone: %p", thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043
Ashok Bhat075e9a12014-01-06 13:45:09 +000044 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 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) {
Ashok Bhat075e9a12014-01-06 13:45:09 +000055 ALOGV("android_media_ToneGenerator_stopTone: %p", thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056
Ashok Bhat075e9a12014-01-06 13:45:09 +000057 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080058 fields.context);
59
Ashok Bhat075e9a12014-01-06 13:45:09 +000060 ALOGV("ToneGenerator lpToneGen: %p", 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
Eric Laurent505e5c82012-03-29 15:19:36 -070068static jint android_media_ToneGenerator_getAudioSessionId(JNIEnv *env, jobject thiz) {
Ashok Bhat075e9a12014-01-06 13:45:09 +000069 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz,
Eric Laurent505e5c82012-03-29 15:19:36 -070070 fields.context);
71 if (lpToneGen == NULL) {
72 jniThrowRuntimeException(env, "Method called after release()");
73 return 0;
74 }
75 return lpToneGen->getSessionId();
76}
77
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078static void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) {
Ashok Bhat075e9a12014-01-06 13:45:09 +000079 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080080 fields.context);
Ashok Bhat075e9a12014-01-06 13:45:09 +000081 ALOGV("android_media_ToneGenerator_release lpToneGen: %p", lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082
Ashok Bhat075e9a12014-01-06 13:45:09 +000083 env->SetLongField(thiz, fields.context, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080084
Glenn Kasten1137be12012-02-08 17:47:58 -080085 delete lpToneGen;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080086}
87
88static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz,
89 jint streamType, jint volume) {
Glenn Kastenbc1d77b2012-01-12 16:38:12 -080090 ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091
Ashok Bhat075e9a12014-01-06 13:45:09 +000092 env->SetLongField(thiz, fields.context, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093
Ashok Bhat075e9a12014-01-06 13:45:09 +000094 ALOGV("android_media_ToneGenerator_native_setup jobject: %p", thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095
Ashok Bhat075e9a12014-01-06 13:45:09 +000096 ALOGV("ToneGenerator lpToneGen: %p", lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097
98 if (!lpToneGen->isInited()) {
Glenn Kasten0765c442012-01-27 15:24:38 -080099 ALOGE("ToneGenerator init failed");
Elliott Hughes69a017b2011-04-08 14:10:28 -0700100 jniThrowRuntimeException(env, "Init failed");
You Kim8a5f9c12012-12-07 04:58:28 +0900101 delete lpToneGen;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800102 return;
103 }
104
105 // Stow our new C++ ToneGenerator in an opaque field in the Java object.
Ashok Bhat075e9a12014-01-06 13:45:09 +0000106 env->SetLongField(thiz, fields.context, (jlong)lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107
Ashok Bhat075e9a12014-01-06 13:45:09 +0000108 ALOGV("ToneGenerator fields.context: %p", (void*) env->GetLongField(thiz, fields.context));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109}
110
111static void android_media_ToneGenerator_native_finalize(JNIEnv *env,
112 jobject thiz) {
Ashok Bhat075e9a12014-01-06 13:45:09 +0000113 ALOGV("android_media_ToneGenerator_native_finalize jobject: %p", thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114
Ashok Bhat075e9a12014-01-06 13:45:09 +0000115 ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116 fields.context);
117
Glenn Kasten0765c442012-01-27 15:24:38 -0800118 if (lpToneGen != NULL) {
119 ALOGV("delete lpToneGen: %p", lpToneGen);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120 delete lpToneGen;
121 }
122}
123
124// ----------------------------------------------------------------------------
125
Daniel Micay76f6a862015-09-19 17:31:01 -0400126static const JNINativeMethod gMethods[] = {
Eric Laurent96c08a62009-09-07 08:38:38 -0700127 { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800128 { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone },
Eric Laurent505e5c82012-03-29 15:19:36 -0700129 { "getAudioSessionId", "()I", (void *)android_media_ToneGenerator_getAudioSessionId},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130 { "release", "()V", (void *)android_media_ToneGenerator_release },
131 { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup },
132 { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize }
133};
134
135
136int register_android_media_ToneGenerator(JNIEnv *env) {
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800137 jclass clazz = FindClassOrDie(env, "android/media/ToneGenerator");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800139 fields.context = GetFieldIDOrDie(env, clazz, "mNativeContext", "J");
Ashok Bhat075e9a12014-01-06 13:45:09 +0000140 ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %p", fields.context);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800142 return RegisterMethodsOrDie(env, "android/media/ToneGenerator", gMethods, NELEM(gMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143}