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