• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }