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:
@@ -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},
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user