1 /* 2 * Copyright (C) 2017 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 #ifndef _Included_org_drrickorang_loopback_loopback 18 #define _Included_org_drrickorang_loopback_loopback 19 20 #include <stdbool.h> 21 #include <time.h> 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 typedef struct { 28 int* timeStampsMs; // Array of milliseconds since first callback 29 short* callbackDurations; // Array of milliseconds between callback and previous callback 30 short index; // Current write position 31 struct timespec startTime; // Time of first callback {seconds,nanoseconds} 32 int capacity; // Total number of callback times/lengths that can be recorded 33 bool exceededCapacity; // Set only if late callbacks come after array is full 34 } callbackTimeStamps; 35 36 #define NANOS_PER_SECOND 1000000000 37 #define NANOS_PER_MILLI 1000000 38 #define MILLIS_PER_SECOND 1000 39 40 enum STATUS_ENUM { 41 STATUS_SUCCESS = 0, 42 STATUS_FAIL = 1 43 }; 44 45 enum JAVA_CONSTANTS_ENUM { 46 // Must match constant 'range' in BufferPeriod.java 47 RANGE = 1002, 48 // Must match constants in Constant.java 49 TEST_TYPE_LATENCY = 222, 50 TEST_TYPE_BUFFER_PERIOD = 223, 51 AUDIO_THREAD_TYPE_JAVA = 0, 52 AUDIO_THREAD_TYPE_NATIVE_SLES = 1, 53 AUDIO_THREAD_TYPE_NATIVE_AAUDIO = 2, 54 }; 55 56 typedef struct { 57 int (*computeDefaultSettings)(int performanceMode, int *samplingRate, 58 int *playerBufferFrameCount, int *recorderBufferFrameCount); 59 int (*init)(void **ppCtx, int samplingRate, int frameCount, int micSource, 60 int performanceMode, 61 int testType, double frequency1, char* byteBufferPtr, int byteBufferLength, 62 short* loopbackTone, int maxRecordedLateCallbacks, int ignoreFirstFrames); 63 int (*destroy)(void **ppCtx); 64 int (*processNext)(void *pCtx, double *pSamples, long maxSamples); 65 int* (*getRecorderBufferPeriod)(void *pCtx); 66 int (*getRecorderMaxBufferPeriod)(void *pCtx); 67 int64_t (*getRecorderVarianceBufferPeriod)(void *pCtx); 68 int* (*getPlayerBufferPeriod)(void *pCtx); 69 int (*getPlayerMaxBufferPeriod)(void *pCtx); 70 int64_t (*getPlayerVarianceBufferPeriod)(void *pCtx); 71 int (*getCaptureRank)(void *pCtx); 72 int (*getPlayerTimeStampsAndExpectedBufferPeriod)(void *pCtx, callbackTimeStamps **ppTSs); 73 int (*getRecorderTimeStampsAndExpectedBufferPeriod)(void *pCtx, callbackTimeStamps **ppTSs); 74 } native_engine_t; 75 76 typedef struct { 77 void *context; 78 native_engine_t *methods; 79 } native_engine_instance_t; 80 81 enum NATIVE_ENGINE_ENUM { 82 NATIVE_ENGINE_SLES = 0, 83 NATIVE_ENGINE_AAUDIO = 1, 84 NATIVE_ENGINE_COUNT = NATIVE_ENGINE_AAUDIO + 1 85 }; 86 87 extern native_engine_t sEngines[NATIVE_ENGINE_COUNT]; 88 89 #ifdef __cplusplus 90 } 91 #endif 92 93 #endif // _Included_org_drrickorang_loopback_loopback 94