1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_proxy_common_fun_test.h"
17 #include <unistd.h>
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
20 #include "hdf_remote_service.h"
21
22 namespace comfun {
GetDynamicLibHandle(const std::string path)23 void *GetDynamicLibHandle(const std::string path)
24 {
25 char absPath[DYNAMIC_LIB_PATH_MAX] = {0};
26 if (realpath(path.c_str(), absPath) == nullptr) {
27 return nullptr;
28 }
29 void *handleSo = dlopen(absPath, RTLD_LAZY);
30 if (handleSo == nullptr) {
31 return nullptr;
32 }
33 return handleSo;
34 }
35
InitPort(struct AudioPort & portIndex)36 int32_t InitPort(struct AudioPort &portIndex)
37 {
38 portIndex.dir = PORT_OUT;
39 portIndex.portId = 1;
40 portIndex.portName = "usb";
41 return HDF_SUCCESS;
42 }
43
InitHwRender(struct AudioHwRender & hwRender,const struct AudioDeviceDescriptor & desc,const struct AudioSampleAttributes & attrs)44 int32_t InitHwRender(struct AudioHwRender &hwRender, const struct AudioDeviceDescriptor &desc,
45 const struct AudioSampleAttributes &attrs)
46 {
47 hwRender.renderParam.renderMode.hwInfo.deviceDescript = desc;
48 hwRender.renderParam.frameRenderMode.attrs = attrs;
49 hwRender.renderParam.renderMode.ctlParam.audioGain.gainMax = 15; // gainMax 15
50 hwRender.renderParam.renderMode.ctlParam.audioGain.gainMin = 0;
51 hwRender.renderParam.frameRenderMode.frames = 0;
52 hwRender.renderParam.frameRenderMode.time.tvNSec = 0;
53 hwRender.renderParam.frameRenderMode.time.tvSec = 0;
54 hwRender.renderParam.frameRenderMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
55 hwRender.renderParam.frameRenderMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
56 hwRender.renderParam.frameRenderMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
57 hwRender.renderParam.frameRenderMode.attrs.period = attrs.period;
58 hwRender.renderParam.frameRenderMode.attrs.frameSize = attrs.frameSize;
59 hwRender.renderParam.frameRenderMode.attrs.startThreshold = attrs.startThreshold;
60 hwRender.renderParam.frameRenderMode.attrs.stopThreshold = attrs.stopThreshold;
61 hwRender.renderParam.frameRenderMode.attrs.silenceThreshold = attrs.silenceThreshold;
62 hwRender.renderParam.frameRenderMode.attrs.isBigEndian = attrs.isBigEndian;
63 hwRender.renderParam.frameRenderMode.attrs.isSignedData = attrs.isSignedData;
64 return HDF_SUCCESS;
65 }
66
InitHwCapture(struct AudioHwCapture & hwCapture,const struct AudioDeviceDescriptor & desc,const struct AudioSampleAttributes & attrs)67 int32_t InitHwCapture(struct AudioHwCapture &hwCapture, const struct AudioDeviceDescriptor &desc,
68 const struct AudioSampleAttributes &attrs)
69 {
70 hwCapture.captureParam.captureMode.hwInfo.deviceDescript = desc;
71 hwCapture.captureParam.frameCaptureMode.attrs = attrs;
72 hwCapture.captureParam.captureMode.ctlParam.audioGain.gainMax = 15; // gainMax 15
73 hwCapture.captureParam.captureMode.ctlParam.audioGain.gainMin = 0;
74 hwCapture.captureParam.frameCaptureMode.frames = 0;
75 hwCapture.captureParam.frameCaptureMode.time.tvNSec = 0;
76 hwCapture.captureParam.frameCaptureMode.time.tvSec = 0;
77 hwCapture.captureParam.frameCaptureMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
78 hwCapture.captureParam.frameCaptureMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
79 hwCapture.captureParam.frameCaptureMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
80 hwCapture.captureParam.frameCaptureMode.attrs.period = attrs.period;
81 hwCapture.captureParam.frameCaptureMode.attrs.frameSize = attrs.frameSize;
82 hwCapture.captureParam.frameCaptureMode.attrs.startThreshold = attrs.startThreshold;
83 hwCapture.captureParam.frameCaptureMode.attrs.stopThreshold = attrs.stopThreshold;
84 hwCapture.captureParam.frameCaptureMode.attrs.silenceThreshold = attrs.silenceThreshold;
85 hwCapture.captureParam.frameCaptureMode.attrs.isBigEndian = attrs.isBigEndian;
86 hwCapture.captureParam.frameCaptureMode.attrs.isSignedData = attrs.isSignedData;
87 return HDF_SUCCESS;
88 }
89
InitAttrsCommon(struct AudioSampleAttributes & attrs)90 void InitAttrsCommon(struct AudioSampleAttributes &attrs)
91 {
92 /* Initialization of audio parameters for playback */
93 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
94 attrs.channelCount = AUDIO_CHANNELCOUNT;
95 attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
96 attrs.interleaved = 0;
97 attrs.type = AUDIO_IN_MEDIA;
98 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
99 attrs.frameSize = AUDIO_FORMAT_PCM_BIT * AUDIO_CHANNELCOUNT / 8; /* divide 8 is for bit to byte */
100 attrs.isBigEndian = false;
101 attrs.isSignedData = true;
102 /* DEEP_BUFFER_RENDER_PERIOD_SIZE / (16 * attrs->channelCount / 8) divide 8 is for bit to byte */
103 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (AUDIO_FORMAT_PCM_BIT * AUDIO_CHANNELCOUNT / 8);
104 attrs.stopThreshold = INT_32_MAX;
105 }
106
InitAttrs(struct AudioSampleAttributes & attrs)107 int32_t InitAttrs(struct AudioSampleAttributes &attrs)
108 {
109 InitAttrsCommon(attrs);
110 attrs.silenceThreshold = 0;
111 return HDF_SUCCESS;
112 }
113
InitDevDesc(struct AudioDeviceDescriptor & devDesc)114 int32_t InitDevDesc(struct AudioDeviceDescriptor &devDesc)
115 {
116 /* Initialization of audio parameters for playback */
117 devDesc.portId = 0;
118 devDesc.pins = PIN_OUT_SPEAKER;
119 devDesc.desc = NULL;
120 return HDF_SUCCESS;
121 }
122
InitDevDesc(struct AudioDeviceDescriptor & devDesc,const uint32_t portId,int pins)123 int32_t InitDevDesc(struct AudioDeviceDescriptor &devDesc, const uint32_t portId, int pins)
124 {
125 devDesc.portId = portId;
126 devDesc.pins = (enum AudioPortPin)pins;
127 devDesc.desc = nullptr;
128 return HDF_SUCCESS;
129 }
130
InitAttrsCapture(struct AudioSampleAttributes & attrs)131 int32_t InitAttrsCapture(struct AudioSampleAttributes &attrs)
132 {
133 InitAttrsCommon(attrs);
134 attrs.silenceThreshold = SILENCE_THRESHOLD;
135 return HDF_SUCCESS;
136 }
137
InitDevDescCapture(struct AudioDeviceDescriptor & devDesc)138 int32_t InitDevDescCapture(struct AudioDeviceDescriptor &devDesc)
139 {
140 /* Initialization of audio parameters for playback */
141 devDesc.portId = 0;
142 devDesc.pins = PIN_IN_MIC;
143 devDesc.desc = NULL;
144 return HDF_SUCCESS;
145 }
146
AudioRenderCallbackUtTest(enum AudioCallbackType type,void * reserved,void * cookie)147 int32_t AudioRenderCallbackUtTest(enum AudioCallbackType type, void *reserved, void *cookie)
148 {
149 (void)reserved;
150 (void)cookie;
151 switch (type) {
152 case AUDIO_NONBLOCK_WRITE_COMPELETED:
153 return HDF_SUCCESS;
154 case AUDIO_RENDER_FULL:
155 return HDF_SUCCESS;
156 case AUDIO_FLUSH_COMPLETED:
157 return HDF_SUCCESS;
158 case AUDIO_ERROR_OCCUR:
159 return HDF_FAILURE;
160 case AUDIO_DRAIN_COMPELETED:
161 return HDF_FAILURE;
162 default:
163 return HDF_FAILURE;
164 }
165 return HDF_FAILURE;
166 }
167
SwitchAdapter(struct AudioAdapterDescriptor * descs,const std::string & adapterNameCase,int portFlag,struct AudioPort * & audioPort,int size)168 int32_t SwitchAdapter(struct AudioAdapterDescriptor *descs, const std::string &adapterNameCase,
169 int portFlag, struct AudioPort *&audioPort, int size)
170 {
171 if (descs == nullptr || size > ADAPTER_COUNT) {
172 return HDF_FAILURE;
173 }
174
175 for (int index = 0; index < size; index++) {
176 struct AudioAdapterDescriptor *desc = &descs[index];
177 if (desc == nullptr || desc->adapterName == nullptr) {
178 continue;
179 }
180 if (strcmp(desc->adapterName, adapterNameCase.c_str())) {
181 continue;
182 }
183 for (uint32_t port = 0; port < desc->portNum; port++) {
184 if (desc->ports[port].dir == portFlag) {
185 audioPort = &desc->ports[port];
186 return index;
187 }
188 }
189 }
190 return HDF_FAILURE;
191 }
192
GetAdapters(TestAudioManager * manager,struct AudioAdapterDescriptor ** descs,int & size)193 int32_t GetAdapters(TestAudioManager *manager, struct AudioAdapterDescriptor **descs, int &size)
194 {
195 int32_t ret = -1;
196 if (descs == nullptr) {
197 return AUDIO_HAL_ERR_INVALID_PARAM;
198 }
199 ret = manager->GetAllAdapters(manager, descs, &size);
200 if (ret < 0) {
201 return ret;
202 }
203 if (*descs == nullptr) {
204 return AUDIO_HAL_ERR_INTERNAL;
205 }
206 return AUDIO_HAL_SUCCESS;
207 }
208
GetLoadAdapter(TestAudioManager * manager,int portType,const std::string & adapterName,struct AudioAdapter ** adapter,struct AudioPort * & audioPort)209 int32_t GetLoadAdapter(TestAudioManager *manager, int portType,
210 const std::string &adapterName, struct AudioAdapter **adapter, struct AudioPort *&audioPort)
211 {
212 int32_t ret = -1;
213 int size = 0;
214 struct AudioAdapterDescriptor *desc = nullptr;
215 struct AudioAdapterDescriptor *descs = nullptr;
216 if (adapter == nullptr) {
217 return AUDIO_HAL_ERR_INVALID_PARAM;
218 }
219 ret = GetAdapters(manager, &descs, size);
220 if (ret < 0) {
221 return ret;
222 }
223 if (descs == nullptr) {
224 return AUDIO_HAL_ERR_INTERNAL;
225 }
226
227 int index = SwitchAdapter(descs, adapterName, portType, audioPort, size);
228 if (index < 0) {
229 return AUDIO_HAL_ERR_INTERNAL;
230 }
231 desc = &descs[index];
232 if (desc == nullptr) {
233 return AUDIO_HAL_ERR_INVALID_PARAM;
234 }
235 ret = manager->LoadAdapter(manager, desc, adapter);
236 if (ret < 0) {
237 return ret;
238 }
239 if (*adapter == nullptr) {
240 return AUDIO_HAL_ERR_INTERNAL;
241 }
242 return AUDIO_HAL_SUCCESS;
243 }
244 }
245