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