1b3db213eb55acb661e4b9ea40bcc00af4b76fab9Glenn Kasten/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Copyright 2008, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ToneGenerator" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <jni.h> 25c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <JNIHelp.h> 26ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <utils/Log.h> 29c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <media/AudioSystem.h> 30c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <media/ToneGenerator.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4196c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurentstatic jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, jint toneType, jint durationMs) { 42075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("android_media_ToneGenerator_startTone: %p", thiz); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen == NULL) { 4769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowRuntimeException(env, "Method called after release()"); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5123f7ad39ef52c0ac0a94934a71b6802c0a806b7fGlenn Kasten return lpToneGen->startTone((ToneGenerator::tone_type) toneType, durationMs); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) { 55075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("android_media_ToneGenerator_stopTone: %p", thiz); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen == NULL) { 6269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowRuntimeException(env, "Method called after release()"); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->stopTone(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurentstatic jint android_media_ToneGenerator_getAudioSessionId(JNIEnv *env, jobject thiz) { 69075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, 70505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent fields.context); 71505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent if (lpToneGen == NULL) { 72505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent jniThrowRuntimeException(env, "Method called after release()"); 73505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent return 0; 74505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent } 75505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent return lpToneGen->getSessionId(); 76505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent} 77505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) { 79075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 81075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("android_media_ToneGenerator_release lpToneGen: %p", lpToneGen); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, 0); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 851137be1a686fdfc9f02c3aca7c33f28006df4742Glenn Kasten delete lpToneGen; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint streamType, jint volume) { 90bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 92075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, 0); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("android_media_ToneGenerator_native_setup jobject: %p", thiz); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 96075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!lpToneGen->isInited()) { 990765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGE("ToneGenerator init failed"); 10069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowRuntimeException(env, "Init failed"); 1018a5f9c19b65aebd1972355faf0c8bb90500c7596You Kim delete lpToneGen; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ ToneGenerator in an opaque field in the Java object. 106075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, (jlong)lpToneGen); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("ToneGenerator fields.context: %p", (void*) env->GetLongField(thiz, fields.context)); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_finalize(JNIEnv *env, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject thiz) { 113075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("android_media_ToneGenerator_native_finalize jobject: %p", thiz); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 115075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1180765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten if (lpToneGen != NULL) { 1190765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("delete lpToneGen: %p", lpToneGen); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpToneGen; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 12796c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone }, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone }, 129505e5c8859f596ed58489be565d6e029314b2ac8Eric Laurent { "getAudioSessionId", "()I", (void *)android_media_ToneGenerator_getAudioSessionId}, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "release", "()V", (void *)android_media_ToneGenerator_release }, 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup }, 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_ToneGenerator(JNIEnv *env) { 137ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe jclass clazz = FindClassOrDie(env, "android/media/ToneGenerator"); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe fields.context = GetFieldIDOrDie(env, clazz, "mNativeContext", "J"); 140075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %p", fields.context); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 142ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie(env, "android/media/ToneGenerator", gMethods, NELEM(gMethods)); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 144