From 0efc52b4c9bf1a54a801fd17bca6c57ef162da54 Mon Sep 17 00:00:00 2001 From: liyuhang Date: Sat, 9 Mar 2024 12:59:07 +0000 Subject: [PATCH 1/3] Add spatialization and headtracking Signed-off-by: liyuhang Change-Id: Ie060a8b5225b189549159c24cc755bd52a21e99a --- .../native/audiocommon/include/audio_info.h | 8 +- .../client/include/ipc_stream_proxy.h | 2 + .../client/src/ipc_stream_proxy.cpp | 17 ++++ .../client/src/renderer_in_client.cpp | 93 +++++++++++++++++++ .../audio_service/common/include/ipc_stream.h | 3 + .../server/include/i_renderer_stream.h | 1 + .../server/include/ipc_stream_in_server.h | 2 + .../server/include/ipc_stream_stub.h | 3 + .../server/include/pa_adapter_manager.h | 1 + .../server/include/pa_renderer_stream_impl.h | 2 + .../server/include/renderer_in_server.h | 1 + .../server/src/ipc_stream_in_server.cpp | 10 ++ .../server/src/ipc_stream_stub.cpp | 8 ++ .../server/src/pa_adapter_manager.cpp | 30 +++--- .../server/src/pa_renderer_stream_impl.cpp | 23 +++++ .../server/src/renderer_in_server.cpp | 5 + 16 files changed, 196 insertions(+), 13 deletions(-) diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index a3a61a0ec6..3623c017a8 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -279,17 +279,23 @@ struct AudioRendererInfo { ContentType contentType = CONTENT_TYPE_UNKNOWN; StreamUsage streamUsage = STREAM_USAGE_UNKNOWN; int32_t rendererFlags = 0; + bool spatializationEnabled = false; + bool headTrackingEnabled = false; bool Marshalling(Parcel &parcel) const { return parcel.WriteInt32(static_cast(contentType)) && parcel.WriteInt32(static_cast(streamUsage)) - && parcel.WriteInt32(rendererFlags); + && parcel.WriteInt32(rendererFlags) + && parcel.WriteBool(spatializationEnabled) + && parcel.WriteBool(headTrackingEnabled); } void Unmarshalling(Parcel &parcel) { contentType = static_cast(parcel.ReadInt32()); streamUsage = static_cast(parcel.ReadInt32()); rendererFlags = parcel.ReadInt32(); + spatializationEnabled = parcel.ReadBool(); + headTrackingEnabled = parcel.ReadBool(); } }; diff --git a/services/audio_service/client/include/ipc_stream_proxy.h b/services/audio_service/client/include/ipc_stream_proxy.h index eead0c16ab..004fd298b0 100644 --- a/services/audio_service/client/include/ipc_stream_proxy.h +++ b/services/audio_service/client/include/ipc_stream_proxy.h @@ -75,6 +75,8 @@ public: uint64_t &cacheTimeDsp, uint64_t &cacheTimePa) override; // renderer only int32_t OffloadSetVolume(float volume) override; // renderer only + + int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) override; // renderer only private: static inline BrokerDelegator delegator_; }; diff --git a/services/audio_service/client/src/ipc_stream_proxy.cpp b/services/audio_service/client/src/ipc_stream_proxy.cpp index 03f6b3bb96..f3e6021d9f 100644 --- a/services/audio_service/client/src/ipc_stream_proxy.cpp +++ b/services/audio_service/client/src/ipc_stream_proxy.cpp @@ -418,5 +418,22 @@ int32_t IpcStreamProxy::OffloadSetVolume(float volume) return ret; } + +int32_t IpcStreamProxy::UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(GetDescriptor()), ERROR, "Write descriptor failed!"); + + data.WriteBool(spatializationEnabled); + data.WriteBool(headTrackingEnabled); + int ret = Remote()->SendRequest(IpcStreamMsg::ON_UPDATE_SPATIALIZATION_STATE, data, reply, option); + CHECK_AND_RETURN_RET_LOG(ret == AUDIO_OK, ret, "failed, ipc error: %{public}d", ret); + ret = reply.ReadInt32(); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "failed, error: %{public}d", ret); + return ret; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/client/src/renderer_in_client.cpp b/services/audio_service/client/src/renderer_in_client.cpp index 02235f6a35..bca85ea172 100644 --- a/services/audio_service/client/src/renderer_in_client.cpp +++ b/services/audio_service/client/src/renderer_in_client.cpp @@ -50,6 +50,8 @@ #include "callback_handler.h" #include "audio_speed.h" #include "audio_spatial_channel_converter.h" +#include "audio_policy_manager.h" +#include "audio_spatialization_manager.h" namespace OHOS { namespace AudioStandard { @@ -74,6 +76,7 @@ static const int32_t SHORT_TIMEOUT_IN_MS = 20; // ms static constexpr int CB_QUEUE_CAPACITY = 3; constexpr int32_t MAX_BUFFER_SIZE = 100000; } +class SpatializationStateChangeCallbackImpl; class RendererInClientInner : public RendererInClient, public IStreamListener, public IHandler, public std::enable_shared_from_this { public: @@ -203,6 +206,8 @@ public: void HandleRenderMarkReachedEvent(int64_t rendererMarkPosition); void HandleRenderPeriodReachedEvent(int64_t rendererPeriodNumber); + void OnSpatializationStateChange(const AudioSpatializationState &spatializationState); + private: void RegisterTracker(const std::shared_ptr &proxyObj); void UpdateTracker(const std::string &updateCase); @@ -227,6 +232,11 @@ private: // for callback mode. Check status if not running, wait for start or release. bool WaitForRunning(); int32_t WriteInner(uint8_t *buffer, size_t bufferSize); + + int32_t RegisterSpatializationStateEventListener(); + + int32_t UnregisterSpatializationStateEventListener(uint32_t sessionID); + private: AudioStreamType eStreamType_; int32_t appUid_; @@ -344,6 +354,12 @@ private: uint64_t offloadStartReadPos_ = 0; int64_t offloadStartHandleTime_ = 0; + std::string spatializationEnabled_ = "Invalid"; + std::string headTrackingEnabled_ = "Invalid"; + uint32_t spatializationRegisteredSessionID_ = 0; + bool firstSpatializationRegistered_ = true; + std::shared_ptr spatializationStateChangeCallback_ = nullptr; + enum { STATE_CHANGE_EVENT = 0, RENDERER_MARK_REACHED_EVENT, @@ -367,6 +383,17 @@ private: }; }; +class SpatializationStateChangeCallbackImpl : public AudioSpatializationStateChangeCallback { +public: + SpatializationStateChangeCallbackImpl(); + virtual ~SpatializationStateChangeCallbackImpl(); + + void OnSpatializationStateChange(const AudioSpatializationState &spatializationState) override; + void SetRendererInClientPtr(std::shared_ptr rendererInClientPtr); +private: + std::weak_ptr rendererInClientPtr_; +}; + std::shared_ptr RendererInClient::GetInstance(AudioStreamType eStreamType, int32_t appUid) { return std::make_shared(eStreamType, appUid); @@ -438,6 +465,10 @@ void RendererInClientInner::SetRendererInfo(const AudioRendererInfo &rendererInf rendererInfo_.streamUsage == STREAM_USAGE_NOTIFICATION) { effectMode_ = EFFECT_NONE; } + AudioSpatializationState spatializationState = + AudioPolicyManager::GetInstance().GetSpatializationState(rendererInfo_.streamUsage); + rendererInfo_.spatializationEnabled = spatializationState.spatializationEnabled; + rendererInfo_.headTrackingEnabled = spatializationState.headTrackingEnabled; AUDIO_INFO_LOG("SetRendererInfo with flag %{public}d", rendererInfo_.rendererFlags); } @@ -522,6 +553,7 @@ int32_t RendererInClientInner::SetAudioStreamInfo(const AudioStreamParams info, DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpOutFile_, &dumpOutFd_); RegisterTracker(proxyObj); + RegisterSpatializationStateEventListener(); return SUCCESS; } @@ -2075,6 +2107,67 @@ IAudioStream::StreamClass RendererInClientInner::GetStreamClass() { return PA_STREAM; } + +void RendererInClientInner::OnSpatializationStateChange(const AudioSpatializationState &spatializationState) +{ + CHECK_AND_RETURN_LOG(ipcStream_ != nullptr, "Object ipcStream is nullptr"); + CHECK_AND_RETURN_LOG(ipcStream_->UpdateSpatializationState(spatializationState.spatializationEnabled, + spatializationState.headTrackingEnabled) == SUCCESS, "Update spatialization state failed"); +} + +int32_t RendererInClientInner::RegisterSpatializationStateEventListener() +{ + if (firstSpatializationRegistered_) { + firstSpatializationRegistered_ = false; + } else { + UnregisterSpatializationStateEventListener(spatializationRegisteredSessionID_); + } + + if (!spatializationStateChangeCallback_) { + spatializationStateChangeCallback_ = std::make_shared(); + CHECK_AND_RETURN_RET_LOG(spatializationStateChangeCallback_, ERROR, "Memory Allocation Failed !!"); + } + spatializationStateChangeCallback_->SetRendererInClientPtr(shared_from_this()); + + int32_t ret = AudioPolicyManager::GetInstance().RegisterSpatializationStateEventListener( + sessionId_, rendererInfo_.streamUsage, spatializationStateChangeCallback_); + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "RegisterSpatializationStateEventListener failed"); + spatializationRegisteredSessionID_ = sessionId_; + + return SUCCESS; +} + +int32_t RendererInClientInner::UnregisterSpatializationStateEventListener(uint32_t sessionID) +{ + int32_t ret = AudioPolicyManager::GetInstance().UnregisterSpatializationStateEventListener(sessionID); + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "UnregisterSpatializationStateEventListener failed"); + return SUCCESS; +} + +SpatializationStateChangeCallbackImpl::SpatializationStateChangeCallbackImpl() +{ + AUDIO_INFO_LOG("Instance create"); +} + +SpatializationStateChangeCallbackImpl::~SpatializationStateChangeCallbackImpl() +{ + AUDIO_INFO_LOG("Instance destory"); +} + +void SpatializationStateChangeCallbackImpl::SetRendererInClientPtr( + std::shared_ptr rendererInClientPtr) +{ + rendererInClientPtr_ = rendererInClientPtr; +} + +void SpatializationStateChangeCallbackImpl::OnSpatializationStateChange( + const AudioSpatializationState &spatializationState) +{ + std::shared_ptr rendererInClient = rendererInClientPtr_.lock(); + if (rendererInClient != nullptr) { + rendererInClient->OnSpatializationStateChange(spatializationState); + } +} } // namespace AudioStandard } // namespace OHOS #endif // FAST_AUDIO_STREAM_H diff --git a/services/audio_service/common/include/ipc_stream.h b/services/audio_service/common/include/ipc_stream.h index 5519a8573b..64bc1b93d8 100644 --- a/services/audio_service/common/include/ipc_stream.h +++ b/services/audio_service/common/include/ipc_stream.h @@ -83,6 +83,8 @@ public: virtual int32_t OffloadSetVolume(float volume) = 0; // renderer only + virtual int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) = 0; // rendererOnly + // IPC code. enum IpcStreamMsg : uint32_t { ON_REGISTER_STREAM_LISTENER = 0, @@ -109,6 +111,7 @@ public: ON_UNSET_OFFLOAD_MODE, ON_GET_OFFLOAD_APPROXIMATELY_CACHE_TIME, ON_SET_OFFLOAD_VOLUME, + ON_UPDATE_SPATIALIZATION_STATE, IPC_STREAM_MAX_MSG }; diff --git a/services/audio_service/server/include/i_renderer_stream.h b/services/audio_service/server/include/i_renderer_stream.h index 4834db479e..a43eea82fc 100644 --- a/services/audio_service/server/include/i_renderer_stream.h +++ b/services/audio_service/server/include/i_renderer_stream.h @@ -52,6 +52,7 @@ public: uint64_t &cacheTimeDsp, uint64_t &cacheTimePa) = 0; virtual int32_t OffloadSetVolume(float volume) = 0; virtual size_t GetWritableSize() = 0; + virtual int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) = 0; }; } // namespace AudioStandard } // namespace OHOS 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 f038b686df..8419b1ed5b 100644 --- a/services/audio_service/server/include/ipc_stream_in_server.h +++ b/services/audio_service/server/include/ipc_stream_in_server.h @@ -98,6 +98,8 @@ public: int32_t OffloadSetVolume(float volume) override; // renderer only + int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) override; // renderer only + private: int32_t ConfigRenderer(); int32_t ConfigCapturer(); diff --git a/services/audio_service/server/include/ipc_stream_stub.h b/services/audio_service/server/include/ipc_stream_stub.h index 377e27840c..96149aa144 100644 --- a/services/audio_service/server/include/ipc_stream_stub.h +++ b/services/audio_service/server/include/ipc_stream_stub.h @@ -55,6 +55,8 @@ private: int32_t HandleGetOffloadApproximatelyCacheTime(MessageParcel &data, MessageParcel &reply); int32_t HandleOffloadSetVolume(MessageParcel &data, MessageParcel &reply); + int32_t HandleUpdateSpatializationState(MessageParcel &data, MessageParcel &reply); + using HandlerFunc = int32_t(IpcStreamStub::*)(MessageParcel &data, MessageParcel &reply); // Using the same order in IpcStreamMsg::Code when add func! static inline HandlerFunc funcList_[IpcStreamMsg::IPC_STREAM_MAX_MSG] = { @@ -82,6 +84,7 @@ private: &IpcStreamStub::HandleUnsetOffloadMode, &IpcStreamStub::HandleGetOffloadApproximatelyCacheTime, &IpcStreamStub::HandleOffloadSetVolume, + &IpcStreamStub::HandleUpdateSpatializationState, }; }; } // namespace AudioStandard diff --git a/services/audio_service/server/include/pa_adapter_manager.h b/services/audio_service/server/include/pa_adapter_manager.h index cee809b9be..985510f7f2 100644 --- a/services/audio_service/server/include/pa_adapter_manager.h +++ b/services/audio_service/server/include/pa_adapter_manager.h @@ -82,6 +82,7 @@ private: int32_t InitPaContext(); int32_t HandleMainLoopStart(); pa_stream *InitPaStream(AudioProcessConfig processConfig, uint32_t sessionId, bool isRecording); + bool IsEffectNone(StreamUsage streamUsage); int32_t SetPaProplist(pa_proplist *propList, pa_channel_map &map, AudioProcessConfig &processConfig, const std::string &streamName, uint32_t sessionId); std::shared_ptr CreateRendererStream(AudioProcessConfig processConfig, pa_stream *paStream); diff --git a/services/audio_service/server/include/pa_renderer_stream_impl.h b/services/audio_service/server/include/pa_renderer_stream_impl.h index 77677e55e4..910238a494 100644 --- a/services/audio_service/server/include/pa_renderer_stream_impl.h +++ b/services/audio_service/server/include/pa_renderer_stream_impl.h @@ -61,6 +61,8 @@ public: size_t GetWritableSize() override; // offload end + int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) override; + private: static void PAStreamWriteCb(pa_stream *stream, size_t length, void *userdata); static void PAStreamMovedCb(pa_stream *stream, void *userdata); diff --git a/services/audio_service/server/include/renderer_in_server.h b/services/audio_service/server/include/renderer_in_server.h index f9b872c5d5..059e761b87 100644 --- a/services/audio_service/server/include/renderer_in_server.h +++ b/services/audio_service/server/include/renderer_in_server.h @@ -56,6 +56,7 @@ public: int32_t GetOffloadApproximatelyCacheTime(uint64_t &timeStamp, uint64_t &paWriteIndex, uint64_t &cacheTimeDsp, uint64_t &cacheTimePa); int32_t OffloadSetVolume(float volume); + int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled); int32_t Init(); int32_t ConfigServerBuffer(); 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 1fb5ec74e2..8ae9efeddd 100644 --- a/services/audio_service/server/src/ipc_stream_in_server.cpp +++ b/services/audio_service/server/src/ipc_stream_in_server.cpp @@ -359,5 +359,15 @@ int32_t IpcStreamInServer::OffloadSetVolume(float volume) } return rendererInServer_->OffloadSetVolume(volume); } + +int32_t IpcStreamInServer::UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) +{ + if (mode_ != AUDIO_MODE_PLAYBACK || rendererInServer_ == nullptr) { + AUDIO_ERR_LOG("failed, invalid mode: %{public}d, or rendererInServer_ is null: %{public}d,", + static_cast(mode_), rendererInServer_ == nullptr); + return ERR_OPERATION_FAILED; + } + return rendererInServer_->UpdateSpatializationState(spatializationEnabled, headTrackingEnabled); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/ipc_stream_stub.cpp b/services/audio_service/server/src/ipc_stream_stub.cpp index 6b99b5e537..3fa61984ab 100644 --- a/services/audio_service/server/src/ipc_stream_stub.cpp +++ b/services/audio_service/server/src/ipc_stream_stub.cpp @@ -259,5 +259,13 @@ int32_t IpcStreamStub::HandleOffloadSetVolume(MessageParcel &data, MessageParcel return AUDIO_OK; } + +int32_t IpcStreamStub::HandleUpdateSpatializationState(MessageParcel &data, MessageParcel &reply) +{ + bool spatializationEnabled = data.ReadBool(); + bool headTrackingEnabled = data.ReadBool(); + reply.WriteInt32(UpdateSpatializationState(spatializationEnabled, headTrackingEnabled)); + return AUDIO_OK; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/pa_adapter_manager.cpp b/services/audio_service/server/src/pa_adapter_manager.cpp index 0515ed3f28..59ddf73aff 100644 --- a/services/audio_service/server/src/pa_adapter_manager.cpp +++ b/services/audio_service/server/src/pa_adapter_manager.cpp @@ -333,16 +333,19 @@ pa_stream *PaAdapterManager::InitPaStream(AudioProcessConfig processConfig, uint return paStream; } +bool PaAdapterManager::IsEffectNone(StreamUsage streamUsage) +{ + if (streamUsage == STREAM_USAGE_SYSTEM || streamUsage == STREAM_USAGE_DTMF || + streamUsage == STREAM_USAGE_ENFORCED_TONE || streamUsage == STREAM_USAGE_ULTRASONIC || + streamUsage == STREAM_USAGE_NAVIGATION || streamUsage == STREAM_USAGE_NOTIFICATION) { + return true; + } + return false; +} + int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &map, AudioProcessConfig &processConfig, const std::string &streamName, uint32_t sessionId) { - bool isEffectNone = false; - StreamUsage mStreamUsage = processConfig.rendererInfo.streamUsage; - if (mStreamUsage == STREAM_USAGE_SYSTEM || mStreamUsage == STREAM_USAGE_DTMF || - mStreamUsage == STREAM_USAGE_ENFORCED_TONE || mStreamUsage == STREAM_USAGE_ULTRASONIC || - mStreamUsage == STREAM_USAGE_NAVIGATION || mStreamUsage == STREAM_USAGE_NOTIFICATION) { - isEffectNone = true; - } // for remote audio device router filter pa_proplist_sets(propList, "stream.sessionID", std::to_string(sessionId).c_str()); pa_proplist_sets(propList, "stream.client.uid", std::to_string(processConfig.appInfo.appUid).c_str()); @@ -351,7 +354,8 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m pa_proplist_sets(propList, "media.name", streamName.c_str()); const std::string effectSceneName = GetEffectSceneName(processConfig.streamType); pa_proplist_sets(propList, "scene.type", effectSceneName.c_str()); - pa_proplist_sets(propList, "scene.mode", isEffectNone ? "EFFECT_NONE" : "EFFECT_DEFAULT"); + pa_proplist_sets(propList, "scene.mode", + IsEffectNone(processConfig.rendererInfo.streamUsage) ? "EFFECT_NONE" : "EFFECT_DEFAULT"); float mVolumeFactor = 1.0f; float mPowerVolumeFactor = 1.0f; pa_proplist_sets(propList, "stream.volumeFactor", std::to_string(mVolumeFactor).c_str()); @@ -366,6 +370,10 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m AudioPrivacyType privacyType = processConfig.privacyType; pa_proplist_sets(propList, "stream.privacyType", std::to_string(privacyType).c_str()); pa_proplist_sets(propList, "stream.usage", std::to_string(processConfig.rendererInfo.streamUsage).c_str()); + pa_proplist_sets(propList, "spatialization.enabled", + std::to_string(processConfig.rendererInfo.spatializationEnabled).c_str()); + pa_proplist_sets(propList, "headtracking.enabled", + std::to_string(processConfig.rendererInfo.headTrackingEnabled).c_str()); } else if (processConfig.audioMode == AUDIO_MODE_RECORD) { pa_proplist_sets(propList, "stream.isInnerCapturer", std::to_string(processConfig.isInnerCapturer).c_str()); pa_proplist_sets(propList, "stream.isWakeupCapturer", std::to_string(processConfig.isWakeupCapturer).c_str()); @@ -383,10 +391,8 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m pa_channel_map_init(&map); map.channels = processConfig.streamInfo.channels; uint32_t channelsInLayout = ConvertChLayoutToPaChMap(processConfig.streamInfo.channelLayout, map); - if (channelsInLayout != processConfig.streamInfo.channels || channelsInLayout == 0) { - AUDIO_ERR_LOG("Invalid channel Layout"); - return ERR_INVALID_PARAM; - } + CHECK_AND_RETURN_RET_LOG(channelsInLayout == processConfig.streamInfo.channels && channelsInLayout == 0, + ERR_INVALID_PARAM, "Invalid channel Layout"); return SUCCESS; } diff --git a/services/audio_service/server/src/pa_renderer_stream_impl.cpp b/services/audio_service/server/src/pa_renderer_stream_impl.cpp index 92b305d713..4f6bae24bc 100644 --- a/services/audio_service/server/src/pa_renderer_stream_impl.cpp +++ b/services/audio_service/server/src/pa_renderer_stream_impl.cpp @@ -732,6 +732,29 @@ int32_t PaRendererStreamImpl::OffloadSetVolume(float volume) return audioRendererSinkInstance->SetVolume(volume, 0); } +int32_t PaRendererStreamImpl::UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) +{ + PaLockGuard lock(mainloop_); + if (CheckReturnIfStreamInvalid(paStream_, ERR_ILLEGAL_STATE) < 0) { + return ERR_ILLEGAL_STATE; + } + + pa_proplist *propList = pa_proplist_new(); + if (propList == nullptr) { + AUDIO_ERR_LOG("pa_proplist_new failed"); + return ERR_OPERATION_FAILED; + } + + pa_proplist_sets(propList, "spatialization.enabled", std::to_string(spatializationEnabled).c_str()); + pa_proplist_sets(propList, "headtracking.enabled", std::to_string(headTrackingEnabled).c_str()); + pa_operation *updatePropOperation = pa_stream_proplist_update(paStream_, PA_UPDATE_REPLACE, propList, + nullptr, nullptr); + pa_proplist_free(propList); + pa_operation_unref(updatePropOperation); + + return SUCCESS; +} + int32_t PaRendererStreamImpl::OffloadGetPresentationPosition(uint64_t& frames, int64_t& timeSec, int64_t& timeNanoSec) { auto *audioRendererSinkInstance = static_cast (IAudioRendererSink::GetInstance( diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index 69e81b28fc..93d1d245ee 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -538,5 +538,10 @@ int32_t RendererInServer::OffloadSetVolume(float volume) { return stream_->OffloadSetVolume(volume); } + +int32_t RendererInServer::UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) +{ + return stream_->UpdateSpatializationState(spatializationEnabled, headTrackingEnabled); +} } // namespace AudioStandard } // namespace OHOS -- Gitee From c35d907c669440e902110a9f64bd817562c1425a Mon Sep 17 00:00:00 2001 From: Li Yuhang Date: Wed, 13 Mar 2024 07:36:54 +0000 Subject: [PATCH 2/3] Modify Signed-off-by: Li Yuhang --- services/audio_service/common/src/audio_process_config.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/audio_service/common/src/audio_process_config.cpp b/services/audio_service/common/src/audio_process_config.cpp index 0f0c91d8d0..bbf6af16e4 100644 --- a/services/audio_service/common/src/audio_process_config.cpp +++ b/services/audio_service/common/src/audio_process_config.cpp @@ -45,6 +45,8 @@ int32_t ProcessConfig::WriteConfigToParcel(const AudioProcessConfig &config, Mes parcel.WriteInt32(config.rendererInfo.contentType); parcel.WriteInt32(config.rendererInfo.streamUsage); parcel.WriteInt32(config.rendererInfo.rendererFlags); + parcel.WriteBool(config.rendererInfo.spatializationEnabled); + parcel.WriteBool(config.rendererInfo.headTrackingEnabled); //AudioPrivacyType parcel.WriteInt32(config.privacyType); @@ -84,6 +86,8 @@ int32_t ProcessConfig::ReadConfigFromParcel(AudioProcessConfig &config, MessageP config.rendererInfo.contentType = static_cast(parcel.ReadInt32()); config.rendererInfo.streamUsage = static_cast(parcel.ReadInt32()); config.rendererInfo.rendererFlags = parcel.ReadInt32(); + config.rendererInfo.spatializationEnabled = parcel.ReadBool(); + config.rendererInfo.headTrackingEnabled = parcel.ReadBool(); //AudioPrivacyType config.privacyType = static_cast(parcel.ReadInt32()); -- Gitee From 1611d12996d577e224f615fb85fe9b215f86974f Mon Sep 17 00:00:00 2001 From: Li Yuhang Date: Wed, 13 Mar 2024 10:05:26 +0000 Subject: [PATCH 3/3] Modify Signed-off-by: Li Yuhang Change-Id: I241c7dec2fa83b4c7b101c19bbb76f2ac4c0c691 --- services/audio_service/server/src/pa_adapter_manager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/audio_service/server/src/pa_adapter_manager.cpp b/services/audio_service/server/src/pa_adapter_manager.cpp index 59ddf73aff..7fa8f0ab93 100644 --- a/services/audio_service/server/src/pa_adapter_manager.cpp +++ b/services/audio_service/server/src/pa_adapter_manager.cpp @@ -366,7 +366,6 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m if (processConfig.audioMode == AUDIO_MODE_PLAYBACK) { pa_proplist_sets(propList, "stream.flush", "false"); - pa_proplist_sets(propList, "spatialization.enabled", "0"); AudioPrivacyType privacyType = processConfig.privacyType; pa_proplist_sets(propList, "stream.privacyType", std::to_string(privacyType).c_str()); pa_proplist_sets(propList, "stream.usage", std::to_string(processConfig.rendererInfo.streamUsage).c_str()); @@ -391,7 +390,7 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m pa_channel_map_init(&map); map.channels = processConfig.streamInfo.channels; uint32_t channelsInLayout = ConvertChLayoutToPaChMap(processConfig.streamInfo.channelLayout, map); - CHECK_AND_RETURN_RET_LOG(channelsInLayout == processConfig.streamInfo.channels && channelsInLayout == 0, + CHECK_AND_RETURN_RET_LOG(channelsInLayout == processConfig.streamInfo.channels && channelsInLayout != 0, ERR_INVALID_PARAM, "Invalid channel Layout"); return SUCCESS; } -- Gitee