AudioRecord JAVA: expose audio session Id

Added getAudioSessionId() method to AudioRecord class so that applications can
retrieve the AudioRecord's session ID and attach audio pre processes.

Change-Id: I1914770f0e54d97c9aef6a9eb36fff69b6d31552
This commit is contained in:
Eric Laurent
2011-06-18 10:34:05 -07:00
parent 464d5b3da2
commit 44ff4cd8be
2 changed files with 49 additions and 6 deletions

View File

@@ -127,7 +127,7 @@ static void recorderCallback(int event, void* user, void *info) {
static int
android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
jint source, jint sampleRateInHertz, jint channels,
jint audioFormat, jint buffSizeInBytes)
jint audioFormat, jint buffSizeInBytes, jintArray jSession)
{
//LOGV(">> Entering android_media_AudioRecord_setup");
//LOGV("sampleRate=%d, audioFormat=%d, channels=%x, buffSizeInBytes=%d",
@@ -162,6 +162,20 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
return AUDIORECORD_ERROR_SETUP_INVALIDSOURCE;
}
if (jSession == NULL) {
LOGE("Error creating AudioRecord: invalid session ID pointer");
return AUDIORECORD_ERROR;
}
jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
LOGE("Error creating AudioRecord: Error retrieving session id pointer");
return AUDIORECORD_ERROR;
}
int sessionId = nSession[0];
env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);
nSession = NULL;
audiorecord_callback_cookie *lpCallbackData = NULL;
AudioRecord* lpRecorder = NULL;
@@ -193,13 +207,24 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this,
recorderCallback,// callback_t
lpCallbackData,// void* user
0, // notificationFrames,
true); // threadCanCallJava)
true, // threadCanCallJava)
sessionId);
if(lpRecorder->initCheck() != NO_ERROR) {
LOGE("Error creating AudioRecord instance: initialization check failed.");
goto native_init_failure;
}
nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
if (nSession == NULL) {
LOGE("Error creating AudioRecord: Error retrieving session id pointer");
goto native_init_failure;
}
// read the audio session ID back from AudioTrack in case a new session was created during set()
nSession[0] = lpRecorder->getSessionId();
env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);
nSession = NULL;
// save our newly created C++ AudioRecord in the "nativeRecorderInJavaObj" field
// of the Java object
env->SetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj, (int)lpRecorder);
@@ -485,7 +510,7 @@ static JNINativeMethod gMethods[] = {
// name, signature, funcPtr
{"native_start", "()I", (void *)android_media_AudioRecord_start},
{"native_stop", "()V", (void *)android_media_AudioRecord_stop},
{"native_setup", "(Ljava/lang/Object;IIIII)I",
{"native_setup", "(Ljava/lang/Object;IIIII[I)I",
(void *)android_media_AudioRecord_setup},
{"native_finalize", "()V", (void *)android_media_AudioRecord_finalize},
{"native_release", "()V", (void *)android_media_AudioRecord_release},

View File

@@ -185,7 +185,10 @@ public class AudioRecord
* Size of the native audio buffer.
*/
private int mNativeBufferSizeInBytes = 0;
/**
* Audio session ID
*/
private int mSessionId = 0;
//---------------------------------------------------------
// Constructor, Finalize
@@ -227,15 +230,20 @@ public class AudioRecord
audioBuffSizeCheck(bufferSizeInBytes);
// native initialization
int[] session = new int[1];
session[0] = 0;
//TODO: update native initialization when information about hardware init failure
// due to capture device already open is available.
int initResult = native_setup( new WeakReference<AudioRecord>(this),
mRecordSource, mSampleRate, mChannels, mAudioFormat, mNativeBufferSizeInBytes);
mRecordSource, mSampleRate, mChannels, mAudioFormat, mNativeBufferSizeInBytes,
session);
if (initResult != SUCCESS) {
loge("Error code "+initResult+" when initializing native AudioRecord object.");
return; // with mState == STATE_UNINITIALIZED
}
mSessionId = session[0];
mState = STATE_INITIALIZED;
}
@@ -485,6 +493,15 @@ public class AudioRecord
}
}
/**
* Returns the audio session ID.
*
* @return the ID of the audio session this AudioRecord belongs to.
* @hide
*/
public int getAudioSessionId() {
return mSessionId;
}
//---------------------------------------------------------
// Transport control methods
@@ -763,7 +780,8 @@ public class AudioRecord
//--------------------
private native final int native_setup(Object audiorecord_this,
int recordSource, int sampleRate, int nbChannels, int audioFormat, int buffSizeInBytes);
int recordSource, int sampleRate, int nbChannels, int audioFormat,
int buffSizeInBytes, int[] sessionId);
private native final void native_finalize();