| /* |
| ** |
| ** Copyright 2008, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #define LOG_TAG "ToneGenerator" |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| |
| #include <jni.h> |
| #include <nativehelper/JNIHelp.h> |
| #include "core_jni_helpers.h" |
| |
| #include <utils/Log.h> |
| #include <media/AudioSystem.h> |
| #include <media/ToneGenerator.h> |
| |
| // ---------------------------------------------------------------------------- |
| |
| using namespace android; |
| |
| struct fields_t { |
| jfieldID context; |
| }; |
| static fields_t fields; |
| |
| static jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, jint toneType, jint durationMs) { |
| ALOGV("android_media_ToneGenerator_startTone: %p", thiz); |
| |
| ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, |
| fields.context); |
| if (lpToneGen == NULL) { |
| jniThrowRuntimeException(env, "Method called after release()"); |
| return false; |
| } |
| |
| return lpToneGen->startTone((ToneGenerator::tone_type) toneType, durationMs); |
| } |
| |
| static void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) { |
| ALOGV("android_media_ToneGenerator_stopTone: %p", thiz); |
| |
| ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, |
| fields.context); |
| |
| ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); |
| if (lpToneGen == NULL) { |
| jniThrowRuntimeException(env, "Method called after release()"); |
| return; |
| } |
| lpToneGen->stopTone(); |
| } |
| |
| static jint android_media_ToneGenerator_getAudioSessionId(JNIEnv *env, jobject thiz) { |
| ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, |
| fields.context); |
| if (lpToneGen == NULL) { |
| jniThrowRuntimeException(env, "Method called after release()"); |
| return 0; |
| } |
| return lpToneGen->getSessionId(); |
| } |
| |
| static void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) { |
| ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, |
| fields.context); |
| ALOGV("android_media_ToneGenerator_release lpToneGen: %p", lpToneGen); |
| |
| env->SetLongField(thiz, fields.context, 0); |
| |
| delete lpToneGen; |
| } |
| |
| static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, |
| jint streamType, jint volume) { |
| ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true); |
| |
| env->SetLongField(thiz, fields.context, 0); |
| |
| ALOGV("android_media_ToneGenerator_native_setup jobject: %p", thiz); |
| |
| ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); |
| |
| if (!lpToneGen->isInited()) { |
| ALOGE("ToneGenerator init failed"); |
| jniThrowRuntimeException(env, "Init failed"); |
| delete lpToneGen; |
| return; |
| } |
| |
| // Stow our new C++ ToneGenerator in an opaque field in the Java object. |
| env->SetLongField(thiz, fields.context, (jlong)lpToneGen); |
| |
| ALOGV("ToneGenerator fields.context: %p", (void*) env->GetLongField(thiz, fields.context)); |
| } |
| |
| static void android_media_ToneGenerator_native_finalize(JNIEnv *env, |
| jobject thiz) { |
| ALOGV("android_media_ToneGenerator_native_finalize jobject: %p", thiz); |
| |
| ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, |
| fields.context); |
| |
| if (lpToneGen != NULL) { |
| ALOGV("delete lpToneGen: %p", lpToneGen); |
| delete lpToneGen; |
| } |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| static const JNINativeMethod gMethods[] = { |
| { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone }, |
| { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone }, |
| { "getAudioSessionId", "()I", (void *)android_media_ToneGenerator_getAudioSessionId}, |
| { "release", "()V", (void *)android_media_ToneGenerator_release }, |
| { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup }, |
| { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize } |
| }; |
| |
| |
| int register_android_media_ToneGenerator(JNIEnv *env) { |
| jclass clazz = FindClassOrDie(env, "android/media/ToneGenerator"); |
| |
| fields.context = GetFieldIDOrDie(env, clazz, "mNativeContext", "J"); |
| ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %p", fields.context); |
| |
| return RegisterMethodsOrDie(env, "android/media/ToneGenerator", gMethods, NELEM(gMethods)); |
| } |