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 = 2;
30 const int32_t AUDIO_SAMPLE_RATE_48K = 48000;
31 const int32_t MAX_AUDIO_ADAPTER_DESC = 5;
32 const int32_t AUDIO_OFFLOAD_BUFFER_SIZE = 100;
33 const int32_t AUDIO_BIT_RATE = AUDIO_SAMPLE_RATE_48K * 8;
34 const int32_t AUDIO_BIT_WIDTH = 32;
35
36 class AudioUtRenderOffloadTest : public testing::Test {
37 public:
38 struct IAudioManager *manager_ = nullptr;
39 struct AudioAdapterDescriptor descs_[MAX_AUDIO_ADAPTER_DESC];
40 struct AudioAdapterDescriptor *desc_;
41 struct IAudioAdapter *adapter_ = nullptr;
42 struct IAudioRender *render_ = nullptr;
43 struct AudioDeviceDescriptor devDescRender_ = {};
44 struct AudioSampleAttributes attrsRender_ = {};
45 uint32_t renderId_ = 0;
46 char *devDescriptorName_ = nullptr;
47 uint32_t size_ = MAX_AUDIO_ADAPTER_DESC;
48 virtual void SetUp();
49 virtual void TearDown();
50 void InitRenderAttrs(struct AudioSampleAttributes &attrs);
51 void InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc);
52 void FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf);
53 void ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen);
54 };
55
InitRenderAttrs(struct AudioSampleAttributes & attrs)56 void AudioUtRenderOffloadTest::InitRenderAttrs(struct AudioSampleAttributes &attrs)
57 {
58 attrs.channelCount = AUDIO_RENDER_CHANNELCOUNT;
59 attrs.sampleRate = AUDIO_SAMPLE_RATE_48K;
60 attrs.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
61 attrs.interleaved = 0;
62 attrs.type = AUDIO_OFFLOAD;
63 attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE;
64 attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT;
65 attrs.isBigEndian = false;
66 attrs.isSignedData = true;
67 attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount);
68 attrs.stopThreshold = INT_MAX;
69 attrs.silenceThreshold = BUFFER_LENTH;
70 attrs.offloadInfo.bitRate = AUDIO_BIT_RATE;
71 attrs.offloadInfo.bitWidth = AUDIO_BIT_WIDTH;
72 attrs.offloadInfo.sampleRate = AUDIO_SAMPLE_RATE_48K;
73 attrs.offloadInfo.channelCount = AUDIO_RENDER_CHANNELCOUNT;
74 attrs.offloadInfo.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;
75 }
76
InitRenderDevDesc(struct AudioDeviceDescriptor & devDesc)77 void AudioUtRenderOffloadTest::InitRenderDevDesc(struct AudioDeviceDescriptor &devDesc)
78 {
79 devDesc.pins = PIN_OUT_SPEAKER;
80 devDescriptorName_ = strdup("cardname");
81 devDesc.desc = devDescriptorName_;
82
83 ASSERT_NE(desc_, nullptr);
84 ASSERT_NE(desc_->ports, nullptr);
85 for (uint32_t index = 0; index < desc_->portsLen; index++) {
86 if (desc_->ports[index].dir == PORT_OUT) {
87 devDesc.portId = desc_->ports[index].portId;
88 return;
89 }
90 }
91 free(devDesc.desc);
92 }
93
FreeAdapterElements(struct AudioAdapterDescriptor * dataBlock,bool freeSelf)94 void AudioUtRenderOffloadTest::FreeAdapterElements(struct AudioAdapterDescriptor *dataBlock, bool freeSelf)
95 {
96 if (dataBlock == nullptr) {
97 return;
98 }
99
100 OsalMemFree(dataBlock->adapterName);
101
102 OsalMemFree(dataBlock->ports);
103
104 if (freeSelf) {
105 OsalMemFree(dataBlock);
106 }
107 }
108
ReleaseAllAdapterDescs(struct AudioAdapterDescriptor * descs,uint32_t descsLen)109 void AudioUtRenderOffloadTest::ReleaseAllAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen)
110 {
111 if (descs == nullptr || descsLen == 0) {
112 return;
113 }
114
115 for (uint32_t i = 0; i < descsLen; i++) {
116 FreeAdapterElements(&descs[i], false);
117 }
118 }
119
SetUp()120 void AudioUtRenderOffloadTest::SetUp()
121 {
122 manager_ = IAudioManagerGet(false);
123 ASSERT_NE(manager_, nullptr);
124
125 ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, descs_, &size_));
126 ASSERT_NE(descs_, nullptr);
127 EXPECT_GE(MAX_AUDIO_ADAPTER_DESC, size_);
128 desc_ = &descs_[0];
129 ASSERT_EQ(HDF_SUCCESS, manager_->LoadAdapter(manager_, desc_, &adapter_));
130 ASSERT_NE(adapter_, nullptr);
131 InitRenderDevDesc(devDescRender_);
132 InitRenderAttrs(attrsRender_);
133 (void)adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_);
134 ASSERT_NE(render_, nullptr);
135 }
136
TearDown()137 void AudioUtRenderOffloadTest::TearDown()
138 {
139 ASSERT_NE(devDescriptorName_, nullptr);
140 free(devDescriptorName_);
141
142 if (adapter_ != nullptr) {
143 adapter_->DestroyRender(adapter_, renderId_);
144 render_ = nullptr;
145 }
146 if (manager_ != nullptr) {
147 manager_->UnloadAdapter(manager_, desc_->adapterName);
148 adapter_ = nullptr;
149 ReleaseAllAdapterDescs(descs_, size_);
150
151 IAudioManagerRelease(manager_, false);
152 }
153 }
154
155 HWTEST_F(AudioUtRenderOffloadTest, RenderSetBufferSizeIsInValid001, TestSize.Level1)
156 {
157 uint32_t size = AUDIO_OFFLOAD_BUFFER_SIZE;
158 int32_t ret = render_->SetBufferSize(nullptr, size);
159 ASSERT_TRUE(ret == HDF_ERR_INVALID_OBJECT);
160 }
161
162 HWTEST_F(AudioUtRenderOffloadTest, RenderSetBufferSizeIsValid001, TestSize.Level1)
163 {
164 uint32_t size = AUDIO_OFFLOAD_BUFFER_SIZE;
165 int32_t ret = render_->SetBufferSize(render_, size);
166 ASSERT_TRUE(ret == HDF_SUCCESS);
167 }
168
169 } // end of namespace