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