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 6f9040181dd9a68576daf6362c567359f72863e5..ac3b657219377a6fbfeb5400c4b8de21da8176a8 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 1f4e31a40542cb21243bf813b8ddab22c0c03c2d..4db8b96e193fe621ca1aa1ec8e3801a98133bfa9 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 b9eeb82c2638c35ab238a37dd8a1d5698aebf5cc..8a95bcf468923cd4d996f467249ba41c16177991 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 7230d436ac3f00c6cf768a6f8cb57a0a56cf431c..ba79fd156ffb16d0dc14c4ccc4980fe5ac24e862 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 9ec75f6c52180df53bed524c0487c086a81e5ce5..044b60f47145672f09d5dff5bbc9bab26aad4523 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 6a653198c96d20fe488a09f19cd80ce66f6cf758..60e71942a9be9e039bcb8fc6c8f3579d2709983c 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 d11ddc3a1636bf9e1ded98ec7f36ba1b1d44dbf4..4cb554bd01818b551acfc338aa0ff62dcc59c15d 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 9b26ea56fe5e16007cade70acf802fd6a5ee9564..ed52aceda4f058c839b2e10ca30ac5a96456d70b 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 fe72497d9914196b6e3b2097039000c3f1888cce..c422feca3d04b3db3a973a08af3e346b2491e2f0 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 386cc20d3c25d0854eca47669dac361b717c91a2..227fe8a68689626703200f320cecba0f4c351eef 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_);