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