1 /*
2 * Copyright (c) 2024-2025 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 #include <climits>
17 #include <cstring>
18 #include <gtest/gtest.h>
19 #include "hdf_dlist.h"
20 #include "osal_mem.h"
21 #include "v4_0/audio_types.h"
22 #include "v4_0/iaudio_adapter.h"
23 #include "v4_0/iaudio_manager.h"
24
25 using namespace std;
26 using namespace testing::ext;
27
28 #define AUDIO_CHANNELCOUNT 2
29 #define AUDIO_SAMPLE_RATE_192K 192000
30 #define AUDIO_SAMPLE_RATE_48K 48000
31 #define AUDIO_SAMPLE_RATE_44_1K 44100
32 #define DEEP_BUFFER_RENDER_PERIOD_SIZE 4096
33 #define AUDIO_CHANNELLAYOUT 3
34 namespace {
35 static const uint32_t g_audioAdapterNumMax = 5;
36
37 class HdfAudioAdapterDirectTest : public testing::Test {
38 public:
39 struct IAudioManager *manager_ = nullptr;
40 struct IAudioAdapter *adapter_ = nullptr;
41 struct AudioAdapterDescriptor *adapterDescs_ = nullptr;
42 uint32_t renderId_ = 0;
43 uint32_t captureId_ = 0;
44 virtual void SetUp();
45 virtual void TearDown();
46 void InitDirectAttrs(struct AudioSampleAttributes &attrs);
47 void InitDevDesc(struct AudioDeviceDescriptor &devDesc);
48 void AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf);
49 void ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen);
50 };
51
AudioAdapterDescriptorFree(struct AudioAdapterDescriptor * dataBlock,bool freeSelf)52 void HdfAudioAdapterDirectTest::AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf)
53 {
54 if (dataBlock == nullptr) {
55 return;
56 }
57
58 if (dataBlock->adapterName != nullptr) {
59 OsalMemFree(dataBlock->adapterName);
60 dataBlock->adapterName = nullptr;
61 }
62
63 if (dataBlock->ports != nullptr) {
64 OsalMemFree(dataBlock->ports);
65 }
66
67 if (freeSelf) {
68 OsalMemFree(dataBlock);
69 }
70 }
71
ReleaseAdapterDescs(struct AudioAdapterDescriptor ** descs,uint32_t descsLen)72 void HdfAudioAdapterDirectTest::ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen)
73 {
74 if ((descsLen > 0) && (descs != nullptr) && ((*descs) != nullptr)) {
75 for (uint32_t i = 0; i < descsLen; i++) {
76 AudioAdapterDescriptorFree(&(*descs)[i], false);
77 }
78 OsalMemFree(*descs);
79 *descs = nullptr;
80 }
81 }
82
InitDirectAttrs(struct AudioSampleAttributes & attrs)83 void HdfAudioAdapterDirectTest::InitDirectAttrs(struct AudioSampleAttributes &attrs)
84 {
85 attrs.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
86 attrs.channelCount = AUDIO_CHANNELCOUNT;
87 attrs.channelLayout = AUDIO_CHANNELLAYOUT;
88 attrs.sampleRate = AUDIO_SAMPLE_RATE_192K;
89 attrs.interleaved = 1;
90 attrs.type = AUDIO_DIRECT;
91 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
92 attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_32_BIT * AUDIO_CHANNELCOUNT;
93 attrs.isBigEndian = false;
94 attrs.isSignedData = true;
95 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.frameSize);
96 attrs.stopThreshold = INT_MAX;
97 attrs.silenceThreshold = 0;
98 }
99
InitDevDesc(struct AudioDeviceDescriptor & devDesc)100 void HdfAudioAdapterDirectTest::InitDevDesc(struct AudioDeviceDescriptor &devDesc)
101 {
102 ASSERT_NE(adapterDescs_, nullptr);
103 ASSERT_NE(adapterDescs_->ports, nullptr);
104 for (uint32_t index = 0; index < adapterDescs_->portsLen; index++) {
105 if (adapterDescs_->ports[index].dir == PORT_OUT) {
106 devDesc.portId = adapterDescs_->ports[index].portId;
107 return;
108 }
109 }
110 }
111
SetUp()112 void HdfAudioAdapterDirectTest::SetUp()
113 {
114 uint32_t size = g_audioAdapterNumMax;
115 manager_ = IAudioManagerGet(false);
116 ASSERT_NE(manager_, nullptr);
117
118 adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc(
119 sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax));
120 ASSERT_NE(adapterDescs_, nullptr);
121
122 ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, adapterDescs_, &size));
123 if (size > g_audioAdapterNumMax) {
124 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
125 ASSERT_LT(size, g_audioAdapterNumMax);
126 }
127
128 if (manager_->LoadAdapter(manager_, &adapterDescs_[0], &adapter_) != HDF_SUCCESS) {
129 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
130 ASSERT_TRUE(false);
131 }
132 if (adapter_ == nullptr) {
133 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
134 ASSERT_TRUE(false);
135 }
136 }
137
TearDown()138 void HdfAudioAdapterDirectTest::TearDown()
139 {
140 ASSERT_NE(manager_, nullptr);
141 ASSERT_NE(adapter_, nullptr);
142
143 manager_->UnloadAdapter(manager_, adapterDescs_[0].adapterName);
144 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
145 adapter_ = nullptr;
146 IAudioManagerRelease(manager_, false);
147 manager_ = nullptr;
148 }
149
150 /**
151 * @tc.number : SUB_Driver_Audio_Direct_0100
152 * @tc.name : HdfAudioAdapterDirectCreateRenderInvalid001
153 * @tc.desc : Verify function when the input parameter is invalid.
154 @tc.type: FUNC
155 */
156 HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderInvalid001, TestSize.Level1)
157 {
158 struct IAudioRender *render = nullptr;
159 struct AudioDeviceDescriptor devicedesc = {};
160 struct AudioSampleAttributes attrs = {};
161 uint32_t renderId_ = 10;
162
163 EXPECT_EQ(HDF_ERR_INVALID_OBJECT, adapter_->CreateRender(nullptr, &devicedesc, &attrs, &render, &renderId_));
164 EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, nullptr, &attrs, &render, &renderId_));
165 EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, nullptr, &render, &renderId_));
166 EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, &attrs, nullptr, &renderId_));
167 EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, nullptr));
168 EXPECT_NE(HDF_SUCCESS, adapter_->DestroyRender(adapter_, renderId_));
169 }
170
171 /**
172 * @tc.number : SUB_Driver_Audio_Direct_0200
173 * @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid001
174 * @tc.desc : Verify supported the direct when sampleRate is 192K.
175 @tc.type: FUNC
176 */
177 HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid001, TestSize.Level1)
178 {
179 struct IAudioRender *render = nullptr;
180 struct AudioDeviceDescriptor devicedesc = {};
181 struct AudioSampleAttributes attrs = {};
182 InitDevDesc(devicedesc);
183 devicedesc.desc = strdup("");
184 devicedesc.pins = PIN_OUT_HEADSET;
185 InitDirectAttrs(attrs);
186 attrs.streamId = 0;
187 int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_);
188 if (ret == HDF_ERR_NOT_SUPPORT)
189 {
190 GTEST_SKIP() << "direct is not supported!" << std::endl;
191 return;
192 }
193 EXPECT_TRUE(ret == HDF_SUCCESS);
194 ret = adapter_->DestroyRender(adapter_, renderId_);
195 EXPECT_TRUE(ret == HDF_SUCCESS);
196 }
197
198 /**
199 * @tc.number : SUB_Driver_Audio_Direct_0300
200 * @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid002
201 * @tc.desc : Verify supported the direct when sampleRate is 48K.
202 @tc.type: FUNC
203 */
204 HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid002, TestSize.Level1)
205 {
206 struct IAudioRender *render = nullptr;
207 struct AudioDeviceDescriptor devicedesc = {};
208 struct AudioSampleAttributes attrs = {};
209 InitDevDesc(devicedesc);
210 devicedesc.desc = strdup("");
211 devicedesc.pins = PIN_OUT_HEADSET;
212 InitDirectAttrs(attrs);
213 attrs.streamId = 0;
214 attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
215 int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_);
216 if (ret == HDF_ERR_NOT_SUPPORT)
217 {
218 GTEST_SKIP() << "direct is not supported!" << std::endl;
219 return;
220 }
221 EXPECT_TRUE(ret == HDF_SUCCESS);
222 ret = adapter_->DestroyRender(adapter_, renderId_);
223 EXPECT_TRUE(ret == HDF_SUCCESS);
224 }
225
226 /**
227 * @tc.number : SUB_Driver_Audio_Direct_0400
228 * @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid003
229 * @tc.desc : Verify supported the direct when sampleRate is 44.1K.
230 @tc.type: FUNC
231 */
232 HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid003, TestSize.Level1)
233 {
234 struct IAudioRender *render = nullptr;
235 struct AudioDeviceDescriptor devicedesc = {};
236 struct AudioSampleAttributes attrs = {};
237 InitDevDesc(devicedesc);
238 devicedesc.desc = strdup("");
239 devicedesc.pins = PIN_OUT_HEADSET;
240 InitDirectAttrs(attrs);
241 attrs.streamId = 0;
242 attrs.sampleRate = AUDIO_SAMPLE_RATE_44_1K;
243 int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_);
244 if (ret == HDF_ERR_NOT_SUPPORT)
245 {
246 GTEST_SKIP() << "direct is not supported!" << std::endl;
247 return;
248 }
249 EXPECT_TRUE(ret == HDF_SUCCESS);
250 ret = adapter_->DestroyRender(adapter_, renderId_);
251 EXPECT_TRUE(ret == HDF_SUCCESS);
252 }
253 }