|
|
|
|
@ -54,7 +54,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_utun_audioprobe_ProbeActivity_closeNa
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
extern "C" JNIEXPORT jboolean JNICALL Java_com_utun_audioprobe_ProbeActivity_openNative( |
|
|
|
|
JNIEnv*, jclass, jboolean exclusive, jint channels) { |
|
|
|
|
JNIEnv*, jclass, jboolean exclusive, jint channels, jboolean callback) { |
|
|
|
|
if (probe.stream || (channels != 1 && channels != 2)) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CALL, "probe invalid open stream=%p channels=%d", probe.stream, channels); |
|
|
|
|
return JNI_FALSE; |
|
|
|
|
@ -70,7 +70,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_utun_audioprobe_ProbeActivity_ope
|
|
|
|
|
AAudioStreamBuilder_setChannelCount(builder, channels); |
|
|
|
|
AAudioStreamBuilder_setSharingMode(builder, exclusive ? AAUDIO_SHARING_MODE_EXCLUSIVE : AAUDIO_SHARING_MODE_SHARED); |
|
|
|
|
AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); |
|
|
|
|
AAudioStreamBuilder_setDataCallback(builder, data_callback, &probe); |
|
|
|
|
if (callback) AAudioStreamBuilder_setDataCallback(builder, data_callback, &probe); |
|
|
|
|
AAudioStreamBuilder_setErrorCallback(builder, error_callback, &probe); |
|
|
|
|
aaudio_result_t opened = AAudioStreamBuilder_openStream(builder, &probe.stream); |
|
|
|
|
check_result("delete builder", AAudioStreamBuilder_delete(builder)); |
|
|
|
|
@ -99,6 +99,12 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_utun_audioprobe_ProbeActivity_ope
|
|
|
|
|
return JNI_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
extern "C" JNIEXPORT jint JNICALL Java_com_utun_audioprobe_ProbeActivity_writeNative(JNIEnv* env, jclass, jshortArray input) { |
|
|
|
|
int16_t samples[960]{}; |
|
|
|
|
env->GetShortArrayRegion(input, 0, 960, samples); |
|
|
|
|
return AAudioStream_write(probe.stream, samples, 960 / probe.channels, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Timestamp опрашивается вне realtime callback. Java одинаково агрегирует AAudio и AudioTrack. */ |
|
|
|
|
extern "C" JNIEXPORT void JNICALL Java_com_utun_audioprobe_ProbeActivity_sampleNative(JNIEnv* env, jclass, jlongArray output) { |
|
|
|
|
if (!probe.stream || env->GetArrayLength(output) != 10) { |
|
|
|
|
|