1 /* 2 * Copyright (C) 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 #ifndef _Included_org_drrickorang_loopback_sles 18 #define _Included_org_drrickorang_loopback_sles 19 20 #include <SLES/OpenSLES.h> 21 #include <SLES/OpenSLES_Android.h> 22 #include <pthread.h> 23 #include <android/log.h> 24 #include <jni.h> 25 #include <stdbool.h> 26 27 //struct audio_utils_fifo; 28 #define SLES_PRINTF(...) __android_log_print(ANDROID_LOG_INFO, "sles_jni", __VA_ARGS__); 29 30 #include <audio_utils/fifo.h> 31 32 #include "loopback_sles.h" 33 34 typedef struct { 35 int* buffer_period; 36 struct timespec previous_time; 37 struct timespec current_time; 38 int buffer_count; 39 int max_buffer_period; 40 41 volatile int32_t captureRank; // Set > 0 when the callback requests a systrace/bug report 42 43 int measurement_count; // number of measurements which were actually recorded 44 int64_t SDM; // sum of squares of deviations from the expected mean 45 int64_t var; // variance in nanoseconds^2 46 } bufferStats; 47 48 //TODO fix this 49 typedef struct { 50 SLuint32 rxBufCount; // -r# 51 SLuint32 txBufCount; // -t# 52 SLuint32 bufSizeInFrames; // -f# 53 SLuint32 channels; // -c# 54 SLuint32 sampleRate; // -s# 55 SLuint32 exitAfterSeconds; // -e# 56 SLuint32 freeBufCount; // calculated 57 SLuint32 bufSizeInBytes; // calculated 58 int injectImpulse; // -i#i 59 size_t totalDiscardedInputFrames; // total number of input frames discarded 60 int ignoreFirstFrames; 61 62 // Storage area for the buffer queues 63 char **rxBuffers; 64 char **txBuffers; 65 char **freeBuffers; 66 67 // Buffer indices 68 SLuint32 rxFront; // oldest recording 69 SLuint32 rxRear; // next to be recorded 70 SLuint32 txFront; // oldest playing 71 SLuint32 txRear; // next to be played 72 SLuint32 freeFront; // oldest free 73 SLuint32 freeRear; // next to be freed 74 75 struct audio_utils_fifo fifo; // jitter buffer between recorder and player callbacks, 76 // to mitigate unpredictable phase difference between these, 77 // or even concurrent callbacks on two CPU cores 78 struct audio_utils_fifo fifo2; // For sending data to java code (to plot it) 79 short *fifo2Buffer; 80 short *fifoBuffer; 81 SLAndroidSimpleBufferQueueItf recorderBufferQueue; 82 SLBufferQueueItf playerBufferQueue; 83 84 //other things that belong here 85 SLObjectItf playerObject; 86 SLObjectItf recorderObject; 87 SLObjectItf outputmixObject; 88 SLObjectItf engineObject; 89 90 bufferStats recorderBufferStats; 91 bufferStats playerBufferStats; 92 93 int testType; 94 double frequency1; 95 double bufferTestPhase1; 96 int count; 97 char* byteBufferPtr; 98 int byteBufferLength; 99 100 short* loopbackTone; 101 102 callbackTimeStamps recorderTimeStamps; 103 callbackTimeStamps playerTimeStamps; 104 short expectedBufferPeriod; 105 } sles_data; 106 107 // how late in ms a callback must be to trigger a systrace/bugreport 108 #define LATE_CALLBACK_CAPTURE_THRESHOLD 4 109 #define LATE_CALLBACK_OUTLIER_THRESHOLD 1 110 #define BUFFER_PERIOD_DISCARD 10 111 #define BUFFER_PERIOD_DISCARD_FULL_DUPLEX_PARTNER 2 112 113 #endif //_Included_org_drrickorang_loopback_sles 114