@@ -43,6 +43,21 @@ static NativeAudioContext engine;
4343/* ********************************************************************************/
4444extern " C" {
4545
46+ // --- Cached JNI IDs ---
47+ static jclass g_callbackStatusClass = nullptr ;
48+ static jmethodID g_callbackStatusConstructor = nullptr ;
49+
50+ static jclass g_arrayListClass = nullptr ;
51+ static jmethodID g_arrayListConstructor = nullptr ;
52+ static jmethodID g_arrayListAddMethod = nullptr ;
53+
54+ static jclass g_playbackParametersClass = nullptr ;
55+ static jmethodID g_playbackParametersConstructor = nullptr ;
56+ static jfieldID g_fallbackModeField = nullptr ;
57+ static jfieldID g_stretchModeField = nullptr ;
58+ static jfieldID g_pitchField = nullptr ;
59+ static jfieldID g_speedField = nullptr ;
60+
4661JNIEXPORT jint JNICALL
4762Java_com_mobileer_oboetester_OboeAudioStream_openNative (JNIEnv *env, jobject,
4863 jint nativeApi,
@@ -254,6 +269,35 @@ Java_com_mobileer_oboetester_TestAudioActivity_setupMemoryBuffer(JNIEnv *env, jo
254269 engine.getCurrentActivity ()->setupMemoryBuffer (buf, length);
255270}
256271
272+ JNIEXPORT jint JNICALL
273+ Java_com_mobileer_oboetester_TestAudioActivity_setPlaybackParametersNative (
274+ JNIEnv *env, jobject, jobject playbackParameters) {
275+ oboe::PlaybackParameters params{};
276+ params.fallbackMode = static_cast <oboe::FallbackMode>(
277+ env->GetIntField (playbackParameters, g_fallbackModeField));
278+ params.stretchMode = static_cast <oboe::StretchMode>(
279+ env->GetIntField (playbackParameters, g_stretchModeField));
280+ params.pitch = static_cast <float >(env->GetFloatField (playbackParameters, g_pitchField));
281+ params.speed = static_cast <float >(env->GetFloatField (playbackParameters, g_speedField));
282+
283+ return static_cast <jint>(engine.getCurrentActivity ()->setPlaybackParameters (params));
284+ }
285+
286+ JNIEXPORT jobject JNICALL
287+ Java_com_mobileer_oboetester_TestAudioActivity_getPlaybackParametersNative (
288+ JNIEnv *env, jobject) {
289+ oboe::ResultWithValue<oboe::PlaybackParameters> result =
290+ engine.getCurrentActivity ()->getPlaybackParameters ();
291+ if (!result) {
292+ return nullptr ;
293+ }
294+ oboe::PlaybackParameters params = result.value ();
295+
296+ return env->NewObject (g_playbackParametersClass, g_playbackParametersConstructor,
297+ (jint)params.fallbackMode ,
298+ (jint)params.stretchMode , params.pitch , params.speed );
299+ }
300+
257301JNIEXPORT jint JNICALL
258302Java_com_mobileer_oboetester_OboeAudioStream_startPlaybackNative (JNIEnv *env, jobject) {
259303 return (jint) engine.getCurrentActivity ()->startPlayback ();
@@ -1185,14 +1229,6 @@ Java_com_mobileer_oboetester_AudioWorkloadTestActivity_close(JNIEnv *env, jobjec
11851229 return sAudioWorkload .close ();
11861230}
11871231
1188- // --- Cached JNI IDs ---
1189- static jclass g_callbackStatusClass = nullptr ;
1190- static jmethodID g_callbackStatusConstructor = nullptr ;
1191-
1192- static jclass g_arrayListClass = nullptr ;
1193- static jmethodID g_arrayListConstructor = nullptr ;
1194- static jmethodID g_arrayListAddMethod = nullptr ;
1195-
11961232// Store the JavaVM pointer to get JNIEnv in JNI_OnLoad/OnUnload
11971233static JavaVM* g_javaVM = nullptr ;
11981234
@@ -1256,6 +1292,33 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
12561292 return JNI_ERR;
12571293 }
12581294
1295+ const char * playbackParametersClassName = " com/mobileer/oboetester/PlaybackParameters" ;
1296+ jclass localPlaybackParametersClass = env->FindClass (playbackParametersClassName);
1297+ if (localPlaybackParametersClass == nullptr ) {
1298+ LOGE (" JNI_OnLoad: Could not find class %s" , playbackParametersClassName);
1299+ if (env->ExceptionCheck ()) env->ExceptionDescribe ();
1300+ return JNI_ERR;
1301+ }
1302+ g_playbackParametersClass = (jclass)env->NewGlobalRef (localPlaybackParametersClass);
1303+ env->DeleteLocalRef (localPlaybackParametersClass);
1304+ if (g_playbackParametersClass == nullptr ) {
1305+ LOGE (" JNI_OnLoad: Could not create global ref for %s" , playbackParametersClassName);
1306+ return JNI_ERR;
1307+ }
1308+
1309+ g_playbackParametersConstructor = env->GetMethodID (
1310+ g_playbackParametersClass, " <init>" , " (IIFF)V" );
1311+ if (g_playbackParametersConstructor == nullptr ) {
1312+ LOGE (" JNI_OnLoad: Could not find constructor for %s" , playbackParametersClassName);
1313+ if (env->ExceptionCheck ()) env->ExceptionDescribe ();
1314+ return JNI_ERR;
1315+ }
1316+
1317+ g_fallbackModeField = env->GetFieldID (g_playbackParametersClass, " mFallbackMode" , " I" );
1318+ g_stretchModeField = env->GetFieldID (g_playbackParametersClass, " mStretchMode" , " I" );
1319+ g_pitchField = env->GetFieldID (g_playbackParametersClass, " mPitch" , " F" );
1320+ g_speedField = env->GetFieldID (g_playbackParametersClass, " mSpeed" , " F" );
1321+
12591322 std::cout << " JNI_OnLoad: Successfully cached JNI class and method IDs." << std::endl;
12601323 return JNI_VERSION_1_6;
12611324}
@@ -1277,10 +1340,19 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) {
12771340 env->DeleteGlobalRef (g_arrayListClass);
12781341 g_arrayListClass = nullptr ;
12791342 }
1343+ if (g_playbackParametersClass != nullptr ) {
1344+ env->DeleteGlobalRef (g_playbackParametersClass);
1345+ g_playbackParametersClass = nullptr ;
1346+ }
12801347
12811348 g_callbackStatusConstructor = nullptr ;
12821349 g_arrayListConstructor = nullptr ;
12831350 g_arrayListAddMethod = nullptr ;
1351+ g_playbackParametersConstructor = nullptr ;
1352+ g_fallbackModeField = nullptr ;
1353+ g_stretchModeField = nullptr ;
1354+ g_pitchField = nullptr ;
1355+ g_speedField = nullptr ;
12841356
12851357 g_javaVM = nullptr ;
12861358 std::cout << " JNI_OnUnload: Released global JNI references." << std::endl;
0 commit comments