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 }