android_media_ToneGenerator.cpp revision 1137be1a686fdfc9f02c3aca7c33f28006df4742
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_media_AudioSystem.cpp 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 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "media/AudioSystem.h" 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#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) { 420765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("android_media_ToneGenerator_startTone: %x", (int)thiz); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(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) { 550765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("android_media_ToneGenerator_stopTone: %x", (int)thiz); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 600765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)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 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 710765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("android_media_ToneGenerator_release lpToneGen: %x", (int)lpToneGen); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 751137be1a686fdfc9f02c3aca7c33f28006df4742Glenn Kasten delete lpToneGen; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint streamType, jint volume) { 80bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 840765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("android_media_ToneGenerator_native_setup jobject: %x", (int)thiz); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen == NULL) { 870765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGE("ToneGenerator creation failed"); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 910765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)lpToneGen); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!lpToneGen->isInited()) { 940765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGE("ToneGenerator init failed"); 9569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowRuntimeException(env, "Init failed"); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ ToneGenerator in an opaque field in the Java object. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, (int)lpToneGen); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1020765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("ToneGenerator fields.context: %x", env->GetIntField(thiz, fields.context)); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_finalize(JNIEnv *env, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject thiz) { 1070765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("android_media_ToneGenerator_native_finalize jobject: %x", (int)thiz); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1120765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten if (lpToneGen != NULL) { 1130765c448ab7d51355a7b1e82d359acfcf169f481Glenn Kasten ALOGV("delete lpToneGen: %p", lpToneGen); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpToneGen; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 12196c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone }, 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone }, 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "release", "()V", (void *)android_media_ToneGenerator_release }, 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup }, 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_ToneGenerator(JNIEnv *env) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/media/ToneGenerator"); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 1343762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find %s", "android/media/ToneGenerator"); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fields.context == NULL) { 1403762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find ToneGenerator.mNativeContext"); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %x", (unsigned int)fields.context); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/ToneGenerator", gMethods, NELEM(gMethods)); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 148