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