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 #ifndef AUDIO_IDLHDI_COMMON_H
17 #define AUDIO_IDLHDI_COMMON_H
18 #include <inttypes.h>
19 #include <limits.h>
20 #include <pthread.h>
21 #include <securec.h>
22 #include <signal.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string>
26 #include <sys/mman.h>
27 #include <sys/time.h>
28 #include <unistd.h>
29 #include "hdf_base.h"
30 #include "v4_0/iaudio_manager.h"
31 #include "v4_0/audio_types.h"
32 
33 namespace OHOS {
34 namespace Audio {
35 #ifdef AUDIO_ADM_PASSTHROUGH
36     constexpr bool IS_STUB = true;
37 #endif
38 #ifdef AUDIO_ADM_SERVICE
39     constexpr bool IS_STUB = false;
40 #endif
41 const std::string AUDIO_FILE = "/data/test/audiorendertest.wav";
42 const std::string LOW_LATENCY_AUDIO_FILE = "/data/test/lowlatencyrendertest.wav";
43 const std::string AUDIO_CAPTURE_FILE = "/data/test/audiocapture.wav";
44 const std::string AUDIO_LOW_LATENCY_CAPTURE_FILE = "/data/test/lowlatencycapturetest.wav";
45 
46 const int AUDIO_ADAPTER_MAX_NUM = 5;
47 const std::string ADAPTER_NAME = "primary";
48 const std::string ADAPTER_NAME_OUT = "primary_ext";
49 using TestAudioManager = struct IAudioManager;
50 const std::string AUDIO_RIFF = "RIFF";
51 const std::string AUDIO_WAVE = "WAVE";
52 const std::string AUDIO_DATA = "data";
53 const uint32_t INT_32_MAX = 0x7fffffff;
54 const uint32_t INDEX_END = 555;
55 const uint32_t MOVE_RIGHT_NUM = 3;
56 const int MOVE_LEFT_NUM = 8;
57 const int CHANNELCOUNT = 2;
58 const int SAMPLERATE = 48000;
59 const int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4*1024;
60 const float GAIN_MIN = 0;
61 const float GAIN_MAX = 15;
62 const uint64_t INITIAL_VALUE = 0;
63 const int BUFFER_LENTH = 1024 * 16;
64 const int FILE_CAPTURE_SIZE = 1024 * 1024 * 1;
65 const uint64_t MEGABYTE = 1024;
66 const int FRAME_SIZE = 1024;
67 const int FRAME_COUNT = 4;
68 const int PCM_BYTE_MIN = 1024;
69 const int PCM_BYTE_MAX = 8 * 1024;
70 const int ADAPTER_COUNT = 32;
71 const int TRY_NUM_FRAME = 20;
72 const int AUDIO_WRITE_COMPLETED_VALUE = 1;
73 const int AUDIO_RENDER_FULL_VALUE = 2;
74 const int AUDIO_FLUSH_COMPLETED_VALUE = 3;
75 const int64_t SECTONSEC = 1000000000;
76 const int MICROSECOND = 1000000;
77 const int RANGE = 3;
78 const int OUT_OF_RANGE = 6;
79 const int32_t AUDIO_HAL_ERR_NOTREADY = -7001; /* audio adapter is not ready */
80 const int32_t AUDIO_HAL_ERR_AI_BUSY = -7002;  /* audio capture is busy now */
81 const int32_t AUDIO_HAL_ERR_AO_BUSY = -7003;  /* audio render is busy now */
82 
83 constexpr int PCM_8_BIT  = 8;
84 constexpr int PCM_16_BIT = 16;
85 constexpr int PCM_24_BIT = 24;
86 constexpr int PCM_32_BIT = 32;
87 constexpr int SAMPLE_RATE_8000 = 8000;
88 constexpr int SAMPLE_RATE_11025 = 11025;
89 constexpr int SAMPLE_RATE_22050 = 22050;
90 constexpr int SAMPLE_RATE_32000 = 32000;
91 constexpr int SAMPLE_RATE_44100 = 44100;
92 constexpr int SAMPLE_RATE_48000 = 48000;
93 constexpr int SAMPLE_RATE_12000 = 12000;
94 constexpr int SAMPLE_RATE_16000 = 16000;
95 constexpr int SAMPLE_RATE_24000 = 24000;
96 constexpr int SAMPLE_RATE_64000 = 64000;
97 constexpr int SAMPLE_RATE_96000 = 96000;
98 constexpr int DOUBLE_CHANNEL_COUNT = 2;
99 constexpr int SINGLE_CHANNEL_COUNT = 1;
100 
101 struct AudioCtlElemId {
102     const char *cardServiceName;
103     int32_t iface;
104     const char *itemName; /* ASCII name of item */
105 };
106 
107 struct AudioCtlElemValue {
108     struct AudioCtlElemId id;
109     int32_t value[2];
110 };
111 
112 struct AudioHeadInfo {
113     uint32_t testFileRiffId;
114     uint32_t testFileRiffSize;
115     uint32_t testFileFmt;
116     uint32_t audioFileFmtId;
117     uint32_t audioFileFmtSize;
118     uint16_t audioFileFormat;
119     uint16_t audioChannelNum;
120     uint32_t audioSampleRate;
121     uint32_t audioByteRate;
122     uint16_t audioBlockAlign;
123     uint16_t audioBitsPerSample;
124     uint32_t dataId;
125     uint32_t dataSize;
126 };
127 
128 struct AudioCharacteristic {
129     bool setmute;
130     bool getmute;
131     float setvolume;
132     float getvolume;
133     float setgain;
134     float getgain;
135     float gainthresholdmin;
136     float gainthresholdmax;
137     uint64_t getframes;
138     uint64_t getframesize;
139     uint64_t getframecount;
140     uint32_t getcurrentchannelId;
141     AudioChannelMode setmode;
142     AudioChannelMode getmode;
143     bool supported;
144     uint32_t latencyTime;
145 };
146 
147 struct PrepareAudioPara {
148     TestAudioManager *manager;
149     AudioPortDirection portType;
150     const char *adapterName;
151     struct IAudioAdapter *adapter;
152     struct AudioPort audioPort;
153     void *self;
154     void *result;
155     pthread_t tids;
156     AudioPortPin pins;
157     const char *path;
158     struct IAudioRender *render;
159     struct IAudioCapture *capture;
160     struct AudioHeadInfo headInfo;
161     struct AudioAdapterDescriptor *desc;
162     struct AudioAdapterDescriptor *descs;
163     char *frame;
164     uint64_t requestBytes;
165     uint32_t replyBytes;
166     uint64_t fileSize;
167     struct AudioSampleAttributes attrs;
168     struct AudioCharacteristic character;
169     struct AudioSampleAttributes attrsValue;
170     struct AudioSceneDescriptor scenes;
171     struct AudioPortCapability capability;
172     enum AudioPortPassthroughMode mode;
173     struct AudioTimeStamp time;
174     struct timeval start;
175     struct timeval end;
176     long delayTime;
177     long totalTime;
178     float averageDelayTime;
179     struct AudioDeviceDescriptor devDesc;
180 };
181 
182 int32_t InitAttrs(struct AudioSampleAttributes &attrs);
183 
184 int32_t InitDevDesc(struct AudioDeviceDescriptor &devDesc, const uint32_t portId, int pins);
185 
186 int32_t SwitchAdapter(struct AudioAdapterDescriptor *descs, const std::string &adapterNameCase,
187     int portFlag, struct AudioPort *&audioPort, int size);
188 
189 uint32_t PcmFormatToBits(int format);
190 
191 uint32_t PcmFramesToBytes(const struct AudioSampleAttributes attrs);
192 
193 int32_t WavHeadAnalysis(struct AudioHeadInfo &wavHeadInfo, FILE *file, struct AudioSampleAttributes &attrs);
194 
195 int32_t GetAdapters(TestAudioManager *manager, struct AudioAdapterDescriptor *&descs, uint32_t &size);
196 
197 int32_t GetLoadAdapter(TestAudioManager *manager, int portType,
198     const std::string &adapterName, struct IAudioAdapter **adapter, struct AudioPort &audioPort);
199 
200 int32_t AudioCreateRender(TestAudioManager *manager, int pins, const std::string &adapterName,
201     struct IAudioAdapter **adapter, struct IAudioRender **render, uint32_t *renderId);
202 
203 #ifdef SUPPORT_OFFLOAD
204 int32_t AudioOffloadCreateRender(TestAudioManager *manager, int pins, const std::string &adapterName,
205     struct IAudioAdapter **adapter, struct IAudioRender **render, uint32_t *renderId);
206 #endif
207 
208 int32_t AudioCreateCapture(TestAudioManager *manager, int pins, const std::string &adapterName,
209     struct IAudioAdapter **adapter, struct IAudioCapture **capture, uint32_t *captureId);
210 
211 int32_t FrameStart(struct AudioHeadInfo wavHeadInfo, struct IAudioRender *render, FILE *file,
212     struct AudioSampleAttributes attrs);
213 
214 int32_t FrameStartCapture(struct IAudioCapture *capture, FILE *file, const struct AudioSampleAttributes attrs);
215 
216 int32_t RenderFramePrepare(const std::string &path, char *&frame, uint64_t &numRead);
217 
218 void FrameStatus(int status);
219 
220 int32_t StartRecord(struct IAudioCapture *capture, FILE *file, uint64_t filesize);
221 
222 int32_t AudioRenderStartAndOneFrame(struct IAudioRender *render);
223 
224 int32_t StopAudio(struct PrepareAudioPara &audiopara);
225 
226 int32_t ThreadRelease(struct PrepareAudioPara &audiopara);
227 
228 int32_t AudioCaptureStartAndOneFrame(struct IAudioCapture *capture);
229 
230 int32_t PlayAudioFile(struct PrepareAudioPara &audiopara);
231 
232 int32_t RecordAudio(struct PrepareAudioPara &audiopara);
233 
234 int32_t InitAttrsUpdate(struct AudioSampleAttributes &attrs, int format, uint32_t channelCount,
235     uint32_t sampleRate, uint32_t silenceThreshold = BUFFER_LENTH);
236 
237 int32_t AudioRenderSetGetSampleAttributes(struct AudioSampleAttributes attrs, struct AudioSampleAttributes &attrsValue,
238     struct IAudioRender *render);
239 
240 int32_t AudioCaptureSetGetSampleAttributes(struct AudioSampleAttributes attrs, struct AudioSampleAttributes &attrsValue,
241     struct IAudioCapture *capture);
242 
243 int32_t InitMmapDesc(const std::string &path, struct AudioMmapBufferDescriptor &desc, int32_t &reqSize, bool flag);
244 
245 int32_t PlayMapAudioFile(struct PrepareAudioPara &audiopara);
246 
247 int32_t RecordMapAudio(struct PrepareAudioPara &audiopara);
248 
249 int32_t AudioRenderCallback(struct IAudioCallback *self, enum AudioCallbackType type, int8_t* reserved,
250     int8_t* cookie);
251 
252 int32_t CheckFlushValue();
253 
254 int32_t CheckRenderFullValue();
255 
256 int32_t CheckWriteCompleteValue();
257 
258 void TestReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen);
259 
260 void TestAudioPortCapabilityFree(struct AudioPortCapability *dataBlock, bool freeSelf);
261 
262 int32_t ReleaseCaptureSource(TestAudioManager *manager, struct IAudioAdapter *&adapter,
263     struct IAudioCapture *&capture, uint32_t captureId);
264 
265 int32_t ReleaseRenderSource(TestAudioManager *manager, struct IAudioAdapter *&adapter, struct IAudioRender *&render,
266                             uint32_t renderId);
267 
268 int32_t GetCaptureBufferSize(struct IAudioCapture *capture, uint32_t &bufferSize);
269 }
270 }
271 #endif // AUDIO_IDLHDI_COMMON_H
272