From 3c614143949c32b2526c1d7d4a6e161bebeeed28 Mon Sep 17 00:00:00 2001 From: sunshinglight Date: Thu, 21 Aug 2025 09:25:59 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E5=90=BE=E5=A3=B0app=E9=9C=80=E6=B1=82api?= =?UTF-8?q?=E5=92=8Cclient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sunshinglight Change-Id: Ica88d2bb16e089122e89708429c2f6c81c535fce --- .../audiorenderer/napi_audio_renderer.cpp | 81 +++++++++++++++++++ .../napi/audiorenderer/napi_audio_renderer.h | 3 + frameworks/js/napi/common/napi_audio_enum.h | 5 ++ .../include/audio_renderer_private.h | 3 + .../audiorenderer/src/audio_renderer.cpp | 38 +++++++++ .../audiostream/include/i_audio_stream.h | 2 + .../native/audiocommon/include/audio_info.h | 8 ++ .../audiorenderer/include/audio_renderer.h | 19 +++++ .../include/renderer_in_client_private.h | 2 + .../client/src/renderer_in_client_public.cpp | 17 ++++ services/audio_service/idl/IIpcStream.idl | 1 + .../server/include/renderer_in_server.h | 1 + .../server/src/renderer_in_server.cpp | 5 ++ 13 files changed, 185 insertions(+) diff --git a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp index c1bbb6085e..479857472e 100644 --- a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp +++ b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp @@ -111,6 +111,8 @@ napi_status NapiAudioRenderer::InitNapiAudioRenderer(napi_env env, napi_value &c DECLARE_NAPI_FUNCTION("getAudioTimestampInfo", GetAudioTimestampInfo), DECLARE_NAPI_FUNCTION("getAudioTimestampInfoSync", GetAudioTimestampInfoSync), DECLARE_NAPI_FUNCTION("setDefaultOutputDevice", SetDefaultOutputDevice), + DECLARE_NAPI_FUNCTION("setTarget", SetTarget), + DECLARE_NAPI_FUNCTION("getTarget", GetTarget), }; napi_status status = napi_define_class(env, NAPI_AUDIO_RENDERER_CLASS_NAME.c_str(), @@ -541,6 +543,85 @@ napi_value NapiAudioRenderer::GetRendererSamplingRate(napi_env env, napi_callbac return NapiAsyncWork::Enqueue(env, context, "GetRendererSamplingRate", executor, complete); } +napi_value NapiAudioRenderer::SetTarget(napi_env env, napi_callback_info info) +{ + auto context = std::make_shared(); + if (context == nullptr) { + AUDIO_ERR_LOG("SetTarget failed : no memory"); + NapiAudioError::ThrowError(env, "SetTarget failed : no memory", + NAPI_ERR_NO_MEMORY); + return NapiParamUtils::GetUndefinedValue(env); + } + + auto inputParser = [env, context](size_t argc, napi_value *argv) { + NAPI_CHECK_ARGS_RETURN_VOID(context, argc >= ARGS_ONE, "invalid arguments", + NAPI_ERR_INVALID_PARAM); + context->status = NapiParamUtils::GetValueUInt32(env, context->target, argv[PARAM0]); + NAPI_CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get Target failed", + NAPI_ERR_INVALID_PARAM); + }; + + context->GetCbInfo(env, info, inputParser); + + auto executor = [context]() { + CHECK_AND_RETURN_LOG(CheckContextStatus(context), "context object state is error."); + auto obj = reinterpret_cast(context->native); + ObjectRefMap objectGuard(obj); + auto *napiAudioRenderer = objectGuard.GetPtr(); + CHECK_AND_RETURN_LOG(CheckAudioRendererStatus(napiAudioRenderer, context), + "context object state is error."); + if (context->target != 0 or context->target != 1) { + context->SignError(NAPI_ERR_INVALID_PARAM); + return; + } + context->intValue = napiAudioRenderer->audioRenderer_->SetTarget(context->target); + CHECK_AND_RETURN(context->intValue != SUCCESS); + if (context->intValue == ERR_PERMISSION_DENIED) { + context->SignError(NAPI_ERR_NO_PERMISSION); + } else if (context->intValue == ERR_SYSTEM_PERMISSION_DENIED) { + context->SignError(NAPI_ERR_PERMISSION_DENIED); + } else if (context->intValue == ERR_ILLEGAL_STATE) { + context->SignError(NAPI_ERR_ILLEGAL_STATE); + } else { + context->SignError(NAPI_ERR_SYSTEM); + } + //todo NAPI_ERR_UNSUPPORTED + }; + + auto complete = [env](napi_value &output) { + output = NapiParamUtils::GetUndefinedValue(env); + }; + return NapiAsyncWork::Enqueue(env, context, "SetTarget", executor, complete); +} + +napi_value NapiAudioRenderer::GetTarget(napi_env env, napi_callback_info info) +{ + auto context = std::make_shared(); + if (context == nullptr) { + AUDIO_ERR_LOG("GetTarget failed : no memory"); + NapiAudioError::ThrowError(env, "GetTarget failed : no memory", + NAPI_ERR_NO_MEMORY); + return NapiParamUtils::GetUndefinedValue(env); + } + + context->GetCbInfo(env, info); + + auto executor = [context]() { + CHECK_AND_RETURN_LOG(CheckContextStatus(context), "context object state is error."); + auto obj = reinterpret_cast(context->native); + ObjectRefMap objectGuard(obj); + auto *napiAudioRenderer = objectGuard.GetPtr(); + CHECK_AND_RETURN_LOG(CheckAudioRendererStatus(napiAudioRenderer, context), + "context object state is error."); + context->rendererSampleRate = napiAudioRenderer->audioRenderer_->GetTarget(); + }; + + auto complete = [env, context](napi_value &output) { + NapiParamUtils::SetValueUInt32(env, context->target, output); + }; + return NapiAsyncWork::Enqueue(env, context, "GetTarget", executor, complete); +} + napi_value NapiAudioRenderer::Start(napi_env env, napi_callback_info info) { auto context = std::make_shared(); diff --git a/frameworks/js/napi/audiorenderer/napi_audio_renderer.h b/frameworks/js/napi/audiorenderer/napi_audio_renderer.h index 178b9755c7..ee89efaa76 100644 --- a/frameworks/js/napi/audiorenderer/napi_audio_renderer.h +++ b/frameworks/js/napi/audiorenderer/napi_audio_renderer.h @@ -58,6 +58,7 @@ private: int32_t audioRendererRate; int32_t rendererFlags; int32_t interruptMode; + int32_t target; bool isTrue; uint64_t time; size_t bufferLen; @@ -140,6 +141,8 @@ private: static napi_value GetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info); static napi_value SetDefaultOutputDevice(napi_env env, napi_callback_info info); static napi_value GetCallback(size_t argc, napi_value *argv); + static napi_value SetTarget(napi_env env, napi_callback_info info); + static napi_value GetTarget(napi_env env, napi_callback_info info); static napi_status WriteArrayBufferToNative(std::shared_ptr context); diff --git a/frameworks/js/napi/common/napi_audio_enum.h b/frameworks/js/napi/common/napi_audio_enum.h index 49ffd206be..3c14dedecc 100644 --- a/frameworks/js/napi/common/napi_audio_enum.h +++ b/frameworks/js/napi/common/napi_audio_enum.h @@ -123,6 +123,11 @@ public: LOOPBACK_MODE_HARDWARE = 0 }; + enum RenderTarget { + PLAYBACK = 0, + INJECT_TO_VOICE_COMMUNICATION_CAPTURE = 1 + } + static napi_value Init(napi_env env, napi_value exports); static bool IsLegalInputArgumentInterruptMode(int32_t interruptMode); static bool IsLegalInputArgumentAudioEffectMode(int32_t audioEffectMode); diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index 74c2a8a9cc..68a407bfa1 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -74,6 +74,8 @@ public: float GetLoudnessGain() const override; int32_t SetRenderRate(AudioRendererRate renderRate) const override; AudioRendererRate GetRenderRate() const override; + int32_t SetTarget(RenderTarget target) const override; + RenderTarget GetTarget() const override; int32_t SetRendererSamplingRate(uint32_t sampleRate) const override; uint32_t GetRendererSamplingRate() const override; int32_t SetRendererCallback(const std::shared_ptr &callback) override; @@ -272,6 +274,7 @@ private: bool isDirectVoipSupported_ = false; bool isEnableVoiceModemCommunicationStartStream_ = false; RendererState state_ = RENDERER_INVALID; + RenderTarget target_ = PLAYBACK; std::optional speed_ = std::nullopt; std::optional pitch_ = std::nullopt; diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 14351ec5c7..4433f0c712 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -1476,6 +1476,44 @@ AudioRendererRate AudioRendererPrivate::GetRenderRate() const return currentStream->GetRenderRate(); } +int32_t AudioRendererPrivate::SetTarget(RenderTarget target) const +{ + std::shared_ptr currentStream = GetInnerStream(); + CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr"); + int32_t ret = currentStream->SetRenderRate(renderRate); + CHECK_AND_RETURN_RET(ret == SUCCESS, ret); + float speed = 1.0f; + switch (renderRate) { + case RENDER_RATE_NORMAL: + speed = 1.0f; + break; + case RENDER_RATE_DOUBLE: + speed = 2.0f; + break; + case RENDER_RATE_HALF: + speed = 0.5f; + break; + default: + speed = 1.0f; + } + ret = currentStream->SetSpeed(speed); + if (ret != SUCCESS) { + AUDIO_WARNING_LOG("SetSpeed Failed, error: %{public}d", ret); + } + ret = currentStream->SetPitch(speed); + if (ret != SUCCESS) { + AUDIO_WARNING_LOG("SetPitch Failed, error: %{public}d", ret); + } + return SUCCESS; +} + +RenderTarget AudioRendererPrivate::GetRenderRate() const +{ + std::shared_ptr currentStream = GetInnerStream(); + CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_RATE_NORMAL, "audioStream_ is nullptr"); + return currentStream->GetRenderRate(); +} + int32_t AudioRendererPrivate::SetRendererSamplingRate(uint32_t sampleRate) const { std::shared_ptr currentStream = GetInnerStream(); diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index 806c39e4e9..b1d6e491f4 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -157,6 +157,8 @@ public: virtual bool GetMute() = 0; virtual int32_t SetRenderRate(AudioRendererRate renderRate) = 0; virtual AudioRendererRate GetRenderRate() = 0; + virtual int32_t SetRenderTarget(RenderTarget target) = 0; + virtual RenderTarget GetRenderTarget() = 0; virtual int32_t SetStreamCallback(const std::shared_ptr &callback) = 0; virtual int32_t SetSpeed(float speed) = 0; virtual int32_t SetPitch(float pitch) = 0; diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index 4c2056f8ae..cb73149e5e 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -303,6 +303,14 @@ enum AudioRendererRate { RENDER_RATE_HALF = 2, }; +/** + * Enumerates the audio playback target. + */ +enum RenderTarget { + PLAYBACK = 0, + INJECT_TO_VOICE_COMMUNICATION_CAPTURE = 1 +} + /** * media safe volume status */ diff --git a/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h b/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h index 6a03db4231..0d672665ee 100644 --- a/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h +++ b/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h @@ -586,6 +586,25 @@ public: */ virtual AudioRendererRate GetRenderRate() const = 0; + /** + * @brief Set the render target + * + * @param target The target at which the stream needs to be rendered. + * @return Returns {@link SUCCESS} if render rate is successfully set; returns an error code + * defined in {@link audio_errors.h} otherwise. + * @since 22 + */ + virtual int32_t SetTarget(RenderTarget target) const = 0; + + /** + * @brief Obtains the current render target + * + * @return Returns current render target + * @since 22 + */ + virtual RenderTarget GetTarget() const = 0; + + /** * @brief Set the render sampling rate * diff --git a/services/audio_service/client/include/renderer_in_client_private.h b/services/audio_service/client/include/renderer_in_client_private.h index 4cbb5226ab..a87033de6e 100644 --- a/services/audio_service/client/include/renderer_in_client_private.h +++ b/services/audio_service/client/include/renderer_in_client_private.h @@ -85,6 +85,8 @@ public: bool GetMute() override; int32_t SetRenderRate(AudioRendererRate renderRate) override; AudioRendererRate GetRenderRate() override; + int32_t SetRenderTarget(RenderTarget target) override; + RenderTarget GetRenderRate() override; int32_t SetStreamCallback(const std::shared_ptr &callback) override; int32_t SetRendererFirstFrameWritingCallback( const std::shared_ptr &callback) override; diff --git a/services/audio_service/client/src/renderer_in_client_public.cpp b/services/audio_service/client/src/renderer_in_client_public.cpp index 1af44d7f47..a300f31db4 100644 --- a/services/audio_service/client/src/renderer_in_client_public.cpp +++ b/services/audio_service/client/src/renderer_in_client_public.cpp @@ -567,6 +567,23 @@ AudioRendererRate RendererInClientInner::GetRenderRate() return rendererRate_; } +int32_t RendererInClientInner::SetRenderTarget(RenderTarget target) +{ + if (renderTarget_ == target) { + AUDIO_INFO_LOG("Set same target"); + return SUCCESS; + } + CHECK_AND_RETURN_RET_LOG(ipcStream_ != nullptr, ERR_ILLEGAL_STATE, "ipcStream is not inited!"); + renderTarget_ = target; + return ipcStream_->SetTarget(target); +} + +AudioRendererRate RendererInClientInner::GetRenderTarget() +{ + AUDIO_INFO_LOG("Get RenderTarget %{public}d", renderTarget_); + return renderTarget_; +} + int32_t RendererInClientInner::SetStreamCallback(const std::shared_ptr &callback) { if (callback == nullptr) { diff --git a/services/audio_service/idl/IIpcStream.idl b/services/audio_service/idl/IIpcStream.idl index 5f907e064c..7efd37e43a 100644 --- a/services/audio_service/idl/IIpcStream.idl +++ b/services/audio_service/idl/IIpcStream.idl @@ -38,6 +38,7 @@ interface IIpcStream { void GetLatency([out] unsigned long latency); void SetRate([in] int rate); // SetRenderRate void GetRate([out] int rate); // SetRenderRate + void SetTarget([in] int target); // SetRenderTarget void SetLowPowerVolume([in] float volume); // renderer only void GetLowPowerVolume([out] float volume); // renderer only void SetAudioEffectMode([in] int effectMode); // renderer only diff --git a/services/audio_service/server/include/renderer_in_server.h b/services/audio_service/server/include/renderer_in_server.h index 09475e5785..b988be914a 100644 --- a/services/audio_service/server/include/renderer_in_server.h +++ b/services/audio_service/server/include/renderer_in_server.h @@ -82,6 +82,7 @@ public: int32_t GetAudioPosition(uint64_t &framePos, uint64_t ×tamp, uint64_t &latency, int32_t base); int32_t GetLatency(uint64_t &latency); int32_t SetRate(int32_t rate); + int32_t SetTarget(int32_t target); int32_t SetLowPowerVolume(float volume); int32_t GetLowPowerVolume(float &volume); int32_t SetAudioEffectMode(int32_t effectMode); diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index 887418c13d..fad6532df7 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -1377,6 +1377,11 @@ int32_t RendererInServer::SetRate(int32_t rate) return stream_->SetRate(rate); } +int32_t RendererInServer::SetTarget(int32_t target) +{ + return SUCCESS; +} + int32_t RendererInServer::SetLowPowerVolume(float volume) { if (volume < MIN_FLOAT_VOLUME || volume > MAX_FLOAT_VOLUME) { -- Gitee From deacd2b836193b951a2972df0509c687e5f9f2cf Mon Sep 17 00:00:00 2001 From: sunshinglight Date: Wed, 3 Sep 2025 10:26:11 +0000 Subject: [PATCH 2/2] add rendertarget client api Signed-off-by: sunshinglight Change-Id: I645f6a628bca50c891cc78c01ce218dd46229e67 --- .../audiorenderer/napi_audio_renderer.cpp | 45 ++++++---------- frameworks/js/napi/common/napi_audio_enum.cpp | 21 ++++++++ frameworks/js/napi/common/napi_audio_enum.h | 6 ++- .../unittest/include/audio_renderer_mock.h | 2 + .../include/audio_renderer_private.h | 8 ++- .../include/shared_audio_renderer_wrapper.h | 10 ++++ .../audiorenderer/src/audio_renderer.cpp | 52 +++++-------------- .../src/renderer_in_client_unit_test.cpp | 2 + .../audiostream/include/i_audio_stream.h | 4 +- .../native/audiocommon/include/audio_errors.h | 6 +++ .../native/audiocommon/include/audio_info.h | 16 +++--- .../audiorenderer/include/audio_renderer.h | 35 ++++++------- .../include/renderer_in_client_private.h | 6 +-- .../client/src/renderer_in_client_public.cpp | 19 +++---- services/audio_service/idl/IIpcStream.idl | 2 +- .../server/include/ipc_stream_in_server.h | 3 +- .../server/include/renderer_in_server.h | 2 +- .../server/src/ipc_stream_in_server.cpp | 10 ++++ .../server/src/renderer_in_server.cpp | 11 ++-- .../client/capturer_in_client_unit_test.cpp | 2 + 20 files changed, 140 insertions(+), 122 deletions(-) diff --git a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp index e46fac7657..907b6ab60c 100644 --- a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp +++ b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp @@ -555,6 +555,8 @@ napi_value NapiAudioRenderer::GetRendererSamplingRate(napi_env env, napi_callbac napi_value NapiAudioRenderer::SetTarget(napi_env env, napi_callback_info info) { + CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySelfPermission(), + NapiAudioError::ThrowErrorAndReturn(env, NAPI_ERR_PERMISSION_DENIED), "No system permission"); auto context = std::make_shared(); if (context == nullptr) { AUDIO_ERR_LOG("SetTarget failed : no memory"); @@ -566,7 +568,7 @@ napi_value NapiAudioRenderer::SetTarget(napi_env env, napi_callback_info info) auto inputParser = [env, context](size_t argc, napi_value *argv) { NAPI_CHECK_ARGS_RETURN_VOID(context, argc >= ARGS_ONE, "invalid arguments", NAPI_ERR_INVALID_PARAM); - context->status = NapiParamUtils::GetValueUInt32(env, context->target, argv[PARAM0]); + context->status = NapiParamUtils::GetValueInt32(env, context->target, argv[PARAM0]); NAPI_CHECK_ARGS_RETURN_VOID(context, context->status == napi_ok, "get Target failed", NAPI_ERR_INVALID_PARAM); }; @@ -580,22 +582,24 @@ napi_value NapiAudioRenderer::SetTarget(napi_env env, napi_callback_info info) auto *napiAudioRenderer = objectGuard.GetPtr(); CHECK_AND_RETURN_LOG(CheckAudioRendererStatus(napiAudioRenderer, context), "context object state is error."); - if (context->target != 0 or context->target != 1) { + if (!NapiAudioEnum::IsLegalRenderTargetType(context->target)) { context->SignError(NAPI_ERR_INVALID_PARAM); return; } - context->intValue = napiAudioRenderer->audioRenderer_->SetTarget(context->target); + RenderTarget target = static_cast(context->target); + context->intValue = napiAudioRenderer->audioRenderer_->SetTarget(target); CHECK_AND_RETURN(context->intValue != SUCCESS); if (context->intValue == ERR_PERMISSION_DENIED) { context->SignError(NAPI_ERR_NO_PERMISSION); } else if (context->intValue == ERR_SYSTEM_PERMISSION_DENIED) { context->SignError(NAPI_ERR_PERMISSION_DENIED); - } else if (context->intValue == ERR_ILLEGAL_STATE) { + } else if (context->intValue == ERR_INJECT_TO_VOICE_COMMUNICATION_CAPTURE_BY_ILLEGAL_STATE) { context->SignError(NAPI_ERR_ILLEGAL_STATE); + } else if (context->intValue == ERR_INJECT_TO_VOICE_COMMUNICATION_CAPTURE_BY_ILLEGAL_STREAM) { + context->SignError(NAPI_ERR_UNSUPPORTED); } else { context->SignError(NAPI_ERR_SYSTEM); } - //todo NAPI_ERR_UNSUPPORTED }; auto complete = [env](napi_value &output) { @@ -606,30 +610,15 @@ napi_value NapiAudioRenderer::SetTarget(napi_env env, napi_callback_info info) napi_value NapiAudioRenderer::GetTarget(napi_env env, napi_callback_info info) { - auto context = std::make_shared(); - if (context == nullptr) { - AUDIO_ERR_LOG("GetTarget failed : no memory"); - NapiAudioError::ThrowError(env, "GetTarget failed : no memory", - NAPI_ERR_NO_MEMORY); - return NapiParamUtils::GetUndefinedValue(env); - } - - context->GetCbInfo(env, info); - - auto executor = [context]() { - CHECK_AND_RETURN_LOG(CheckContextStatus(context), "context object state is error."); - auto obj = reinterpret_cast(context->native); - ObjectRefMap objectGuard(obj); - auto *napiAudioRenderer = objectGuard.GetPtr(); - CHECK_AND_RETURN_LOG(CheckAudioRendererStatus(napiAudioRenderer, context), - "context object state is error."); - context->rendererSampleRate = napiAudioRenderer->audioRenderer_->GetTarget(); - }; + napi_value result = nullptr; + size_t argc = PARAM0; + auto *napiAudioRenderer = GetParamWithSync(env, info, argc, nullptr); + CHECK_AND_RETURN_RET_LOG(napiAudioRenderer!= nullptr, result, "napiAudioRenderer is nullptr"); + CHECK_AND_RETURN_RET_LOG(napiAudioRenderer->audioRenderer_ != nullptr, result, "audioRenderer_ is nullptr"); - auto complete = [env, context](napi_value &output) { - NapiParamUtils::SetValueUInt32(env, context->target, output); - }; - return NapiAsyncWork::Enqueue(env, context, "GetTarget", executor, complete); + int32_t target = napiAudioRenderer->audioRenderer_->GetTarget(); + NapiParamUtils::SetValueInt32(env, target, result); + return result; } napi_value NapiAudioRenderer::Start(napi_env env, napi_callback_info info) diff --git a/frameworks/js/napi/common/napi_audio_enum.cpp b/frameworks/js/napi/common/napi_audio_enum.cpp index bdc34f0084..f797c7dd6d 100644 --- a/frameworks/js/napi/common/napi_audio_enum.cpp +++ b/frameworks/js/napi/common/napi_audio_enum.cpp @@ -552,6 +552,11 @@ const std::map NapiAudioEnum::effectFlagMap = { {"CAPTURE_EFFECT_FLAG", CAPTURE_EFFECT_FLAG}, }; +const std::map NapiAudioEnum::renderTargetMap = { + {"PLAYBACK", PLAY_BACK}, + {"INJECT_TO_VOICE_COMMUNICATION_CAPTURE", INJECT_TO_VOICE_COMMUNICATION_CAPTURE}, +}; + NapiAudioEnum::NapiAudioEnum() : env_(nullptr) { } @@ -720,6 +725,7 @@ napi_status NapiAudioEnum::InitAudioEnum(napi_env env, napi_value exports) DECLARE_NAPI_PROPERTY("OutputDeviceChangeRecommendedAction", CreateEnumObject(env, outputDeviceChangeRecommendedActionMap)), DECLARE_NAPI_PROPERTY("EffectFlag", CreateEnumObject(env, effectFlagMap)), + DECLARE_NAPI_PROPERTY("RenderTarget", CreateEnumObject(env, renderTargetMap)), }; return napi_define_properties(env, exports, sizeof(static_prop) / sizeof(static_prop[0]), static_prop); } @@ -1183,6 +1189,21 @@ bool NapiAudioEnum::IsLegalCapturerType(int32_t type) return result; } +bool NapiAudioEnum::IsLegalRenderTargetType(int32_t type) +{ + bool result = false; + switch (type) { + case PLAY_BACK: + case INJECT_TO_VOICE_COMMUNICATION_CAPTURE: + result = true; + break; + default: + result = false; + break; + } + return result; +} + bool NapiAudioEnum::IsLegalInputArgumentVolType(int32_t inputType) { bool result = false; diff --git a/frameworks/js/napi/common/napi_audio_enum.h b/frameworks/js/napi/common/napi_audio_enum.h index ee12745a6d..27914c3dd7 100644 --- a/frameworks/js/napi/common/napi_audio_enum.h +++ b/frameworks/js/napi/common/napi_audio_enum.h @@ -124,9 +124,9 @@ public: }; enum RenderTarget { - PLAYBACK = 0, + PLAY_BACK = 0, INJECT_TO_VOICE_COMMUNICATION_CAPTURE = 1 - } + }; static napi_value Init(napi_env env, napi_value exports); static bool IsLegalInputArgumentInterruptMode(int32_t interruptMode); @@ -164,6 +164,7 @@ public: static bool IsLegalInputArgumentAudioLoopbackReverbPreset(int32_t preset); static bool IsLegalInputArgumentAudioLoopbackEqualizerPreset(int32_t preset); static bool IsLegalInputArgumentSessionScene(int32_t scene); + static bool IsLegalRenderTargetType(int32_t type); private: static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); @@ -310,6 +311,7 @@ private: static const std::map audioSessionStateChangeHintMap; static const std::map outputDeviceChangeRecommendedActionMap; static const std::map effectFlagMap; + static const std::map renderTargetMap; static std::unique_ptr sAudioParameters_; std::unique_ptr audioParameters_; diff --git a/frameworks/native/audioloopback/test/unittest/include/audio_renderer_mock.h b/frameworks/native/audioloopback/test/unittest/include/audio_renderer_mock.h index ba9c38d402..7e730edd71 100644 --- a/frameworks/native/audioloopback/test/unittest/include/audio_renderer_mock.h +++ b/frameworks/native/audioloopback/test/unittest/include/audio_renderer_mock.h @@ -124,6 +124,8 @@ public: MOCK_METHOD(void, SetInterruptEventCallbackType, (InterruptEventCallbackType callbackType), (override)); MOCK_METHOD(void, SetAudioHapticsSyncId, (int32_t audioHapticsSyncId), (override)); MOCK_METHOD(void, ResetFirstFrameState, (), (override)); + MOCK_METHOD(int32_t, SetTarget, (RenderTarget target), (const, override)); + MOCK_METHOD(RenderTarget, GetTarget, (), (const, override)); }; } // namespace AudioStandard diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index d427c99e81..fa9a828cbd 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -74,8 +74,6 @@ public: float GetLoudnessGain() const override; int32_t SetRenderRate(AudioRendererRate renderRate) const override; AudioRendererRate GetRenderRate() const override; - int32_t SetTarget(RenderTarget target) const override; - RenderTarget GetTarget() const override; int32_t SetRendererSamplingRate(uint32_t sampleRate) const override; uint32_t GetRendererSamplingRate() const override; int32_t SetRendererCallback(const std::shared_ptr &callback) override; @@ -108,6 +106,8 @@ public: float GetMaxStreamVolume() const override; int32_t GetCurrentOutputDevices(AudioDeviceDescriptor &deviceInfo) const override; uint32_t GetUnderflowCount() const override; + int32_t SetTarget(RenderTarget target) const override; + RenderTarget GetTarget() const override; int32_t RegisterOutputDeviceChangeWithInfoCallback( const std::shared_ptr &callback) override; @@ -165,10 +165,8 @@ public: static inline AudioStreamParams ConvertToAudioStreamParams(const AudioRendererParams params) { AudioStreamParams audioStreamParams; - audioStreamParams.format = params.sampleFormat; audioStreamParams.samplingRate = params.sampleRate; - audioStreamParams.customSampleRate = params.customSampleRate; audioStreamParams.channels = params.channelCount; audioStreamParams.encoding = params.encodingType; audioStreamParams.channelLayout = params.channelLayout; @@ -217,6 +215,7 @@ private: IAudioStream::SwitchInfo &info); bool GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo, RendererState previousState, IAudioStream::SwitchInfo &info); + bool ContinueAfterConcede(IAudioStream::StreamClass &targetClass, RestoreInfo restoreInfo); bool ContinueAfterSplit(RestoreInfo restoreInfo); bool InitTargetStream(IAudioStream::SwitchInfo &info, std::shared_ptr &audioStream); void HandleAudioInterruptWhenServerDied(); @@ -276,7 +275,6 @@ private: bool isDirectVoipSupported_ = false; bool isEnableVoiceModemCommunicationStartStream_ = false; RendererState state_ = RENDERER_INVALID; - RenderTarget target_ = PLAYBACK; std::optional speed_ = std::nullopt; std::optional pitch_ = std::nullopt; diff --git a/frameworks/native/audiorenderer/include/shared_audio_renderer_wrapper.h b/frameworks/native/audiorenderer/include/shared_audio_renderer_wrapper.h index 67cc3cde08..1d78193117 100644 --- a/frameworks/native/audiorenderer/include/shared_audio_renderer_wrapper.h +++ b/frameworks/native/audiorenderer/include/shared_audio_renderer_wrapper.h @@ -482,6 +482,16 @@ public: return sharedAudioRenderer_->SetInterruptEventCallbackType(callbackType); } + int32_t SetTarget(RenderTarget target) const override + { + return sharedAudioRenderer_->SetTarget(target); + } + + RenderTarget GetTarget() const override + { + return sharedAudioRenderer_->GetTarget(); + } + explicit SharedAudioRendererWrapper(std::shared_ptr renderer) : sharedAudioRenderer_(renderer) { } diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index d373ea52b9..20ad354c7c 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -1505,44 +1505,6 @@ AudioRendererRate AudioRendererPrivate::GetRenderRate() const return currentStream->GetRenderRate(); } -int32_t AudioRendererPrivate::SetTarget(RenderTarget target) const -{ - std::shared_ptr currentStream = GetInnerStream(); - CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr"); - int32_t ret = currentStream->SetRenderRate(renderRate); - CHECK_AND_RETURN_RET(ret == SUCCESS, ret); - float speed = 1.0f; - switch (renderRate) { - case RENDER_RATE_NORMAL: - speed = 1.0f; - break; - case RENDER_RATE_DOUBLE: - speed = 2.0f; - break; - case RENDER_RATE_HALF: - speed = 0.5f; - break; - default: - speed = 1.0f; - } - ret = currentStream->SetSpeed(speed); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("SetSpeed Failed, error: %{public}d", ret); - } - ret = currentStream->SetPitch(speed); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("SetPitch Failed, error: %{public}d", ret); - } - return SUCCESS; -} - -RenderTarget AudioRendererPrivate::GetRenderRate() const -{ - std::shared_ptr currentStream = GetInnerStream(); - CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_RATE_NORMAL, "audioStream_ is nullptr"); - return currentStream->GetRenderRate(); -} - int32_t AudioRendererPrivate::SetRendererSamplingRate(uint32_t sampleRate) const { std::shared_ptr currentStream = GetInnerStream(); @@ -2981,5 +2943,19 @@ int32_t AudioRendererPrivate::HandleCreateFastStreamError(AudioStreamParams &aud audioStream_->NotifyRouteUpdate(flag, networkId); return ret; } + +int32_t AudioRendererPrivate::SetTarget(RenderTarget target) const +{ + std::shared_ptr currentStream = GetInnerStream(); + CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr"); + return currentStream->SetRenderTarget(target); +} + +RenderTarget AudioRendererPrivate::GetTarget() const +{ + std::shared_ptr currentStream = GetInnerStream(); + CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, PLAY_BACK, "audioStream_ is nullptr"); + return currentStream->GetRenderTarget(); +} } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/audiorenderer/test/unittest/renderer_test/src/renderer_in_client_unit_test.cpp b/frameworks/native/audiorenderer/test/unittest/renderer_test/src/renderer_in_client_unit_test.cpp index 68fad1966e..97f60fe3c5 100644 --- a/frameworks/native/audiorenderer/test/unittest/renderer_test/src/renderer_in_client_unit_test.cpp +++ b/frameworks/native/audiorenderer/test/unittest/renderer_test/src/renderer_in_client_unit_test.cpp @@ -101,6 +101,8 @@ public: virtual int32_t SetOffloadMode(int32_t state, bool isAppBack) override { return 0; } // renderer only + virtual int32_t SetTarget(int32_t target, int32_t &ret) override { return 0; } // renderer only + virtual int32_t UnsetOffloadMode() override { return 0; } // renderer only virtual int32_t GetOffloadApproximatelyCacheTime(uint64_t ×tamp, uint64_t &paWriteIndex, diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index ca2d28aeaf..d0f4a7a722 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -162,12 +162,12 @@ public: virtual bool GetMute() = 0; virtual int32_t SetRenderRate(AudioRendererRate renderRate) = 0; virtual AudioRendererRate GetRenderRate() = 0; - virtual int32_t SetRenderTarget(RenderTarget target) = 0; - virtual RenderTarget GetRenderTarget() = 0; virtual int32_t SetStreamCallback(const std::shared_ptr &callback) = 0; virtual int32_t SetSpeed(float speed) = 0; virtual int32_t SetPitch(float pitch) = 0; virtual float GetSpeed() = 0; + virtual int32_t SetRenderTarget(RenderTarget target) { return 0; } + virtual RenderTarget GetRenderTarget() { return PLAY_BACK; } virtual void SetUnderflowCount(uint32_t underflowCount) = 0; virtual void SetOverflowCount(uint32_t overflowCount) = 0; diff --git a/interfaces/inner_api/native/audiocommon/include/audio_errors.h b/interfaces/inner_api/native/audiocommon/include/audio_errors.h index b41f8250d0..32fe3ce2fd 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_errors.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_errors.h @@ -180,6 +180,12 @@ const int32_t ERR_PRO_STREAM_NOT_SUPPORTED = BASE_AUDIO_ERR_OFFSET - 39; /** failed to set volume because isVolumeControlDisabled is true */ const int32_t ERR_SET_VOL_FAILED_BY_VOLUME_CONTROL_DISABLED = BASE_AUDIO_ERR_OFFSET - 40; +/** failed to inject because state is not illegal */ +const int32_t ERR_INJECT_TO_VOICE_COMMUNICATION_CAPTURE_BY_ILLEGAL_STATE = BASE_AUDIO_ERR_OFFSET - 41; + +/** failed to inject because stream is not normal */ +const int32_t ERR_INJECT_TO_VOICE_COMMUNICATION_CAPTURE_BY_ILLEGAL_STREAM = BASE_AUDIO_ERR_OFFSET - 42; + /** Unknown error */ const int32_t ERR_UNKNOWN = BASE_AUDIO_ERR_OFFSET - 200; } // namespace AudioStandard diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index fb8a4ae3d4..10ff96c5c8 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -304,14 +304,6 @@ enum AudioRendererRate { RENDER_RATE_HALF = 2, }; -/** - * Enumerates the audio playback target. - */ -enum RenderTarget { - PLAYBACK = 0, - INJECT_TO_VOICE_COMMUNICATION_CAPTURE = 1 -} - /** * media safe volume status */ @@ -1962,6 +1954,14 @@ enum XperfEventId : int32_t { XPERF_EVENT_FAULT = 3, XPERF_EVENT_MAX = 4, }; + +/** + * Enumerates the audio playback target + */ +enum RenderTarget { + PLAY_BACK = 0, + INJECT_TO_VOICE_COMMUNICATION_CAPTURE = 1 +}; } // namespace AudioStandard } // namespace OHOS #endif // AUDIO_INFO_H diff --git a/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h b/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h index 5488e49ffe..f89f22b158 100644 --- a/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h +++ b/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h @@ -587,26 +587,7 @@ public: * @since 8 */ virtual AudioRendererRate GetRenderRate() const = 0; - - /** - * @brief Set the render target - * - * @param target The target at which the stream needs to be rendered. - * @return Returns {@link SUCCESS} if render rate is successfully set; returns an error code - * defined in {@link audio_errors.h} otherwise. - * @since 22 - */ - virtual int32_t SetTarget(RenderTarget target) const = 0; - - /** - * @brief Obtains the current render target - * - * @return Returns current render target - * @since 22 - */ - virtual RenderTarget GetTarget() const = 0; - /** * @brief Set the render sampling rate * @@ -1139,6 +1120,22 @@ public: */ static bool CheckSupportedSamplingRates(uint32_t rates); + /** + * @brief Sef the render target + * @param target The target at which the stream needs to be rendered. + * @return Returns {@link SUCCESS} if render target is successfully set; returns an error code + * defined in {@link audio_errors.h} otherwise. + * @since 22 + */ + virtual int32_t SetTarget(RenderTarget target) const { return 0; }; + + /** + * @brief Obtains the current render target + * @return Returns current render target + * @since 22 + */ + virtual RenderTarget GetTarget() const { return PLAY_BACK; } + private: static void SendRendererCreateError(const StreamUsage &sreamUsage, const int32_t &errorCode); diff --git a/services/audio_service/client/include/renderer_in_client_private.h b/services/audio_service/client/include/renderer_in_client_private.h index 898d6b531f..c3b418801c 100644 --- a/services/audio_service/client/include/renderer_in_client_private.h +++ b/services/audio_service/client/include/renderer_in_client_private.h @@ -85,8 +85,6 @@ public: bool GetMute() override; int32_t SetRenderRate(AudioRendererRate renderRate) override; AudioRendererRate GetRenderRate() override; - int32_t SetRenderTarget(RenderTarget target) override; - RenderTarget GetRenderRate() override; int32_t SetStreamCallback(const std::shared_ptr &callback) override; int32_t SetRendererFirstFrameWritingCallback( const std::shared_ptr &callback) override; @@ -223,6 +221,8 @@ public: void NotifyRouteUpdate(uint32_t routeFlag, const std::string &networkId) override; bool GetStopFlag() const override; void SetAudioHapticsSyncId(const int32_t &audioHapticsSyncId) override; + int32_t SetRenderTarget(RenderTarget renderTarget) override; + RenderTarget GetRenderTarget() override; private: void RegisterTracker(const std::shared_ptr &proxyObj); @@ -316,7 +316,7 @@ private: bool streamTrackerRegistered_ = false; std::atomic needSetThreadPriority_ = true; - + RenderTarget renderTarget_ = PLAY_BACK; AudioStreamParams curStreamParams_ = {0}; // in plan next: replace it with AudioRendererParams AudioStreamParams streamParams_ = {0}; diff --git a/services/audio_service/client/src/renderer_in_client_public.cpp b/services/audio_service/client/src/renderer_in_client_public.cpp index c7d12e7b8e..f8a1775ef3 100644 --- a/services/audio_service/client/src/renderer_in_client_public.cpp +++ b/services/audio_service/client/src/renderer_in_client_public.cpp @@ -603,20 +603,21 @@ AudioRendererRate RendererInClientInner::GetRenderRate() return rendererRate_; } -int32_t RendererInClientInner::SetRenderTarget(RenderTarget target) + +int32_t RendererInClientInner::SetRenderTarget(RenderTarget renderTarget) { - if (renderTarget_ == target) { - AUDIO_INFO_LOG("Set same target"); - return SUCCESS; - } + CHECK_AND_RETURN_RET_LOG(renderTarget_ != renderTarget, SUCCESS, "Set same renderTarget"); CHECK_AND_RETURN_RET_LOG(ipcStream_ != nullptr, ERR_ILLEGAL_STATE, "ipcStream is not inited!"); - renderTarget_ = target; - return ipcStream_->SetTarget(target); + renderTarget_ = renderTarget; + int32_t ret = 0; + AUDIO_INFO_LOG("Set render target: %{public}d", renderTarget); + ipcStream_->SetTarget(renderTarget, ret); + return ret; } -AudioRendererRate RendererInClientInner::GetRenderTarget() +RenderTarget RendererInClientInner::GetRenderTarget() { - AUDIO_INFO_LOG("Get RenderTarget %{public}d", renderTarget_); + AUDIO_INFO_LOG("Get RenderRate %{public}d", renderTarget_); return renderTarget_; } diff --git a/services/audio_service/idl/IIpcStream.idl b/services/audio_service/idl/IIpcStream.idl index c72214e435..319760fdb0 100644 --- a/services/audio_service/idl/IIpcStream.idl +++ b/services/audio_service/idl/IIpcStream.idl @@ -40,7 +40,6 @@ interface IIpcStream { void GetLatency([out] unsigned long latency); void SetRate([in] int rate); // SetRenderRate void GetRate([out] int rate); // SetRenderRate - void SetTarget([in] int target); // SetRenderTarget void SetLowPowerVolume([in] float volume); // renderer only void GetLowPowerVolume([out] float volume); // renderer only void SetAudioEffectMode([in] int effectMode); // renderer only @@ -66,4 +65,5 @@ interface IIpcStream { void ResolveBufferBaseAndGetServerSpanSize([out] sharedptr buffer, [out] unsigned int spanSizeInFrame, [out] unsigned long engineTotalSizeInFrame); void SetAudioHapticsSyncId([in] int audioHapticsSyncId); + void SetTarget([in] int target, [out] int ret); //SetRenderTarget } \ No newline at end of file diff --git a/services/audio_service/server/include/ipc_stream_in_server.h b/services/audio_service/server/include/ipc_stream_in_server.h index 4f6993171b..c9887eb3a5 100644 --- a/services/audio_service/server/include/ipc_stream_in_server.h +++ b/services/audio_service/server/include/ipc_stream_in_server.h @@ -133,7 +133,8 @@ public: uint32_t &spanSizeInFrame, uint64_t &engineTotalSizeInFrame) override; int32_t SetAudioHapticsSyncId(int32_t audioHapticsSyncId) override; - + + int32_t SetTarget(int32_t target, int32_t &ret) override; // for inner-capturer std::shared_ptr GetRenderer(); std::shared_ptr GetCapturer(); diff --git a/services/audio_service/server/include/renderer_in_server.h b/services/audio_service/server/include/renderer_in_server.h index aafd99b232..83208aa6a8 100644 --- a/services/audio_service/server/include/renderer_in_server.h +++ b/services/audio_service/server/include/renderer_in_server.h @@ -83,7 +83,7 @@ public: int32_t GetSpeedPosition(uint64_t &framePos, uint64_t ×tamp, uint64_t &latency, int32_t base); int32_t GetLatency(uint64_t &latency); int32_t SetRate(int32_t rate); - int32_t SetTarget(int32_t target); + int32_t SetTarget(int32_t target, int32_t &ret); int32_t SetLowPowerVolume(float volume); int32_t GetLowPowerVolume(float &volume); int32_t SetAudioEffectMode(int32_t effectMode); diff --git a/services/audio_service/server/src/ipc_stream_in_server.cpp b/services/audio_service/server/src/ipc_stream_in_server.cpp index 4cf945ae8d..0b07d8e9c1 100644 --- a/services/audio_service/server/src/ipc_stream_in_server.cpp +++ b/services/audio_service/server/src/ipc_stream_in_server.cpp @@ -337,6 +337,16 @@ int32_t IpcStreamInServer::GetRate(int32_t &rate) return ERR_OPERATION_FAILED; } + int32_t IpcStreamInServer::SetTarget(int32_t target, int32_t &ret) +{ + if (mode_ == AUDIO_MODE_PLAYBACK && rendererInServer_ != nullptr) { + rendererInServer_->SetTarget(target, ret); + return ret; + } + AUDIO_ERR_LOG("SetTarget failed, invalid mode: %{public}d", static_cast(mode_)); + return ERR_OPERATION_FAILED; +} + int32_t IpcStreamInServer::SetLowPowerVolume(float volume) { if (mode_ == AUDIO_MODE_PLAYBACK && rendererInServer_ != nullptr) { diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index b3c108f177..8dcb627a8c 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -1412,11 +1412,6 @@ int32_t RendererInServer::SetRate(int32_t rate) return stream_->SetRate(rate); } -int32_t RendererInServer::SetTarget(int32_t target) -{ - return SUCCESS; -} - int32_t RendererInServer::SetLowPowerVolume(float volume) { if (volume < MIN_FLOAT_VOLUME || volume > MAX_FLOAT_VOLUME) { @@ -2279,5 +2274,11 @@ void RendererInServer::InitDupBuffer(int32_t innerCapId) AUDIO_INFO_LOG("InitDupBuffer success, innerCapId: %{public}d, stream sessionId: %{public}u", innerCapId, streamIndex_); } + +int32_t RendererInServer::SetTarget(int32_t target, int32_t &ret) +{ + ret = SUCCESS; + return SUCCESS; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp b/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp index 2bfdd3cf01..a303832def 100644 --- a/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp +++ b/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp @@ -157,6 +157,8 @@ public: virtual int32_t GetPrivacyType(int32_t &privacyType) override { return 0; } // renderer only virtual int32_t SetOffloadMode(int32_t state, bool isAppBack) override { return 0; } // renderer only + + virtual int32_t SetTarget(int32_t target, int32_t &ret) override { return 0; } // renderer only virtual int32_t UnsetOffloadMode() override { return 0; } // renderer only -- Gitee