diff --git a/frameworks/native/audioadapter/test/unittest/BUILD.gn b/frameworks/native/audioadapter/test/unittest/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..4c7a03b7a3c782bd73eed8060c96953ad032cc7e --- /dev/null +++ b/frameworks/native/audioadapter/test/unittest/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2025 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. + +import("//build/ohos.gni") +import("//build/test.gni") +import("../../../../config.gni") + +module_output_path = "multimedia_audio_framework/audio_engine" + +config("audio_engine_private_config") { + visibility = [ ":*" ] + + include_dirs = [ + "./include", + "../../include", + "../../../audioutils/include", + "../../../hdiadapter_new/include", + "../../../../../interfaces/inner_api/native/audiocommon/include", + "../../../../../services/audio_engine/manager/include", + "../../../../../services/audio_policy/server/include/service/common", + "../../../../../services/audio_service/common/include", + "../../../../../services/audio_service/server/include", + ] +} + +ohos_unittest("pro_audio_service_adapter_unit_test") { + module_out_path = module_out_path + testonly = true + cflags = [ + "-Wall", + "-Werror", + "-fno-access-control", + ] + sources = [ + "src/pro_audio_service_adapter_unit_test.cpp", + ] + + configs = [ ":audio_engine_private_config" ] + + deps = [ + "../../:pulse_audio_service_adapter", + "../../../audioutils:audio_utils", + "../../../hdiadapter_new:hdiadapter_new", + "../../../../../services/audio_engine:audio_engine_manager", + ] + + external_deps = [ + "c_utils:utils", + "googletest:gtest", + "hilog:libhilog", + "hisysevent:libhisysevent", + "ipc:ipc_single", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] +} \ No newline at end of file diff --git a/frameworks/native/audioadapter/test/unittest/include/pro_audio_service_adapter_unit_test.h b/frameworks/native/audioadapter/test/unittest/include/pro_audio_service_adapter_unit_test.h new file mode 100644 index 0000000000000000000000000000000000000000..6175894f132db7fa684f361a85ab560983b0a148 --- /dev/null +++ b/frameworks/native/audioadapter/test/unittest/include/pro_audio_service_adapter_unit_test.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025 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. + */ +#ifndef PRO_AUDIO_SERVICE_ADAPTER_UNIT_TEST_H +#define PRO_AUDIO_SERVICE_ADAPTER_UNIT_TEST_H +#include +#include "gtest/gtest.h" +#include "pro_audio_service_adapter_impl.h" +#include "audio_service_adapter.h" +namespace OHOS { +namespace AudioStandard { +class ProAudioServiceCallbackTest : public AudioServiceAdapterCallback { +public: + ProAudioServiceCallbackTest() {} + ~ProAudioServiceCallbackTest() + { + AUDIO_WARNING_LOG("Destructor ProAudioServiceCallbackTest"); + } + void OnAudioStreamRemoved(const uint64_t sessionId) + {} + void OnSetVolumeDbCb() + {} +}; + +class ProAudioServiceAdapterUnitTest : public testing::Test { +public: + ProAudioServiceAdapterUnitTest(); + ~ProAudioServiceAdapterUnitTest(); + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(void); + void TearDown(void); + AudioModuleInfo InitSinkAudioModeInfo(); + AudioModuleInfo InitSourceAudioModeInfo(); +private: + void Init(); +protected: + std::shared_ptr impl_; + int32_t engineFlag_; +}; +} // namespace AudioStandard +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp b/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8bdc14cd81533b98b691e6c4e0e5e550cca2e266 --- /dev/null +++ b/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2025 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 "gtest/gtest.h" +#include "audio_errors.h" +#include "audio_utils.h" +#include "i_hpae_manager.h" +#include "manager/hdi_adapter_manager.h" +#include "util/id_handler.h" +#include "pro_audio_service_adapter_unit_test.h" +using namespace testing::ext; +namespace OHOS { +namespace AudioStandard { +static std::string g_rootPath = "/data/"; + +void ProAudioServiceAdapterUnitTest::SetUpTestCase(void) +{} +void ProAudioServiceAdapterUnitTest::TearDownTestCase(void) +{} +void ProAudioServiceAdapterUnitTest::SetUp(void) +{ + IdHandler::GetInstance(); + HdiAdapterManager::GetInstance(); + std::unique_ptr cb = std::make_unique(); + impl_ = AudioServiceAdapter::CreateAudioAdapter(std::move(cb)); + impl_->Connect(); + HPAE::IHpaeManager::GetHpaeManager().Init(); +} + +void ProAudioServiceAdapterUnitTest::TearDown(void) +{ + impl_ = nullptr; + if (engineFlag_ != 1) { + const char *key = "const.multimedia.audio.proaudioEnable"; + SetSysPara(key, engineFlag_); + } +} + +ProAudioServiceAdapterUnitTest::ProAudioServiceAdapterUnitTest() +{ + engineFlag_ = GetEngineFlag(); + std::cout<<"engine flag:"<(DEVICE_TYPE_SPEAKER); + audioModuleInfo.deviceType = typeValue.str(); + return audioModuleInfo; +} + +AudioModuleInfo ProAudioServiceAdapterUnitTest::InitSourceAudioModeInfo() +{ + AudioModuleInfo audioModuleInfo; + audioModuleInfo.lib = "libmodule-hdi-source.z.so"; + audioModuleInfo.channels = "2"; + audioModuleInfo.rate = "48000"; + audioModuleInfo.name = "mic"; + audioModuleInfo.adapterName = "file_io"; + audioModuleInfo.className = "file_io"; + audioModuleInfo.bufferSize = "3840"; + audioModuleInfo.format = "s16le"; + audioModuleInfo.fixedLatency = "1"; + audioModuleInfo.offloadEnable = "0"; + audioModuleInfo.networkId = "LocalDevice"; + audioModuleInfo.fileName = g_rootPath + audioModuleInfo.adapterName + "_" + audioModuleInfo.rate + "_" + + audioModuleInfo.channels + "_" + audioModuleInfo.format + ".pcm"; + std::stringstream typeValue; + typeValue << static_cast(DEVICE_TYPE_SPEAKER); + audioModuleInfo.deviceType = typeValue.str(); + return audioModuleInfo; +} + +/** + * @tc.name: Pro_Audio_OpenAudioPort_001 + * @tc.desc: test open audio port sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_OpenAudioPort_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); +} + +/** + * @tc.name: Pro_Audio_OpenAudioPort_002 + * @tc.desc: test open audio port source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_OpenAudioPort_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); +} + +/** + * @tc.name: Pro_Audio_CloseAudioPort_001 + * @tc.desc: test close audio port + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_CloseAudioPort_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->CloseAudioPort(portId); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_CloseAudioPort_002 + * @tc.desc: test close audio port source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_CloseAudioPort_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->CloseAudioPort(portId); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetDefaultSink_001 + * @tc.desc: test set default sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetDefaultSink_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetDefaultSink(moduleInfo.name); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetDefaultSource_001 + * @tc.desc: test set default source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetDefaultSource_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetDefaultSource(moduleInfo.name); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetSinkMute_001 + * @tc.desc: test set sink mute + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetSinkMute_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetSinkMute(moduleInfo.name, true); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetSinkMute_002 + * @tc.desc: test set sink unmute + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetSinkMute_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetSinkMute(moduleInfo.name, false); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetSourceMute_001 + * @tc.desc: test set source mute + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetSourceMute_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetSourceOutputMute(portId, true); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SetSourceMute_002 + * @tc.desc: test set source unmute + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SetSourceMute_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SetSourceOutputMute(portId, false); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SuspendedSink_001 + * @tc.desc: test suspended sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SuspendedSink_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SuspendAudioDevice(moduleInfo.name, true); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SuspendedSink_002 + * @tc.desc: test suspended sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SuspendedSink_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SuspendAudioDevice(moduleInfo.name, false); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SuspendedSource_001 + * @tc.desc: test suspended source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SuspendedSource_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SuspendAudioDevice(moduleInfo.name, true); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_SuspendedSource_002 + * @tc.desc: test suspended source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_SuspendedSource_002, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + int32_t ret = impl_->SuspendAudioDevice(moduleInfo.name, false); + EXPECT_EQ(SUCCESS, ret); +} + +/** + * @tc.name: Pro_Audio_GetAllSinks_001 + * @tc.desc: test get all sinks + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_GetAllSinks_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + std::vector sinkInputs = impl_->GetAllSinkInputs(); + EXPECT_EQ(0, sinkInputs.size()); +} + +/** + * @tc.name: Pro_Audio_GetAllSources_001 + * @tc.desc: test get all sources + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_GetAllSources_001, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_GE(0, portId); + std::vector sourceOutputs = impl_->GetAllSourceOutputs(); + EXPECT_EQ(0, sourceOutputs.size()); +} +} // namespace AudioStandard +} // namespace OHOS diff --git a/services/audio_engine/node/src/hpae_source_output_node.cpp b/services/audio_engine/node/src/hpae_source_output_node.cpp index a39d2c1fcb6777ca405735d479b434db5bd44e4e..5e16f3147a48ef5a08b57bd42651c04731d9e8c2 100644 --- a/services/audio_engine/node/src/hpae_source_output_node.cpp +++ b/services/audio_engine/node/src/hpae_source_output_node.cpp @@ -48,10 +48,6 @@ void HpaeSourceOutputNode::DoProcess() auto format = "bit[" + std::to_string(GetBitWidth()) + "]"; Trace trace("[" + std::to_string(GetSessionId()) + "]HpaeSourceOutputNode::DoProcess " + rate + ch + len + format); - if (readCallback_.lock() == nullptr) { - AUDIO_WARNING_LOG("HpaeSourceOutputNode readCallback_ is nullptr, sessionId:%{public}d", GetSessionId()); - return; - } std::vector &outputVec = inputStream_.ReadPreOutputData(); if (outputVec.empty()) { return; @@ -75,9 +71,14 @@ void HpaeSourceOutputNode::DoProcess() .outputData = (int8_t *)sourceOutputData_.data(), .requestDataLen = sourceOutputData_.size(), }; - int32_t ret = readCallback_.lock()->OnStreamData(streamInfo_); - if (ret != 0) { - AUDIO_WARNING_LOG("sessionId %{public}u, readCallback_ write read data error", GetSessionId()); + if (readCallback_.lock()) { + int32_t ret = readCallback_.lock()->OnStreamData(streamInfo_); + if (ret != 0) { + AUDIO_WARNING_LOG("sessionId %{public}u, readCallback_ write read data error", GetSessionId()); + } + } else { + AUDIO_WARNING_LOG("sessionId %{public}u, readCallback_ is nullptr", GetSessionId()); + return; } totalFrames_ += GetFrameLen(); framesRead_.store(totalFrames_);