• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <memory>
18 
19 #include <android/log.h>
20 
21 #include "lb2/logging.h"
22 #include "lb2/loopback2.h"
23 #include "lb2/loopback_test.h"
24 #include "lb2/sound_system_aaudio.h"
25 #include "lb2/sound_system_echo.h"
26 
27 // The Java layer always uses "mono" mode for native tests.
28 static constexpr int CHANNEL_COUNT = 1;
29 
30 struct LbData {
31     std::unique_ptr<TestContext> testContext;
32     std::unique_ptr<SoundSystem> soundSys;
33     std::unique_ptr<LoopbackTest> currentTest;
34 };
35 
lb2ComputeDefaultSettings(int performanceMode,int * samplingRate,int * playerBufferFrameCount,int * recorderBufferFrameCount)36 int lb2ComputeDefaultSettings(int performanceMode, int *samplingRate,
37              int *playerBufferFrameCount, int *recorderBufferFrameCount) {
38     SoundSystemAAudio ss;
39     return ss.probeDefaultSettings(static_cast<PerformanceMode>(performanceMode),
40             samplingRate, playerBufferFrameCount, recorderBufferFrameCount) ?
41             STATUS_SUCCESS : STATUS_FAIL;
42 }
43 
lb2Init(void ** ppLbData,int samplingRate,int frameCount,int,int performanceMode,int testType,double frequency1,char * byteBufferPtr,int byteBufferLength,short * loopbackTone,int,int ignoreFirstFrames)44 int lb2Init(void **ppLbData, int samplingRate, int frameCount, int /*micSource*/,
45         int performanceMode, int testType, double frequency1, char* byteBufferPtr,
46         int byteBufferLength, short* loopbackTone, int /*maxRecordedLateCallbacks*/,
47         int ignoreFirstFrames) {
48     *ppLbData = nullptr;
49     std::unique_ptr<LbData> lbData(new LbData());  // will auto-release in case if init fails.
50     switch (testType) {
51         case TEST_TYPE_LATENCY:
52             lbData->testContext.reset(new LatencyTestContext(
53                             static_cast<PerformanceMode>(performanceMode), frameCount,
54                             CHANNEL_COUNT, samplingRate, ignoreFirstFrames, loopbackTone));
55             break;
56         case TEST_TYPE_BUFFER_PERIOD: {
57             // TODO: Get rid of ByteBuffer.
58             static_assert(
59                     sizeof(sample_t) == sizeof(short), "byteBuffer only supports short samples");
60             AudioBufferView<sample_t> byteBuffer(
61                     reinterpret_cast<sample_t*>(byteBufferPtr), byteBufferLength, CHANNEL_COUNT);
62             lbData->testContext.reset(new GlitchTestContext(
63                             static_cast<PerformanceMode>(performanceMode),frameCount,
64                             CHANNEL_COUNT, samplingRate, frequency1, std::move(byteBuffer)));
65             break;
66         }
67         default:
68             ALOGE("Invalid test type: %d", testType);
69             return STATUS_FAIL;
70     }
71     // TODO: Implement switching from the Java side.
72     lbData->soundSys.reset(new SoundSystemAAudio(lbData->testContext.get()));
73     // lbData->soundSys.reset(new SoundSystemEcho(lbData->testContext.get()));
74     switch (testType) {
75         case TEST_TYPE_LATENCY:
76             lbData->currentTest.reset(new LatencyTest(
77                             lbData->soundSys.get(),
78                             static_cast<LatencyTestContext*>(lbData->testContext.get())));
79             break;
80         case TEST_TYPE_BUFFER_PERIOD:
81             lbData->currentTest.reset(new GlitchTest(
82                             lbData->soundSys.get(),
83                             static_cast<GlitchTestContext*>(lbData->testContext.get())));
84             break;
85     }
86     if (!lbData->currentTest->init()) return STATUS_FAIL;
87     *ppLbData = lbData.release();
88     return STATUS_SUCCESS;
89 }
90 
lb2ProcessNext(void * pLbData,double * pSamples,long maxSamples)91 int lb2ProcessNext(void *pLbData, double *pSamples, long maxSamples) {
92     if (pLbData == nullptr) return 0;
93     LbData *lbData = static_cast<LbData*>(pLbData);
94     return lbData->currentTest->collectRecording(
95             AudioBufferView<double>(pSamples, maxSamples / CHANNEL_COUNT, CHANNEL_COUNT));
96 }
97 
lb2Destroy(void ** ppCtx)98 int lb2Destroy(void **ppCtx) {
99     LbData** ppLbData = reinterpret_cast<LbData**>(ppCtx);
100     if (ppLbData != nullptr) {
101         delete *ppLbData;
102         *ppLbData = nullptr;
103         return STATUS_SUCCESS;
104     } else {
105         return STATUS_FAIL;
106     }
107 }
108 
lb2GetRecorderBufferPeriod(void *)109 int* lb2GetRecorderBufferPeriod(void*) {
110     static int *bufferPeriod = new int[1002]();
111     return bufferPeriod;
112 }
113 
lb2GetRecorderMaxBufferPeriod(void *)114 int lb2GetRecorderMaxBufferPeriod(void*) {
115     return 0;
116 }
117 
lb2GetRecorderVarianceBufferPeriod(void *)118 int64_t lb2GetRecorderVarianceBufferPeriod(void*) {
119     return 0;
120 }
121 
lb2GetPlayerBufferPeriod(void *)122 int* lb2GetPlayerBufferPeriod(void*) {
123     static int *bufferPeriod = new int[1002]();
124     return bufferPeriod;
125 }
126 
lb2GetPlayerMaxBufferPeriod(void *)127 int lb2GetPlayerMaxBufferPeriod(void*) {
128     return 0;
129 }
130 
lb2GetPlayerVarianceBufferPeriod(void *)131 int64_t lb2GetPlayerVarianceBufferPeriod(void*) {
132     return 0;
133 }
134 
lb2GetCaptureRank(void *)135 int lb2GetCaptureRank(void*) {
136     return 0;
137 }
138 
lb2GetPlayerTimeStampsAndExpectedBufferPeriod(void *,callbackTimeStamps ** ppTSs)139 int lb2GetPlayerTimeStampsAndExpectedBufferPeriod(void*, callbackTimeStamps **ppTSs) {
140     static callbackTimeStamps tss = {
141         new int[10],               //int* timeStampsMs
142         new short[10],             //short* callbackDurations
143         0,                         //short index
144         {0,0},                     //struct timespec startTime;
145         0,                         //int capacity
146         false                      //bool exceededCapacity
147     };
148     *ppTSs = &tss;
149     return 0;
150 }
151 
lb2GetRecorderTimeStampsAndExpectedBufferPeriod(void *,callbackTimeStamps ** ppTSs)152 int lb2GetRecorderTimeStampsAndExpectedBufferPeriod(void*, callbackTimeStamps **ppTSs) {
153     static callbackTimeStamps tss = {
154         new int[10],               //int* timeStampsMs
155         new short[10],             //short* callbackDurations
156         0,                         //short index
157         {0,0},                     //struct timespec startTime;
158         0,                         //int capacity
159         false                      //bool exceededCapacity
160     };
161     *ppTSs = &tss;
162     return 0;
163 }
164