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