• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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