android_media_ToneGenerator.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, jint toneType) { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("android_media_ToneGenerator_startTone: %x\n", (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) { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Method called after release()"); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lpToneGen->startTone(toneType); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("android_media_ToneGenerator_stopTone: %x\n", (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 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator lpToneGen: %x\n", (unsigned int)lpToneGen); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen == NULL) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "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); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("android_media_ToneGenerator_release lpToneGen: %x\n", (int)lpToneGen); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpToneGen; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint streamType, jint volume) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = new ToneGenerator(streamType, AudioSystem::linearToLog(volume)); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, 0); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("android_media_ToneGenerator_native_setup jobject: %x\n", (int)thiz); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen == NULL) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("ToneGenerator creation failed \n"); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator lpToneGen: %x\n", (unsigned int)lpToneGen); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!lpToneGen->isInited()) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("ToneGenerator init failed \n"); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Init failed"); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ ToneGenerator in an opaque field in the Java object. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(thiz, fields.context, (int)lpToneGen); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator fields.context: %x\n", env->GetIntField(thiz, fields.context)); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_media_ToneGenerator_native_finalize(JNIEnv *env, 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject thiz) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("android_media_ToneGenerator_native_finalize jobject: %x\n", (int)thiz); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("delete lpToneGen: %x\n", (int)lpToneGen); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete lpToneGen; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "startTone", "(I)Z", (void *)android_media_ToneGenerator_startTone }, 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone }, 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "release", "()V", (void *)android_media_ToneGenerator_release }, 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup }, 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_ToneGenerator(JNIEnv *env) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/media/ToneGenerator"); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find %s", "android/media/ToneGenerator"); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fields.context == NULL) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find ToneGenerator.mNativeContext"); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %x", (unsigned int)fields.context); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/ToneGenerator", gMethods, NELEM(gMethods)); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 150