From 951b99dd179c2a84b26f5df37096f75fdd80ab18 Mon Sep 17 00:00:00 2001 From: hwx1255622 Date: Sat, 15 Jun 2024 16:34:11 +0800 Subject: [PATCH] Signed-off-by: hwx1255622 Change-Id: If5fdc56e9bdf5946050c549bbcb8845cbe511d35 --- hdf/audio/idl/common/adapter/BUILD.gn | 5 +- .../adapter/src/audio_adapter_direct_test.cpp | 237 ++++++++++++++++++ .../src/AudioRenderCommonTest.cpp | 17 +- .../src/AudioRenderMmapTest.cpp | 7 +- 4 files changed, 252 insertions(+), 14 deletions(-) create mode 100644 hdf/audio/idl/common/adapter/src/audio_adapter_direct_test.cpp diff --git a/hdf/audio/idl/common/adapter/BUILD.gn b/hdf/audio/idl/common/adapter/BUILD.gn index 5de25cc3..419c4149 100644 --- a/hdf/audio/idl/common/adapter/BUILD.gn +++ b/hdf/audio/idl/common/adapter/BUILD.gn @@ -27,7 +27,10 @@ ohos_moduletest_suite("HatsHdfAudioIdlAdapterTest") { configs = [ ":audio_idl_adapter" ] if (drivers_peripheral_audio_feature_multichannel) { - sources += [ "src/audio_adapter_multchannel_test.cpp" ] + sources += [ + "src/audio_adapter_direct_test.cpp", + "src/audio_adapter_multchannel_test.cpp", + ] } deps = [ "//third_party/bounds_checking_function:libsec_shared" ] diff --git a/hdf/audio/idl/common/adapter/src/audio_adapter_direct_test.cpp b/hdf/audio/idl/common/adapter/src/audio_adapter_direct_test.cpp new file mode 100644 index 00000000..4f6f2b2c --- /dev/null +++ b/hdf/audio/idl/common/adapter/src/audio_adapter_direct_test.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "hdf_dlist.h" +#include "osal_mem.h" +#include "v3_0/audio_types.h" +#include "v3_0/iaudio_adapter.h" +#include "v3_0/iaudio_manager.h" + +using namespace std; +using namespace testing::ext; + +#define AUDIO_CHANNELCOUNT 2 +#define AUDIO_SAMPLE_RATE_192K 192000 +#define AUDIO_SAMPLE_RATE_48K 48000 +#define AUDIO_SAMPLE_RATE_44_1K 44100 +#define DEEP_BUFFER_RENDER_PERIOD_SIZE 4096 +#define AUDIO_CHANNELLAYOUT 3 +namespace { +static const uint32_t g_audioAdapterNumMax = 5; + +class HdfAudioAdapterDirectTest : public testing::Test { +public: + struct IAudioManager *manager_ = nullptr; + struct IAudioAdapter *adapter_ = nullptr; + struct AudioAdapterDescriptor *adapterDescs_ = nullptr; + uint32_t renderId_ = 0; + uint32_t captureId_ = 0; + virtual void SetUp(); + virtual void TearDown(); + void InitDirectAttrs(struct AudioSampleAttributes &attrs); + void InitDevDesc(struct AudioDeviceDescriptor &devDesc); + void AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf); + void ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen); +}; + +void HdfAudioAdapterDirectTest::AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf) +{ + if (dataBlock == nullptr) { + return; + } + + if (dataBlock->adapterName != nullptr) { + OsalMemFree(dataBlock->adapterName); + dataBlock->adapterName = nullptr; + } + + if (dataBlock->ports != nullptr) { + OsalMemFree(dataBlock->ports); + } + + if (freeSelf) { + OsalMemFree(dataBlock); + } +} + +void HdfAudioAdapterDirectTest::ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen) +{ + if ((descsLen > 0) && (descs != nullptr) && ((*descs) != nullptr)) { + for (uint32_t i = 0; i < descsLen; i++) { + AudioAdapterDescriptorFree(&(*descs)[i], false); + } + OsalMemFree(*descs); + *descs = nullptr; + } +} + +void HdfAudioAdapterDirectTest::InitDirectAttrs(struct AudioSampleAttributes &attrs) +{ + attrs.format = AUDIO_FORMAT_TYPE_PCM_32_BIT; + attrs.channelCount = AUDIO_CHANNELCOUNT; + attrs.channelLayout = AUDIO_CHANNELLAYOUT; + attrs.sampleRate = AUDIO_SAMPLE_RATE_192K; + attrs.interleaved = 1; + attrs.type = AUDIO_DIRECT; + attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE; + attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_32_BIT * AUDIO_CHANNELCOUNT; + attrs.isBigEndian = false; + attrs.isSignedData = true; + attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.frameSize); + attrs.stopThreshold = INT_MAX; + attrs.silenceThreshold = 0; +} + +void HdfAudioAdapterDirectTest::InitDevDesc(struct AudioDeviceDescriptor &devDesc) +{ + ASSERT_NE(adapterDescs_, nullptr); + ASSERT_NE(adapterDescs_->ports, nullptr); + for (uint32_t index = 0; index < adapterDescs_->portsLen; index++) { + if (adapterDescs_->ports[index].dir == PORT_OUT) { + devDesc.portId = adapterDescs_->ports[index].portId; + return; + } + } +} + +void HdfAudioAdapterDirectTest::SetUp() +{ + uint32_t size = g_audioAdapterNumMax; + manager_ = IAudioManagerGet(false); + ASSERT_NE(manager_, nullptr); + + adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc( + sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax)); + ASSERT_NE(adapterDescs_, nullptr); + + ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, adapterDescs_, &size)); + if (size > g_audioAdapterNumMax) { + ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ASSERT_LT(size, g_audioAdapterNumMax); + } + + if (manager_->LoadAdapter(manager_, &adapterDescs_[0], &adapter_) != HDF_SUCCESS) { + ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ASSERT_TRUE(false); + } + if (adapter_ == nullptr) { + ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ASSERT_TRUE(false); + } +} + +void HdfAudioAdapterDirectTest::TearDown() +{ + ASSERT_NE(manager_, nullptr); + ASSERT_NE(adapter_, nullptr); + + manager_->UnloadAdapter(manager_, adapterDescs_[0].adapterName); + ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + adapter_ = nullptr; + IAudioManagerRelease(manager_, false); + manager_ = nullptr; +} + +/** +* @tc.number : SUB_Driver_Audio_Direct_0100 +* @tc.name : HdfAudioAdapterDirectCreateRenderInvalid001 +* @tc.desc : Verify function when the input parameter is invalid. + @tc.type: FUNC +*/ +HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderInvalid001, TestSize.Level1) +{ + struct IAudioRender *render = nullptr; + struct AudioDeviceDescriptor devicedesc = {}; + struct AudioSampleAttributes attrs = {}; + + EXPECT_EQ(HDF_ERR_INVALID_OBJECT, adapter_->CreateRender(nullptr, &devicedesc, &attrs, &render, &renderId_)); + EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, nullptr, &attrs, &render, &renderId_)); + EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, nullptr, &render, &renderId_)); + EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, &attrs, nullptr, &renderId_)); + EXPECT_EQ(HDF_ERR_INVALID_PARAM, adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, nullptr)); + EXPECT_NE(HDF_SUCCESS, adapter_->DestroyRender(adapter_, renderId_)); +} + +/** +* @tc.number : SUB_Driver_Audio_Direct_0200 +* @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid001 +* @tc.desc : Verify supported the direct when sampleRate is 192K. + @tc.type: FUNC +*/ +HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid001, TestSize.Level1) +{ + struct IAudioRender *render = nullptr; + struct AudioDeviceDescriptor devicedesc = {}; + struct AudioSampleAttributes attrs = {}; + InitDevDesc(devicedesc); + devicedesc.desc = strdup(""); + devicedesc.pins = PIN_OUT_HEADSET; + InitDirectAttrs(attrs); + attrs.streamId = 0; + int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); + ret = adapter_->DestroyRender(adapter_, renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** +* @tc.number : SUB_Driver_Audio_Direct_0300 +* @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid002 +* @tc.desc : Verify supported the direct when sampleRate is 48K. + @tc.type: FUNC +*/ +HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid002, TestSize.Level1) +{ + struct IAudioRender *render = nullptr; + struct AudioDeviceDescriptor devicedesc = {}; + struct AudioSampleAttributes attrs = {}; + InitDevDesc(devicedesc); + devicedesc.desc = strdup(""); + devicedesc.pins = PIN_OUT_HEADSET; + InitDirectAttrs(attrs); + attrs.streamId = 0; + attrs.sampleRate = AUDIO_SAMPLE_RATE_48K; + int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); + ret = adapter_->DestroyRender(adapter_, renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** +* @tc.number : SUB_Driver_Audio_Direct_0400 +* @tc.name : HdfAudioAdapterDirectCreateRenderIsvalid003 +* @tc.desc : Verify supported the direct when sampleRate is 44.1K. + @tc.type: FUNC +*/ +HWTEST_F(HdfAudioAdapterDirectTest, HdfAudioAdapterDirectCreateRenderIsvalid003, TestSize.Level1) +{ + struct IAudioRender *render = nullptr; + struct AudioDeviceDescriptor devicedesc = {}; + struct AudioSampleAttributes attrs = {}; + InitDevDesc(devicedesc); + devicedesc.desc = strdup(""); + devicedesc.pins = PIN_OUT_HEADSET; + InitDirectAttrs(attrs); + attrs.streamId = 0; + attrs.sampleRate = AUDIO_SAMPLE_RATE_44_1K; + int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); + ret = adapter_->DestroyRender(adapter_, renderId_); + EXPECT_TRUE(ret == HDF_SUCCESS); +} +} \ No newline at end of file diff --git a/hdf/audio/idl/common/render_additional/src/AudioRenderCommonTest.cpp b/hdf/audio/idl/common/render_additional/src/AudioRenderCommonTest.cpp index 84da7dec..3d0cae11 100644 --- a/hdf/audio/idl/common/render_additional/src/AudioRenderCommonTest.cpp +++ b/hdf/audio/idl/common/render_additional/src/AudioRenderCommonTest.cpp @@ -26,7 +26,6 @@ using namespace testing::ext; namespace { const int BUFFER_LENTH = 1024 * 16; const int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4 * 1024; -const int MOVE_LEFT_NUM = 8; const int32_t AUDIO_RENDER_CHANNELCOUNT = 2; const int32_t AUDIO_SAMPLE_RATE_48K = 48000; const int32_t MAX_AUDIO_ADAPTER_DESC = 5; @@ -84,16 +83,16 @@ uint64_t AudioUtRenderTestAdditional::GetRenderBufferSize() void AudioUtRenderTestAdditional::InitRenderAttrs(struct AudioSampleAttributes &attrs) { - attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_16_BIT; + attrs.format = AUDIO_FORMAT_TYPE_PCM_16_BIT; attrs.channelCount = AUDIO_RENDER_CHANNELCOUNT; attrs.sampleRate = AUDIO_SAMPLE_RATE_48K; attrs.interleaved = 0; attrs.type = AUDIO_IN_MEDIA; attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE; - attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT / MOVE_LEFT_NUM; + attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT; attrs.isBigEndian = false; attrs.isSignedData = true; - attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount / MOVE_LEFT_NUM); + attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount); attrs.stopThreshold = INT_MAX; attrs.silenceThreshold = BUFFER_LENTH; } @@ -187,8 +186,8 @@ HWTEST_F(AudioUtRenderTestAdditional, testCommonRenderGetLatency001, Function | int i, ret = 0; for (i = 0; i < 1000; i++) { ret |= render_->GetLatency(render_, &ms); + EXPECT_EQ(HDF_SUCCESS, ret); } - EXPECT_EQ(HDF_SUCCESS, ret); } /** @@ -231,8 +230,8 @@ HWTEST_F(AudioUtRenderTestAdditional, testCommonRenderRenderFrame002, Function | EXPECT_NE(nullptr, frame); for (i = 0; i < 1000; i++) { ret |= render_->RenderFrame(render_, frame, frameLen, &requestBytes); + EXPECT_EQ(ret, HDF_SUCCESS); } - EXPECT_EQ(ret, HDF_SUCCESS); EXPECT_EQ(HDF_SUCCESS, render_->Stop(render_)); } @@ -444,8 +443,8 @@ HWTEST_F(AudioUtRenderTestAdditional, testCommonRenderDrainBufferk001, Function int32_t ret = 0; for (i = 0; i < 1000; i++) { ret |= render_->DrainBuffer(render_, &type); + EXPECT_EQ(HDF_ERR_NOT_SUPPORT, ret); } - EXPECT_EQ(HDF_ERR_NOT_SUPPORT, ret); } /** @@ -516,8 +515,8 @@ HWTEST_F(AudioUtRenderTestAdditional, testCommonRenderCheckSceneCapability001, F scene.desc = devDescRender_; for (i = 0; i < 1000; i++) { ret |= render_->CheckSceneCapability(render_, &scene, &supported); + EXPECT_EQ(HDF_SUCCESS, ret); } - EXPECT_EQ(HDF_SUCCESS, ret); } /** @@ -629,8 +628,8 @@ HWTEST_F(AudioUtRenderTestAdditional, testCommonRenderSelectScene001, Function | scene.desc.desc = strdup("mic"); for (i = 0; i < 1000; i++) { ret |= render_->SelectScene(render_, &scene); + EXPECT_EQ(HDF_SUCCESS, ret); } - EXPECT_EQ(HDF_SUCCESS, ret); free(scene.desc.desc); } diff --git a/hdf/audio/idl/common/render_additional/src/AudioRenderMmapTest.cpp b/hdf/audio/idl/common/render_additional/src/AudioRenderMmapTest.cpp index 31f49d94..90192cd2 100644 --- a/hdf/audio/idl/common/render_additional/src/AudioRenderMmapTest.cpp +++ b/hdf/audio/idl/common/render_additional/src/AudioRenderMmapTest.cpp @@ -26,7 +26,6 @@ using namespace testing::ext; namespace { const int BUFFER_LENTH = 1024 * 16; const int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4 * 1024; -const int MOVE_LEFT_NUM = 8; const int32_t AUDIO_RENDER_CHANNELCOUNT = 2; const int32_t AUDIO_SAMPLE_RATE_48K = 48000; const int32_t MAX_AUDIO_ADAPTER_DESC = 5; @@ -52,15 +51,16 @@ public: void AudioUtRenderMmapTestAdditional::InitRenderAttrs(struct AudioSampleAttributes &attrs) { + attrs.format = AUDIO_FORMAT_TYPE_PCM_16_BIT; attrs.channelCount = AUDIO_RENDER_CHANNELCOUNT; attrs.sampleRate = AUDIO_SAMPLE_RATE_48K; attrs.interleaved = 0; attrs.type = AUDIO_MMAP_NOIRQ; attrs.period = DEEP_BUFFER_RENDER_PERIOD_SIZE; - attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT / MOVE_LEFT_NUM; + attrs.frameSize = AUDIO_FORMAT_TYPE_PCM_16_BIT * AUDIO_RENDER_CHANNELCOUNT; attrs.isBigEndian = false; attrs.isSignedData = true; - attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount / MOVE_LEFT_NUM); + attrs.startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs.format * attrs.channelCount); attrs.stopThreshold = INT_MAX; attrs.silenceThreshold = BUFFER_LENTH; } @@ -121,7 +121,6 @@ void AudioUtRenderMmapTestAdditional::SetUp() InitRenderDevDesc(devDescRender_); InitRenderAttrs(attrsRender_); - attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_16_BIT; int32_t ret = adapter_->CreateRender(adapter_, &devDescRender_, &attrsRender_, &render_, &renderId_); if (ret != HDF_SUCCESS) { attrsRender_.format = AUDIO_FORMAT_TYPE_PCM_32_BIT;