1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker * Copyright 2020 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker *
4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker *
8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker *
10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker */
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Worker #include <cassert>
18*b7c941bbSAndroid Build Coastguard Worker #include <cstring>
19*b7c941bbSAndroid Build Coastguard Worker #include <jni.h>
20*b7c941bbSAndroid Build Coastguard Worker #include <stdint.h>
21*b7c941bbSAndroid Build Coastguard Worker
22*b7c941bbSAndroid Build Coastguard Worker // If the NDK is before O then define this in your build
23*b7c941bbSAndroid Build Coastguard Worker // so that AAudio.h will not be included.
24*b7c941bbSAndroid Build Coastguard Worker // #define OBOE_NO_INCLUDE_AAUDIO
25*b7c941bbSAndroid Build Coastguard Worker
26*b7c941bbSAndroid Build Coastguard Worker // Oboe Includes
27*b7c941bbSAndroid Build Coastguard Worker //#include <oboe/Oboe.h>
28*b7c941bbSAndroid Build Coastguard Worker #include <AAudioExtensions.h>
29*b7c941bbSAndroid Build Coastguard Worker
30*b7c941bbSAndroid Build Coastguard Worker #include "NativeAudioAnalyzer.h"
31*b7c941bbSAndroid Build Coastguard Worker
32*b7c941bbSAndroid Build Coastguard Worker extern "C" {
33*b7c941bbSAndroid Build Coastguard Worker
34*b7c941bbSAndroid Build Coastguard Worker //
35*b7c941bbSAndroid Build Coastguard Worker // com.android.cts.verifier.audio.NativeAnalyzerThread
36*b7c941bbSAndroid Build Coastguard Worker //
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_openAudio(JNIEnv *,jobject,jint inputDeviceId,jint outputDeviceId)37*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_openAudio
38*b7c941bbSAndroid Build Coastguard Worker (JNIEnv * /*env */, jobject /* obj */, jint inputDeviceId, jint outputDeviceId) {
39*b7c941bbSAndroid Build Coastguard Worker // It is OK to use a raw pointer here because the pointer will be passed back
40*b7c941bbSAndroid Build Coastguard Worker // to Java and only used from one thread.
41*b7c941bbSAndroid Build Coastguard Worker // Java then deletes it from that same thread by calling _closeAudio() below.
42*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = new NativeAudioAnalyzer();
43*b7c941bbSAndroid Build Coastguard Worker aaudio_result_t result = analyzer->openAudio(inputDeviceId, outputDeviceId);
44*b7c941bbSAndroid Build Coastguard Worker if (result != AAUDIO_OK) {
45*b7c941bbSAndroid Build Coastguard Worker delete analyzer;
46*b7c941bbSAndroid Build Coastguard Worker analyzer = nullptr;
47*b7c941bbSAndroid Build Coastguard Worker }
48*b7c941bbSAndroid Build Coastguard Worker return (jlong) analyzer;
49*b7c941bbSAndroid Build Coastguard Worker }
50*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_startAudio(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)51*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_startAudio
52*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
53*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
54*b7c941bbSAndroid Build Coastguard Worker int result = AAUDIO_ERROR_NULL;
55*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
56*b7c941bbSAndroid Build Coastguard Worker result = analyzer->startAudio();
57*b7c941bbSAndroid Build Coastguard Worker }
58*b7c941bbSAndroid Build Coastguard Worker return result;
59*b7c941bbSAndroid Build Coastguard Worker }
60*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_stopAudio(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)61*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_stopAudio
62*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
63*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
64*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
65*b7c941bbSAndroid Build Coastguard Worker return analyzer->stopAudio();
66*b7c941bbSAndroid Build Coastguard Worker }
67*b7c941bbSAndroid Build Coastguard Worker return AAUDIO_ERROR_NULL;
68*b7c941bbSAndroid Build Coastguard Worker }
69*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_closeAudio(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)70*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_closeAudio
71*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
72*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
73*b7c941bbSAndroid Build Coastguard Worker int result = AAUDIO_ERROR_NULL;
74*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
75*b7c941bbSAndroid Build Coastguard Worker result = analyzer->closeAudio();
76*b7c941bbSAndroid Build Coastguard Worker delete analyzer;
77*b7c941bbSAndroid Build Coastguard Worker }
78*b7c941bbSAndroid Build Coastguard Worker return result;
79*b7c941bbSAndroid Build Coastguard Worker }
80*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isRecordingComplete(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)81*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isRecordingComplete
82*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
83*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
84*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
85*b7c941bbSAndroid Build Coastguard Worker return analyzer->isRecordingComplete();
86*b7c941bbSAndroid Build Coastguard Worker }
87*b7c941bbSAndroid Build Coastguard Worker return false;
88*b7c941bbSAndroid Build Coastguard Worker }
89*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isLowlatency(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer,jint streamId)90*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isLowlatency
91*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer, jint streamId) {
92*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
93*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
94*b7c941bbSAndroid Build Coastguard Worker return analyzer->isLowLatencyStream(streamId);
95*b7c941bbSAndroid Build Coastguard Worker }
96*b7c941bbSAndroid Build Coastguard Worker return false;
97*b7c941bbSAndroid Build Coastguard Worker }
98*b7c941bbSAndroid Build Coastguard Worker
99*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_has24BitHardwareSupport(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)100*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_has24BitHardwareSupport
101*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
102*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
103*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
104*b7c941bbSAndroid Build Coastguard Worker return analyzer->has24BitHardwareSupport();
105*b7c941bbSAndroid Build Coastguard Worker }
106*b7c941bbSAndroid Build Coastguard Worker return false;
107*b7c941bbSAndroid Build Coastguard Worker }
108*b7c941bbSAndroid Build Coastguard Worker
109*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isMMapStream(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer,jint streamId)110*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_isMMapStream
111*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer, jint streamId) {
112*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
113*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
114*b7c941bbSAndroid Build Coastguard Worker return analyzer->isMMapStream(streamId);
115*b7c941bbSAndroid Build Coastguard Worker }
116*b7c941bbSAndroid Build Coastguard Worker return false;
117*b7c941bbSAndroid Build Coastguard Worker }
118*b7c941bbSAndroid Build Coastguard Worker
119*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getHardwareFormat(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)120*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getHardwareFormat
121*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
122*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
123*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
124*b7c941bbSAndroid Build Coastguard Worker return analyzer->getHardwareFormat();
125*b7c941bbSAndroid Build Coastguard Worker }
126*b7c941bbSAndroid Build Coastguard Worker return (jint) AAUDIO_FORMAT_INVALID;
127*b7c941bbSAndroid Build Coastguard Worker }
128*b7c941bbSAndroid Build Coastguard Worker
129*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getBurstFrames(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer,jint streamId)130*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getBurstFrames
131*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer, jint streamId) {
132*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
133*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
134*b7c941bbSAndroid Build Coastguard Worker return analyzer->getFramesPerBurst(streamId);
135*b7c941bbSAndroid Build Coastguard Worker }
136*b7c941bbSAndroid Build Coastguard Worker return 0;
137*b7c941bbSAndroid Build Coastguard Worker }
138*b7c941bbSAndroid Build Coastguard Worker
139*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getCapacityFrames(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer,jint streamId)140*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getCapacityFrames
141*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer, jint streamId) {
142*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
143*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
144*b7c941bbSAndroid Build Coastguard Worker return analyzer->getCapacityFrames(streamId);
145*b7c941bbSAndroid Build Coastguard Worker }
146*b7c941bbSAndroid Build Coastguard Worker return 0;
147*b7c941bbSAndroid Build Coastguard Worker }
148*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getError(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)149*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getError
150*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
151*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
152*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
153*b7c941bbSAndroid Build Coastguard Worker return (jint) analyzer->getError();
154*b7c941bbSAndroid Build Coastguard Worker }
155*b7c941bbSAndroid Build Coastguard Worker return (jint) AAUDIO_ERROR_NULL;
156*b7c941bbSAndroid Build Coastguard Worker }
157*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_analyze(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)158*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_analyze
159*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
160*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
161*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
162*b7c941bbSAndroid Build Coastguard Worker return analyzer->analyze();
163*b7c941bbSAndroid Build Coastguard Worker }
164*b7c941bbSAndroid Build Coastguard Worker return AAUDIO_ERROR_NULL;
165*b7c941bbSAndroid Build Coastguard Worker }
166*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getLatencyMillis(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)167*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jdouble JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getLatencyMillis
168*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
169*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
170*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
171*b7c941bbSAndroid Build Coastguard Worker return analyzer->getLatencyMillis();
172*b7c941bbSAndroid Build Coastguard Worker }
173*b7c941bbSAndroid Build Coastguard Worker return -1.0;
174*b7c941bbSAndroid Build Coastguard Worker }
175*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getConfidence(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)176*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jdouble JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getConfidence
177*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
178*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
179*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
180*b7c941bbSAndroid Build Coastguard Worker return analyzer->getConfidence();
181*b7c941bbSAndroid Build Coastguard Worker }
182*b7c941bbSAndroid Build Coastguard Worker return 0.0;
183*b7c941bbSAndroid Build Coastguard Worker }
184*b7c941bbSAndroid Build Coastguard Worker
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getSampleRate(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)185*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAnalyzerThread_getSampleRate
186*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
187*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
188*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
189*b7c941bbSAndroid Build Coastguard Worker return analyzer->getSampleRate();
190*b7c941bbSAndroid Build Coastguard Worker }
191*b7c941bbSAndroid Build Coastguard Worker return 0;
192*b7c941bbSAndroid Build Coastguard Worker }
193*b7c941bbSAndroid Build Coastguard Worker
194*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jdouble JNICALL
Java_com_android_cts_verifier_audio_NativeAnalyzerThread_measureTimestampLatencyMillis(JNIEnv * env __unused,jobject obj __unused,jlong pAnalyzer)195*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_NativeAnalyzerThread_measureTimestampLatencyMillis
196*b7c941bbSAndroid Build Coastguard Worker (JNIEnv *env __unused, jobject obj __unused, jlong pAnalyzer) {
197*b7c941bbSAndroid Build Coastguard Worker NativeAudioAnalyzer * analyzer = (NativeAudioAnalyzer *) pAnalyzer;
198*b7c941bbSAndroid Build Coastguard Worker if (analyzer != nullptr) {
199*b7c941bbSAndroid Build Coastguard Worker return analyzer->measureTimestampLatencyMillis();
200*b7c941bbSAndroid Build Coastguard Worker }
201*b7c941bbSAndroid Build Coastguard Worker return 0;
202*b7c941bbSAndroid Build Coastguard Worker }
203*b7c941bbSAndroid Build Coastguard Worker
204*b7c941bbSAndroid Build Coastguard Worker //
205*b7c941bbSAndroid Build Coastguard Worker // com.android.cts.verifier.audio.audiolib.AudioUtils
206*b7c941bbSAndroid Build Coastguard Worker //
207*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL
Java_com_android_cts_verifier_audio_audiolib_AudioUtils_isMMapSupported(JNIEnv * env __unused)208*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_audiolib_AudioUtils_isMMapSupported(JNIEnv *env __unused) {
209*b7c941bbSAndroid Build Coastguard Worker
210*b7c941bbSAndroid Build Coastguard Worker return oboe::AAudioExtensions::getInstance().isMMapSupported();
211*b7c941bbSAndroid Build Coastguard Worker }
212*b7c941bbSAndroid Build Coastguard Worker
213*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL
Java_com_android_cts_verifier_audio_audiolib_AudioUtils_isMMapExclusiveSupported(JNIEnv * env __unused)214*b7c941bbSAndroid Build Coastguard Worker Java_com_android_cts_verifier_audio_audiolib_AudioUtils_isMMapExclusiveSupported(
215*b7c941bbSAndroid Build Coastguard Worker JNIEnv *env __unused) {
216*b7c941bbSAndroid Build Coastguard Worker
217*b7c941bbSAndroid Build Coastguard Worker return oboe::AAudioExtensions::getInstance().isMMapExclusiveSupported();
218*b7c941bbSAndroid Build Coastguard Worker }
219*b7c941bbSAndroid Build Coastguard Worker
220*b7c941bbSAndroid Build Coastguard Worker }
221