From ba591ffa62e945d525dc3b3d616b52c5d24d75b0 Mon Sep 17 00:00:00 2001 From: m30053149 Date: Wed, 10 Sep 2025 19:25:35 +0800 Subject: [PATCH] update device type for endpoint Signed-off-by: m30053149 --- .../include/sink/fast_audio_render_sink.h | 2 ++ .../include/sink/i_audio_render_sink.h | 5 +++++ .../sink/fast_audio_render_sink.cpp | 5 +++++ .../libaudio_process_service.versionscript | 1 + .../audio_service/server/include/audio_endpoint.h | 2 ++ .../server/include/audio_endpoint_private.h | 2 ++ .../audio_service/server/include/audio_service.h | 1 + .../audio_service/server/src/audio_endpoint.cpp | 15 ++++++++++++++- .../audio_service/server/src/audio_server.cpp | 6 ++++++ .../audio_service/server/src/audio_service.cpp | 10 ++++++++++ 10 files changed, 48 insertions(+), 1 deletion(-) diff --git a/frameworks/native/hdiadapter_new/include/sink/fast_audio_render_sink.h b/frameworks/native/hdiadapter_new/include/sink/fast_audio_render_sink.h index 6f9040181d..ac3b657219 100644 --- a/frameworks/native/hdiadapter_new/include/sink/fast_audio_render_sink.h +++ b/frameworks/native/hdiadapter_new/include/sink/fast_audio_render_sink.h @@ -78,6 +78,8 @@ public: void SetDmDeviceType(uint16_t dmDeviceType, DeviceType deviceType) override; + std::string GetAdapterName(void) override; + private: int32_t GetMmapBufferInfo(int &fd, uint32_t &totalSizeInframe, uint32_t &spanSizeInframe, uint32_t &byteSizePerFrame, uint32_t &syncInfoSize) override; diff --git a/frameworks/native/hdiadapter_new/include/sink/i_audio_render_sink.h b/frameworks/native/hdiadapter_new/include/sink/i_audio_render_sink.h index 1f4e31a405..4db8b96e19 100644 --- a/frameworks/native/hdiadapter_new/include/sink/i_audio_render_sink.h +++ b/frameworks/native/hdiadapter_new/include/sink/i_audio_render_sink.h @@ -133,6 +133,11 @@ public: virtual void SetDmDeviceType(uint16_t dmDeviceType, DeviceType deviceType) {} virtual void RegisterCurrentDeviceCallback(const std::function &callback) {} + + virtual std::string GetAdapterName(void) + { + return ""; + } }; } // namespace AudioStandard diff --git a/frameworks/native/hdiadapter_new/sink/fast_audio_render_sink.cpp b/frameworks/native/hdiadapter_new/sink/fast_audio_render_sink.cpp index b9eeb82c26..8a95bcf468 100644 --- a/frameworks/native/hdiadapter_new/sink/fast_audio_render_sink.cpp +++ b/frameworks/native/hdiadapter_new/sink/fast_audio_render_sink.cpp @@ -713,5 +713,10 @@ void FastAudioRenderSink::PreparePosition(void) #endif } +std::string FastAudioRenderSink::GetAdapterName(void) +{ + return attr_.adapterName; +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/libaudio_process_service.versionscript b/services/audio_service/libaudio_process_service.versionscript index 7230d436ac..ba79fd156f 100644 --- a/services/audio_service/libaudio_process_service.versionscript +++ b/services/audio_service/libaudio_process_service.versionscript @@ -88,6 +88,7 @@ *SendInterruptEventToAudioServer*; *SendInterruptEventToAudioService*; *GetPrivacyType*; + *UpdateDeviceType*; local: *; }; \ No newline at end of file diff --git a/services/audio_service/server/include/audio_endpoint.h b/services/audio_service/server/include/audio_endpoint.h index 9ec75f6c52..044b60f471 100644 --- a/services/audio_service/server/include/audio_endpoint.h +++ b/services/audio_service/server/include/audio_endpoint.h @@ -104,6 +104,8 @@ public: virtual ~AudioEndpoint() = default; + virtual int32_t UpdateDeviceType(DeviceType type) = 0; + protected: // SamplingRate EncodingType SampleFormat Channel AudioStreamInfo dstStreamInfo_; diff --git a/services/audio_service/server/include/audio_endpoint_private.h b/services/audio_service/server/include/audio_endpoint_private.h index 6a653198c9..60e71942a9 100644 --- a/services/audio_service/server/include/audio_endpoint_private.h +++ b/services/audio_service/server/include/audio_endpoint_private.h @@ -122,6 +122,7 @@ public: void BindCore(); void CheckWakeUpTime(int64_t &wakeUpTime); + int32_t UpdateDeviceType(DeviceType type) override; private: AudioProcessConfig GetInnerCapConfig(); void StartThread(const IAudioSinkAttr &attr); @@ -339,6 +340,7 @@ private: std::string dumpHdiName_ = ""; mutable int64_t volumeDataCount_ = 0; std::string logUtilsTag_ = ""; + std::string endpointKey_ = ""; // for get amplitude float maxAmplitude_ = 0; diff --git a/services/audio_service/server/include/audio_service.h b/services/audio_service/server/include/audio_service.h index d11ddc3a16..4cb554bd01 100644 --- a/services/audio_service/server/include/audio_service.h +++ b/services/audio_service/server/include/audio_service.h @@ -83,6 +83,7 @@ public: int32_t NotifyStreamVolumeChanged(AudioStreamType streamType, float volume); #ifdef SUPPORT_LOW_LATENCY + void UpdateDeviceType(DeviceType type); sptr GetAudioProcess(const AudioProcessConfig &config); // override for ProcessReleaseCallback, do release process work. int32_t OnProcessRelease(IAudioProcessStream *process, bool isSwitchStream = false) override; diff --git a/services/audio_service/server/src/audio_endpoint.cpp b/services/audio_service/server/src/audio_endpoint.cpp index 9b26ea56fe..ed52aceda4 100644 --- a/services/audio_service/server/src/audio_endpoint.cpp +++ b/services/audio_service/server/src/audio_endpoint.cpp @@ -60,6 +60,18 @@ namespace { const int32_t DUP_DEFAULT_LEN = 20; // 20 -> 20ms } +int32_t AudioEndpointInner::UpdateDeviceType(DeviceType type) +{ + CHECK_AND_RETURN_RET_LOG(fastRenderId_ != HDI_INVALID_ID, ERROR, "fastRenderId_ is HDI_INVALID_ID"); + std::shared_ptr sink = HdiAdapterManager::GetInstance().GetRenderSink(fastRenderId_); + CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "sink is nullptr"); + std::string adapterName = sink->GetAdapterName(); + CHECK_AND_RETURN_RET(adapterName == "primary", ERROR); + deviceInfo_.deviceType_ = type; + AUDIO_INFO_LOG("update deviceType to: %{public}d", type); + return SUCCESS; +} + std::string AudioEndpoint::GenerateEndpointKey(AudioDeviceDescriptor &deviceInfo, int32_t endpointFlag) { // All primary sinks share one endpoint @@ -114,7 +126,7 @@ AudioEndpointInner::AudioEndpointInner(EndpointType type, uint64_t id, std::string AudioEndpointInner::GetEndpointName() { - return GenerateEndpointKey(deviceInfo_, id_); + return endpointKey_; } int32_t AudioEndpointInner::SetVolume(AudioStreamType streamType, float volume) @@ -592,6 +604,7 @@ bool AudioEndpointInner::Config(const AudioDeviceDescriptor &deviceInfo, AudioSt bool ret = readTimeModel_.ConfigSampleRate(dstStreamInfo_.samplingRate); CHECK_AND_RETURN_RET_LOG(ret != false, false, "Config LinearPosTimeModel failed."); StartThread(attr); + endpointKey_ = GenerateEndpointKey(deviceInfo_, id_); return true; } diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index fe72497d99..c422feca3d 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -1415,9 +1415,15 @@ int32_t AudioServer::SetIORoutes(DeviceType type, DeviceFlag flag, std::vectorUpdateDeviceType(type); +#endif sink->UpdateActiveDevice(deviceTypes); PolicyHandler::GetInstance().SetActiveOutputDevice(type); } else if (flag == DeviceFlag::ALL_DEVICES_FLAG) { +#ifdef SUPPORT_LOW_LATENCY + AudioService::GetInstance()->UpdateDeviceType(type); +#endif UpdateDeviceForAllSource(source, type); sink->UpdateActiveDevice(deviceTypes); PolicyHandler::GetInstance().SetActiveOutputDevice(type); diff --git a/services/audio_service/server/src/audio_service.cpp b/services/audio_service/server/src/audio_service.cpp index 386cc20d3c..227fe8a686 100644 --- a/services/audio_service/server/src/audio_service.cpp +++ b/services/audio_service/server/src/audio_service.cpp @@ -83,6 +83,16 @@ AudioService::~AudioService() } #ifdef SUPPORT_LOW_LATENCY +void AudioService::UpdateDeviceType(DeviceType type) +{ + std::lock_guard lock(processListMutex_); + + for (const auto &pair : endpointList_) { + CHECK_AND_CONTINUE_LOG(pair.second != nullptr, "pair.second is nullptr"); + pair.second->UpdateDeviceType(type); + } +} + int32_t AudioService::OnProcessRelease(IAudioProcessStream *process, bool isSwitchStream) { std::lock_guard processListLock(processListMutex_); -- Gitee