1 /*
2 * Copyright (c) 2023 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_MULTCHANNEL_CHANNELCOUNT 6
29 #define AUDIO_SAMPLE_RATE_48K 48000
30 #define DEEP_BUFFER_RENDER_PERIOD_SIZE 4096
31 #define AUDIO_MULTCHANNEL_CHANNELLAYOUT 1551
32 #define MULTICHANNEL_OUTPUT_STREAM_ID 61
33 namespace {
34 static const uint32_t g_audioAdapterNumMax = 5;
35
36 class HdfAudioUtAdapterMultiTest : public testing::Test {
37 public:
38 struct IAudioManager *manager_ = nullptr;
39 struct IAudioAdapter *adapter_ = nullptr;
40 struct AudioAdapterDescriptor *adapterDescs_ = nullptr;
41 uint32_t renderId_ = 0;
42 uint32_t captureId_ = 0;
43 virtual void SetUp();
44 virtual void TearDown();
45 void InitMultchannelAttrs(struct AudioSampleAttributes &attrs);
46 void InitDevDesc(struct AudioDeviceDescriptor &devDesc);
47 void AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf);
48 void ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen);
49 };
50
AudioAdapterDescriptorFree(struct AudioAdapterDescriptor * dataBlock,bool freeSelf)51 void HdfAudioUtAdapterMultiTest::AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf)
52 {
53 if (dataBlock == nullptr) {
54 return;
55 }
56
57 if (dataBlock->adapterName != nullptr) {
58 OsalMemFree(dataBlock->adapterName);
59 dataBlock->adapterName = nullptr;
60 }
61
62 if (dataBlock->ports != nullptr) {
63 OsalMemFree(dataBlock->ports);
64 }
65
66 if (freeSelf) {
67 OsalMemFree(dataBlock);
68 }
69 }
70
ReleaseAdapterDescs(struct AudioAdapterDescriptor ** descs,uint32_t descsLen)71 void HdfAudioUtAdapterMultiTest::ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen)
72 {
73 if ((descsLen > 0) && (descs != nullptr) && ((*descs) != nullptr)) {
74 for (uint32_t i = 0; i < descsLen; i++) {
75 AudioAdapterDescriptorFree(&(*descs)[i], false);
76 }
77 OsalMemFree(*descs);
78 *descs = nullptr;
79 }
80 }
81
InitMultchannelAttrs(struct AudioSampleAttributes & attrs)82 void HdfAudioUtAdapterMultiTest::InitMultchannelAttrs(struct AudioSampleAttributes &attrs)
83 {
84 attrs.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
85 attrs.channelCount = AUDIO_MULTCHANNEL_CHANNELCOUNT;
86 attrs.channelLayout = AUDIO_MULTCHANNEL_CHANNELLAYOUT;
87 attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
88 attrs.interleaved = 1;
89 attrs.type = AUDIO_MULTI_CHANNEL;
90 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
91 attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_32_BIT * AUDIO_MULTCHANNEL_CHANNELCOUNT;
92 attrs.isBigEndian = false;
93 attrs.isSignedData = true;
94 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.frameSize);
95 attrs.stopThreshold = INT_MAX;
96 attrs.silenceThreshold = 0;
97 }
98
InitDevDesc(struct AudioDeviceDescriptor & devDesc)99 void HdfAudioUtAdapterMultiTest::InitDevDesc(struct AudioDeviceDescriptor &devDesc)
100 {
101 ASSERT_NE(adapterDescs_, nullptr);
102 ASSERT_NE(adapterDescs_->ports, nullptr);
103 for (uint32_t index = 0; index < adapterDescs_->portsLen; index++) {
104 if (adapterDescs_->ports[index].dir == PORT_OUT) {
105 devDesc.portId = adapterDescs_->ports[index].portId;
106 return;
107 }
108 }
109 }
110
SetUp()111 void HdfAudioUtAdapterMultiTest::SetUp()
112 {
113 uint32_t size = g_audioAdapterNumMax;
114 manager_ = IAudioManagerGet(false);
115 ASSERT_NE(manager_, nullptr);
116
117 adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc(
118 sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax));
119 ASSERT_NE(adapterDescs_, nullptr);
120
121 ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, adapterDescs_, &size));
122 if (size > g_audioAdapterNumMax) {
123 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
124 ASSERT_LT(size, g_audioAdapterNumMax);
125 }
126
127 if (manager_->LoadAdapter(manager_, &adapterDescs_[0], &adapter_) != HDF_SUCCESS) {
128 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
129 ASSERT_TRUE(false);
130 }
131 if (adapter_ == nullptr) {
132 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
133 ASSERT_TRUE(false);
134 }
135 }
136
TearDown()137 void HdfAudioUtAdapterMultiTest::TearDown()
138 {
139 ASSERT_NE(manager_, nullptr);
140 ASSERT_NE(adapter_, nullptr);
141
142 manager_->UnloadAdapter(manager_, adapterDescs_[0].adapterName);
143 ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax);
144 adapter_ = nullptr;
145 IAudioManagerRelease(manager_, false);
146 manager_ = nullptr;
147 }
148
149 HWTEST_F(HdfAudioUtAdapterMultiTest, HdfAudioAdapterMultchannelCreateRenderIsvalid001, TestSize.Level1)
150 {
151 struct IAudioRender *render = nullptr;
152 struct AudioDeviceDescriptor devicedesc = {};
153 struct AudioSampleAttributes attrs = {};
154 InitDevDesc(devicedesc);
155 devicedesc.desc = strdup("");
156 devicedesc.pins = PIN_OUT_SPEAKER;
157 InitMultchannelAttrs(attrs);
158 attrs.streamId = MULTICHANNEL_OUTPUT_STREAM_ID;
159 int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_);
160 EXPECT_TRUE(ret == HDF_SUCCESS || ret == HDF_FAILURE);
161 ret = adapter_->DestroyRender(adapter_, renderId_);
162 EXPECT_TRUE(ret == HDF_SUCCESS || ret == HDF_FAILURE || ret == HDF_ERR_INVALID_PARAM);
163 }
164
165 }