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 <gtest/gtest.h>
17 #include "osal_mem.h"
18
19 #include "v4_0/audio_types.h"
20 #include "v4_0/iaudio_manager.h"
21 #include "v4_0/iaudio_render.h"
22
23 using namespace std;
24 using namespace testing::ext;
25
26 namespace {
27 const int BUFFER_LENTH = 1024 * 16;
28 const int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4 * 1024;
29 const int32_t AUDIO_RENDER_CHANNELCOUNT = 6;
30 const int32_t AUDIO_SAMPLE_RATE_48K = 48000;
31 const int32_t MAX_AUDIO_ADAPTER_DESC = 5;
32
33 class AudioUtRenderMultchannelTest : public testing::Test {
34 public:
35 struct IAudioManager *manager_ = nullptr;
36 struct AudioAdapterDescriptor descs_[MAX_AUDIO_ADAPTER_DESC];
37 struct AudioAdapterDescriptor *desc_;
38 struct IAudioAdapter *adapter_ = nullptr;
39 struct IAudioRender *render_ = nullptr;
40 struct AudioDeviceDescriptor devDescRender_ = {};
41 struct AudioSampleAttributes attrsRender_ = {};
42 uint32_t renderId_ = 0;
43 char *devDescriptorName_ = nullptr;
44 uint32_t size_ = MAX_AUDIO_ADAPTER_DESC;
45 virtual void SetUp();
46 virtual void TearDown();
47 void InitRenderAttrs(struct AudioSampleAttributes &attrs);
48 void InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc);
49 void FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf);
50 void ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen);
51 };
52
InitRenderAttrs(struct AudioSampleAttributes & attrs)53 void AudioUtRenderMultchannelTest::InitRenderAttrs(struct AudioSampleAttributes &attrs)
54 {
55 attrs.format = AUDIO_FORMAT_TYPE_PCM_16_BIT;
56 attrs.channelCount = AUDIO_RENDER_CHANNELCOUNT;
57 attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
58 attrs.interleaved = 0;
59 attrs.type = AUDIO_MULTI_CHANNEL;
60 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
61 attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT;
62 attrs.isBigEndian = false;
63 attrs.isSignedData = true;
64 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount);
65 attrs.stopThreshold = INT_MAX;
66 attrs.silenceThreshold = BUFFER_LENTH;
67 }
68
InitRenderDevDesc(struct AudioDeviceDescriptor & devDesc)69 void AudioUtRenderMultchannelTest::InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc)
70 {
71 devDesc.pins = PIN_OUT_SPEAKER;
72 devDescriptorName_ = strdup("cardname");
73 devDesc.desc = devDescriptorName_;
74
75 ASSERT_NE(desc_, nullptr);
76 ASSERT_NE(desc_->ports, nullptr);
77 for (uint32_t index = 0; index < desc_->portsLen; index++) {
78 if (desc_->ports[index].dir == PORT_OUT) {
79 devDesc.portId = desc_->ports[index].portId;
80 return;
81 }
82 }
83 free(devDesc.desc);
84 }
85
FreeAdapterElements(struct AudioAdapterDescriptor * dataBlock,bool freeSelf)86 void AudioUtRenderMultchannelTest::FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf)
87 {
88 if (dataBlock == nullptr) {
89 return;
90 }
91
92 OsalMemFree(dataBlock->adapterName);
93
94 OsalMemFree(dataBlock->ports);
95
96 if (freeSelf) {
97 OsalMemFree(dataBlock);
98 }
99 }
100
ReleaseAllAdapterDescs(struct AudioAdapterDescriptor * descs,uint32_t descsLen)101 void AudioUtRenderMultchannelTest::ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen)
102 {
103 if (descs == nullptr || descsLen == 0) {
104 return;
105 }
106
107 for (uint32_t i = 0; i < descsLen; i++) {
108 FreeAdapterElements(&descs[i], false);
109 }
110 }
111
SetUp()112 void AudioUtRenderMultchannelTest::SetUp()
113 {
114 manager_ = IAudioManagerGet(false);
115 ASSERT_NE(manager_, nullptr);
116
117 ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, descs_, &size_));
118 ASSERT_NE(descs_, nullptr);
119 EXPECT_GE(MAX_AUDIO_ADAPTER_DESC, size_);
120 desc_ = &descs_[0];
121 ASSERT_EQ(HDF_SUCCESS, manager_->LoadAdapter(manager_, desc_, &adapter_));
122 ASSERT_NE(adapter_, nullptr);
123 InitRenderDevDesc(devDescRender_);
124 attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_16_BIT;
125 InitRenderAttrs(attrsRender_);
126
127 int32_t ret = adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_);
128 if (ret != HDF_SUCCESS) {
129 attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
130 ASSERT_EQ(HDF_SUCCESS, adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_));
131 }
132 ASSERT_NE(render_, nullptr);
133 }
134
TearDown()135 void AudioUtRenderMultchannelTest::TearDown()
136 {
137 ASSERT_NE(devDescriptorName_, nullptr);
138 free(devDescriptorName_);
139 devDescriptorName_ = nullptr;
140
141 if (adapter_ != nullptr) {
142 adapter_->DestroyRender(adapter_, renderId_);
143 render_ = nullptr;
144 }
145 if (manager_ != nullptr) {
146 manager_->UnloadAdapter(manager_, desc_->adapterName);
147 adapter_ = nullptr;
148 ReleaseAllAdapterDescs(descs_, size_);
149
150 IAudioManagerRelease(manager_, false);
151 }
152 }
153
154 } // end of namespace