// ---------------------------------------------------------------------------- static void android_media_AudioRecord_release(JNIEnv *env, jobject thiz) { // serialize access. Ugly, but functional. Mutex::Autolock lock(&sLock); AudioRecord *lpRecorder = (AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetIntField( thiz, javaAudioRecordFields.nativeCallbackCookie); // reset the native resources in the Java object so any attempt to access // them after a call to release fails. env->SetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj, 0); env->SetIntField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); // delete the AudioRecord object if (lpRecorder) { LOGV("About to delete lpRecorder: %x\n", (int)lpRecorder); lpRecorder->stop(); delete lpRecorder; } // delete the callback information if (lpCookie) { LOGV("deleting lpCookie: %x\n", (int)lpCookie); env->DeleteGlobalRef(lpCookie->audioRecord_class); env->DeleteGlobalRef(lpCookie->audioRecord_ref); delete lpCookie; } }
// ---------------------------------------------------------------------------- static void android_media_AudioRecord_stop(JNIEnv *env, jobject thiz) { AudioRecord *lpRecorder = (AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); if (lpRecorder == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } lpRecorder->stop(); //LOGV("Called lpRecorder->stop()"); }
// ---------------------------------------------------------------------------- static void android_media_AudioRecord_finalize(JNIEnv *env, jobject thiz) { // delete the AudioRecord object AudioRecord *lpRecorder = (AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); if (lpRecorder) { //LOGV("About to delete lpRecorder: %x\n", (int)lpRecorder); lpRecorder->stop(); delete lpRecorder; } // delete the callback information audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetIntField( thiz, javaAudioRecordFields.nativeCallbackCookie); if (lpCookie) { LOGV("deleting lpCookie: %x\n", (int)lpCookie); delete lpCookie; } }
status_t FMA2DPWriter::readerthread() { status_t err = OK; int framecount =((4*mBufferSize)/mAudioChannels)/sizeof(int16_t); //sizeof(int16_t) is frame size for PCM stream int inChannel = (mAudioChannels == 2) ? AUDIO_CHANNEL_IN_STEREO : AUDIO_CHANNEL_IN_MONO; prctl(PR_SET_NAME, (unsigned long)"FMA2DPReaderThread", 0, 0, 0); AudioRecord* record = new AudioRecord( mAudioSource, mSampleRate, mAudioFormat, inChannel, framecount); if(!record){ ALOGE("fatal:Not able to open audiorecord"); return UNKNOWN_ERROR; } status_t res = record->initCheck(); if (res == NO_ERROR) res = record->start(); else{ ALOGE("fatal:record init check failure"); return UNKNOWN_ERROR; } while (!mDone) { mFreeQLock.lock(); if(mFreeQ.empty()){ mFreeQLock.unlock(); ALOGV("FreeQ empty"); sem_wait(&mReaderThreadWakeupsem); ALOGV("FreeQ filled up"); continue; } List<audioBufferstruct>::iterator it = mFreeQ.begin(); audioBufferstruct buff ( it->audioBuffer,it->bufferlen); mFreeQ.erase(it); mFreeQLock.unlock(); buff.bufferlen = record->read(buff.audioBuffer, mBufferSize); ALOGV("read %d bytes", buff.bufferlen); if (buff.bufferlen <= 0){ ALOGE("error in reading from audiorecord..bailing out."); this ->notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_RECORDER_ERROR_UNKNOWN, ERROR_MALFORMED); err = INVALID_OPERATION ; break; } mDataQLock.lock(); if(mDataQ.empty()){ ALOGV("waking up reader"); sem_post(&mWriterThreadWakeupsem); } mDataQ.push_back(buff); mDataQLock.unlock(); } record->stop(); delete record; return err; }