From 3c3e974769858f42216e200e4c2d3822bb9cb504 Mon Sep 17 00:00:00 2001 From: sunshinglight Date: Tue, 2 Sep 2025 14:13:20 +0000 Subject: [PATCH] add rendertarget client-api Signed-off-by: sunshinglight Change-Id: I0d9202d5e7ba4687034af6a8bf60c539c8c9390a --- .../audiorenderer/napi_audio_renderer.cpp | 70 +++++++++++++++++++ .../napi/audiorenderer/napi_audio_renderer.h | 3 + frameworks/js/napi/common/napi_audio_enum.cpp | 21 ++++++ frameworks/js/napi/common/napi_audio_enum.h | 7 ++ .../include/audio_renderer_private.h | 2 + .../include/shared_audio_renderer_wrapper.h | 10 +++ .../audiorenderer/src/audio_renderer.cpp | 14 ++++ .../src/renderer_in_client_unit_test.cpp | 2 + .../audiostream/include/i_audio_stream.h | 2 + .../native/audiocommon/include/audio_errors.h | 6 ++ .../native/audiocommon/include/audio_info.h | 8 +++ .../audiorenderer/include/audio_renderer.h | 16 +++++ .../include/renderer_in_client_private.h | 4 +- .../client/src/renderer_in_client_public.cpp | 18 +++++ services/audio_service/idl/IIpcStream.idl | 1 + .../server/include/ipc_stream_in_server.h | 3 +- .../server/include/renderer_in_server.h | 1 + .../server/src/ipc_stream_in_server.cpp | 10 +++ .../server/src/renderer_in_server.cpp | 6 ++ 19 files changed, 202 insertions(+), 2 deletions(-) diff --git a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp index 6f69353376..907b6ab60c 100644 --- a/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp +++ b/frameworks/js/napi/audiorenderer/napi_audio_renderer.cpp @@ -121,6 +121,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(), @@ -551,6 +553,74 @@ 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) +{ + 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"); + 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::GetValueInt32(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 (!NapiAudioEnum::IsLegalRenderTargetType(context->target)) { + context->SignError(NAPI_ERR_INVALID_PARAM); + return; + } + 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_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); + } + }; + + 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) +{ + 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"); + + int32_t target = napiAudioRenderer->audioRenderer_->GetTarget(); + NapiParamUtils::SetValueInt32(env, target, result); + return result; +} + 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 beed0e5ec7..4158c560b8 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; @@ -134,6 +135,8 @@ private: static napi_value SetSpeed(napi_env env, napi_callback_info info); static napi_value GetSpeed(napi_env env, napi_callback_info info); static napi_value GetState(napi_env env, napi_callback_info info); + static napi_value SetTarget(napi_env env, napi_callback_info info); + static napi_value GetTarget(napi_env env, napi_callback_info info); static napi_value On(napi_env env, napi_callback_info info); static napi_value Off(napi_env env, napi_callback_info info); static napi_value SetSilentModeAndMixWithOthers(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 c5fcfdf3fa..c95afbfeb0 100644 --- a/frameworks/js/napi/common/napi_audio_enum.cpp +++ b/frameworks/js/napi/common/napi_audio_enum.cpp @@ -547,6 +547,11 @@ const std::map NapiAudioEnum::outputDeviceChangeRecommende {"DEVICE_CHANGE_RECOMMEND_TO_STOP", static_cast(OutputDeviceChangeRecommendedAction::RECOMMEND_TO_STOP)}, }; +const std::map NapiAudioEnum::renderTargetMap = { + {"PLAYBACK", PLAY_BACK}, + {"INJECT_TO_VOICE_COMMUNICATION_CAPTURE", INJECT_TO_VOICE_COMMUNICATION_CAPTURE}, +}; + NapiAudioEnum::NapiAudioEnum() : env_(nullptr) { } @@ -714,6 +719,7 @@ napi_status NapiAudioEnum::InitAudioEnum(napi_env env, napi_value exports) CreateEnumObject(env, audioSessionStateChangeHintMap)), DECLARE_NAPI_PROPERTY("OutputDeviceChangeRecommendedAction", CreateEnumObject(env, outputDeviceChangeRecommendedActionMap)), + DECLARE_NAPI_PROPERTY("RenderTarget", CreateEnumObject(env, renderTargetMap)), }; return napi_define_properties(env, exports, sizeof(static_prop) / sizeof(static_prop[0]), static_prop); } @@ -1177,6 +1183,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 c18a11233c..adb8346112 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 { + 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); static bool IsLegalInputArgumentAudioEffectMode(int32_t audioEffectMode); @@ -159,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); @@ -304,6 +310,7 @@ private: static const std::map audioSessionSceneMap; static const std::map audioSessionStateChangeHintMap; static const std::map outputDeviceChangeRecommendedActionMap; + static const std::map renderTargetMap; static std::unique_ptr sAudioParameters_; std::unique_ptr audioParameters_; diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index 2754afce03..cde2163016 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; 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 2f69947299..215d3507b8 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -2952,5 +2952,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 b76dfcce4b..e745adfd7d 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 174a5e1e9b..3890878bc1 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -165,6 +165,8 @@ public: 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 d984c5f385..3d5ceb9765 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -1944,6 +1944,14 @@ enum BoostTriggerMethod : uint32_t { METHOD_WRITE_OR_READ, METHOD_MAX }; + +/** + * 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 6a03db4231..02269c74fa 100644 --- a/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h +++ b/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h @@ -1110,6 +1110,22 @@ public: */ virtual void ResetFirstFrameState() {}; + /** + * @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 = 0; + + /** + * @brief Obtains the current render target + * @return Returns current render target + * @since 22 + */ + virtual RenderTarget GetTarget() const = 0; + 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 e0c30bdfaa..08d3d6ae69 100644 --- a/services/audio_service/client/include/renderer_in_client_private.h +++ b/services/audio_service/client/include/renderer_in_client_private.h @@ -221,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); @@ -313,7 +315,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 31d93feac5..826597632e 100644 --- a/services/audio_service/client/src/renderer_in_client_public.cpp +++ b/services/audio_service/client/src/renderer_in_client_public.cpp @@ -596,6 +596,24 @@ AudioRendererRate RendererInClientInner::GetRenderRate() return rendererRate_; } + +int32_t RendererInClientInner::SetRenderTarget(RenderTarget renderTarget) +{ + 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_ = renderTarget; + int32_t ret = 0; + AUDIO_INFO_LOG("Set render target: %{public}d", renderTarget); + ipcStream_->SetTarget(renderTarget, ret); + return ret; +} + +RenderTarget RendererInClientInner::GetRenderTarget() +{ + AUDIO_INFO_LOG("Get RenderRate %{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 c45da9db89..319760fdb0 100644 --- a/services/audio_service/idl/IIpcStream.idl +++ b/services/audio_service/idl/IIpcStream.idl @@ -65,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 d713046253..12526b10b5 100644 --- a/services/audio_service/server/include/renderer_in_server.h +++ b/services/audio_service/server/include/renderer_in_server.h @@ -83,6 +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 &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 8510840934..00ee38cca7 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 6acdb91a9b..dd0c940b7d 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -2249,5 +2249,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 -- Gitee