1 /*
2 * Copyright (c) 2021 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 /*
17 * @addtogroup Audio
18 * @{
19 *
20 * @brief Defines audio-related APIs for fuzztest.
21 *
22 * @since 1.0
23 * @version 1.0
24 */
25
26 /*
27 * @file audio_hdi_fuzzer_common.h
28 *
29 * @brief Declares APIs for operations related to the audio fuzztest.
30 *
31 * @since 1.0
32 * @version 1.0
33 */
34
35 #include "audio_hdi_fuzzer_common.h"
36
37 namespace HMOS {
38 namespace Audio {
GetManager(TestAudioManager * & manager)39 int32_t GetManager(TestAudioManager *&manager)
40 {
41 void *handleSo = nullptr;
42 TestAudioManager *(*GetAudioManager)() = nullptr;
43 handleSo = dlopen(RESOLVED_PATH.c_str(), RTLD_LAZY);
44 if (handleSo == nullptr) {
45 return HDF_FAILURE;
46 }
47 GetAudioManager = (TestAudioManager *(*)())(dlsym(handleSo, FUNCTION_NAME.c_str()));
48 if (GetAudioManager == nullptr) {
49 return HDF_FAILURE;
50 }
51 manager = GetAudioManager();
52 if (manager == nullptr) {
53 return HDF_FAILURE;
54 }
55 return HDF_SUCCESS;
56 }
InitAttrs(struct AudioSampleAttributes & attrs)57 int32_t InitAttrs(struct AudioSampleAttributes& attrs)
58 {
59 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
60 attrs.channelCount = CHANNELCOUNT;
61 attrs.sampleRate = SAMPLERATE;
62 attrs.interleaved = 0;
63 attrs.type = AUDIO_IN_MEDIA;
64 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
65 attrs.frameSize = PCM_16_BIT * CHANNELCOUNT / MOVE_LEFT_NUM;
66 attrs.isBigEndian = false;
67 attrs.isSignedData = true;
68 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (PCM_16_BIT * attrs.channelCount / MOVE_LEFT_NUM);
69 attrs.stopThreshold = INT_32_MAX;
70 attrs.silenceThreshold = BUFFER_LENTH;
71 return HDF_SUCCESS;
72 }
73
InitDevDesc(struct AudioDeviceDescriptor & devDesc,const uint32_t portId,enum AudioPortPin pins)74 int32_t InitDevDesc(struct AudioDeviceDescriptor& devDesc, const uint32_t portId, enum AudioPortPin pins)
75 {
76 devDesc.portId = portId;
77 devDesc.pins = pins;
78 devDesc.desc = nullptr;
79 return HDF_SUCCESS;
80 }
81
SwitchAdapter(struct AudioAdapterDescriptor * descs,const std::string & adapterNameCase,enum AudioPortDirection portFlag,struct AudioPort * & audioPort,int size)82 int32_t SwitchAdapter(struct AudioAdapterDescriptor *descs, const std::string& adapterNameCase,
83 enum AudioPortDirection portFlag, struct AudioPort *&audioPort, int size)
84 {
85 if (descs == nullptr || size > ADAPTER_COUNT) {
86 return HDF_FAILURE;
87 }
88
89 for (int index = 0; index < size; index++) {
90 struct AudioAdapterDescriptor *desc = &descs[index];
91 if (desc == nullptr || desc->adapterName == nullptr) {
92 continue;
93 }
94 if (strcmp(desc->adapterName, adapterNameCase.c_str())) {
95 continue;
96 }
97 for (uint32_t port = 0; port < desc->portNum; port++) {
98 if (desc->ports[port].dir == portFlag) {
99 audioPort = &desc->ports[port];
100 return index;
101 }
102 }
103 }
104 return HDF_FAILURE;
105 }
106
GetAdapters(TestAudioManager * manager,struct AudioAdapterDescriptor ** descs,int & size)107 int32_t GetAdapters(TestAudioManager *manager, struct AudioAdapterDescriptor **descs, int &size)
108 {
109 int32_t ret = -1;
110 if (manager == nullptr || descs == nullptr) {
111 return HDF_FAILURE;
112 }
113 ret = manager->GetAllAdapters(manager, descs, &size);
114 if (ret < 0 || *descs == nullptr || size != AUDIO_ADAPTER_MAX_NUM) {
115 return HDF_FAILURE;
116 }
117 return HDF_SUCCESS;
118 }
119
GetLoadAdapter(TestAudioManager * manager,struct AudioAdapter ** adapter,struct AudioPort * & audioPort)120 int32_t GetLoadAdapter(TestAudioManager *manager, struct AudioAdapter **adapter, struct AudioPort *&audioPort)
121 {
122 int32_t ret = -1;
123 int size = 0;
124 struct AudioAdapterDescriptor *desc = nullptr;
125 struct AudioAdapterDescriptor *descs = nullptr;
126 if (manager == nullptr || adapter == nullptr) {
127 return AUDIO_HAL_ERR_INVALID_PARAM;
128 }
129 ret = GetAdapters(manager, &descs, size);
130 if (ret < 0) {
131 return ret;
132 }
133 if (descs == nullptr) {
134 return AUDIO_HAL_ERR_INTERNAL;
135 }
136 std::string adapterName = "usb";
137 int index = SwitchAdapter(descs, adapterName, PORT_OUT_IN, audioPort, size);
138 if (index < 0) {
139 return AUDIO_HAL_ERR_INTERNAL;
140 }
141 desc = &descs[index];
142 ret = manager->LoadAdapter(manager, desc, adapter);
143 if (ret < 0) {
144 return ret;
145 }
146 if (*adapter == nullptr) {
147 return AUDIO_HAL_ERR_INTERNAL;
148 }
149 return AUDIO_HAL_SUCCESS;
150 }
151
AudioCreateRender(TestAudioManager * manager,struct AudioAdapter ** adapter,struct AudioRender ** render)152 int32_t AudioCreateRender(TestAudioManager *manager, struct AudioAdapter **adapter, struct AudioRender **render)
153 {
154 int32_t ret = -1;
155 struct AudioSampleAttributes attrs = {};
156 struct AudioDeviceDescriptor devDesc = {};
157 struct AudioPort *renderPort = nullptr;
158 if (manager == nullptr || adapter == nullptr || render == nullptr) {
159 return HDF_FAILURE;
160 }
161 ret = GetLoadAdapter(manager, adapter, renderPort);
162 if (ret < 0) {
163 return ret;
164 }
165 if (*adapter == nullptr || (*adapter)->CreateRender == nullptr) {
166 return AUDIO_HAL_ERR_INTERNAL;
167 }
168 InitAttrs(attrs);
169 InitDevDesc(devDesc, renderPort->portId, PIN_OUT_SPEAKER);
170 ret = (*adapter)->CreateRender(*adapter, &devDesc, &attrs, render);
171 if (ret < 0) {
172 manager->UnloadAdapter(manager, *adapter);
173 return ret;
174 }
175 if (*render == nullptr) {
176 manager->UnloadAdapter(manager, *adapter);
177 return AUDIO_HAL_ERR_INTERNAL;
178 }
179 return HDF_SUCCESS;
180 }
AudioGetManagerCreateRender(TestAudioManager * & manager,struct AudioAdapter ** adapter,struct AudioRender ** render)181 int32_t AudioGetManagerCreateRender(TestAudioManager *&manager, struct AudioAdapter **adapter,
182 struct AudioRender **render)
183 {
184 int32_t ret = -1;
185 ret = GetManager(manager);
186 if (ret < 0 || manager == nullptr) {
187 return HDF_FAILURE;
188 }
189 ret = AudioCreateRender(manager, adapter, render);
190 if (ret < 0 || adapter == nullptr || render == nullptr) {
191 return HDF_FAILURE;
192 }
193 return ret;
194 }
AudioGetManagerCreateStartRender(TestAudioManager * & manager,struct AudioAdapter ** adapter,struct AudioRender ** render)195 int32_t AudioGetManagerCreateStartRender(TestAudioManager *&manager, struct AudioAdapter **adapter,
196 struct AudioRender **render)
197 {
198 int32_t ret = -1;
199 ret = AudioGetManagerCreateRender(manager, adapter, render);
200 if (ret < 0 || adapter == nullptr || render == nullptr) {
201 return HDF_FAILURE;
202 }
203 ret = (*render)->control.Start((AudioHandle)*render);
204 if (ret < 0) {
205 (*adapter)->DestroyRender(*adapter, *render);
206 manager->UnloadAdapter(manager, *adapter);
207 return HDF_FAILURE;
208 }
209 return HDF_SUCCESS;
210 }
AudioCreateCapture(TestAudioManager * manager,struct AudioAdapter ** adapter,struct AudioCapture ** capture)211 int32_t AudioCreateCapture(TestAudioManager *manager, struct AudioAdapter **adapter, struct AudioCapture **capture)
212 {
213 int32_t ret = -1;
214 struct AudioSampleAttributes attrs = {};
215 struct AudioDeviceDescriptor devDesc = {};
216 struct AudioPort *capturePort = nullptr;
217 if (manager == nullptr || adapter == nullptr || capture == nullptr) {
218 return AUDIO_HAL_ERR_INVALID_PARAM;
219 }
220 ret = GetLoadAdapter(manager, adapter, capturePort);
221 if (ret < 0) {
222 return ret;
223 }
224 if (*adapter == nullptr || (*adapter)->CreateCapture == nullptr) {
225 return AUDIO_HAL_ERR_INTERNAL;
226 }
227 InitAttrs(attrs);
228 InitDevDesc(devDesc, capturePort->portId, PIN_IN_MIC);
229 ret = (*adapter)->CreateCapture(*adapter, &devDesc, &attrs, capture);
230 if (ret < 0) {
231 manager->UnloadAdapter(manager, *adapter);
232 return ret;
233 }
234 if (*capture == nullptr) {
235 manager->UnloadAdapter(manager, *adapter);
236 return AUDIO_HAL_ERR_INTERNAL;
237 }
238 return HDF_SUCCESS;
239 }
AudioGetManagerCreateCapture(TestAudioManager * & manager,struct AudioAdapter ** adapter,struct AudioCapture ** capture)240 int32_t AudioGetManagerCreateCapture(TestAudioManager *&manager, struct AudioAdapter **adapter,
241 struct AudioCapture **capture)
242 {
243 int32_t ret = -1;
244 ret = GetManager(manager);
245 if (ret < 0 || manager == nullptr) {
246 return HDF_FAILURE;
247 }
248 ret = AudioCreateCapture(manager, adapter, capture);
249 if (ret < 0 || adapter == nullptr || capture == nullptr) {
250 return HDF_FAILURE;
251 }
252 return ret;
253 }
AudioGetManagerCreateStartCapture(TestAudioManager * & manager,struct AudioAdapter ** adapter,struct AudioCapture ** capture)254 int32_t AudioGetManagerCreateStartCapture(TestAudioManager *&manager, struct AudioAdapter **adapter,
255 struct AudioCapture **capture)
256 {
257 int32_t ret = -1;
258 ret = AudioGetManagerCreateCapture(manager, adapter, capture);
259 if (ret < 0 || adapter == nullptr || capture == nullptr || manager == nullptr) {
260 return HDF_FAILURE;
261 }
262 ret = (*capture)->control.Start((AudioHandle)*capture);
263 if (ret < 0) {
264 (*adapter)->DestroyCapture(*adapter, *capture);
265 manager->UnloadAdapter(manager, *adapter);
266 return ret;
267 }
268 return HDF_SUCCESS;
269 }
InitMmapDesc(FILE * fp,struct AudioMmapBufferDescripter & desc,int32_t & reqSize,bool flag)270 int32_t InitMmapDesc(FILE *fp, struct AudioMmapBufferDescripter &desc, int32_t &reqSize, bool flag)
271 {
272 if (fp == NULL) {
273 return HDF_FAILURE;
274 }
275 int fd = fileno(fp);
276 if (fd == -1) {
277 return HDF_FAILURE;
278 }
279 if (flag) {
280 fseek(fp, 0, SEEK_END);
281 reqSize = ftell(fp);
282 desc.offset = 134;
283 } else {
284 reqSize = FILE_CAPTURE_SIZE;
285 ftruncate(fd, FILE_CAPTURE_SIZE);
286 desc.offset = 0;
287 }
288 desc.memoryFd = fd;
289 desc.isShareable = 1;
290 desc.transferFrameSize = DEEP_BUFFER_RENDER_PERIOD_SIZE / FRAME_COUNT;
291 return HDF_SUCCESS;
292 }
293 }
294 }