已合并
故障编码-编创 #15564
已合并
Cemelia创建于 6月4日
14 个文件变更+1873-250
@@ -629,7 +629,7 @@ int32_t OHAudioSuiteEngine::CreatePipeline(
629 PipelineWorkMode workMode = static_cast<PipelineWorkMode>(ohWorkMode);629 PipelineWorkMode workMode = static_cast<PipelineWorkMode>(ohWorkMode);
630 int32_t ret = IAudioSuiteManager::GetAudioSuiteManager().CreatePipeline(pipelineId, workMode);630 int32_t ret = IAudioSuiteManager::GetAudioSuiteManager().CreatePipeline(pipelineId, workMode);
631 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CreatePipeline failed, ret = %{public}d.", ret);631 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CreatePipeline failed, ret = %{public}d.", ret);
632- CHECK_AND_RETURN_RET_LOG(pipelineId != INVALID_PIPELINE_ID, ret, "CreatePipeline failed, pipelineId invailed");632+ CHECK_AND_RETURN_RET_LOG(pipelineId != INVALID_PIPELINE_ID, ret, "CreatePipeline failed, pipelineId invaild");
633 633 
634 OHAudioSuitePipeline *audioPipeline = new OHAudioSuitePipeline(pipelineId);634 OHAudioSuitePipeline *audioPipeline = new OHAudioSuitePipeline(pipelineId);
635 CHECK_AND_RETURN_RET_LOG(audioPipeline != nullptr, ERR_MEMORY_ALLOC_FAILED,635 CHECK_AND_RETURN_RET_LOG(audioPipeline != nullptr, ERR_MEMORY_ALLOC_FAILED,
@@ -643,8 +643,11 @@ int32_t OHAudioSuiteEngine::DestroyPipeline(OHAudioSuitePipeline *audioPipeline)
643{643{
644 CHECK_AND_RETURN_RET_LOG(audioPipeline != nullptr, ERR_INVALID_PARAM,644 CHECK_AND_RETURN_RET_LOG(audioPipeline != nullptr, ERR_INVALID_PARAM,
645 "DestroyPipeline failed, audioPipeline is nullptr.");645 "DestroyPipeline failed, audioPipeline is nullptr.");
646- CHECK_AND_RETURN_RET_LOG(IsPipelineExists(audioPipeline), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,646+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(IsPipelineExists(audioPipeline), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,
647- "OHAudioSuiteEngine::The pipeline does not exist.");647+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
648+ static_cast<int32_t>(getuid()), ERR_DESTROY_PIPELINE_NOT_FOUND,
649+ "OHAudioSuiteEngine::The pipeline does not exist.", true),
650+ "OHAudioSuiteEngine::The pipeline does not exist.");
648 uint32_t pipelineId = audioPipeline->GetPipelineId();651 uint32_t pipelineId = audioPipeline->GetPipelineId();
649 int32_t ret = IAudioSuiteManager::GetAudioSuiteManager().DestroyPipeline(pipelineId);652 int32_t ret = IAudioSuiteManager::GetAudioSuiteManager().DestroyPipeline(pipelineId);
650 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "DestroyPipeline failed, ret = %{public}d.", ret);653 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "DestroyPipeline failed, ret = %{public}d.", ret);
@@ -867,8 +870,11 @@ int32_t OHAudioSuiteEngine::SetAudioFormat(OHAudioNode *node, OH_AudioFormat *au
867int32_t OHAudioSuiteEngine::ConnectNodes(OHAudioNode *srcNode, OHAudioNode *destNode)870int32_t OHAudioSuiteEngine::ConnectNodes(OHAudioNode *srcNode, OHAudioNode *destNode)
868{871{
869 CHECK_AND_RETURN_RET_LOG(srcNode != nullptr, ERR_INVALID_PARAM, "ConnectNodes failed, srcNode is nullptr.");872 CHECK_AND_RETURN_RET_LOG(srcNode != nullptr, ERR_INVALID_PARAM, "ConnectNodes failed, srcNode is nullptr.");
tianluowen
tianluowentianluowen6月4日
已过期

这个不需要上报。

likedislike
870- CHECK_AND_RETURN_RET_LOG(IsNodeExists(srcNode), ERR_AUDIO_SUITE_NODE_NOT_EXIST,873+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
871- "OHAudioSuiteEngine::The sec node does not exist.");874+ IsNodeExists(srcNode), ERR_AUDIO_SUITE_NODE_NOT_EXIST,
875+ StreamDfxManager::GetInstance().SendAudioErrorEvent(static_cast<int32_t>(getuid()), EDIT_CONNECT_NODES_INVAILD,
tianluowen
tianluowentianluowen6月4日

CHECK_AND_RETURN_RET_LOG(IsNodeExists(srcNode), ERR_AUDIO_SUITE_NODE_NOT_EXIST,

likedislike
876+ "OHAudioSuiteEngine::The sec node does not exist.", true),
877+ "OHAudioSuiteEngine::The sec node does not exist.");
872 CHECK_AND_RETURN_RET_LOG(destNode != nullptr, ERR_INVALID_PARAM, "ConnectNodes failed, srcNode is nullptr.");878 CHECK_AND_RETURN_RET_LOG(destNode != nullptr, ERR_INVALID_PARAM, "ConnectNodes failed, srcNode is nullptr.");
873 CHECK_AND_RETURN_RET_LOG(IsNodeExists(destNode), ERR_AUDIO_SUITE_NODE_NOT_EXIST,879 CHECK_AND_RETURN_RET_LOG(IsNodeExists(destNode), ERR_AUDIO_SUITE_NODE_NOT_EXIST,
874 "OHAudioSuiteEngine::The dest node does not exist.");880 "OHAudioSuiteEngine::The dest node does not exist.");
@@ -1028,11 +1034,15 @@ int32_t OHAudioSuiteEngine::SetSpaceRenderPositionParams(
1028 OHAudioNode *node, OH_AudioSuite_SpaceRenderPositionParams position)1034 OHAudioNode *node, OH_AudioSuite_SpaceRenderPositionParams position)
1029{1035{
1030 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderPositionParams value) {1036 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderPositionParams value) {
1031- CHECK_AND_RETURN_RET_LOG(1037+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1032 value.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&1038 value.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&
1033 value.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&1039 value.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&
1034 value.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,1040 value.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,
1035- ERR_INVALID_PARAM, "SetSpaceRenderPositionParams failed, point distance must be in the -5.0f~5.0f");1041+ ERR_INVALID_PARAM,
1042+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1043+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1044+ "SetSpaceRenderPositionParams failed, point distance must be in the -5.0f~5.0f", true),
1045+ "SetSpaceRenderPositionParams failed, point distance must be in the -5.0f~5.0f");
1036 AudioSpaceRenderPositionParams positionParams;1046 AudioSpaceRenderPositionParams positionParams;
1037 positionParams.x = value.x;1047 positionParams.x = value.x;
1038 positionParams.y = value.y;1048 positionParams.y = value.y;
@@ -1064,22 +1074,30 @@ int32_t OHAudioSuiteEngine::SetSpaceRenderRotationParams(
1064 OHAudioNode *node, OH_AudioSuite_SpaceRenderRotationParams rotation)1074 OHAudioNode *node, OH_AudioSuite_SpaceRenderRotationParams rotation)
1065{1075{
1066 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderRotationParams value) {1076 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderRotationParams value) {
1067- CHECK_AND_RETURN_RET_LOG(1077+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1068- value.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,1078+ value.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&
1069- ERR_INVALID_PARAM, "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f");1079+ value.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE &&
1070- CHECK_AND_RETURN_RET_LOG(
1071- value.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,
1072- ERR_INVALID_PARAM, "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f");
1073- CHECK_AND_RETURN_RET_LOG(
1074 value.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,1080 value.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE && value.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE,
1075- ERR_INVALID_PARAM, "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f");1081+ ERR_INVALID_PARAM,
1076- CHECK_AND_RETURN_RET_LOG(1082+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1083+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1084+ "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f.", true),
1085+ "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f.");
1086+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1077 value.surroundTime >= SPACE_RENDER_MIN_TIME && value.surroundTime <= SPACE_RENDER_MAX_TIME,1087 value.surroundTime >= SPACE_RENDER_MIN_TIME && value.surroundTime <= SPACE_RENDER_MAX_TIME,
1078- ERR_INVALID_PARAM, "SetSpaceRenderRotationParams failed, time must be in the 2.0f~40.0f");1088+ ERR_INVALID_PARAM,
1079- CHECK_AND_RETURN_RET_LOG(1089+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1090+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1091+ "SetSpaceRenderRotationParams failed, time must be in the 2.0f~40.0f.", true),
1092+ "SetSpaceRenderRotationParams failed, time must be in the 2.0f~40.0f.");
1093+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1080 value.surroundDirection == OH_AudioSuite_SurroundDirection::SPACE_RENDER_CCW ||1094 value.surroundDirection == OH_AudioSuite_SurroundDirection::SPACE_RENDER_CCW ||
1081 value.surroundDirection == OH_AudioSuite_SurroundDirection::SPACE_RENDER_CW,1095 value.surroundDirection == OH_AudioSuite_SurroundDirection::SPACE_RENDER_CW,
1082- ERR_INVALID_PARAM, "SetSpaceRenderRotationParams failed, surround direction must be 0 or 1");1096+ ERR_INVALID_PARAM,
1097+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1098+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1099+ "SetSpaceRenderRotationParams failed, surround direction must be 0 or 1.", true),
1100+ "SetSpaceRenderRotationParams failed, surround direction must be 0 or 1.");
1083 AudioSpaceRenderRotationParams rotationParams;1101 AudioSpaceRenderRotationParams rotationParams;
1084 rotationParams.x = value.x;1102 rotationParams.x = value.x;
1085 rotationParams.y = value.y;1103 rotationParams.y = value.y;
@@ -1115,12 +1133,18 @@ int32_t OHAudioSuiteEngine::SetSpaceRenderExtensionParams(
1115 OHAudioNode* node, OH_AudioSuite_SpaceRenderExtensionParams extension)1133 OHAudioNode* node, OH_AudioSuite_SpaceRenderExtensionParams extension)
1116{1134{
1117 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderExtensionParams value) {1135 auto setter = [](uint32_t nodeId, OH_AudioSuite_SpaceRenderExtensionParams value) {
1118- CHECK_AND_RETURN_RET_LOG(1136+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1119 value.extRadius >= SPACE_RENDER_MIN_EXPAND_RADIUS && value.extRadius <= SPACE_RENDER_MAX_EXPAND_RADIUS,1137 value.extRadius >= SPACE_RENDER_MIN_EXPAND_RADIUS && value.extRadius <= SPACE_RENDER_MAX_EXPAND_RADIUS,
1120- ERR_INVALID_PARAM, "SetSpaceRenderExtensionParams failed, Radius must be in the 1.0f~5.0f");1138+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
1121- CHECK_AND_RETURN_RET_LOG(1139+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1140+ "SetSpaceRenderExtensionParams failed, Radius must be in the 1.0f~5.0f", true),
1141+ "SetSpaceRenderExtensionParams failed, Radius must be in the 1.0f~5.0f");
1142+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1122 value.extAngle > SPACE_RENDER_MIN_EXPAND_ANGLE && value.extAngle < SPACE_RENDER_MAX_EXPAND_ANGLE,1143 value.extAngle > SPACE_RENDER_MIN_EXPAND_ANGLE && value.extAngle < SPACE_RENDER_MAX_EXPAND_ANGLE,
1123- ERR_INVALID_PARAM, "SetSpaceRenderExtensionParams failed, Angle must be in the (1, 360).");1144+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
1145+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1146+ "SetSpaceRenderExtensionParams failed, Angle must be in the (0, 360)", true),
1147+ "SetSpaceRenderExtensionParams failed, Angle must be in the (0, 360).");
1124 AudioSpaceRenderExtensionParams extensionParams;1148 AudioSpaceRenderExtensionParams extensionParams;
1125 extensionParams.extAngle = value.extAngle;1149 extensionParams.extAngle = value.extAngle;
1126 extensionParams.extRadius = value.extRadius;1150 extensionParams.extRadius = value.extRadius;
@@ -1148,10 +1172,13 @@ int32_t OHAudioSuiteEngine::GetSpaceRenderExtensionParams(
1148 1172 
1149int32_t OHAudioSuiteEngine::SetTempoAndPitch(OHAudioNode* node, float speed, float pitch)1173int32_t OHAudioSuiteEngine::SetTempoAndPitch(OHAudioNode* node, float speed, float pitch)
1150{1174{
1151- CHECK_AND_RETURN_RET_LOG(speed >= SPEED_RATE_MIN && speed <= SPEED_RATE_MAX,1175+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1152- ERR_INVALID_PARAM, "SetTempoAndPitch failed, speed must be in the 0.5~10.0");1176+ (speed >= SPEED_RATE_MIN && speed <= SPEED_RATE_MAX) && (pitch >= PITCH_RATE_MIN && pitch <= PITCH_RATE_MAX),
1153- CHECK_AND_RETURN_RET_LOG(pitch >= PITCH_RATE_MIN && pitch <= PITCH_RATE_MAX,1177+ ERR_INVALID_PARAM,
1154- ERR_INVALID_PARAM, "SetTempoAndPitch failed, pitch must be in the 0.1~5.0");1178+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1179+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1180+ "SetTempoAndPitch failed, speed must be in the 0.5~10.0 and pitch must be in the 0.1~5.0.", true),
1181+ "SetTempoAndPitch failed, speed must be in the 0.5~10.0 and pitch must be in the 0.1~5.0.");
1155 struct TempoAndPitch {1182 struct TempoAndPitch {
1156 float speed;1183 float speed;
1157 float pitch;1184 float pitch;
@@ -1187,11 +1214,14 @@ int32_t OHAudioSuiteEngine::GetTempoAndPitch(OHAudioNode* node, float* speed, fl
1187int32_t OHAudioSuiteEngine::SetPureVoiceChangeOption(1214int32_t OHAudioSuiteEngine::SetPureVoiceChangeOption(
1188 OHAudioNode* node, OH_AudioSuite_PureVoiceChangeOption option)1215 OHAudioNode* node, OH_AudioSuite_PureVoiceChangeOption option)
1189{1216{
1190- CHECK_AND_RETURN_RET_LOG(1217+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
1191 (option.pitch >= AUDIO_VOICE_MORPHING_PITCH_MIN && option.pitch <= AUDIO_VOICE_MORPHING_PITCH_MAX) ||1218 (option.pitch >= AUDIO_VOICE_MORPHING_PITCH_MIN && option.pitch <= AUDIO_VOICE_MORPHING_PITCH_MAX) ||
1192 option.pitch == AUDIO_VOICE_MORPHING_PITCH_DEFAULT,1219 option.pitch == AUDIO_VOICE_MORPHING_PITCH_DEFAULT,
1193 ERR_INVALID_PARAM,1220 ERR_INVALID_PARAM,
1194- "SetPureVoicePitch failed, pitch must be in the 0.3f~3.0f and 0.0f");1221+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
1222+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
1223+ "SetPureVoiceChangeOption failed, pitch must be in the 0.3f~3.0f or 0.0f.", true),
1224+ "SetPureVoiceChangeOption failed, pitch must be in the 0.3f~3.0f or 0.0f.");
萤火虫
萤火虫萤火虫6月4日

【告警类型】安全告警 【告警级别】提示 【告警描述】The == or != operator is used to compare floating point numbers.It's probably better to use a comparison with defined precision: fabs(A - B) <Epsilon or fabs(A - B) > Epsilon. The error is in macros.

likedislike
1195 auto setter = [](uint32_t nodeId, OH_AudioSuite_PureVoiceChangeOption value) {1225 auto setter = [](uint32_t nodeId, OH_AudioSuite_PureVoiceChangeOption value) {
1196 AudioPureVoiceChangeOption optionParams;1226 AudioPureVoiceChangeOption optionParams;
1197 optionParams.optionGender = static_cast<AudioPureVoiceChangeGenderOption>(value.optionGender);1227 optionParams.optionGender = static_cast<AudioPureVoiceChangeGenderOption>(value.optionGender);
@@ -19,6 +19,7 @@
19#include "OHAudioSuiteNodeBuilder.h"19#include "OHAudioSuiteNodeBuilder.h"
20#include "native_audio_suite_engine.h"20#include "native_audio_suite_engine.h"
21#include "oh_audio_suite_tool_test.h"21#include "oh_audio_suite_tool_test.h"
22+#include "audio_errors.h"
22 23 
23using namespace testing::ext;24using namespace testing::ext;
24 25 
@@ -602,6 +603,31 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_StartPipeline_005, TestSize
602 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);603 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
603}604}
604 605 
606+/**
607+ * @tc.name : Test OH_AudioSuiteEngine_StartPipeline.
608+ * @tc.number: OH_AudioSuiteEngine_StartPipeline_006
609+ * @tc.desc : Test pipeline not exist.
610+ */
611+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_StartPipeline_006, TestSize.Level0)
612+{
613+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
614+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
615+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
616+ 
617+ OH_AudioSuitePipeline *pipeline = nullptr;
618+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
619+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
620+ 
621+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
622+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
623+ 
624+ ret = OH_AudioSuiteEngine_StartPipeline(pipeline);
625+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_PIPELINE_NOT_EXIST);
626+ 
627+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
628+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
629+}
630+ 
605/**631/**
606 * @tc.name : Test OH_AudioSuiteEngine_StopPipeline.632 * @tc.name : Test OH_AudioSuiteEngine_StopPipeline.
607 * @tc.number: OH_AudioSuiteEngine_StopPipeline_001633 * @tc.number: OH_AudioSuiteEngine_StopPipeline_001
@@ -705,6 +731,31 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_StopPipeline_003, TestSize.
705 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);731 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
706}732}
707 733 
734+/**
735+ * @tc.name : Test OH_AudioSuiteEngine_StopPipeline.
736+ * @tc.number: OH_AudioSuiteEngine_StopPipeline_004
737+ * @tc.desc : Test pipeline not exist.
738+ */
739+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_StopPipeline_004, TestSize.Level0)
740+{
741+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
742+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
743+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
744+ 
745+ OH_AudioSuitePipeline *pipeline = nullptr;
746+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
747+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
748+ 
749+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
750+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
751+ 
752+ ret = OH_AudioSuiteEngine_StopPipeline(pipeline);
753+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_PIPELINE_NOT_EXIST);
754+ 
755+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
756+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
757+}
758+ 
708/**759/**
709 * @tc.name : Test OH_AudioSuiteEngine_GetPipelineState.760 * @tc.name : Test OH_AudioSuiteEngine_GetPipelineState.
710 * @tc.number: OH_AudioSuiteEngine_GetPipelineState_001761 * @tc.number: OH_AudioSuiteEngine_GetPipelineState_001
@@ -943,6 +994,35 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_RenderFrame_003, TestSize.L
943 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);994 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
944}995}
945 996 
997+/**
998+ * @tc.name : Test OH_AudioSuiteEngine_RenderFrame.
999+ * @tc.number: OH_AudioSuiteEngine_RenderFrame_004
1000+ * @tc.desc : Test pipeline not exist.
1001+ */
1002+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_RenderFrame_004, TestSize.Level0)
1003+{
1004+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
1005+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
1006+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
1007+ 
1008+ OH_AudioSuitePipeline *pipeline = nullptr;
1009+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
1010+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
1011+ 
1012+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
1013+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
1014+ 
1015+ uint32_t audioDdata[10] = {0};
1016+ int32_t writeSize = 0;
1017+ bool finished = false;
1018+ ret = OH_AudioSuiteEngine_RenderFrame(
1019+ pipeline, (void *)audioDdata, sizeof(audioDdata), &writeSize, &finished);
1020+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_PIPELINE_NOT_EXIST);
1021+ 
1022+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
1023+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
1024+}
1025+ 
946/**1026/**
947 * @tc.name : Test OH_AudioSuiteEngine_ConnectNodes.1027 * @tc.name : Test OH_AudioSuiteEngine_ConnectNodes.
948 * @tc.number: OH_AudioSuiteEngine_ConnectNodes_0011028 * @tc.number: OH_AudioSuiteEngine_ConnectNodes_001
@@ -2384,6 +2464,38 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetSoundFieldType_002, Test
2384 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2464 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2385}2465}
2386 2466 
2467+/**
2468+ * @tc.name : Test OH_AudioSuiteEngine_SetSoundFieldType.
2469+ * @tc.number: OH_AudioSuiteEngine_SetSoundFieldType_003
2470+ * @tc.desc : Test invalid enum value.
2471+ */
2472+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetSoundFieldType_003, TestSize.Level0)
2473+{
2474+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2475+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2476+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2477+ 
2478+ OH_AudioSuitePipeline *pipeline = nullptr;
2479+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2480+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2481+ 
2482+ OH_AudioNode *audioNode = nullptr;
2483+ CreateNode(pipeline, EFFECT_NODE_TYPE_SOUND_FIELD, &audioNode);
2484+ 
2485+ // Test invalid enum value (10) to test deep layer fault interception
2486+ ret = OH_AudioSuiteEngine_SetSoundFieldType(audioNode, static_cast<OH_SoundFieldType>(10));
2487+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2488+ 
2489+ ret = OH_AudioSuiteEngine_DestroyNode(audioNode);
2490+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2491+ 
2492+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
2493+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2494+ 
2495+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
2496+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2497+}
2498+ 
2387/**2499/**
2388 * @tc.name : Test OH_AudioSuiteEngine_SetEnvironmentType.2500 * @tc.name : Test OH_AudioSuiteEngine_SetEnvironmentType.
2389 * @tc.number: OH_AudioSuiteEngine_SetEnvironmentType_0012501 * @tc.number: OH_AudioSuiteEngine_SetEnvironmentType_001
@@ -2426,6 +2538,44 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetEnvironmentType_002, Tes
2426 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2538 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2427}2539}
2428 2540 
2541+/**
2542+ * @tc.name : Test OH_AudioSuiteEngine_SetEnvironmentType.
2543+ * @tc.number: OH_AudioSuiteEngine_SetEnvironmentType_003
2544+ * @tc.desc : Test invalid parameter range (-1 and 5).
2545+ */
2546+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetEnvironmentType_003, TestSize.Level0)
2547+{
2548+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2549+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2550+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2551+ 
2552+ OH_AudioSuitePipeline *pipeline = nullptr;
2553+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2554+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2555+ 
2556+ OH_AudioNode *envEffectNode = nullptr;
2557+ CreateNode(pipeline, EFFECT_NODE_TYPE_ENVIRONMENT_EFFECT, &envEffectNode);
2558+ 
2559+ // Test environmentType out of range (must be in 0~4)
2560+ ret = OH_AudioSuiteEngine_SetEnvironmentType(envEffectNode, static_cast<OH_EnvironmentType>(-1));
2561+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2562+ 
2563+ ret = OH_AudioSuiteEngine_SetEnvironmentType(envEffectNode, static_cast<OH_EnvironmentType>(5));
2564+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2565+ 
2566+ ret = OH_AudioSuiteEngine_SetEnvironmentType(envEffectNode, static_cast<OH_EnvironmentType>(10));
2567+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2568+ 
2569+ ret = OH_AudioSuiteEngine_DestroyNode(envEffectNode);
2570+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2571+ 
2572+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
2573+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2574+ 
2575+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
2576+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2577+}
2578+ 
2429/**2579/**
2430 * @tc.name : Test OH_AudioSuiteEngine_SetVoiceBeautifierType.2580 * @tc.name : Test OH_AudioSuiteEngine_SetVoiceBeautifierType.
2431 * @tc.number: OH_AudioSuiteEngine_SetVoiceBeautifierType_0012581 * @tc.number: OH_AudioSuiteEngine_SetVoiceBeautifierType_001
@@ -2468,6 +2618,44 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetVoiceBeautifierType_002,
2468 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2618 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2469}2619}
2470 2620 
2621+/**
2622+ * @tc.name : Test OH_AudioSuiteEngine_SetVoiceBeautifierType.
2623+ * @tc.number: OH_AudioSuiteEngine_SetVoiceBeautifierType_003
2624+ * @tc.desc : Test invalid parameter range (0 and 5).
2625+ */
2626+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetVoiceBeautifierType_003, TestSize.Level0)
2627+{
2628+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2629+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2630+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2631+ 
2632+ OH_AudioSuitePipeline *pipeline = nullptr;
2633+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2634+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2635+ 
2636+ OH_AudioNode *voiceBeautifierNode = nullptr;
2637+ CreateNode(pipeline, EFFECT_NODE_TYPE_VOICE_BEAUTIFIER, &voiceBeautifierNode);
2638+ 
2639+ // Test voiceBeautifierType out of range (must be in 1~4)
2640+ ret = OH_AudioSuiteEngine_SetVoiceBeautifierType(voiceBeautifierNode, static_cast<OH_VoiceBeautifierType>(0));
2641+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2642+ 
2643+ ret = OH_AudioSuiteEngine_SetVoiceBeautifierType(voiceBeautifierNode, static_cast<OH_VoiceBeautifierType>(5));
2644+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2645+ 
2646+ ret = OH_AudioSuiteEngine_SetVoiceBeautifierType(voiceBeautifierNode, static_cast<OH_VoiceBeautifierType>(10));
2647+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
2648+ 
2649+ ret = OH_AudioSuiteEngine_DestroyNode(voiceBeautifierNode);
2650+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2651+ 
2652+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
2653+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2654+ 
2655+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
2656+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2657+}
2658+ 
2471/**2659/**
2472 * @tc.name : Test OH_AudioSuiteEngine_SetSpaceRenderPositionParams.2660 * @tc.name : Test OH_AudioSuiteEngine_SetSpaceRenderPositionParams.
2473 * @tc.number: OH_AudioSuiteEngine_SetSpaceRenderPositionParams_0012661 * @tc.number: OH_AudioSuiteEngine_SetSpaceRenderPositionParams_001
@@ -2600,6 +2788,64 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetSpaceRenderExtensionPara
2600 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2788 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2601}2789}
2602 2790 
2791+/**
2792+ * @tc.name : Test OH_AudioSuiteEngine_SetSpaceRenderExtensionParams.
2793+ * @tc.number: OH_AudioSuiteEngine_SetSpaceRenderExtensionParams_003
2794+ * @tc.desc : Test invalid parameter range.
2795+ */
2796+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetSpaceRenderExtensionParams_003, TestSize.Level0)
2797+{
2798+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2799+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2800+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2801+ 
2802+ OH_AudioSuitePipeline *pipeline = nullptr;
2803+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2804+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2805+ 
2806+ OH_AudioNode *spaceRenderNode = nullptr;
2807+ CreateNode(pipeline, EFFECT_NODE_TYPE_SPACE_RENDER, &spaceRenderNode);
2808+ 
2809+ // Test extRadius out of range (must be in 1.0f~5.0f)
2810+ OH_AudioSuite_SpaceRenderExtensionParams extension = {0.9f, 180};
2811+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2812+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2813+ 
2814+ extension.extRadius = 5.1f;
2815+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2816+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2817+ 
2818+ // Test extAngle out of range (must be in (0,360))
2819+ extension.extRadius = 3.0f;
2820+ extension.extAngle = 0;
2821+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2822+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2823+ 
2824+ extension.extAngle = 360;
2825+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2826+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2827+ 
2828+ // Test valid parameters
2829+ extension.extRadius = 1.0f;
2830+ extension.extAngle = 1;
2831+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2832+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2833+ 
2834+ extension.extRadius = 5.0f;
2835+ extension.extAngle = 359;
2836+ ret = OH_AudioSuiteEngine_SetSpaceRenderExtensionParams(spaceRenderNode, extension);
2837+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2838+ 
2839+ ret = OH_AudioSuiteEngine_DestroyNode(spaceRenderNode);
2840+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2841+ 
2842+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
2843+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2844+ 
2845+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
2846+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2847+}
2848+ 
2603/**2849/**
2604 * @tc.name : Test OH_AudioSuiteEngine_SetTempoAndPitch.2850 * @tc.name : Test OH_AudioSuiteEngine_SetTempoAndPitch.
2605 * @tc.number: OH_AudioSuiteEngine_SetTempoAndPitch_0012851 * @tc.number: OH_AudioSuiteEngine_SetTempoAndPitch_001
@@ -2642,6 +2888,52 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetTempoAndPitch_002, TestS
2642 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2888 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2643}2889}
2644 2890 
2891+/**
2892+ * @tc.name : Test OH_AudioSuiteEngine_SetTempoAndPitch.
2893+ * @tc.number: OH_AudioSuiteEngine_SetTempoAndPitch_003
2894+ * @tc.desc : Test invalid speed and pitch range.
2895+ */
2896+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetTempoAndPitch_003, TestSize.Level0)
2897+{
2898+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2899+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2900+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2901+ 
2902+ OH_AudioSuitePipeline *pipeline = nullptr;
2903+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2904+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2905+ 
2906+ OH_AudioNode *tempoPitchNode = nullptr;
2907+ CreateNode(pipeline, EFFECT_NODE_TYPE_TEMPO_PITCH, &tempoPitchNode);
2908+ 
2909+ // Test speed out of range (speed must be in 0.5~10.0)
2910+ ret = OH_AudioSuiteEngine_SetTempoAndPitch(tempoPitchNode, 0.4f, 1.0f);
2911+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2912+ 
2913+ ret = OH_AudioSuiteEngine_SetTempoAndPitch(tempoPitchNode, 10.1f, 1.0f);
2914+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2915+ 
2916+ // Test pitch out of range (pitch must be in 0.1~5.0)
2917+ ret = OH_AudioSuiteEngine_SetTempoAndPitch(tempoPitchNode, 1.0f, 0.09f);
2918+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2919+ 
2920+ ret = OH_AudioSuiteEngine_SetTempoAndPitch(tempoPitchNode, 1.0f, 5.1f);
2921+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2922+ 
2923+ // Test both speed and pitch out of range
2924+ ret = OH_AudioSuiteEngine_SetTempoAndPitch(tempoPitchNode, 0.4f, 0.09f);
2925+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
2926+ 
2927+ ret = OH_AudioSuiteEngine_DestroyNode(tempoPitchNode);
2928+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2929+ 
2930+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
2931+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2932+ 
2933+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
2934+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2935+}
2936+ 
2645/**2937/**
2646 * @tc.name : Test OH_AudioSuiteEngine_SetPureVoiceChangeOption.2938 * @tc.name : Test OH_AudioSuiteEngine_SetPureVoiceChangeOption.
2647 * @tc.number: OH_AudioSuiteEngine_SetPureVoiceChangeOption_0012939 * @tc.number: OH_AudioSuiteEngine_SetPureVoiceChangeOption_001
@@ -2686,6 +2978,57 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetPureVoiceChangeOption_00
2686 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);2978 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2687}2979}
2688 2980 
2981+/**
2982+ * @tc.name : Test OH_AudioSuiteEngine_SetPureVoiceChangeOption.
2983+ * @tc.number: OH_AudioSuiteEngine_SetPureVoiceChangeOption_003
2984+ * @tc.desc : Test invalid pitch range.
2985+ */
2986+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetPureVoiceChangeOption_003, TestSize.Level0)
2987+{
2988+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
2989+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
2990+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2991+ 
2992+ OH_AudioSuitePipeline *pipeline = nullptr;
2993+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
2994+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2995+ 
2996+ OH_AudioNode *pureVoiceChangeNode = nullptr;
2997+ CreateNode(pipeline, EFFECT_NODE_TYPE_PURE_VOICE_CHANGE, &pureVoiceChangeNode);
2998+ 
2999+ // Test pitch out of range (pitch must be in 0.3f~3.0f or 0.0f)
3000+ OH_AudioSuite_PureVoiceChangeOption option = {PURE_VOICE_CHANGE_FEMALE, PURE_VOICE_CHANGE_TYPE_SEASONED};
3001+ option.pitch = 0.29f;
3002+ ret = OH_AudioSuiteEngine_SetPureVoiceChangeOption(pureVoiceChangeNode, option);
3003+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
3004+ 
3005+ option.pitch = 3.01f;
3006+ ret = OH_AudioSuiteEngine_SetPureVoiceChangeOption(pureVoiceChangeNode, option);
3007+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_INVALID_PARAM);
3008+ 
3009+ // Test valid pitch values
3010+ option.pitch = 0.3f;
3011+ ret = OH_AudioSuiteEngine_SetPureVoiceChangeOption(pureVoiceChangeNode, option);
3012+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3013+ 
3014+ option.pitch = 3.0f;
3015+ ret = OH_AudioSuiteEngine_SetPureVoiceChangeOption(pureVoiceChangeNode, option);
3016+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3017+ 
3018+ option.pitch = 0.0f;
3019+ ret = OH_AudioSuiteEngine_SetPureVoiceChangeOption(pureVoiceChangeNode, option);
3020+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3021+ 
3022+ ret = OH_AudioSuiteEngine_DestroyNode(pureVoiceChangeNode);
3023+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3024+ 
3025+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
3026+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3027+ 
3028+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
3029+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3030+}
3031+ 
2689/**3032/**
2690 * @tc.name : Test OH_AudioSuiteEngine_SetGeneralVoiceChangeType.3033 * @tc.name : Test OH_AudioSuiteEngine_SetGeneralVoiceChangeType.
2691 * @tc.number: OH_AudioSuiteEngine_SetGeneralVoiceChangeType_0013034 * @tc.number: OH_AudioSuiteEngine_SetGeneralVoiceChangeType_001
@@ -2730,6 +3073,47 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetGeneralVoiceChangeType_0
2730 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);3073 EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
2731}3074}
2732 3075 
3076+/**
3077+ * @tc.name : Test OH_AudioSuiteEngine_SetGeneralVoiceChangeType.
3078+ * @tc.number: OH_AudioSuiteEngine_SetGeneralVoiceChangeType_003
3079+ * @tc.desc : Test invalid parameter range (0 and 11).
3080+ */
3081+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_SetGeneralVoiceChangeType_003, TestSize.Level0)
3082+{
3083+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
3084+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
3085+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3086+ 
3087+ OH_AudioSuitePipeline *pipeline = nullptr;
3088+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
3089+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3090+ 
3091+ OH_AudioNode *generalVoiceChangeNode = nullptr;
3092+ CreateNode(pipeline, EFFECT_NODE_TYPE_GENERAL_VOICE_CHANGE, &generalVoiceChangeNode);
3093+ 
3094+ // Test generalVoiceChangeType out of range (must be in 1~10)
3095+ ret = OH_AudioSuiteEngine_SetGeneralVoiceChangeType(generalVoiceChangeNode,
3096+ static_cast<OH_AudioSuite_GeneralVoiceChangeType>(0));
3097+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
3098+ 
3099+ ret = OH_AudioSuiteEngine_SetGeneralVoiceChangeType(generalVoiceChangeNode,
3100+ static_cast<OH_AudioSuite_GeneralVoiceChangeType>(11));
3101+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
3102+ 
3103+ ret = OH_AudioSuiteEngine_SetGeneralVoiceChangeType(generalVoiceChangeNode,
3104+ static_cast<OH_AudioSuite_GeneralVoiceChangeType>(20));
3105+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_SYSTEM);
3106+ 
3107+ ret = OH_AudioSuiteEngine_DestroyNode(generalVoiceChangeNode);
3108+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3109+ 
3110+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
3111+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3112+ 
3113+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
3114+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
3115+}
3116+ 
2733/**3117/**
2734 * @tc.name : Test OHAudioSuiteEngine_RemovePipeline.3118 * @tc.name : Test OHAudioSuiteEngine_RemovePipeline.
2735 * @tc.number: OHAudioSuiteEngine_RemovePipeline_0013119 * @tc.number: OHAudioSuiteEngine_RemovePipeline_001
@@ -3826,6 +4210,39 @@ HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_IsNodeTypeSupported001, Tes
3826 std::filesystem::rename("/system/lib64/libimedia_sws.z.so.bak", "/system/lib64/libimedia_sws.z.so");4210 std::filesystem::rename("/system/lib64/libimedia_sws.z.so.bak", "/system/lib64/libimedia_sws.z.so");
3827}4211}
3828 4212 
4213+/**
4214+ * @tc.name : Test OH_AudioSuiteEngine_CreateNode with empty node type.
4215+ * @tc.number: OH_AudioSuiteEngine_CreateNodeWithEmptyNodeTypeTest
4216+ * @tc.desc : Test create node with empty node type.
4217+ */
4218+HWTEST_F(OHAudioSuiteEngineTest, OH_AudioSuiteEngine_CreateNodeWithEmptyNodeTypeTest, TestSize.Level0)
4219+{
4220+ OH_AudioSuiteEngine *audioSuiteEngine = nullptr;
4221+ OH_AudioSuite_Result ret = OH_AudioSuiteEngine_Create(&audioSuiteEngine);
4222+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4223+ 
4224+ OH_AudioSuitePipeline *pipeline = nullptr;
4225+ ret = OH_AudioSuiteEngine_CreatePipeline(audioSuiteEngine, &pipeline, AUDIOSUITE_PIPELINE_EDIT_MODE);
4226+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4227+ 
4228+ OH_AudioNodeBuilder *builder = nullptr;
4229+ ret = OH_AudioSuiteNodeBuilder_Create(&builder);
4230+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4231+ 
4232+ OH_AudioNode *audioNode = nullptr;
4233+ ret = OH_AudioSuiteEngine_CreateNode(pipeline, builder, &audioNode);
4234+ EXPECT_EQ(ret, AUDIOSUITE_ERROR_UNSUPPORTED_OPERATION);
4235+ 
4236+ ret = OH_AudioSuiteEngine_DestroyPipeline(pipeline);
4237+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4238+ 
4239+ ret = OH_AudioSuiteEngine_Destroy(audioSuiteEngine);
4240+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4241+ 
4242+ ret = OH_AudioSuiteNodeBuilder_Destroy(builder);
4243+ EXPECT_EQ(ret, AUDIOSUITE_SUCCESS);
4244+}
4245+ 
3829/**4246/**
3830 * @tc.name : Test OH_AudioSuiteEngine_HoaRenderNodeConnection.4247 * @tc.name : Test OH_AudioSuiteEngine_HoaRenderNodeConnection.
3831 * @tc.number: OH_AudioSuiteEngine_HoaRenderNodeConnection_0014248 * @tc.number: OH_AudioSuiteEngine_HoaRenderNodeConnection_001
@@ -895,6 +895,29 @@ constexpr int32_t AVSESSION_CONTROL_DESKTOPLYRIC_NOT_ENABLE_LOCAL_SET = BuildErr
895constexpr int32_t AVSESSION_CONTROL_DESKTOPLYRIC_NOT_ENABLE_LOCAL_GET = BuildErrorCode(895constexpr int32_t AVSESSION_CONTROL_DESKTOPLYRIC_NOT_ENABLE_LOCAL_GET = BuildErrorCode(
896 ProblemCategory::FAULT_SESSION_LOCAL_GET, OperationType::AVSESSION,896 ProblemCategory::FAULT_SESSION_LOCAL_GET, OperationType::AVSESSION,
897 BusinessScenario::CONTROL, ERR_DESKTOPLYRIC_NOT_ENABLE);897 BusinessScenario::CONTROL, ERR_DESKTOPLYRIC_NOT_ENABLE);
898+ 
899+// FAULT_WRONG_AUDIO_EFFECT
900+constexpr int32_t ERR_DESTROY_PIPELINE_NOT_FOUND = BuildErrorCode(
901+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::RELEASE,
902+ ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST);
903+constexpr int32_t EDIT_CONNECT_NODES_INVAILD = BuildErrorCode(
904+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG,
905+ ERR_AUDIO_SUITE_NODE_NOT_EXIST);
906+constexpr int32_t EDIT_CONNECT_NODES_NOT_EXIST = BuildErrorCode(
907+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG,
908+ ERR_AUDIO_SUITE_NODE_NOT_EXIST);
909+constexpr int32_t ERR_NODE_PARAM_SET_NODE_NOT_FOUND = BuildErrorCode(
910+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG,
911+ ERR_AUDIO_SUITE_NODE_NOT_EXIST);
912+constexpr int32_t ERR_RENDER_PIPELINE_NOT_FOUND = BuildErrorCode(
913+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::RENDER,
914+ ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST);
915+constexpr int32_t ERR_PIPELINE_STATE_INVALID = BuildErrorCode(
916+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG, ERR_ILLEGAL_STATE);
917+constexpr int32_t EDIT_NODE_PARAMETERS_INVALID = BuildErrorCode(
918+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG, ERR_INVALID_PARAM);
919+constexpr int32_t EDIT_NODE_DISCONNECT_NOT_SUPPORTED = BuildErrorCode(
920+ ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG, ERR_NOT_SUPPORTED);
898} // namespace AudioStandard921} // namespace AudioStandard
899} // namespace OHOS922} // namespace OHOS
900#endif // AUDIO_ERRORS_H923#endif // AUDIO_ERRORS_H
@@ -644,8 +644,8 @@ int32_t AudioSuiteEngine::RenderFrame(uint32_t pipelineId,
644 static_cast<int32_t>(getuid()),644 static_cast<int32_t>(getuid()),
645 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,645 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
646 BusinessScenario::RENDER, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST),646 BusinessScenario::RENDER, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST),
647- "engine RenderFrame failed, pipeline id is invailed.", true);647+ "engine RenderFrame failed, pipeline id is invaild.", true);
648- AUDIO_ERR_LOG("engine RenderFrame failed, pipeline id is invailed.");648+ AUDIO_ERR_LOG("engine RenderFrame failed, pipeline id is invaild.");
649 managerCallback_.OnRenderFrame(ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST, pipelineId);649 managerCallback_.OnRenderFrame(ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST, pipelineId);
650 return;650 return;
651 }651 }
@@ -695,6 +695,8 @@ int32_t AudioSuiteEngine::SetOptions(uint32_t nodeId, std::string name, std::str
695 auto request = [this, nodeId, name, value]() {695 auto request = [this, nodeId, name, value]() {
696 AUDIO_DEBUG_LOG("SetOptions enter");696 AUDIO_DEBUG_LOG("SetOptions enter");
697 if (nodeMap_.find(nodeId) == nodeMap_.end()) {697 if (nodeMap_.find(nodeId) == nodeMap_.end()) {
698+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
699+ static_cast<int32_t>(getuid()), ERR_NODE_PARAM_SET_NODE_NOT_FOUND, "The node does not exist.", true);
698 AUDIO_ERR_LOG("engine SetOptions node failed, node id=%{public}d is invailed.", nodeId);700 AUDIO_ERR_LOG("engine SetOptions node failed, node id=%{public}d is invailed.", nodeId);
699 managerCallback_.OnSetOptions(ERR_AUDIO_SUITE_NODE_NOT_EXIST);701 managerCallback_.OnSetOptions(ERR_AUDIO_SUITE_NODE_NOT_EXIST);
700 return;702 return;
@@ -731,6 +733,8 @@ int32_t AudioSuiteEngine::GetOptions(uint32_t nodeId, std::string name, std::str
731 auto request = [this, nodeId, name, &value]() {733 auto request = [this, nodeId, name, &value]() {
732 AUDIO_DEBUG_LOG("GetOptions enter");734 AUDIO_DEBUG_LOG("GetOptions enter");
733 if (nodeMap_.find(nodeId) == nodeMap_.end()) {735 if (nodeMap_.find(nodeId) == nodeMap_.end()) {
736+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
737+ static_cast<int32_t>(getuid()), ERR_NODE_PARAM_SET_NODE_NOT_FOUND, "The node does not exist.", true);
734 AUDIO_ERR_LOG("engine GetOptions node failed, node id=%{public}d is invailed.", nodeId);738 AUDIO_ERR_LOG("engine GetOptions node failed, node id=%{public}d is invailed.", nodeId);
735 managerCallback_.OnGetOptions(ERR_AUDIO_SUITE_NODE_NOT_EXIST);739 managerCallback_.OnGetOptions(ERR_AUDIO_SUITE_NODE_NOT_EXIST);
736 return;740 return;
@@ -38,6 +38,23 @@ namespace AudioSuite {
38 38 
39namespace {39namespace {
40static const int32_t OPERATION_TIMEOUT_IN_MS = 10000; // 10s40static const int32_t OPERATION_TIMEOUT_IN_MS = 10000; // 10s
41+static constexpr int32_t EQ_FREQUENCY_BAND_GAINS_MIN = -10;
42+static constexpr int32_t EQ_FREQUENCY_BAND_GAINS_MAX = 10;
43+static constexpr float SPACE_RENDER_MIN_CART_POINT_DISTANCE = -5.0f;
44+static constexpr float SPACE_RENDER_MAX_CART_POINT_DISTANCE = 5.0f;
45+static constexpr float SPACE_RENDER_MIN_TIME = 2.0f;
46+static constexpr float SPACE_RENDER_MAX_TIME = 40.0f;
47+static constexpr float SPACE_RENDER_MIN_EXPAND_RADIUS = 1.0f;
48+static constexpr float SPACE_RENDER_MAX_EXPAND_RADIUS = 5.0f;
49+static constexpr int32_t SPACE_RENDER_MIN_EXPAND_ANGLE = 0;
50+static constexpr int32_t SPACE_RENDER_MAX_EXPAND_ANGLE = 360;
51+static constexpr float AUDIO_VOICE_MORPHING_PITCH_MIN = 0.3f;
52+static constexpr float AUDIO_VOICE_MORPHING_PITCH_MAX = 3.0f;
53+static constexpr float AUDIO_VOICE_MORPHING_PITCH_DEFAULT = 0.0f;
54+static constexpr float SPEED_RATE_MIN = 0.5f;
55+static constexpr float SPEED_RATE_MAX = 10.0f;
56+static constexpr float PITCH_RATE_MIN = 0.1f;
57+static constexpr float PITCH_RATE_MAX = 5.0f;
41enum ErrorScene : uint32_t {58enum ErrorScene : uint32_t {
42 PIPELINE_SCENE = 0,59 PIPELINE_SCENE = 0,
43 NODE_SCENE = 1,60 NODE_SCENE = 1,
@@ -539,6 +556,14 @@ int32_t AudioSuiteManager::SetEqualizerFrequencyBandGains(uint32_t nodeId, Audio
539 std::lock_guard<std::mutex> lock(lock_);556 std::lock_guard<std::mutex> lock(lock_);
540 CHECK_AND_RETURN_RET_LOG(suiteEngine_ != nullptr, ERR_AUDIO_SUITE_NODE_NOT_EXIST, "suite engine not inited");557 CHECK_AND_RETURN_RET_LOG(suiteEngine_ != nullptr, ERR_AUDIO_SUITE_NODE_NOT_EXIST, "suite engine not inited");
541 558 
559+ for (size_t idx = 0; idx < sizeof(gains.gains) / sizeof(gains.gains[0]); idx++) {
560+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
561+ (gains.gains[idx] >= EQ_FREQUENCY_BAND_GAINS_MIN) && (gains.gains[idx] <= EQ_FREQUENCY_BAND_GAINS_MAX),
562+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
tianluowen
tianluowentianluowen6月4日

这里要分析,之前报什么错误。

likedislike
Cemelia
6月9日 评论:
563+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
564+ "SetEqualizerFrequencyBandGains failed, input value not in -10, 10.", true),
565+ "SetEqualizerFrequencyBandGains failed, input value %{public}d not in -10, 10.", gains.gains[idx]);
566+ }
542 std::string name = "AudioEqualizerFrequencyBandGains";567 std::string name = "AudioEqualizerFrequencyBandGains";
543 std::string value = "";568 std::string value = "";
544 for (size_t idx = 0; idx < sizeof(gains.gains) / sizeof(gains.gains[0]); idx++) {569 for (size_t idx = 0; idx < sizeof(gains.gains) / sizeof(gains.gains[0]); idx++) {
@@ -565,6 +590,16 @@ int32_t AudioSuiteManager::SetEqualizerFrequencyBandGains(uint32_t nodeId, Audio
565 590 
566int32_t AudioSuiteManager::SetSpaceRenderPositionParams(uint32_t nodeId, AudioSpaceRenderPositionParams position)591int32_t AudioSuiteManager::SetSpaceRenderPositionParams(uint32_t nodeId, AudioSpaceRenderPositionParams position)
567{592{
593+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
594+ (position.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) && (position.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE) &&
595+ (position.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) &&
596+ (position.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE) &&
597+ (position.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) &&
598+ (position.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE),
599+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
600+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
601+ "SetSpaceRenderPositionParams failed, point distance must be in the -5.0f~5.0f", true),
602+ "SetSpaceRenderPositionParams failed, point distance must be in the -5.0f~5.0f");
568 return SetParamsTemplate(nodeId, "AudioSpaceRenderPositionParams", position);603 return SetParamsTemplate(nodeId, "AudioSpaceRenderPositionParams", position);
569}604}
570 605 
@@ -575,6 +610,35 @@ int32_t AudioSuiteManager::GetSpaceRenderPositionParams(uint32_t nodeId, AudioSp
575 610 
576int32_t AudioSuiteManager::SetSpaceRenderRotationParams(uint32_t nodeId, AudioSpaceRenderRotationParams rotation)611int32_t AudioSuiteManager::SetSpaceRenderRotationParams(uint32_t nodeId, AudioSpaceRenderRotationParams rotation)
577{612{
613+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
614+ (rotation.x >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) && (rotation.x <= SPACE_RENDER_MAX_CART_POINT_DISTANCE) &&
615+ (rotation.y >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) &&
616+ (rotation.y <= SPACE_RENDER_MAX_CART_POINT_DISTANCE) &&
617+ (rotation.z >= SPACE_RENDER_MIN_CART_POINT_DISTANCE) &&
618+ (rotation.z <= SPACE_RENDER_MAX_CART_POINT_DISTANCE),
619+ ERR_INVALID_PARAM,
620+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
621+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
622+ "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f", true),
623+ "SetSpaceRenderRotationParams failed, point distance must be in the -5.0f~5.0f");
624+ 
625+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
626+ ((rotation.surroundTime >= SPACE_RENDER_MIN_TIME) && (rotation.surroundTime <= SPACE_RENDER_MAX_TIME)),
627+ ERR_INVALID_PARAM,
628+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
629+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
630+ "SetSpaceRenderRotationParams failed, time must be in the 2.0f~40.0f", true),
631+ "SetSpaceRenderRotationParams failed, time must be in the 2.0f~40.0f");
632+ 
633+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
634+ (rotation.surroundDirection == AudioSurroundDirection::SPACE_RENDER_CCW ||
635+ rotation.surroundDirection == AudioSurroundDirection::SPACE_RENDER_CW),
636+ ERR_INVALID_PARAM,
637+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
638+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
639+ "SetSpaceRenderRotationParams failed, surround direction must be 0 or 1", true),
640+ "SetSpaceRenderRotationParams failed, surround direction must be 0 or 1");
641+ 
578 return SetParamsTemplate(nodeId, "AudioSpaceRenderRotationParams", rotation);642 return SetParamsTemplate(nodeId, "AudioSpaceRenderRotationParams", rotation);
579}643}
580 644 
@@ -585,6 +649,19 @@ int32_t AudioSuiteManager::GetSpaceRenderRotationParams(uint32_t nodeId, AudioSp
585 649 
586int32_t AudioSuiteManager::SetSpaceRenderExtensionParams(uint32_t nodeId, AudioSpaceRenderExtensionParams extension)650int32_t AudioSuiteManager::SetSpaceRenderExtensionParams(uint32_t nodeId, AudioSpaceRenderExtensionParams extension)
587{651{
652+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
653+ extension.extRadius >= SPACE_RENDER_MIN_EXPAND_RADIUS && extension.extRadius <= SPACE_RENDER_MAX_EXPAND_RADIUS,
654+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
655+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
656+ "SetSpaceRenderExtensionParams failed, Radius must be in the 1.0f~5.0f", true),
657+ "SetSpaceRenderExtensionParams failed, Radius must be in the 1.0f~5.0f");
658+ 
659+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
660+ extension.extAngle > SPACE_RENDER_MIN_EXPAND_ANGLE && extension.extAngle < SPACE_RENDER_MAX_EXPAND_ANGLE,
661+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
662+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
663+ "SetSpaceRenderExtensionParams failed, Angle must be in the (0, 360)", true),
664+ "SetSpaceRenderExtensionParams failed, Angle must be in the (0, 360)");
588 return SetParamsTemplate(nodeId, "AudioSpaceRenderExtensionParams", extension);665 return SetParamsTemplate(nodeId, "AudioSpaceRenderExtensionParams", extension);
589}666}
590 667 
@@ -598,6 +675,13 @@ int32_t AudioSuiteManager::SetTempoAndPitch(uint32_t nodeId, float speed, float
598 TempoPitchParams params;675 TempoPitchParams params;
599 params.speed = speed;676 params.speed = speed;
600 params.pitch = pitch;677 params.pitch = pitch;
678+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
679+ (speed >= SPEED_RATE_MIN && speed <= SPEED_RATE_MAX) && (pitch >= PITCH_RATE_MIN && pitch <= PITCH_RATE_MAX),
680+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
681+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
682+ "SetTempoAndPitch failed, speed must be in the 0.5~10.0 and pitch must be in the 0.1~5.0.", true),
683+ "SetTempoAndPitch failed, speed %{public}f must be in the 0.5~10.0 and pitch %{public}f must be in the "
684+ "0.1~5.0.", speed, pitch);
601 return SetParamsTemplate(nodeId, "speedAndPitch", params);685 return SetParamsTemplate(nodeId, "speedAndPitch", params);
602}686}
603 687 
@@ -614,6 +698,13 @@ int32_t AudioSuiteManager::GetTempoAndPitch(uint32_t nodeId, float &speed, float
614 698 
615int32_t AudioSuiteManager::SetPureVoiceChangeOption(uint32_t nodeId, AudioPureVoiceChangeOption option)699int32_t AudioSuiteManager::SetPureVoiceChangeOption(uint32_t nodeId, AudioPureVoiceChangeOption option)
616{700{
701+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(
702+ (option.pitch >= AUDIO_VOICE_MORPHING_PITCH_MIN && option.pitch <= AUDIO_VOICE_MORPHING_PITCH_MAX) ||
703+ option.pitch == AUDIO_VOICE_MORPHING_PITCH_DEFAULT,
704+ ERR_INVALID_PARAM, StreamDfxManager::GetInstance().SendAudioErrorEvent(
705+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
706+ "SetPureVoiceChangeOption failed, pitch must be in the 0.3f~3.0f or 0.0f.", true),
707+ "SetPureVoiceChangeOption failed, pitch %{public}f must be in the 0.3f~3.0f or 0.0f.", option.pitch);
617 return SetParamsTemplate(nodeId, "AudioPureVoiceChangeOption", option);708 return SetParamsTemplate(nodeId, "AudioPureVoiceChangeOption", option);
618}709}
619 710 
@@ -838,8 +929,11 @@ int32_t AudioSuiteManager::RenderFrame(uint32_t pipelineId,
838 ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST, "suite engine not inited");929 ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST, "suite engine not inited");
839 930 
840 auto it = pipelineLockMap_.find(pipelineId);931 auto it = pipelineLockMap_.find(pipelineId);
841- CHECK_AND_RETURN_RET_LOG(it != pipelineLockMap_.end(), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,932+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(it != pipelineLockMap_.end(), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,
842- "pipeline lock not exist");933+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
934+ static_cast<int32_t>(getuid()), ERR_RENDER_PIPELINE_NOT_FOUND,
935+ "manager RenderFrame failed, pipeline id is invailed.", true),
936+ "pipeline lock not exist");
843 std::mutex *pipelineLock = it->second.get();937 std::mutex *pipelineLock = it->second.get();
844 CHECK_AND_RETURN_RET_LOG(pipelineLock != nullptr, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,938 CHECK_AND_RETURN_RET_LOG(pipelineLock != nullptr, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,
845 "pipeline lock is null");939 "pipeline lock is null");
@@ -873,8 +967,11 @@ int32_t AudioSuiteManager::MultiRenderFrame(uint32_t pipelineId,
873 ERR_AUDIO_SUITE_ENGINE_NOT_EXIST, "suite engine not inited");967 ERR_AUDIO_SUITE_ENGINE_NOT_EXIST, "suite engine not inited");
874 968 
875 auto it = pipelineLockMap_.find(pipelineId);969 auto it = pipelineLockMap_.find(pipelineId);
876- CHECK_AND_RETURN_RET_LOG(it != pipelineLockMap_.end(), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,970+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(it != pipelineLockMap_.end(), ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,
877- "pipeline lock not exist");971+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
972+ static_cast<int32_t>(getuid()), ERR_RENDER_PIPELINE_NOT_FOUND,
973+ "manager RenderFrame failed, pipeline id is invailed.", true),
974+ "pipeline lock not exist");
878 std::mutex *pipelineLock = it->second.get();975 std::mutex *pipelineLock = it->second.get();
879 CHECK_AND_RETURN_RET_LOG(pipelineLock != nullptr, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,976 CHECK_AND_RETURN_RET_LOG(pipelineLock != nullptr, ERR_AUDIO_SUITE_PIPELINE_NOT_EXIST,
880 "pipeline lock is null");977 "pipeline lock is null");
@@ -770,7 +770,7 @@ int32_t AudioSuitePipeline::ConnectNodesForRun(uint32_t srcNodeId, uint32_t dest
770 static_cast<int32_t>(getuid()),770 static_cast<int32_t>(getuid()),
771 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG,771 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT, BusinessScenario::CONFIG,
772 ERR_AUDIO_SUITE_UNSUPPORT_CONNECT),772 ERR_AUDIO_SUITE_UNSUPPORT_CONNECT),
773- "onnectNodes failed, pipeline running", true);773+ "ConnectNodes failed, pipeline running", true);
774 AUDIO_ERR_LOG("ConnectNodes failed, pipeline running srcNode = %{public}d can not is used node.", srcNodeId);774 AUDIO_ERR_LOG("ConnectNodes failed, pipeline running srcNode = %{public}d can not is used node.", srcNodeId);
775 return ERR_AUDIO_SUITE_UNSUPPORT_CONNECT;775 return ERR_AUDIO_SUITE_UNSUPPORT_CONNECT;
776 }776 }
@@ -864,14 +864,11 @@ int32_t AudioSuitePipeline::DisConnectNodesForRun(uint32_t srcNodeId, uint32_t d
864{864{
865 if (outputNode_ == nullptr) {865 if (outputNode_ == nullptr) {
866 StreamDfxManager::GetInstance().SendAudioErrorEvent(866 StreamDfxManager::GetInstance().SendAudioErrorEvent(
867- static_cast<int32_t>(getuid()),867+ static_cast<int32_t>(getuid()), ERR_PIPELINE_STATE_INVALID,
868- BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
869- BusinessScenario::CONFIG, ERR_ILLEGAL_STATE),
870 "DisConnectNodes failed, pipeline running, can not find output node.", true);868 "DisConnectNodes failed, pipeline running, can not find output node.", true);
871 AUDIO_ERR_LOG("DisConnectNodes failed, pipeline running, can not find output node.");869 AUDIO_ERR_LOG("DisConnectNodes failed, pipeline running, can not find output node.");
872 return ERR_ILLEGAL_STATE;870 return ERR_ILLEGAL_STATE;
873 }871 }
874- 
875 // destNodeId not in pipline running nodes872 // destNodeId not in pipline running nodes
876 if (!IsConnected(outputNode_->GetAudioNodeId(), destNodeId)) {873 if (!IsConnected(outputNode_->GetAudioNodeId(), destNodeId)) {
877 return destNode->DisConnect(srcNode);874 return destNode->DisConnect(srcNode);
@@ -879,10 +876,7 @@ int32_t AudioSuitePipeline::DisConnectNodesForRun(uint32_t srcNodeId, uint32_t d
879 876 
880 if (destNode->GetNodeType() != NODE_TYPE_AUDIO_MIXER) {877 if (destNode->GetNodeType() != NODE_TYPE_AUDIO_MIXER) {
881 StreamDfxManager::GetInstance().SendAudioErrorEvent(878 StreamDfxManager::GetInstance().SendAudioErrorEvent(
882- static_cast<int32_t>(getuid()),879+ static_cast<int32_t>(getuid()), EDIT_NODE_DISCONNECT_NOT_SUPPORTED, "destNode not midx node.", true);
883- BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
884- BusinessScenario::CONFIG, ERR_NOT_SUPPORTED),
885- "destNode not midx node.", true);
886 return ERR_NOT_SUPPORTED;880 return ERR_NOT_SUPPORTED;
887 }881 }
888 882 
@@ -897,9 +891,7 @@ int32_t AudioSuitePipeline::DisConnectNodesForRun(uint32_t srcNodeId, uint32_t d
897 891 
898 if (reverseConnections_[destNodeId].size() <= 1) {892 if (reverseConnections_[destNodeId].size() <= 1) {
899 StreamDfxManager::GetInstance().SendAudioErrorEvent(893 StreamDfxManager::GetInstance().SendAudioErrorEvent(
900- static_cast<int32_t>(getuid()),894+ static_cast<int32_t>(getuid()), EDIT_NODE_DISCONNECT_NOT_SUPPORTED,
901- BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
902- BusinessScenario::CONFIG, ERR_NOT_SUPPORTED),
903 "midx node only one connected", true);895 "midx node only one connected", true);
904 return ERR_NOT_SUPPORTED;896 return ERR_NOT_SUPPORTED;
905 }897 }
@@ -1073,8 +1065,8 @@ int32_t AudioSuitePipeline::SetOptions(uint32_t nodeId, std::string name, std::s
1073 static_cast<int32_t>(getuid()),1065 static_cast<int32_t>(getuid()),
1074 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,1066 BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
1075 BusinessScenario::CONFIG, ERR_INVALID_PARAM),1067 BusinessScenario::CONFIG, ERR_INVALID_PARAM),
1076- "SetOptions failed, node id is invailed.", true);1068+ "SetOptions failed, node id is invaild.", true);
1077- AUDIO_ERR_LOG("SetOptions failed, node id is invailed.");1069+ AUDIO_ERR_LOG("SetOptions failed, node id is invaild.");
1078 TriggerCallback(SET_OPTIONS, ERR_INVALID_PARAM);1070 TriggerCallback(SET_OPTIONS, ERR_INVALID_PARAM);
1079 return;1071 return;
1080 }1072 }
@@ -1083,11 +1075,6 @@ int32_t AudioSuitePipeline::SetOptions(uint32_t nodeId, std::string name, std::s
1083 CHECK_AND_RETURN_LOG(node != nullptr, "SetOptions failed, node is nullptr.");1075 CHECK_AND_RETURN_LOG(node != nullptr, "SetOptions failed, node is nullptr.");
1084 int32_t ret = node->SetOptions(name, value);1076 int32_t ret = node->SetOptions(name, value);
1085 if (ret != SUCCESS) {1077 if (ret != SUCCESS) {
1086- StreamDfxManager::GetInstance().SendAudioErrorEvent(
1087- static_cast<int32_t>(getuid()),
1088- BuildErrorCode(ProblemCategory::FAULT_WRONG_AUDIO_EFFECT, OperationType::EDIT,
1089- BusinessScenario::CONFIG, ret),
1090- "The SetOptions node interface reports an error.", true);
1091 AUDIO_ERR_LOG("SetOptions, ret = %{public}d.", ret);1078 AUDIO_ERR_LOG("SetOptions, ret = %{public}d.", ret);
1092 TriggerCallback(SET_OPTIONS, ret);1079 TriggerCallback(SET_OPTIONS, ret);
1093 return;1080 return;
@@ -27,6 +27,7 @@
27#include "audio_errors.h"27#include "audio_errors.h"
28#include "audio_suite_log.h"28#include "audio_suite_log.h"
29#include "audio_suite_env_algo_interface_impl.h"29#include "audio_suite_env_algo_interface_impl.h"
30+#include "stream_dfx_manager.h"
30 31 
31namespace OHOS {32namespace OHOS {
32namespace AudioStandard {33namespace AudioStandard {
@@ -127,6 +128,8 @@ int32_t StringToEnvMode(const std::string &modStr, iMedia_Env_PARA &para)
127 break;128 break;
128 default:129 default:
129 AUDIO_ERR_LOG("Unknown EnvMode %{public}d", modeInt);130 AUDIO_ERR_LOG("Unknown EnvMode %{public}d", modeInt);
131+ StreamDfxManager::GetInstance().SendAudioErrorEvent(static_cast<int32_t>(getuid()),
132+ EDIT_NODE_PARAMETERS_INVALID, "Environment node passed invalid enum value", true);
130 return ERROR;133 return ERROR;
131 }134 }
132 return SUCCESS;135 return SUCCESS;
@@ -24,6 +24,7 @@
24#include "audio_suite_log.h"24#include "audio_suite_log.h"
25#include "audio_suite_soundfield_algo_interface_impl.h"25#include "audio_suite_soundfield_algo_interface_impl.h"
26#include "audio_utils.h"26#include "audio_utils.h"
27+#include "stream_dfx_manager.h"
27 28 
28namespace OHOS {29namespace OHOS {
29namespace AudioStandard {30namespace AudioStandard {
@@ -147,6 +148,8 @@ int32_t AudioSuiteSoundFieldAlgoInterfaceImpl::SetParameter(const std::string &p
147 return SUCCESS;148 return SUCCESS;
148 } else {149 } else {
149 AUDIO_ERR_LOG("SetParameter Unknown value %{public}s", paramValue.c_str());150 AUDIO_ERR_LOG("SetParameter Unknown value %{public}s", paramValue.c_str());
151+ StreamDfxManager::GetInstance().SendAudioErrorEvent(static_cast<int32_t>(getuid()),
152+ EDIT_NODE_PARAMETERS_INVALID, "The value of SetParameter is unknown.", true);
150 return ERROR;153 return ERROR;
151 }154 }
152 155 
@@ -23,6 +23,7 @@
23#include "audio_errors.h"23#include "audio_errors.h"
24#include "audio_suite_log.h"24#include "audio_suite_log.h"
25#include "audio_suite_voice_morphing_algo_interface_impl.h"25#include "audio_suite_voice_morphing_algo_interface_impl.h"
26+#include "stream_dfx_manager.h"
26 27 
27namespace OHOS {28namespace OHOS {
28namespace AudioStandard {29namespace AudioStandard {
@@ -167,7 +168,11 @@ int32_t AudioSuiteVoiceMorphingAlgoInterfaceImpl::SetParameter(
167 return ERROR;168 return ERROR;
168 }169 }
169 170 
170- CHECK_AND_RETURN_RET_LOG(typeIt != typeMap->end(), ERROR, "SetOptions UNKNOWN TYPE");171+ CHECK_AND_CALL_FUNC_RETURN_RET_LOG(typeIt != typeMap->end(), ERROR,
172+ StreamDfxManager::GetInstance().SendAudioErrorEvent(
173+ static_cast<int32_t>(getuid()), EDIT_NODE_PARAMETERS_INVALID,
174+ "SetVoiceBeautifierType/SetGeneralVoiceChangeType not match the parameters.", true),
175+ "SetOptions UNKNOWN TYPE");
171 176 
172 int32_t ret = vmAlgoApi_.setParam(handle_.data(), typeIt->second);177 int32_t ret = vmAlgoApi_.setParam(handle_.data(), typeIt->second);
173 CHECK_AND_RETURN_RET_LOG(ret == AUDIO_VMP_EOK, ERROR, "Algo setParam failed with %{public}d", ret);178 CHECK_AND_RETURN_RET_LOG(ret == AUDIO_VMP_EOK, ERROR, "Algo setParam failed with %{public}d", ret);
@@ -30,6 +30,7 @@ if (audio_framework_feature_audiosuite_support) {
30 30 
31 include_dirs = [31 include_dirs = [
32 "./tool",32 "./tool",
33+ "./manager/include",
33 "../../client/manager/include",34 "../../client/manager/include",
34 "../../client/converter/include",35 "../../client/converter/include",
35 "../../client/node/include",36 "../../client/node/include",
@@ -51,8 +52,9 @@ if (audio_framework_feature_audiosuite_support) {
51 module_out_path = module_output_path52 module_out_path = module_output_path
52 sources = [53 sources = [
53 "tool/audio_suite_unittest_tools.cpp",54 "tool/audio_suite_unittest_tools.cpp",
54- "manager/audio_suite_engine_manager_test.cpp",55+ "manager/src/audio_suite_manager_dfx_test.cpp",
55- "manager/audio_suite_manager_params_template_test.cpp",56+ "manager/src/audio_suite_engine_manager_test.cpp",
57+ "manager/src/audio_suite_manager_params_template_test.cpp",
56 ]58 ]
57 59 
58 sanitize = {60 sanitize = {
@@ -0,0 +1,238 @@
1+/*
2+ * Copyright (c) 2026 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+#ifndef AUDIO_SUITE_MANAGER_TEST_COMMON_H
17+#define AUDIO_SUITE_MANAGER_TEST_COMMON_H
18+ 
19+#include "audio_suite_manager_callback.h"
20+#include "audio_suite_node.h"
21+#include <unordered_map>
22+class AudioSuiteManagerCallbackTestImpl : public OHOS::AudioStandard::AudioSuite::AudioSuiteManagerCallback {
23+public:
24+ AudioSuiteManagerCallbackTestImpl() = default;
25+ ~AudioSuiteManagerCallbackTestImpl() = default;
26+ 
27+ void OnCreatePipeline(int32_t result, uint32_t pipelineId) override
28+ {
29+ isFinishCreatePipeline_ = true;
30+ engineCreateResult_ = result;
31+ engineCreatePipelineId_ = pipelineId;
32+ }
33+ void OnDestroyPipeline(int32_t result) override
34+ {
35+ isFinishDestroyPipeline_ = true;
36+ destroyPipelineResult_ = result;
37+ }
38+ void OnStartPipeline(int32_t result) override
39+ {
40+ isFinishStartPipeline_ = true;
41+ startPipelineResult_ = result;
42+ }
43+ void OnStopPipeline(int32_t result) override
44+ {
45+ isFinishStopPipeline_ = true;
46+ stopPipelineResult_ = result;
47+ }
48+ void OnGetPipelineState(OHOS::AudioStandard::AudioSuite::AudioSuitePipelineState state, int32_t result) override
49+ {
50+ isFinishGetPipelineState_ = true;
51+ getPipelineState_ = state;
52+ getPipelineResult_ = result;
53+ }
54+ void OnCreateNode(int32_t result, uint32_t nodeId) override
55+ {
56+ isFinishCreateNode_ = true;
57+ engineCreateNodeResult_ = result;
58+ engineCreateNodeId_ = nodeId;
59+ }
60+ void OnDestroyNode(int32_t result) override
61+ {
62+ isFinishDestroyNode_ = true;
63+ destroyNodeResult_ = result;
64+ }
65+ void OnBypassEffectNode(int32_t result) override
66+ {
67+ isFinishBypassEffectNode_ = true;
68+ bypassEffectNodeResult_ = result;
69+ }
70+ void OnGetNodeBypass(int32_t result, bool bypassStatus) override
71+ {
72+ isFinishGetNodeBypassStatus_ = true;
73+ getNodeBypassResult_ = result;
74+ getNodeBypassState_ = bypassStatus;
75+ }
76+ void OnSetAudioFormat(int32_t result) override
77+ {
78+ isFinishSetFormat_ = true;
79+ setFormatResult_ = result;
80+ }
81+ void OnWriteDataCallback(int32_t result) override
82+ {
83+ isFinishSetWriteData_ = true;
84+ setWriteDataResult_ = result;
85+ }
86+ void OnConnectNodes(int32_t result) override
87+ {
88+ isFinishConnectNodes_ = true;
89+ connectNodesResult_ = result;
90+ }
91+ void OnDisConnectNodes(int32_t result) override
92+ {
93+ isFinishDisConnectNodes_ = true;
94+ disConnectNodesResult_ = result;
95+ }
96+ void OnRenderFrame(int32_t result, uint32_t pipelineId) override
97+ {
98+ isFinishRenderFrameMap_[pipelineId] = true;
99+ renderFrameResultMap_[pipelineId] = result;
100+ }
101+ void OnMultiRenderFrame(int32_t result, uint32_t pipelineId) override
102+ {
103+ isFinishMultiRenderFrameMap_[pipelineId] = true;
104+ multiRenderFrameResultMap_[pipelineId] = result;
105+ }
106+ void OnGetOptions(int32_t result) override
107+ {
108+ isFinishGetOptions_ = true;
109+ getOptionsResult_ = result;
110+ }
111+ void OnSetOptions(int32_t result) override
112+ {
113+ isFinishSetOptions_ = true;
114+ setOptionsResult_ = result;
115+ }
116+ 
117+ void OnPrintInfo(int32_t result) override
118+ {
119+ isFinishPrintInfo_ = true;
120+ printInfoResult_ = result;
121+ }
122+ 
123+private:
124+ bool isFinishCreatePipeline_ = false;
125+ uint32_t engineCreatePipelineId_ = OHOS::AudioStandard::AudioSuite::INVALID_PIPELINE_ID;
126+ int32_t engineCreateResult_ = 0;
127+ bool isFinishDestroyPipeline_ = false;
128+ int32_t destroyPipelineResult_ = 0;
129+ bool isFinishStartPipeline_ = false;
130+ int32_t startPipelineResult_ = 0;
131+ bool isFinishStopPipeline_ = false;
132+ int32_t stopPipelineResult_ = 0;
133+ bool isFinishGetPipelineState_ = false;
134+ OHOS::AudioStandard::AudioSuite::AudioSuitePipelineState getPipelineState_ =
135+ OHOS::AudioStandard::AudioSuite::PIPELINE_STOPPED;
136+ int32_t getPipelineResult_ = 0;
137+ bool isFinishCreateNode_ = false;
138+ int32_t engineCreateNodeResult_ = 0;
139+ uint32_t engineCreateNodeId_ = OHOS::AudioStandard::AudioSuite::INVALID_NODE_ID;
140+ bool isFinishDestroyNode_ = false;
141+ int32_t destroyNodeResult_ = 0;
142+ bool isFinishBypassEffectNode_ = false;
143+ int32_t bypassEffectNodeResult_ = 0;
144+ bool isFinishGetNodeBypassStatus_ = false;
145+ bool getNodeBypassState_ = false;
146+ int32_t getNodeBypassResult_ = 0;
147+ bool isFinishSetFormat_ = false;
148+ int32_t setFormatResult_ = 0;
149+ bool isFinishSetWriteData_ = false;
150+ int32_t setWriteDataResult_ = 0;
151+ bool isFinishConnectNodes_ = false;
152+ int32_t connectNodesResult_ = 0;
153+ bool isFinishDisConnectNodes_ = false;
154+ int32_t disConnectNodesResult_ = 0;
155+ bool isFinishGetOptions_ = false;
156+ int32_t getOptionsResult_ = 0;
157+ bool isFinishSetOptions_ = false;
158+ int32_t setOptionsResult_ = 0;
159+ bool isFinishPrintInfo_ = false;
160+ int32_t printInfoResult_ = 0;
161+ std::unordered_map<uint32_t, bool> isFinishRenderFrameMap_;
162+ std::unordered_map<uint32_t, int32_t> renderFrameResultMap_;
163+ std::unordered_map<uint32_t, bool> isFinishMultiRenderFrameMap_;
164+ std::unordered_map<uint32_t, int32_t> multiRenderFrameResultMap_;
165+};
166+ 
167+class AudioNodeTestImpl : public OHOS::AudioStandard::AudioSuite::AudioNode {
168+public:
169+ explicit AudioNodeTestImpl(OHOS::AudioStandard::AudioSuite::AudioNodeType nodeType)
170+ : OHOS::AudioStandard::AudioSuite::AudioNode(nodeType)
171+ {
172+ }
173+ virtual ~AudioNodeTestImpl() = default;
174+ int32_t DoProcess(uint32_t needDataLength) override
175+ {
176+ return 0;
177+ }
178+ int32_t Flush() override
179+ {
180+ return 0;
181+ }
182+ int32_t Connect(const std::shared_ptr<OHOS::AudioStandard::AudioSuite::AudioNode> &preNode) override
183+ {
184+ if (!preNode) {
185+ return -1;
186+ }
187+ return 0;
188+ }
189+ int32_t DisConnect(const std::shared_ptr<OHOS::AudioStandard::AudioSuite::AudioNode> &preNode) override
190+ {
191+ if (!preNode) {
192+ return -1;
193+ }
194+ return 0;
195+ }
196+};
197+ 
198+class SuiteInputNodeRequestDataCallBackFinishedTestImpl
199+ : public OHOS::AudioStandard::AudioSuite::InputNodeRequestDataCallBack {
200+public:
201+ ~SuiteInputNodeRequestDataCallBackFinishedTestImpl() = default;
202+ int32_t OnRequestDataCallBack(void *audioData, int32_t audioDataSize, bool *finished) override
203+ 
204+ {
205+ (void)audioData;
206+ (void)audioDataSize;
207+ if (finished != nullptr) {
208+ *finished = true;
209+ }
210+ return 0;
211+ }
212+};
213+ 
214+class SuiteInputNodeRequestDataCallBackTestImpl
215+ : public SuiteInputNodeRequestDataCallBackFinishedTestImpl::InputNodeRequestDataCallBack {
216+public:
217+ ~SuiteInputNodeRequestDataCallBackTestImpl() = default;
218+ int32_t OnRequestDataCallBack(void *audioData, int32_t audioDataSize, bool *finished) override
219+ {
220+ (void)audioData;
221+ (void)audioDataSize;
222+ (void)finished;
223+ return 0;
224+ }
225+};
226+ 
227+class AudioSuiteEngineManagerUnitTest : public testing::Test {
228+public:
229+ void SetUp()
230+ {
231+ if (!OHOS::AudioStandard::AudioSuite::AllNodeTypesSupported()) {
232+ GTEST_SKIP() << "not support all node types, skip this test";
233+ }
234+ };
235+ void TearDown() {};
236+};
237+ 
238+#endif // AUDIO_SUITE_MANAGER_TEST_COMMON_H
Rservices/audio_suite/test/unittest/manager/audio_suite_engine_manager_test.cppservices/audio_suite/test/unittest/manager/src/audio_suite_engine_manager_test.cpp+2-193
@@ -1,5 +1,5 @@
1/*1/*
2- * Copyright (c) 2025 Huawei Device Co., Ltd.2+ * Copyright (c) 2025~2026 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at5 * You may obtain a copy of the License at
@@ -28,7 +28,7 @@
28#include "audio_suite_base.h"28#include "audio_suite_base.h"
29#include "audio_suite_unittest_tools.h"29#include "audio_suite_unittest_tools.h"
30#include "audio_suite_output_node.h"30#include "audio_suite_output_node.h"
31- 31+#include "audio_suite_manager_test_common.h"
32 32 
33using namespace OHOS;33using namespace OHOS;
34using namespace AudioStandard;34using namespace AudioStandard;
@@ -38,197 +38,6 @@ using namespace testing;
38 38 
39namespace {39namespace {
40 40 
41-class AudioSuiteEngineManagerUnitTest : public testing::Test {
42-public:
43- void SetUp()
44- {
45- if (!AllNodeTypesSupported()) {
46- GTEST_SKIP() << "not support all node types, skip this test";
47- }
48- };
49- void TearDown() {};
50-};
51- 
52-class AudioSuiteManagerCallbackTestImpl : public AudioSuiteManagerCallback {
53-public:
54- AudioSuiteManagerCallbackTestImpl() = default;
55- ~AudioSuiteManagerCallbackTestImpl() = default;
56- 
57- void OnCreatePipeline(int32_t result, uint32_t pipelineId) override
58- {
59- isFinishCreatePipeline_ = true;
60- engineCreateResult_ = result;
61- engineCreatePipelineId_ = pipelineId;
62- }
63- void OnDestroyPipeline(int32_t result) override
64- {
65- isFinishDestroyPipeline_ = true;
66- destroyPipelineResult_ = result;
67- }
68- void OnStartPipeline(int32_t result) override
69- {
70- isFinishStartPipeline_ = true;
71- startPipelineResult_ = result;
72- }
73- void OnStopPipeline(int32_t result) override
74- {
75- isFinishStopPipeline_ = true;
76- stopPipelineResult_ = result;
77- }
78- void OnGetPipelineState(AudioSuitePipelineState state, int32_t result) override
79- {
80- isFinishGetPipelineState_ = true;
81- getPipelineState_ = state;
82- getPipelineResult_ = result;
83- }
84- void OnCreateNode(int32_t result, uint32_t nodeId) override
85- {
86- isFinishCreateNode_ = true;
87- engineCreateNodeResult_ = result;
88- engineCreateNodeId_ = nodeId;
89- }
90- void OnDestroyNode(int32_t result) override
91- {
92- isFinishDestroyNode_ = true;
93- destroyNodeResult_ = result;
94- }
95- void OnBypassEffectNode(int32_t result) override
96- {
97- isFinishBypassEffectNode_ = true;
98- bypassEffectNodeResult_ = result;
99- }
100- void OnGetNodeBypass(int32_t result, bool bypassStatus) override
101- {
102- isFinishGetNodeBypassStatus_ = true;
103- getNodeBypassResult_ = result;
104- getNodeBypassState_ = bypassStatus;
105- }
106- void OnSetAudioFormat(int32_t result) override
107- {
108- isFinishSetFormat_ = true;
109- setFormatResult_ = result;
110- }
111- void OnWriteDataCallback(int32_t result) override
112- {
113- isFinishSetWriteData_ = true;
114- setWriteDataResult_ = result;
115- }
116- void OnConnectNodes(int32_t result) override
117- {
118- isFinishConnectNodes_ = true;
119- connectNodesResult_ = result;
120- }
121- void OnDisConnectNodes(int32_t result) override
122- {
123- isFinishDisConnectNodes_ = true;
124- disConnectNodesResult_ = result;
125- }
126- void OnRenderFrame(int32_t result, uint32_t pipelineId) override
127- {
128- isFinishRenderFrameMap_[pipelineId] = true;
129- renderFrameResultMap_[pipelineId] = result;
130- }
131- void OnMultiRenderFrame(int32_t result, uint32_t pipelineId) override
132- {
133- isFinishMultiRenderFrameMap_[pipelineId] = true;
134- multiRenderFrameResultMap_[pipelineId] = result;
135- }
136- void OnGetOptions(int32_t result) override
137- {
138- isFinishGetOptions_ = true;
139- getOptionsResult_ = result;
140- }
141- void OnSetOptions(int32_t result) override
142- {
143- isFinishSetOptions_ = true;
144- setOptionsResult_ = result;
145- }
146- 
147- void OnPrintInfo(int32_t result) override
148- {
149- isFinishPrintInfo_ = true;
150- printInfoResult_ = result;
151- }
152- 
153-private:
154- bool isFinishCreatePipeline_ = false;
155- uint32_t engineCreatePipelineId_ = INVALID_PIPELINE_ID;
156- int32_t engineCreateResult_ = 0;
157- bool isFinishDestroyPipeline_ = false;
158- int32_t destroyPipelineResult_ = 0;
159- bool isFinishStartPipeline_ = false;
160- int32_t startPipelineResult_ = 0;
161- bool isFinishStopPipeline_ = false;
162- int32_t stopPipelineResult_ = 0;
163- bool isFinishGetPipelineState_ = false;
164- AudioSuitePipelineState getPipelineState_ = PIPELINE_STOPPED;
165- int32_t getPipelineResult_ = 0;
166- bool isFinishCreateNode_ = false;
167- int32_t engineCreateNodeResult_ = 0;
168- uint32_t engineCreateNodeId_ = INVALID_NODE_ID;
169- bool isFinishDestroyNode_ = false;
170- int32_t destroyNodeResult_ = 0;
171- bool isFinishBypassEffectNode_ = false;
172- int32_t bypassEffectNodeResult_ = 0;
173- bool isFinishGetNodeBypassStatus_ = false;
174- bool getNodeBypassState_ = false;
175- int32_t getNodeBypassResult_ = 0;
176- bool isFinishSetFormat_ = false;
177- int32_t setFormatResult_ = 0;
178- bool isFinishSetWriteData_ = false;
179- int32_t setWriteDataResult_ = 0;
180- bool isFinishConnectNodes_ = false;
181- int32_t connectNodesResult_ = 0;
182- bool isFinishDisConnectNodes_ = false;
183- int32_t disConnectNodesResult_ = 0;
184- bool isFinishGetOptions_ = false;
185- int32_t getOptionsResult_ = 0;
186- bool isFinishSetOptions_ = false;
187- int32_t setOptionsResult_ = 0;
188- bool isFinishPrintInfo_ = false;
189- int32_t printInfoResult_ = 0;
190- std::unordered_map<uint32_t, bool> isFinishRenderFrameMap_;
191- std::unordered_map<uint32_t, int32_t> renderFrameResultMap_;
192- std::unordered_map<uint32_t, bool> isFinishMultiRenderFrameMap_;
193- std::unordered_map<uint32_t, int32_t> multiRenderFrameResultMap_;
194-};
195- 
196-class SuiteInputNodeRequestDataCallBackTestImpl : public InputNodeRequestDataCallBack {
197-public:
198- ~SuiteInputNodeRequestDataCallBackTestImpl() = default;
199- int32_t OnRequestDataCallBack(void *audioData, int32_t audioDataSize, bool *finished) override
200- {
201- (void)audioData;
202- (void)audioDataSize;
203- (void)finished;
204- return 0;
205- }
206-};
207- 
208-class AudioNodeTestImpl : public AudioNode {
209-public:
210- explicit AudioNodeTestImpl(AudioNodeType nodeType):AudioNode(nodeType)
211- {
212- }
213- virtual ~AudioNodeTestImpl() = default;
214- int32_t DoProcess(uint32_t needDataLength) override
215- {
216- return 0;
217- }
218- int32_t Flush() override
219- {
220- return 0;
221- }
222- int32_t Connect(const std::shared_ptr<AudioNode> &preNode) override
223- {
224- return 0;
225- }
226- int32_t DisConnect(const std::shared_ptr<AudioNode> &preNode) override
227- {
228- return 0;
229- }
230-};
231- 
232HWTEST_F(AudioSuiteEngineManagerUnitTest, constructEngineManagerTest, TestSize.Level0)41HWTEST_F(AudioSuiteEngineManagerUnitTest, constructEngineManagerTest, TestSize.Level0)
233{42{
234 AudioSuiteManagerCallbackTestImpl callback;43 AudioSuiteManagerCallbackTestImpl callback;
@@ -0,0 +1,1005 @@
1+/*
2+ * Copyright (c) 2026 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+#include <cstdlib>
16+#include <string>
17+#include <thread>
18+#include <cstdio>
19+#include <unistd.h>
20+#include <fcntl.h>
21+#include <fstream>
22+#include <gtest/gtest.h>
23+#include <gmock/gmock.h>
24+#include "audio_errors.h"
25+#include "audio_suite_engine.h"
26+#include "audio_suite_manager_private.h"
27+#include "audio_suite_manager_callback.h"
28+#include "audio_suite_pipeline.h"
29+#include "audio_suite_base.h"
30+#include "audio_suite_unittest_tools.h"
31+#include "audio_suite_output_node.h"
32+#include "audio_suite_manager_test_common.h"
33+ 
34+using namespace OHOS;
35+using namespace AudioStandard;
36+using namespace AudioSuite;
37+using namespace testing::ext;
38+ 
39+namespace {
40+// Test node IDs for DFX tests
41+static constexpr uint32_t TEST_INPUT_NODE_ID = 1;
42+static constexpr uint32_t TEST_SPACERENDER_NODE_ID = 2;
43+static constexpr uint32_t TEST_OUTPUT_NODE_ID = 3;
44+static constexpr uint32_t TEST_EQUALIZER_NODE_ID = 2;
45+static constexpr uint32_t TEST_TEMPOPITCH_NODE_ID = 2;
46+static constexpr uint32_t TEST_AUDIOMIXER_NODE_ID = 4;
47+static constexpr uint32_t TEST_PIPELINE_ID = 100;
48+// Invalid node ID for testing non-existent nodes
49+static constexpr uint32_t TEST_INVALID_NODE_ID = 999;
50+ 
51+// Helper function to create a simple pipeline with space render node
52+static std::shared_ptr<AudioSuitePipeline> CreateSpaceRenderPipeline(AudioSuiteEngine &engine)
53+{
54+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
55+ pipeline->Init();
56+ 
57+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
58+ 
59+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
60+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
61+ inputNode->SetAudioNodeFormat(format);
62+ 
63+ auto spaceRenderNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_SPACE_RENDER);
64+ spaceRenderNode->audioNodeInfo_.nodeId = TEST_SPACERENDER_NODE_ID;
65+ spaceRenderNode->SetAudioNodeFormat(format);
66+ 
67+ auto outputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_OUTPUT);
68+ outputNode->audioNodeInfo_.nodeId = TEST_OUTPUT_NODE_ID;
69+ outputNode->SetAudioNodeFormat(format);
70+ 
71+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
72+ pipeline->nodeMap_[TEST_SPACERENDER_NODE_ID] = spaceRenderNode;
73+ pipeline->nodeMap_[TEST_OUTPUT_NODE_ID] = outputNode;
74+ pipeline->connections_[TEST_INPUT_NODE_ID] = TEST_SPACERENDER_NODE_ID;
75+ pipeline->connections_[TEST_SPACERENDER_NODE_ID] = TEST_OUTPUT_NODE_ID;
76+ pipeline->reverseConnections_[TEST_SPACERENDER_NODE_ID] = {TEST_INPUT_NODE_ID};
77+ pipeline->reverseConnections_[TEST_OUTPUT_NODE_ID] = {TEST_SPACERENDER_NODE_ID};
78+ 
79+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
80+ return pipeline;
81+}
82+ 
83+// Engine creation: The engine already exists.
84+HWTEST_F(AudioSuiteEngineManagerUnitTest, duplicateInitTest, TestSize.Level0)
85+{
86+ AudioSuiteManager manager;
87+ int32_t result = manager.Init();
88+ EXPECT_EQ(result, SUCCESS);
89+ 
90+ result = manager.Init();
91+ EXPECT_EQ(result, ERR_ILLEGAL_STATE);
92+ 
93+ manager.DeInit();
94+}
95+ 
96+HWTEST_F(AudioSuiteEngineManagerUnitTest, duplicateDeInitTest, TestSize.Level0)
97+{
98+ AudioSuiteManager manager;
99+ int32_t result = manager.Init();
100+ EXPECT_EQ(result, SUCCESS);
101+ 
102+ result = manager.DeInit();
103+ EXPECT_EQ(result, SUCCESS);
104+ 
105+ result = manager.DeInit();
106+ EXPECT_EQ(result, ERR_ILLEGAL_STATE);
107+}
108+ 
109+// Pipeline creation: Engine does not exist.
110+HWTEST_F(AudioSuiteEngineManagerUnitTest, createPipelineWithoutEngineTest, TestSize.Level0)
111+{
112+ AudioSuiteManager manager;
113+ uint32_t pipelineId = INVALID_PIPELINE_ID;
114+ int32_t result = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
115+ EXPECT_EQ(result, ERR_AUDIO_SUITE_ENGINE_NOT_EXIST);
116+ 
117+ result = manager.Init();
118+ EXPECT_EQ(result, SUCCESS);
119+ 
120+ manager.DeInit();
121+ result = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
122+ EXPECT_EQ(result, ERR_AUDIO_SUITE_ENGINE_NOT_EXIST);
123+}
124+ 
125+// Pipeline creation: The number of pipelines exceeds the limit.
126+HWTEST_F(AudioSuiteEngineManagerUnitTest, createPipelineExceedLimitTest, TestSize.Level0)
127+{
128+ AudioSuiteManagerCallbackTestImpl callback;
129+ AudioSuiteEngine engineManger(callback);
130+ engineManger.Init();
131+ EXPECT_EQ(engineManger.IsInit(), true);
132+ engineManger.pipelineMap_.clear();
133+ 
134+ for (uint32_t num = 0; num < engineManger.engineCfg_.maxPipelineNum_ - 1; num++) {
135+ callback.isFinishCreatePipeline_ = false;
136+ callback.engineCreateResult_ = 0;
137+ int32_t result = engineManger.CreatePipeline(PIPELINE_EDIT_MODE);
138+ EXPECT_EQ(result, SUCCESS);
139+ }
140+ callback.isFinishCreatePipeline_ = false;
141+ callback.engineCreateResult_ = 0;
142+ int32_t result = engineManger.CreatePipeline(PIPELINE_REALTIME_MODE);
143+ EXPECT_EQ(result, SUCCESS);
144+ 
145+ callback.isFinishCreatePipeline_ = false;
146+ callback.engineCreateResult_ = 0;
147+ result = engineManger.CreatePipeline(PIPELINE_EDIT_MODE);
148+ EXPECT_EQ(result, SUCCESS);
149+ sleep(1);
150+ EXPECT_EQ(callback.isFinishCreatePipeline_, true);
151+ EXPECT_EQ(callback.engineCreateResult_, ERR_AUDIO_SUITE_CREATED_EXCEED_SYSTEM_LIMITS);
152+ 
153+ callback.isFinishCreatePipeline_ = false;
154+ callback.engineCreateResult_ = 0;
155+ result = engineManger.CreatePipeline(PIPELINE_REALTIME_MODE);
156+ EXPECT_EQ(result, SUCCESS);
157+ sleep(1);
158+ EXPECT_EQ(callback.isFinishCreatePipeline_, true);
159+ EXPECT_EQ(callback.engineCreateResult_, ERR_AUDIO_SUITE_CREATED_EXCEED_SYSTEM_LIMITS);
160+ 
161+ engineManger.DeInit();
162+}
163+ 
164+HWTEST_F(AudioSuiteEngineManagerUnitTest, createNodeExceedLimitTest, TestSize.Level0)
165+{
166+ AudioSuitePipeline audioSuitePipeline(PIPELINE_EDIT_MODE);
167+ audioSuitePipeline.Init();
168+ EXPECT_EQ(audioSuitePipeline.IsInit(), true);
169+ 
170+ AudioNodeBuilder builder;
171+ builder.nodeType = NODE_TYPE_INPUT;
172+ 
173+ for (uint32_t num = 0; num < audioSuitePipeline.pipelineCfg_.maxInputNodeNum_; num++) {
174+ int32_t result = audioSuitePipeline.CreateNodeCheckParme(builder);
175+ EXPECT_EQ(result, SUCCESS);
176+ audioSuitePipeline.nodeCounts_[static_cast<std::size_t>(builder.nodeType)]++;
177+ }
178+ 
179+ int32_t result = audioSuitePipeline.CreateNodeCheckParme(builder);
180+ EXPECT_EQ(result, ERR_AUDIO_SUITE_CREATED_EXCEED_SYSTEM_LIMITS);
181+}
182+ 
183+// Node parameter setting: The user-defined parameter is invalid or illegal.
184+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetEqualizerFrequencyBandGainsInvalidParamTest, TestSize.Level0)
185+{
186+ AudioSuiteManagerCallbackTestImpl callback;
187+ AudioSuiteEngine engine(callback);
188+ engine.Init();
189+ EXPECT_EQ(engine.IsInit(), true);
190+ 
191+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
192+ pipeline->Init();
193+ 
194+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
195+ 
196+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
197+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
198+ inputNode->SetAudioNodeFormat(format);
199+ 
200+ auto eqNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_EQUALIZER);
201+ eqNode->audioNodeInfo_.nodeId = TEST_EQUALIZER_NODE_ID;
202+ eqNode->SetAudioNodeFormat(format);
203+ 
204+ auto outputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_OUTPUT);
205+ outputNode->audioNodeInfo_.nodeId = TEST_OUTPUT_NODE_ID;
206+ outputNode->SetAudioNodeFormat(format);
207+ 
208+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
209+ pipeline->nodeMap_[TEST_EQUALIZER_NODE_ID] = eqNode;
210+ pipeline->nodeMap_[TEST_OUTPUT_NODE_ID] = outputNode;
211+ pipeline->connections_[TEST_INPUT_NODE_ID] = TEST_EQUALIZER_NODE_ID;
212+ pipeline->connections_[TEST_EQUALIZER_NODE_ID] = TEST_OUTPUT_NODE_ID;
213+ pipeline->reverseConnections_[TEST_EQUALIZER_NODE_ID] = {TEST_INPUT_NODE_ID};
214+ pipeline->reverseConnections_[TEST_OUTPUT_NODE_ID] = {TEST_EQUALIZER_NODE_ID};
215+ 
216+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
217+ 
218+ AudioSuiteManager manager;
219+ manager.Init();
220+ 
221+ AudioEqualizerFrequencyBandGains gains;
222+ gains.gains[0] = 11;
223+ gains.gains[1] = -11;
224+ for (int i = 2; i < EQUALIZER_BAND_NUM; i++) {
225+ gains.gains[i] = 0;
226+ }
227+ 
228+ int32_t ret = manager.SetEqualizerFrequencyBandGains(TEST_EQUALIZER_NODE_ID, gains);
229+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
230+ 
231+ manager.DeInit();
232+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
233+ engine.DeInit();
234+}
235+ 
236+// The node parameter setting node does not exist.
237+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetEqualizerFrequencyBandGainsNodeNotExistTest, TestSize.Level0)
238+{
239+ AudioSuiteManagerCallbackTestImpl callback;
240+ AudioSuiteEngine engine(callback);
241+ engine.Init();
242+ EXPECT_EQ(engine.IsInit(), true);
243+ 
244+ std::string name = "AudioEqualizerFrequencyBandGains";
245+ std::string value = "0:0:0:0:0:0:0:0:0:0:";
246+ 
247+ // Test the node ID 999 that does not exist.
248+ int32_t ret = engine.SetOptions(TEST_INVALID_NODE_ID, name, value);
249+ EXPECT_EQ(ret, SUCCESS);
250+ 
251+ sleep(1);
252+ EXPECT_EQ(callback.setOptionsResult_, ERR_AUDIO_SUITE_NODE_NOT_EXIST);
253+ engine.DeInit();
254+}
255+ 
256+// The node type not support AudioEqualizerFrequencyBandGains.
257+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetEqualizerFrequencyBandGainsNodeTypeNotSupportTest, TestSize.Level0)
258+{
259+ AudioSuiteManagerCallbackTestImpl callback;
260+ AudioSuiteEngine engine(callback);
261+ engine.Init();
262+ EXPECT_EQ(engine.IsInit(), true);
263+ 
264+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
265+ pipeline->Init();
266+ 
267+ // Register the callback to the engine so that TriggerCallback can be correctly triggered.
268+ auto engineSharedPtr = std::shared_ptr<AudioSuiteEngine>(&engine, [](AudioSuiteEngine *) {});
269+ pipeline->RegisterSendMsgCallback(engineSharedPtr);
270+ 
271+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
272+ 
273+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
274+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
275+ inputNode->SetAudioNodeFormat(format);
276+ 
277+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
278+ 
279+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
280+ engine.nodeMap_[TEST_INPUT_NODE_ID] = TEST_PIPELINE_ID;
281+ std::string name = "AudioEqualizerFrequencyBandGains";
282+ std::string value = "0:0:0:0:0:0:0:0:0:0:";
283+ 
284+ // Test the INPUT node type does not support AudioEqualizerFrequencyBandGains.
285+ int32_t ret = engine.SetOptions(TEST_INPUT_NODE_ID, name, value);
286+ EXPECT_EQ(ret, SUCCESS);
287+ 
288+ sleep(1);
289+ EXPECT_EQ(callback.setOptionsResult_, ERROR);
290+ 
291+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
292+ engine.DeInit();
293+}
294+ 
295+// Test SetTempoAndPitch with invalid speed and pitch range.
296+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetTempoAndPitchInvalidParamTest, TestSize.Level0)
297+{
298+ AudioSuiteManagerCallbackTestImpl callback;
299+ AudioSuiteEngine engine(callback);
300+ engine.Init();
301+ EXPECT_EQ(engine.IsInit(), true);
302+ 
303+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
304+ pipeline->Init();
305+ 
306+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
307+ 
308+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
309+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
310+ inputNode->SetAudioNodeFormat(format);
311+ 
312+ auto tempoPitchNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_TEMPO_PITCH);
313+ tempoPitchNode->audioNodeInfo_.nodeId = TEST_TEMPOPITCH_NODE_ID;
314+ tempoPitchNode->SetAudioNodeFormat(format);
315+ 
316+ auto outputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_OUTPUT);
317+ outputNode->audioNodeInfo_.nodeId = TEST_OUTPUT_NODE_ID;
318+ outputNode->SetAudioNodeFormat(format);
319+ 
320+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
321+ pipeline->nodeMap_[TEST_TEMPOPITCH_NODE_ID] = tempoPitchNode;
322+ pipeline->nodeMap_[TEST_OUTPUT_NODE_ID] = outputNode;
323+ pipeline->connections_[TEST_INPUT_NODE_ID] = TEST_TEMPOPITCH_NODE_ID;
324+ pipeline->connections_[TEST_TEMPOPITCH_NODE_ID] = TEST_OUTPUT_NODE_ID;
325+ pipeline->reverseConnections_[TEST_TEMPOPITCH_NODE_ID] = {TEST_INPUT_NODE_ID};
326+ pipeline->reverseConnections_[TEST_OUTPUT_NODE_ID] = {TEST_TEMPOPITCH_NODE_ID};
327+ 
328+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
329+ 
330+ AudioSuiteManager manager;
331+ manager.Init();
332+ 
333+ // Test speed out of range (speed must be in 0.5~10.0)
334+ int32_t ret = manager.SetTempoAndPitch(TEST_TEMPOPITCH_NODE_ID, 0.4f, 1.0f);
335+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
336+ 
337+ ret = manager.SetTempoAndPitch(TEST_TEMPOPITCH_NODE_ID, 10.1f, 1.0f);
338+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
339+ 
340+ // Test pitch out of range (pitch must be in 0.1~5.0)
341+ ret = manager.SetTempoAndPitch(TEST_TEMPOPITCH_NODE_ID, 1.0f, 0.09f);
342+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
343+ 
344+ ret = manager.SetTempoAndPitch(TEST_TEMPOPITCH_NODE_ID, 1.0f, 5.1f);
345+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
346+ 
347+ // Test both speed and pitch out of range
348+ ret = manager.SetTempoAndPitch(TEST_TEMPOPITCH_NODE_ID, 0.4f, 0.09f);
349+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
350+ 
351+ manager.DeInit();
352+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
353+ engine.DeInit();
354+}
355+ 
356+// Test SetPureVoiceChangeOption with invalid pitch range.
357+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetPureVoiceChangeOptionInvalidParamTest, TestSize.Level0)
358+{
359+ AudioSuiteManager manager;
360+ manager.Init();
361+ 
362+ // Test pitch out of range (pitch must be in 0.3f~3.0f or 0.0f)
363+ AudioPureVoiceChangeOption option;
364+ option.optionGender = PURE_VOICE_CHANGE_FEMALE;
365+ option.optionType = PURE_VOICE_CHANGE_TYPE_SEASONED;
366+ option.pitch = 0.29f;
367+ int32_t ret = manager.SetPureVoiceChangeOption(2, option);
368+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
369+ 
370+ option.pitch = 3.01f;
371+ ret = manager.SetPureVoiceChangeOption(2, option);
372+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
373+ 
374+ // Test valid pitch values (will fail with node not exist error, but param check should pass)
375+ option.pitch = 0.3f;
376+ ret = manager.SetPureVoiceChangeOption(2, option);
377+ EXPECT_NE(ret, ERR_INVALID_PARAM);
378+ 
379+ option.pitch = 3.0f;
380+ ret = manager.SetPureVoiceChangeOption(2, option);
381+ EXPECT_NE(ret, SUCCESS);
382+ 
383+ option.pitch = 0.0f;
384+ ret = manager.SetPureVoiceChangeOption(2, option);
385+ EXPECT_NE(ret, ERR_INVALID_PARAM);
386+ 
387+ manager.DeInit();
388+}
389+ 
390+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderExtensionParamsInvalidParamTest, TestSize.Level0)
391+{
392+ AudioSuiteManager manager;
393+ manager.Init();
394+ 
395+ // Test extRadius out of range (must be in 1.0f~5.0f)
396+ AudioSpaceRenderExtensionParams extension;
397+ extension.extRadius = 0.9f;
398+ extension.extAngle = 180;
399+ int32_t ret = manager.SetSpaceRenderExtensionParams(2, extension);
400+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
401+ 
402+ extension.extRadius = 5.1f;
403+ ret = manager.SetSpaceRenderExtensionParams(2, extension);
404+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
405+ 
406+ // Test extAngle out of range (must be in [1, 359])
407+ extension.extRadius = 3.0f;
408+ extension.extAngle = 0;
409+ ret = manager.SetSpaceRenderExtensionParams(2, extension);
410+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
411+ 
412+ extension.extAngle = 361;
413+ ret = manager.SetSpaceRenderExtensionParams(2, extension);
414+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
415+ 
416+ extension.extRadius = 5.0f;
417+ extension.extAngle = 360;
418+ ret = manager.SetSpaceRenderExtensionParams(2, extension);
419+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
420+ 
421+ manager.DeInit();
422+}
423+ 
424+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderExtensionParamsParamTest, TestSize.Level0)
425+{
426+ AudioSuiteManager manager;
427+ manager.Init();
428+ uint32_t pipelineId = INVALID_PIPELINE_ID;
429+ int32_t ret = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
430+ EXPECT_EQ(ret, SUCCESS);
431+ uint32_t inputNodeId = INVALID_NODE_ID;
432+ AudioNodeBuilder inputBuilder;
433+ inputBuilder.nodeType = NODE_TYPE_INPUT;
434+ ret = manager.CreateNode(pipelineId, inputBuilder, inputNodeId);
435+ EXPECT_EQ(ret, SUCCESS);
436+ 
437+ uint32_t spaceRenderNodeId = INVALID_NODE_ID;
438+ AudioNodeBuilder spaceRenderBuilder;
439+ spaceRenderBuilder.nodeType = NODE_TYPE_SPACE_RENDER;
440+ ret = manager.CreateNode(pipelineId, spaceRenderBuilder, spaceRenderNodeId);
441+ EXPECT_EQ(ret, SUCCESS);
442+ 
443+ uint32_t outputNodeId = INVALID_NODE_ID;
444+ AudioNodeBuilder outputBuilder;
445+ outputBuilder.nodeType = NODE_TYPE_OUTPUT;
446+ ret = manager.CreateNode(pipelineId, outputBuilder, outputNodeId);
447+ EXPECT_EQ(ret, SUCCESS);
448+ 
449+ ret = manager.ConnectNodes(inputNodeId, spaceRenderNodeId);
450+ EXPECT_EQ(ret, SUCCESS);
451+ ret = manager.ConnectNodes(spaceRenderNodeId, outputNodeId);
452+ EXPECT_EQ(ret, SUCCESS);
453+ 
454+ AudioSpaceRenderExtensionParams extension;
455+ extension.extRadius = 1.0f;
456+ extension.extAngle = 1;
457+ ret = manager.SetSpaceRenderExtensionParams(spaceRenderNodeId, extension);
458+ EXPECT_EQ(ret, SUCCESS);
459+ 
460+ extension.extRadius = 5.0f;
461+ extension.extAngle = 359;
462+ ret = manager.SetSpaceRenderExtensionParams(spaceRenderNodeId, extension);
463+ EXPECT_EQ(ret, SUCCESS);
464+ 
465+ extension.extRadius = 3.0f;
466+ extension.extAngle = 180;
467+ ret = manager.SetSpaceRenderExtensionParams(spaceRenderNodeId, extension);
468+ EXPECT_EQ(ret, SUCCESS);
469+ 
470+ manager.DestroyPipeline(pipelineId);
471+ manager.DeInit();
472+}
473+ 
474+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetEnvironmentTypeInvalidEnumValueTest, TestSize.Level0)
475+{
476+ AudioSuiteManager manager;
477+ manager.Init();
478+ 
479+ // Create pipeline
480+ uint32_t pipelineId = INVALID_PIPELINE_ID;
481+ int32_t ret = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
482+ EXPECT_EQ(ret, SUCCESS);
483+ 
484+ // Create environment effect node
485+ uint32_t nodeId = INVALID_NODE_ID;
486+ AudioNodeBuilder builder;
487+ builder.nodeType = NODE_TYPE_ENVIRONMENT_EFFECT;
488+ ret = manager.CreateNode(pipelineId, builder, nodeId);
489+ EXPECT_EQ(ret, SUCCESS);
490+ 
491+ // Test invalid enum value (10) to test deep layer fault interception
492+ ret = manager.SetEnvironmentType(nodeId, static_cast<EnvironmentType>(10));
493+ EXPECT_EQ(ret, ERROR);
494+ 
495+ // Destroy node and pipeline
496+ ret = manager.DestroyNode(nodeId);
497+ EXPECT_EQ(ret, SUCCESS);
498+ 
499+ ret = manager.DestroyPipeline(pipelineId);
500+ EXPECT_EQ(ret, SUCCESS);
501+ 
502+ manager.DeInit();
503+}
504+ 
505+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetVoiceBeautifierTypeInvalidEnumValueTest, TestSize.Level0)
506+{
507+ AudioSuiteManager manager;
508+ manager.Init();
509+ 
510+ // Create pipeline
511+ uint32_t pipelineId = INVALID_PIPELINE_ID;
512+ int32_t ret = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
513+ EXPECT_EQ(ret, SUCCESS);
514+ 
515+ // Create voice beautifier node
516+ uint32_t nodeId = INVALID_NODE_ID;
517+ AudioNodeBuilder builder;
518+ builder.nodeType = NODE_TYPE_VOICE_BEAUTIFIER;
519+ ret = manager.CreateNode(pipelineId, builder, nodeId);
520+ EXPECT_EQ(ret, SUCCESS);
521+ 
522+ // Test invalid enum value (10) to test deep layer fault interception
523+ ret = manager.SetVoiceBeautifierType(nodeId, static_cast<VoiceBeautifierType>(10));
524+ EXPECT_EQ(ret, ERROR);
525+ 
526+ // Destroy node and pipeline
527+ ret = manager.DestroyNode(nodeId);
528+ EXPECT_EQ(ret, SUCCESS);
529+ 
530+ ret = manager.DestroyPipeline(pipelineId);
531+ EXPECT_EQ(ret, SUCCESS);
532+ 
533+ manager.DeInit();
534+}
535+ 
536+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetGeneralVoiceChangeTypeInvalidEnumValueTest, TestSize.Level0)
537+{
538+ AudioSuiteManager manager;
539+ manager.Init();
540+ 
541+ // Create pipeline
542+ uint32_t pipelineId = INVALID_PIPELINE_ID;
543+ int32_t ret = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
544+ EXPECT_EQ(ret, SUCCESS);
545+ 
546+ // Create general voice change node
547+ uint32_t nodeId = INVALID_NODE_ID;
548+ AudioNodeBuilder builder;
549+ builder.nodeType = NODE_TYPE_GENERAL_VOICE_CHANGE;
550+ ret = manager.CreateNode(pipelineId, builder, nodeId);
551+ EXPECT_EQ(ret, SUCCESS);
552+ 
553+ // Test invalid enum value (20) to test deep layer fault interception
554+ ret = manager.SetGeneralVoiceChangeType(nodeId, static_cast<AudioGeneralVoiceChangeType>(20));
555+ EXPECT_EQ(ret, ERROR);
556+ 
557+ // Destroy node and pipeline
558+ ret = manager.DestroyNode(nodeId);
559+ EXPECT_EQ(ret, SUCCESS);
560+ 
561+ ret = manager.DestroyPipeline(pipelineId);
562+ EXPECT_EQ(ret, SUCCESS);
563+ 
564+ manager.DeInit();
565+}
566+ 
567+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSoundFieldTypeInvalidEnumValueTest, TestSize.Level0)
568+{
569+ AudioSuiteManager manager;
570+ manager.Init();
571+ 
572+ // Create pipeline
573+ uint32_t pipelineId = INVALID_PIPELINE_ID;
574+ int32_t ret = manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
575+ EXPECT_EQ(ret, SUCCESS);
576+ 
577+ // Create sound field effect node
578+ uint32_t nodeId = INVALID_NODE_ID;
579+ AudioNodeBuilder builder;
580+ builder.nodeType = NODE_TYPE_SOUND_FIELD;
581+ ret = manager.CreateNode(pipelineId, builder, nodeId);
582+ EXPECT_EQ(ret, SUCCESS);
583+ 
584+ // Test invalid enum value (10) to test deep layer fault interception
585+ ret = manager.SetSoundFieldType(nodeId, static_cast<SoundFieldType>(10));
586+ EXPECT_EQ(ret, ERROR);
587+ 
588+ // Destroy node and pipeline
589+ ret = manager.DestroyNode(nodeId);
590+ EXPECT_EQ(ret, SUCCESS);
591+ 
592+ ret = manager.DestroyPipeline(pipelineId);
593+ EXPECT_EQ(ret, SUCCESS);
594+ 
595+ manager.DeInit();
596+}
597+ 
598+// The current status of the node connection process pipeline is invalid.
599+HWTEST_F(AudioSuiteEngineManagerUnitTest, ConnectNodesRunningPipelineTest, TestSize.Level0)
600+{
601+ AudioSuitePipeline pipeline(PIPELINE_EDIT_MODE);
602+ pipeline.Init();
603+ EXPECT_EQ(pipeline.IsInit(), true);
604+ 
605+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
606+ 
607+ auto inputNode1 = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
608+ inputNode1->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
609+ inputNode1->SetAudioNodeFormat(format);
610+ 
611+ auto outputNode = std::make_shared<AudioOutputNode>(format);
612+ outputNode->audioNodeInfo_.nodeId = TEST_OUTPUT_NODE_ID;
613+ outputNode->SetAudioNodeFormat(format);
614+ 
615+ auto mixNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_AUDIO_MIXER);
616+ mixNode->audioNodeInfo_.nodeId = TEST_AUDIOMIXER_NODE_ID;
617+ mixNode->SetAudioNodeFormat(format);
618+ 
619+ pipeline.nodeMap_[TEST_INPUT_NODE_ID] = inputNode1;
620+ pipeline.nodeMap_[TEST_OUTPUT_NODE_ID] = outputNode;
621+ pipeline.nodeMap_[TEST_AUDIOMIXER_NODE_ID] = mixNode;
622+ 
623+ pipeline.connections_[TEST_INPUT_NODE_ID] = TEST_AUDIOMIXER_NODE_ID;
624+ pipeline.connections_[TEST_AUDIOMIXER_NODE_ID] = TEST_OUTPUT_NODE_ID;
625+ pipeline.reverseConnections_[TEST_AUDIOMIXER_NODE_ID] = {TEST_INPUT_NODE_ID};
626+ pipeline.reverseConnections_[TEST_OUTPUT_NODE_ID] = {TEST_AUDIOMIXER_NODE_ID};
627+ 
628+ pipeline.outputNode_ = outputNode;
629+ pipeline.pipelineState_ = PIPELINE_RUNNING;
630+ 
631+ // inputNode1 is already connected to outputNode via mixNode
632+ int32_t ret = pipeline.ConnectNodesForRun(TEST_INPUT_NODE_ID, TEST_AUDIOMIXER_NODE_ID, inputNode1, mixNode);
633+ EXPECT_EQ(ret, ERR_AUDIO_SUITE_UNSUPPORT_CONNECT);
634+}
635+ 
636+// Test stop pipeline when pipeline is already stopped, expect ERR_ILLEGAL_STATE error.
637+HWTEST_F(AudioSuiteEngineManagerUnitTest, audioSuitePipelineStopWhenAlreadyStoppedTest, TestSize.Level0)
638+{
639+ AudioSuiteManagerCallbackTestImpl callback;
640+ AudioSuiteEngine engine(callback);
641+ engine.Init();
642+ EXPECT_EQ(engine.IsInit(), true);
643+ 
644+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
645+ pipeline->Init();
646+ EXPECT_EQ(pipeline->IsInit(), true);
647+ 
648+ // Register the callback to the engine so that TriggerCallback can be correctly triggered.
649+ auto engineSharedPtr = std::shared_ptr<AudioSuiteEngine>(&engine, [](AudioSuiteEngine *) {});
650+ pipeline->RegisterSendMsgCallback(engineSharedPtr);
651+ 
652+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
653+ 
654+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
655+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
656+ inputNode->SetAudioNodeFormat(format);
657+ 
658+ auto outputNode = std::make_shared<AudioOutputNode>(format);
659+ outputNode->audioNodeInfo_.nodeId = TEST_OUTPUT_NODE_ID;
660+ outputNode->SetAudioNodeFormat(format);
661+ 
662+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
663+ pipeline->nodeMap_[TEST_OUTPUT_NODE_ID] = outputNode;
664+ pipeline->outputNode_ = outputNode;
665+ 
666+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
667+ engine.nodeMap_[TEST_INPUT_NODE_ID] = TEST_PIPELINE_ID;
668+ engine.nodeMap_[TEST_OUTPUT_NODE_ID] = TEST_PIPELINE_ID;
669+ 
670+ // Pipeline is already in STOPPED state by default
671+ pipeline->pipelineState_ = PIPELINE_STOPPED;
672+ 
673+ // Try to stop pipeline when it's already stopped, should trigger ERR_ILLEGAL_STATE
674+ int32_t ret = engine.StopPipeline(100);
675+ EXPECT_EQ(ret, SUCCESS);
676+ 
677+ sleep(1);
678+ EXPECT_EQ(callback.stopPipelineResult_, ERR_ILLEGAL_STATE);
679+ 
680+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
681+ engine.DeInit();
682+}
683+ 
684+// Test SetSpaceRenderPositionParams with invalid parameters.
685+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderPositionParamsInvalidParamTest, TestSize.Level0)
686+{
687+ AudioSuiteManager manager;
688+ manager.Init();
689+ 
690+ AudioSpaceRenderPositionParams position;
691+ position.x = 6.0f;
692+ position.y = 6.0f;
693+ position.z = 6.0f;
694+ 
695+ int32_t ret = manager.SetSpaceRenderPositionParams(2, position);
696+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
697+ 
698+ position.x = -6.0f;
699+ position.y = -6.0f;
700+ position.z = -6.0f;
701+ 
702+ ret = manager.SetSpaceRenderPositionParams(2, position);
703+ EXPECT_EQ(ret, ERR_INVALID_PARAM);
704+ 
705+ manager.DeInit();
706+}
707+ 
708+HWTEST_F(AudioSuiteEngineManagerUnitTest, audioSuitePipelineDisConnectNodesNodeTypeErrorTest, TestSize.Level0)
709+{
710+ AudioSuiteManager manager;
711+ manager.Init();
712+ 
713+ uint32_t pipelineId = INVALID_PIPELINE_ID;
714+ manager.CreatePipeline(pipelineId, PIPELINE_EDIT_MODE);
715+ 
716+ uint32_t inputNodeId = INVALID_NODE_ID;
717+ uint32_t mixerNodeId = INVALID_NODE_ID;
718+ uint32_t outputNodeId = INVALID_NODE_ID;
719+ 
720+ AudioNodeBuilder inputBuilder;
721+ inputBuilder.nodeType = NODE_TYPE_INPUT;
722+ manager.CreateNode(pipelineId, inputBuilder, inputNodeId);
723+ 
724+ AudioNodeBuilder mixerBuilder;
725+ mixerBuilder.nodeType = NODE_TYPE_AUDIO_MIXER;
726+ manager.CreateNode(pipelineId, mixerBuilder, mixerNodeId);
727+ 
728+ AudioNodeBuilder outputBuilder;
729+ outputBuilder.nodeType = NODE_TYPE_OUTPUT;
730+ manager.CreateNode(pipelineId, outputBuilder, outputNodeId);
731+ 
732+ manager.ConnectNodes(inputNodeId, mixerNodeId);
733+ manager.ConnectNodes(mixerNodeId, outputNodeId);
734+ 
735+ // Test 1: Try to disconnect OUTPUT node as source (should fail)
736+ int32_t result = manager.DisConnectNodes(outputNodeId, mixerNodeId);
737+ EXPECT_EQ(result, ERR_NOT_SUPPORTED);
738+ 
739+ // Test 2: Try to disconnect INPUT node as destination (should fail)
740+ result = manager.DisConnectNodes(mixerNodeId, inputNodeId);
741+ EXPECT_EQ(result, ERR_NOT_SUPPORTED);
742+ 
743+ manager.DeInit();
744+}
745+ 
746+// Test SetOptions when node does not exist, expect ERR_INVALID_PARAM error report.
747+HWTEST_F(AudioSuiteEngineManagerUnitTest, audioSuitePipelineSetOptionsErrorReportTest, TestSize.Level0)
748+{
749+ AudioSuiteManagerCallbackTestImpl callback;
750+ AudioSuiteEngine engine(callback);
751+ engine.Init();
752+ EXPECT_EQ(engine.IsInit(), true);
753+ 
754+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
755+ pipeline->Init();
756+ EXPECT_EQ(pipeline->IsInit(), true);
757+ 
758+ // Register the callback to the engine so that TriggerCallback can be correctly triggered.
759+ auto engineSharedPtr = std::shared_ptr<AudioSuiteEngine>(&engine, [](AudioSuiteEngine *) {});
760+ pipeline->RegisterSendMsgCallback(engineSharedPtr);
761+ 
762+ AudioFormat format = {{CH_LAYOUT_STEREO, 2}, SAMPLE_F32LE, SAMPLE_RATE_48000};
763+ 
764+ auto inputNode = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
765+ inputNode->audioNodeInfo_.nodeId = TEST_INPUT_NODE_ID;
766+ inputNode->SetAudioNodeFormat(format);
767+ 
768+ pipeline->nodeMap_[TEST_INPUT_NODE_ID] = inputNode;
769+ 
770+ engine.pipelineMap_[TEST_PIPELINE_ID] = pipeline;
771+ engine.nodeMap_[TEST_INPUT_NODE_ID] = TEST_PIPELINE_ID;
772+ std::string name = "AudioEqualizerFrequencyBandGains";
773+ std::string value = "0:0:0:0:0:0:0:0:0:0:";
774+ 
775+ // Test SetOptions with node ID 999 that does not exist, should trigger ERR_AUDIO_SUITE_NODE_NOT_EXIST
776+ int32_t ret = engine.SetOptions(TEST_INVALID_NODE_ID, name, value);
777+ EXPECT_EQ(ret, SUCCESS);
778+ 
779+ sleep(1);
780+ EXPECT_EQ(callback.setOptionsResult_, ERR_AUDIO_SUITE_NODE_NOT_EXIST);
781+ 
782+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
783+ engine.DeInit();
784+}
785+ 
786+// Test SetSpaceRenderRotationParams with invalid x, y, z parameters.
787+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderRotationParamsInvalidXYZTest, TestSize.Level0)
788+{
789+ AudioSuiteManagerCallbackTestImpl callback;
790+ AudioSuiteEngine engine(callback);
791+ engine.Init();
792+ EXPECT_EQ(engine.IsInit(), true);
793+ 
794+ CreateSpaceRenderPipeline(engine);
795+ 
796+ AudioSuiteManager manager;
797+ EXPECT_EQ(manager.Init(), 0);
798+ 
799+ AudioSpaceRenderRotationParams rotation;
800+ // Test x, y, z upper bound
801+ rotation.x = 6.0f;
802+ rotation.y = 6.0f;
803+ rotation.z = 6.0f;
804+ rotation.surroundTime = 5.0f;
805+ rotation.surroundDirection = AudioSurroundDirection::SPACE_RENDER_CW;
806+ EXPECT_EQ(manager.SetSpaceRenderRotationParams(2, rotation), ERR_INVALID_PARAM);
807+ 
808+ // Test x, y, z lower bound
809+ rotation.x = -6.0f;
810+ rotation.y = -6.0f;
811+ rotation.z = -6.0f;
812+ EXPECT_EQ(manager.SetSpaceRenderRotationParams(2, rotation), ERR_INVALID_PARAM);
813+ 
814+ manager.DeInit();
815+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
816+ engine.DeInit();
817+}
818+ 
819+// Test SetSpaceRenderRotationParams with invalid surroundTime parameters.
820+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderRotationParamsInvalidSurroundTimeTest, TestSize.Level0)
821+{
822+ AudioSuiteManagerCallbackTestImpl callback;
823+ AudioSuiteEngine engine(callback);
824+ engine.Init();
825+ EXPECT_EQ(engine.IsInit(), true);
826+ 
827+ CreateSpaceRenderPipeline(engine);
828+ 
829+ AudioSuiteManager manager;
830+ EXPECT_EQ(manager.Init(), 0);
831+ 
832+ AudioSpaceRenderRotationParams rotation;
833+ rotation.x = 1.0f;
834+ rotation.y = 2.0f;
835+ rotation.z = 3.0f;
836+ rotation.surroundDirection = AudioSurroundDirection::SPACE_RENDER_CW;
837+ 
838+ // Test surroundTime lower bound
839+ rotation.surroundTime = 1.0f;
840+ EXPECT_EQ(manager.SetSpaceRenderRotationParams(2, rotation), ERR_INVALID_PARAM);
841+ 
842+ // Test surroundTime upper bound
843+ rotation.surroundTime = 41.0f;
844+ EXPECT_EQ(manager.SetSpaceRenderRotationParams(2, rotation), ERR_INVALID_PARAM);
845+ 
846+ manager.DeInit();
847+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
848+ engine.DeInit();
849+}
850+ 
851+// Test SetSpaceRenderRotationParams with invalid surroundDirection parameter.
852+HWTEST_F(AudioSuiteEngineManagerUnitTest, SetSpaceRenderRotationParamsInvalidSurroundDirectionTest, TestSize.Level0)
853+{
854+ AudioSuiteManagerCallbackTestImpl callback;
855+ AudioSuiteEngine engine(callback);
856+ engine.Init();
857+ EXPECT_EQ(engine.IsInit(), true);
858+ 
859+ CreateSpaceRenderPipeline(engine);
860+ 
861+ AudioSuiteManager manager;
862+ EXPECT_EQ(manager.Init(), 0);
863+ 
864+ AudioSpaceRenderRotationParams rotation;
865+ rotation.x = 1.0f;
866+ rotation.y = 2.0f;
867+ rotation.z = 3.0f;
868+ rotation.surroundTime = 5.0f;
869+ rotation.surroundDirection = static_cast<AudioSurroundDirection>(2);
870+ EXPECT_EQ(manager.SetSpaceRenderRotationParams(2, rotation), ERR_INVALID_PARAM);
871+ 
872+ manager.DeInit();
873+ engine.pipelineMap_.erase(TEST_PIPELINE_ID);
874+ engine.DeInit();
875+}
876+ 
877+HWTEST_F(AudioSuiteEngineManagerUnitTest, startPipelineNoOutputNodeTest, TestSize.Level0)
878+{
879+ AudioSuiteManagerCallbackTestImpl callback;
880+ AudioSuiteEngine engineManger(callback);
881+ engineManger.Init();
882+ EXPECT_EQ(engineManger.IsInit(), true);
883+ 
884+ std::shared_ptr<AudioSuitePipeline> pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
885+ pipeline->Init();
886+ EXPECT_EQ(pipeline->IsInit(), true);
887+ engineManger.pipelineMap_[1] = pipeline;
888+ 
889+ int32_t result = engineManger.StartPipeline(1);
890+ EXPECT_EQ(result, SUCCESS);
891+}
892+ 
893+HWTEST_F(AudioSuiteEngineManagerUnitTest, renderFrameTest_002, TestSize.Level0)
894+{
895+ AudioSuiteManagerCallbackTestImpl callback;
896+ auto engineMangerPtr = std::make_shared<AudioSuiteEngine>(callback);
897+ engineMangerPtr->Init();
898+ EXPECT_EQ(engineMangerPtr->IsInit(), true);
899+ 
900+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
901+ pipeline->Init();
902+ uint32_t pipelineId = pipeline->GetPipelineId();
903+ pipeline->RegisterSendMsgCallback(engineMangerPtr->weak_from_this());
904+ engineMangerPtr->pipelineMap_[pipelineId] = pipeline;
905+ 
906+ uint8_t audioData[10] = {0};
907+ int32_t writeLen = 0;
908+ bool finished = true;
909+ int32_t result = engineMangerPtr->RenderFrame(pipelineId, audioData, sizeof(audioData), &writeLen, &finished);
910+ 
911+ EXPECT_EQ(result, SUCCESS);
912+ 
913+ sleep(1);
914+ 
915+ EXPECT_EQ(callback.isFinishRenderFrameMap_[pipelineId], true);
916+ EXPECT_EQ(callback.renderFrameResultMap_[pipelineId], ERR_ILLEGAL_STATE);
917+}
918+ 
919+HWTEST_F(AudioSuiteEngineManagerUnitTest, renderFrameTest_003, TestSize.Level0)
920+{
921+ AudioSuiteManagerCallbackTestImpl callback;
922+ auto engineMangerPtr = std::make_shared<AudioSuiteEngine>(callback);
923+ engineMangerPtr->Init();
924+ auto pipeline = std::make_shared<AudioSuitePipeline>(AudioSuite::PIPELINE_EDIT_MODE);
925+ pipeline->Init();
926+ uint32_t pipelineId = pipeline->GetPipelineId();
927+ pipeline->RegisterSendMsgCallback(engineMangerPtr->weak_from_this());
928+ engineMangerPtr->pipelineMap_[pipelineId] = pipeline;
929+ 
930+ AudioNodeBuilder inputBuilder;
931+ inputBuilder.nodeType = NODE_TYPE_INPUT;
932+ AudioFormat inputFormat = {{CH_LAYOUT_STEREO, 2}, SAMPLE_U8, SAMPLE_RATE_48000};
933+ inputBuilder.nodeFormat = inputFormat;
934+ auto inputNode = pipeline->CreateNodeForType(inputBuilder);
935+ inputNode->Init();
936+ uint32_t inputNodeId = 1;
937+ inputNode->audioNodeInfo_.nodeId = inputNodeId;
938+ pipeline->nodeMap_[inputNodeId] = inputNode;
939+ 
940+ AudioFormat outputFormat = {{CH_LAYOUT_STEREO, 2}, SAMPLE_U8, SAMPLE_RATE_48000};
941+ auto outputNode = std::make_shared<AudioOutputNode>(outputFormat);
942+ outputNode->Init();
943+ pipeline->outputNode_ = outputNode;
944+ outputNode->Connect(inputNode);
945+ pipeline->connections_[inputNodeId] = 0;
946+ pipeline->reverseConnections_[0] = {inputNodeId};
947+ 
948+ std::shared_ptr<SuiteInputNodeRequestDataCallBackFinishedTestImpl> requestDataCallback =
949+ std::make_shared<SuiteInputNodeRequestDataCallBackFinishedTestImpl>();
950+ pipeline->SetRequestDataCallback(inputNodeId, requestDataCallback);
951+ pipeline->pipelineState_ = PIPELINE_RUNNING;
952+ 
953+ uint8_t audioData[10000] = {0};
954+ int32_t writeLen = 0;
955+ bool finished = false;
956+ 
957+ int32_t result = engineMangerPtr->RenderFrame(pipelineId, audioData, sizeof(audioData), &writeLen, &finished);
958+ EXPECT_EQ(result, SUCCESS);
959+ sleep(1);
960+ EXPECT_EQ(callback.isFinishRenderFrameMap_[pipelineId], true);
961+ EXPECT_EQ(callback.renderFrameResultMap_[pipelineId], SUCCESS);
962+ EXPECT_EQ(finished, true);
963+ 
964+ callback.isFinishRenderFrameMap_[pipelineId] = false;
965+ callback.renderFrameResultMap_[pipelineId] = SUCCESS;
966+ 
967+ result = engineMangerPtr->RenderFrame(pipelineId, audioData, sizeof(audioData), &writeLen, &finished);
968+ EXPECT_EQ(result, SUCCESS);
969+ sleep(1);
970+ EXPECT_EQ(callback.isFinishRenderFrameMap_[pipelineId], true);
971+ EXPECT_EQ(callback.renderFrameResultMap_[pipelineId], ERR_NOT_SUPPORTED);
972+}
973+ 
974+HWTEST_F(AudioSuiteEngineManagerUnitTest, audioSuitePipelineConnectNodesTest_004, TestSize.Level0)
975+{
976+ AudioSuitePipeline audioSuitePipeline(PIPELINE_EDIT_MODE);
977+ audioSuitePipeline.Init();
978+ EXPECT_EQ(audioSuitePipeline.IsInit(), true);
979+ 
980+ uint32_t srcNodeId = 23;
981+ uint32_t destNodeId = 24;
982+ 
983+ // Test src node is OUTPUT type
984+ audioSuitePipeline.nodeMap_[23] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_OUTPUT);
985+ audioSuitePipeline.nodeMap_[24] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_AUDIO_MIXER);
986+ int32_t result = audioSuitePipeline.ConnectNodes(srcNodeId, destNodeId);
987+ EXPECT_EQ(result, SUCCESS);
988+ 
989+ // Test dest node is INPUT type
990+ srcNodeId = 25;
991+ destNodeId = 26;
992+ audioSuitePipeline.nodeMap_[25] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_AUDIO_MIXER);
993+ audioSuitePipeline.nodeMap_[26] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_INPUT);
994+ result = audioSuitePipeline.ConnectNodes(srcNodeId, destNodeId);
995+ EXPECT_EQ(result, SUCCESS);
996+ 
997+ // Test src node is AUDIO_SEPARATION type and dest is not OUTPUT type
998+ srcNodeId = 27;
999+ destNodeId = 28;
1000+ audioSuitePipeline.nodeMap_[27] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_AUDIO_SEPARATION);
1001+ audioSuitePipeline.nodeMap_[28] = std::make_shared<AudioNodeTestImpl>(NODE_TYPE_AUDIO_MIXER);
1002+ result = audioSuitePipeline.ConnectNodes(srcNodeId, destNodeId);
1003+ EXPECT_EQ(result, SUCCESS);
1004+}
1005+} //namespace
Rservices/audio_suite/test/unittest/manager/audio_suite_manager_params_template_test.cppservices/audio_suite/test/unittest/manager/src/audio_suite_manager_params_template_test.cpp+0-0
文件重命名但无更改。