• 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 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 }