1 /*
2 * Copyright 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define MODULE_NAME "OboeTester"
18
19 #include <cassert>
20 #include <cstring>
21 #include <jni.h>
22 #include <stdint.h>
23 #include <thread>
24
25 #include "common/OboeDebug.h"
26 #include "oboe/Oboe.h"
27
28 #include "NativeAudioContext.h"
29
30 NativeAudioContext engine;
31
32 /*********************************************************************************/
33 /********************** JNI Prototypes *****************************************/
34 /*********************************************************************************/
35 extern "C" {
36
37 JNIEXPORT jint JNICALL
38 Java_com_google_sample_oboe_manualtest_OboeAudioStream_openNative(JNIEnv *env, jobject,
39 jint nativeApi,
40 jint sampleRate,
41 jint channelCount,
42 jint format,
43 jint sharingMode,
44 jint performanceMode,
45 jint inputPreset,
46 jint deviceId,
47 jint sessionId,
48 jint framesPerBurst,
49 jboolean channelConversionAllowed,
50 jboolean formatConversionAllowed,
51 jint rateConversionQuality,
52 jboolean isMMap,
53 jboolean isInput);
54 JNIEXPORT void JNICALL
55 Java_com_google_sample_oboe_manualtest_OboeAudioStream_close(JNIEnv *env, jobject, jint);
56
57 JNIEXPORT jint JNICALL
58 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setThresholdInFrames(JNIEnv *env, jobject, jint, jint);
59 JNIEXPORT jint JNICALL
60 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getThresholdInFrames(JNIEnv *env, jobject, jint);
61 JNIEXPORT jint JNICALL
62 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getBufferCapacityInFrames(JNIEnv *env, jobject, jint);
63 JNIEXPORT jint JNICALL
64 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setNativeApi(JNIEnv *env, jobject, jint, jint);
65
66 JNIEXPORT void JNICALL
67 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setUseCallback(JNIEnv *env, jclass type,
68 jboolean useCallback);
69 JNIEXPORT void JNICALL
70 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackReturnStop(JNIEnv *env,
71 jclass type,
72 jboolean b);
73 JNIEXPORT void JNICALL
74 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackSize(JNIEnv *env, jclass type,
75 jint callbackSize);
76
77 // ================= OboeAudioOutputStream ================================
78
79 JNIEXPORT void JNICALL
80 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneEnabled(JNIEnv *env, jobject, jboolean);
81 JNIEXPORT void JNICALL
82 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneType(JNIEnv *env, jobject, jint);
83 JNIEXPORT void JNICALL
84 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setAmplitude(JNIEnv *env, jobject, jdouble);
85
86 /*********************************************************************************/
87 /********************** JNI Implementations *************************************/
88 /*********************************************************************************/
89
90 JNIEXPORT jboolean JNICALL
Java_com_google_sample_oboe_manualtest_NativeEngine_isMMapSupported(JNIEnv * env,jclass type)91 Java_com_google_sample_oboe_manualtest_NativeEngine_isMMapSupported(JNIEnv *env, jclass type) {
92 return AAudioExtensions::getInstance().isMMapSupported();
93 }
94
95 JNIEXPORT jboolean JNICALL
Java_com_google_sample_oboe_manualtest_NativeEngine_isMMapExclusiveSupported(JNIEnv * env,jclass type)96 Java_com_google_sample_oboe_manualtest_NativeEngine_isMMapExclusiveSupported(JNIEnv *env, jclass type) {
97 return AAudioExtensions::getInstance().isMMapExclusiveSupported();
98 }
99
100 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_NativeEngine_setWorkaroundsEnabled(JNIEnv * env,jclass type,jboolean enabled)101 Java_com_google_sample_oboe_manualtest_NativeEngine_setWorkaroundsEnabled(JNIEnv *env, jclass type,
102 jboolean enabled) {
103 oboe::OboeGlobals::setWorkaroundsEnabled(enabled);
104 }
105
106 JNIEXPORT jboolean JNICALL
Java_com_google_sample_oboe_manualtest_NativeEngine_areWorkaroundsEnabled(JNIEnv * env,jclass type)107 Java_com_google_sample_oboe_manualtest_NativeEngine_areWorkaroundsEnabled(JNIEnv *env,
108 jclass type) {
109 return oboe::OboeGlobals::areWorkaroundsEnabled();
110 }
111
112 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_openNative(JNIEnv * env,jobject synth,jint nativeApi,jint sampleRate,jint channelCount,jint format,jint sharingMode,jint performanceMode,jint inputPreset,jint deviceId,jint sessionId,jint framesPerBurst,jboolean channelConversionAllowed,jboolean formatConversionAllowed,jint rateConversionQuality,jboolean isMMap,jboolean isInput)113 Java_com_google_sample_oboe_manualtest_OboeAudioStream_openNative(
114 JNIEnv *env, jobject synth,
115 jint nativeApi,
116 jint sampleRate,
117 jint channelCount,
118 jint format,
119 jint sharingMode,
120 jint performanceMode,
121 jint inputPreset,
122 jint deviceId,
123 jint sessionId,
124 jint framesPerBurst,
125 jboolean channelConversionAllowed,
126 jboolean formatConversionAllowed,
127 jint rateConversionQuality,
128 jboolean isMMap,
129 jboolean isInput) {
130 LOGD("OboeAudioStream_openNative: sampleRate = %d, framesPerBurst = %d", sampleRate, framesPerBurst);
131
132 return (jint) engine.getCurrentActivity()->open(nativeApi,
133 sampleRate,
134 channelCount,
135 format,
136 sharingMode,
137 performanceMode,
138 inputPreset,
139 deviceId,
140 sessionId,
141 framesPerBurst,
142 channelConversionAllowed,
143 formatConversionAllowed,
144 rateConversionQuality,
145 isMMap,
146 isInput);
147 }
148
149 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_TestAudioActivity_startNative(JNIEnv * env,jobject)150 Java_com_google_sample_oboe_manualtest_TestAudioActivity_startNative(JNIEnv *env, jobject) {
151 return (jint) engine.getCurrentActivity()->start();
152 }
153
154 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_TestAudioActivity_pauseNative(JNIEnv * env,jobject)155 Java_com_google_sample_oboe_manualtest_TestAudioActivity_pauseNative(JNIEnv *env, jobject) {
156 return (jint) engine.getCurrentActivity()->pause();
157 }
158
159 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_TestAudioActivity_stopNative(JNIEnv * env,jobject)160 Java_com_google_sample_oboe_manualtest_TestAudioActivity_stopNative(JNIEnv *env, jobject) {
161 return (jint) engine.getCurrentActivity()->stop();
162 }
163
164 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_TestAudioActivity_getFramesPerCallback(JNIEnv * env,jobject)165 Java_com_google_sample_oboe_manualtest_TestAudioActivity_getFramesPerCallback(JNIEnv *env, jobject) {
166 return (jint) engine.getCurrentActivity()->getFramesPerCallback();
167 }
168
169 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_startPlaybackNative(JNIEnv * env,jobject)170 Java_com_google_sample_oboe_manualtest_OboeAudioStream_startPlaybackNative(JNIEnv *env, jobject) {
171 return (jint) engine.getCurrentActivity()->startPlayback();
172 }
173
174 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_close(JNIEnv * env,jobject,jint streamIndex)175 Java_com_google_sample_oboe_manualtest_OboeAudioStream_close(JNIEnv *env, jobject, jint streamIndex) {
176 engine.getCurrentActivity()->close(streamIndex);
177 }
178
179 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_setBufferSizeInFrames(JNIEnv * env,jobject,jint streamIndex,jint threshold)180 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setBufferSizeInFrames(
181 JNIEnv *env, jobject, jint streamIndex, jint threshold) {
182 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
183 if (oboeStream != nullptr) {
184 auto result = oboeStream->setBufferSizeInFrames(threshold);
185 return (!result)
186 ? (jint) result.error()
187 : (jint) result.value();
188 }
189 return (jint) oboe::Result::ErrorNull;
190 }
191
192 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getBufferSizeInFrames(JNIEnv * env,jobject,jint streamIndex)193 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getBufferSizeInFrames(
194 JNIEnv *env, jobject, jint streamIndex) {
195 jint result = (jint) oboe::Result::ErrorNull;
196 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
197 if (oboeStream != nullptr) {
198 result = oboeStream->getBufferSizeInFrames();
199 }
200 return result;
201 }
202
203 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getBufferCapacityInFrames(JNIEnv * env,jobject,jint streamIndex)204 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getBufferCapacityInFrames(
205 JNIEnv *env, jobject, jint streamIndex) {
206 jint result = (jint) oboe::Result::ErrorNull;
207 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
208 if (oboeStream != nullptr) {
209 result = oboeStream->getBufferCapacityInFrames();
210 }
211 return result;
212 }
213
convertAudioApiToNativeApi(oboe::AudioApi audioApi)214 static int convertAudioApiToNativeApi(oboe::AudioApi audioApi) {
215 switch(audioApi) {
216 case oboe::AudioApi::Unspecified:
217 return NATIVE_MODE_UNSPECIFIED;
218 case oboe::AudioApi::OpenSLES:
219 return NATIVE_MODE_OPENSLES;
220 case oboe::AudioApi::AAudio:
221 return NATIVE_MODE_AAUDIO;
222 default:
223 return -1;
224 }
225 }
226
227 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getNativeApi(JNIEnv * env,jobject,jint streamIndex)228 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getNativeApi(
229 JNIEnv *env, jobject, jint streamIndex) {
230 jint result = (jint) oboe::Result::ErrorNull;
231 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
232 if (oboeStream != nullptr) {
233 oboe::AudioApi audioApi = oboeStream->getAudioApi();
234 result = convertAudioApiToNativeApi(audioApi);
235 LOGD("OboeAudioStream_getNativeApi got %d", result);
236 }
237 return result;
238 }
239
240 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSampleRate(JNIEnv * env,jobject,jint streamIndex)241 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSampleRate(
242 JNIEnv *env, jobject, jint streamIndex) {
243 jint result = (jint) oboe::Result::ErrorNull;
244 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
245 if (oboeStream != nullptr) {
246 result = oboeStream->getSampleRate();
247 }
248 return result;
249 }
250
251 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSharingMode(JNIEnv * env,jobject,jint streamIndex)252 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSharingMode(
253 JNIEnv *env, jobject, jint streamIndex) {
254 jint result = (jint) oboe::Result::ErrorNull;
255 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
256 if (oboeStream != nullptr) {
257 result = (jint) oboeStream->getSharingMode();
258 }
259 return result;
260 }
261
262 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getPerformanceMode(JNIEnv * env,jobject,jint streamIndex)263 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getPerformanceMode(
264 JNIEnv *env, jobject, jint streamIndex) {
265 jint result = (jint) oboe::Result::ErrorNull;
266 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
267 if (oboeStream != nullptr) {
268 result = (jint) oboeStream->getPerformanceMode();
269 }
270 return result;
271 }
272
273 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getInputPreset(JNIEnv * env,jobject,jint streamIndex)274 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getInputPreset(
275 JNIEnv *env, jobject, jint streamIndex) {
276 jint result = (jint) oboe::Result::ErrorNull;
277 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
278 if (oboeStream != nullptr) {
279 result = (jint) oboeStream->getInputPreset();
280 }
281 return result;
282 }
283
284 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesPerBurst(JNIEnv * env,jobject,jint streamIndex)285 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesPerBurst(
286 JNIEnv *env, jobject, jint streamIndex) {
287 jint result = (jint) oboe::Result::ErrorNull;
288 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
289 if (oboeStream != nullptr) {
290 result = oboeStream->getFramesPerBurst();
291 }
292 return result;
293 }
294
295 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getChannelCount(JNIEnv * env,jobject,jint streamIndex)296 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getChannelCount(
297 JNIEnv *env, jobject, jint streamIndex) {
298 jint result = (jint) oboe::Result::ErrorNull;
299 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
300 if (oboeStream != nullptr) {
301 result = oboeStream->getChannelCount();
302 }
303 return result;
304 }
305
306 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFormat(JNIEnv * env,jobject instance,jint streamIndex)307 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFormat(JNIEnv *env, jobject instance, jint streamIndex) {
308 jint result = (jint) oboe::Result::ErrorNull;
309 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
310 if (oboeStream != nullptr) {
311 result = (jint) oboeStream->getFormat();
312 }
313 return result;
314 }
315
316 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getDeviceId(JNIEnv * env,jobject,jint streamIndex)317 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getDeviceId(
318 JNIEnv *env, jobject, jint streamIndex) {
319 jint result = (jint) oboe::Result::ErrorNull;
320 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
321 if (oboeStream != nullptr) {
322 result = oboeStream->getDeviceId();
323 }
324 return result;
325 }
326
327 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSessionId(JNIEnv * env,jobject,jint streamIndex)328 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getSessionId(
329 JNIEnv *env, jobject, jint streamIndex) {
330 jint result = (jint) oboe::Result::ErrorNull;
331 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
332 if (oboeStream != nullptr) {
333 result = oboeStream->getSessionId();
334 }
335 return result;
336 }
337
338 JNIEXPORT jlong JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesWritten(JNIEnv * env,jobject,jint streamIndex)339 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesWritten(
340 JNIEnv *env, jobject, jint streamIndex) {
341 jlong result = (jint) oboe::Result::ErrorNull;
342 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
343 if (oboeStream != nullptr) {
344 result = oboeStream->getFramesWritten();
345 }
346 return result;
347 }
348
349 JNIEXPORT jlong JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesRead(JNIEnv * env,jobject,jint streamIndex)350 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getFramesRead(
351 JNIEnv *env, jobject, jint streamIndex) {
352 jlong result = (jlong) oboe::Result::ErrorNull;
353 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
354 if (oboeStream != nullptr) {
355 result = oboeStream->getFramesRead();
356 }
357 return result;
358 }
359
360 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getXRunCount(JNIEnv * env,jobject,jint streamIndex)361 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getXRunCount(
362 JNIEnv *env, jobject, jint streamIndex) {
363 jint result = (jlong) oboe::Result::ErrorNull;
364 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
365 if (oboeStream != nullptr) {
366 auto oboeResult = oboeStream->getXRunCount();
367 if (!oboeResult) {
368 result = (jint) oboeResult.error();
369 } else {
370 result = oboeResult.value();
371 }
372 }
373 return result;
374 }
375
376 JNIEXPORT jlong JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getCallbackCount(JNIEnv * env,jobject)377 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getCallbackCount(
378 JNIEnv *env, jobject) {
379 return engine.getCurrentActivity()->getCallbackCount();
380 }
381
382 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getLatency(JNIEnv * env,jobject instance,jint streamIndex)383 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getLatency(JNIEnv *env, jobject instance, jint streamIndex) {
384 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
385 if (oboeStream != nullptr) {
386 auto result = oboeStream->calculateLatencyMillis();
387 return (!result) ? -1.0 : result.value();
388 }
389 return -1.0;
390 }
391
392 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getCpuLoad(JNIEnv * env,jobject instance,jint streamIndex)393 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getCpuLoad(JNIEnv *env, jobject instance, jint streamIndex) {
394 return engine.getCurrentActivity()->getCpuLoad();
395 }
396
397 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_setWorkload(JNIEnv * env,jobject,jdouble workload)398 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setWorkload(
399 JNIEnv *env, jobject, jdouble workload) {
400 engine.getCurrentActivity()->setWorkload(workload);
401 }
402
403 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getState(JNIEnv * env,jobject instance,jint streamIndex)404 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getState(JNIEnv *env, jobject instance, jint streamIndex) {
405 oboe::AudioStream *oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
406 if (oboeStream != nullptr) {
407 auto state = oboeStream->getState();
408 if (state != oboe::StreamState::Starting && state != oboe::StreamState::Started) {
409 oboe::Result result = oboeStream->waitForStateChange(
410 oboe::StreamState::Uninitialized,
411 &state, 0);
412
413 if (result != oboe::Result::OK){
414 if (result == oboe::Result::ErrorClosed) {
415 state = oboe::StreamState::Closed;
416 } else if (result == oboe::Result::ErrorDisconnected){
417 state = oboe::StreamState::Disconnected;
418 } else {
419 state = oboe::StreamState::Unknown;
420 }
421 }
422 }
423 return (jint) state;
424 }
425 return -1;
426 }
427
428 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_AudioInputTester_getPeakLevel(JNIEnv * env,jobject instance,jint index)429 Java_com_google_sample_oboe_manualtest_AudioInputTester_getPeakLevel(JNIEnv *env,
430 jobject instance,
431 jint index) {
432 return engine.getCurrentActivity()->getPeakLevel(index);
433 }
434
435 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_setUseCallback(JNIEnv * env,jclass type,jboolean useCallback)436 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setUseCallback(JNIEnv *env, jclass type,
437 jboolean useCallback) {
438 ActivityContext::mUseCallback = useCallback;
439 }
440
441 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackReturnStop(JNIEnv * env,jclass type,jboolean b)442 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackReturnStop(JNIEnv *env, jclass type,
443 jboolean b) {
444 OboeStreamCallbackProxy::setCallbackReturnStop(b);
445 }
446
447 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackSize(JNIEnv * env,jclass type,jint callbackSize)448 Java_com_google_sample_oboe_manualtest_OboeAudioStream_setCallbackSize(JNIEnv *env, jclass type,
449 jint callbackSize) {
450 ActivityContext::callbackSize = callbackSize;
451 }
452
453 JNIEXPORT jboolean JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_isMMap(JNIEnv * env,jobject instance,jint streamIndex)454 Java_com_google_sample_oboe_manualtest_OboeAudioStream_isMMap(JNIEnv *env, jobject instance, jint streamIndex) {
455 return engine.getCurrentActivity()->isMMapUsed(streamIndex);
456 }
457
458 // ================= OboeAudioOutputStream ================================
459
460 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneEnabled(JNIEnv * env,jobject,jboolean enabled)461 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneEnabled(
462 JNIEnv *env, jobject, jboolean enabled) {
463 engine.getCurrentActivity()->setEnabled(enabled);
464 }
465
466 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneType(JNIEnv * env,jobject,jint toneType)467 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setToneType(
468 JNIEnv *env, jobject, jint toneType) {
469 // FIXME engine.getCurrentActivity()->setToneType(toneType);
470 }
471
472 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setChannelEnabled(JNIEnv * env,jobject,jint channelIndex,jboolean enabled)473 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setChannelEnabled(
474 JNIEnv *env, jobject, jint channelIndex, jboolean enabled) {
475 engine.getCurrentActivity()->setChannelEnabled(channelIndex, enabled);
476 }
477
478 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setSignalType(JNIEnv * env,jobject,jint signalType)479 Java_com_google_sample_oboe_manualtest_OboeAudioOutputStream_setSignalType(
480 JNIEnv *env, jobject, jint signalType) {
481 engine.getCurrentActivity()->setSignalType(signalType);
482 }
483
484 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_OboeAudioStream_getOboeVersionNumber(JNIEnv * env,jclass type)485 Java_com_google_sample_oboe_manualtest_OboeAudioStream_getOboeVersionNumber(JNIEnv *env,
486 jclass type) {
487 return OBOE_VERSION_NUMBER;
488 }
489
490 // ==========================================================================
491 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_TestAudioActivity_setActivityType(JNIEnv * env,jobject instance,jint activityType)492 Java_com_google_sample_oboe_manualtest_TestAudioActivity_setActivityType(JNIEnv *env,
493 jobject instance,
494 jint activityType) {
495 engine.setActivityType(activityType);
496 }
497
498 // ==========================================================================
499 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_TestInputActivity_saveWaveFile(JNIEnv * env,jobject instance,jstring fileName)500 Java_com_google_sample_oboe_manualtest_TestInputActivity_saveWaveFile(JNIEnv *env,
501 jobject instance,
502 jstring fileName) {
503 const char *str = env->GetStringUTFChars(fileName, nullptr);
504 LOGD("nativeSaveFile(%s)", str);
505 jint result = engine.getCurrentActivity()->saveWaveFile(str);
506 env->ReleaseStringUTFChars(fileName, str);
507 return result;
508 }
509
510 // ==========================================================================
511 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_TestInputActivity_setMinimumFramesBeforeRead(JNIEnv * env,jobject instance,jint numFrames)512 Java_com_google_sample_oboe_manualtest_TestInputActivity_setMinimumFramesBeforeRead(JNIEnv *env,
513 jobject instance,
514 jint numFrames) {
515 engine.getCurrentActivity()->setMinimumFramesBeforeRead(numFrames);
516 }
517
518 // ==========================================================================
519 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_EchoActivity_setDelayTime(JNIEnv * env,jobject instance,jdouble delayTimeSeconds)520 Java_com_google_sample_oboe_manualtest_EchoActivity_setDelayTime(JNIEnv *env,
521 jobject instance,
522 jdouble delayTimeSeconds) {
523 engine.setDelayTime(delayTimeSeconds);
524 }
525
526 // ==========================================================================
527 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getAnalyzerProgress(JNIEnv * env,jobject instance)528 Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getAnalyzerProgress(JNIEnv *env,
529 jobject instance) {
530 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getProgress();
531 }
532
533 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getMeasuredLatency(JNIEnv * env,jobject instance)534 Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getMeasuredLatency(JNIEnv *env,
535 jobject instance) {
536 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getMeasuredLatency();
537 }
538
539 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getMeasuredConfidence(JNIEnv * env,jobject instance)540 Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getMeasuredConfidence(JNIEnv *env,
541 jobject instance) {
542 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getMeasuredConfidence();
543 }
544
545 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getBackgroundRMS(JNIEnv * env,jobject instance)546 Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getBackgroundRMS(JNIEnv *env,
547 jobject instance) {
548 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getBackgroundRMS();
549 }
550
551 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getSignalRMS(JNIEnv * env,jobject instance)552 Java_com_google_sample_oboe_manualtest_RoundTripLatencyActivity_getSignalRMS(JNIEnv *env,
553 jobject instance) {
554 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getSignalRMS();
555 }
556
557 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getMeasuredResult(JNIEnv * env,jobject instance)558 Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getMeasuredResult(JNIEnv *env,
559 jobject instance) {
560 return engine.mActivityRoundTripLatency.getLatencyAnalyzer()->getResult();
561 }
562
563 // ==========================================================================
564 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getAnalyzerState(JNIEnv * env,jobject instance)565 Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getAnalyzerState(JNIEnv *env,
566 jobject instance) {
567 return ((ActivityFullDuplex *)engine.getCurrentActivity())->getState();
568 }
569
570 JNIEXPORT jboolean JNICALL
Java_com_google_sample_oboe_manualtest_AnalyzerActivity_isAnalyzerDone(JNIEnv * env,jobject instance)571 Java_com_google_sample_oboe_manualtest_AnalyzerActivity_isAnalyzerDone(JNIEnv *env,
572 jobject instance) {
573 return ((ActivityFullDuplex *)engine.getCurrentActivity())->isAnalyzerDone();
574 }
575
576 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getResetCount(JNIEnv * env,jobject instance)577 Java_com_google_sample_oboe_manualtest_AnalyzerActivity_getResetCount(JNIEnv *env,
578 jobject instance) {
579 return ((ActivityFullDuplex *)engine.getCurrentActivity())->getResetCount();
580 }
581
582 // ==========================================================================
583 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_GlitchActivity_getGlitchCount(JNIEnv * env,jobject instance)584 Java_com_google_sample_oboe_manualtest_GlitchActivity_getGlitchCount(JNIEnv *env,
585 jobject instance) {
586 return engine.mActivityGlitches.getGlitchAnalyzer()->getGlitchCount();
587 }
588
589 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_GlitchActivity_getStateFrameCount(JNIEnv * env,jobject instance,jint state)590 Java_com_google_sample_oboe_manualtest_GlitchActivity_getStateFrameCount(JNIEnv *env,
591 jobject instance,
592 jint state) {
593 return engine.mActivityGlitches.getGlitchAnalyzer()->getStateFrameCount(state);
594 }
595
596 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_GlitchActivity_getSignalToNoiseDB(JNIEnv * env,jobject instance)597 Java_com_google_sample_oboe_manualtest_GlitchActivity_getSignalToNoiseDB(JNIEnv *env,
598 jobject instance) {
599 return engine.mActivityGlitches.getGlitchAnalyzer()->getSignalToNoiseDB();
600 }
601 JNIEXPORT jdouble JNICALL
Java_com_google_sample_oboe_manualtest_GlitchActivity_getPeakAmplitude(JNIEnv * env,jobject instance)602 Java_com_google_sample_oboe_manualtest_GlitchActivity_getPeakAmplitude(JNIEnv *env,
603 jobject instance) {
604 return engine.mActivityGlitches.getGlitchAnalyzer()->getPeakAmplitude();
605 }
606
607 JNIEXPORT void JNICALL
Java_com_google_sample_oboe_manualtest_GlitchActivity_setTolerance(JNIEnv * env,jobject instance,jfloat tolerance)608 Java_com_google_sample_oboe_manualtest_GlitchActivity_setTolerance(JNIEnv *env,
609 jobject instance,
610 jfloat tolerance) {
611 if (engine.mActivityGlitches.getGlitchAnalyzer()) {
612 engine.mActivityGlitches.getGlitchAnalyzer()->setTolerance(tolerance);
613 }
614 }
615
616 JNIEXPORT jint JNICALL
Java_com_google_sample_oboe_manualtest_ManualGlitchActivity_getGlitch(JNIEnv * env,jobject instance,jfloatArray waveform_)617 Java_com_google_sample_oboe_manualtest_ManualGlitchActivity_getGlitch(JNIEnv *env, jobject instance,
618 jfloatArray waveform_) {
619 float *waveform = env->GetFloatArrayElements(waveform_, nullptr);
620 jsize length = env->GetArrayLength(waveform_);
621 jsize numSamples = 0;
622 auto *analyzer = engine.mActivityGlitches.getGlitchAnalyzer();
623 if (analyzer) {
624 numSamples = analyzer->getLastGlitch(waveform, length);
625 }
626
627 env->ReleaseFloatArrayElements(waveform_, waveform, 0);
628 return numSamples;
629 }
630
631 }
632