From 50c473449fde5b228c93d42e8f5df8398b2cb896 Mon Sep 17 00:00:00 2001 From: byndyx Date: Sat, 27 Jul 2024 11:45:22 +0800 Subject: [PATCH] circuit Signed-off-by: byndyx --- sa_profile/daudio.cfg | 3 +- .../include/daudio_echo_cannel_manager.h | 9 +++- .../managersource/include/dmic_dev.h | 2 + .../src/daudio_echo_cannel_manager.cpp | 53 +++++++++++++------ .../managersource/src/dmic_dev.cpp | 17 +++--- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/sa_profile/daudio.cfg b/sa_profile/daudio.cfg index c2cf6cc7..6574cd09 100644 --- a/sa_profile/daudio.cfg +++ b/sa_profile/daudio.cfg @@ -9,7 +9,8 @@ "ohos.permission.MICROPHONE", "ohos.permission.DISTRIBUTED_DATASYNC", "ohos.permission.ACCESS_SERVICE_DM", - "ohos.permission.ACCESS_DISTRIBUTED_HARDWARE" + "ohos.permission.ACCESS_DISTRIBUTED_HARDWARE", + "ohos.permission.CAPTURE_VOICE_DOWNLINK_AUDIO" ], "ondemand" : true, "secon" : "u:r:daudio:s0" diff --git a/services/audiomanager/managersource/include/daudio_echo_cannel_manager.h b/services/audiomanager/managersource/include/daudio_echo_cannel_manager.h index 7fde6e33..4b168f76 100644 --- a/services/audiomanager/managersource/include/daudio_echo_cannel_manager.h +++ b/services/audiomanager/managersource/include/daudio_echo_cannel_manager.h @@ -48,6 +48,7 @@ public: private: void OnReadData(size_t length) override; void AecProcessData(); + void CircuitStart(); int32_t ProcessMicData(const std::shared_ptr &pipeInData, std::shared_ptr &micOutData); @@ -66,18 +67,22 @@ private: private: const std::string DUMP_DAUDIO_AEC_REFERENCE_FILENAME = "dump_aec_reference_signal.pcm"; const std::string DUMP_DAUDIO_AEC_RECORD_FILENAME = "dump_aec_record_signal.pcm"; + const std::string DUMP_DAUDIO_AEC_CIRCUIT_FILENAME = "dump_aec_circuit.pcm"; + const std::string DUMP_DAUDIO_AEC_AFTER_PROCESS_FILENAME = "dump_aec_after_process.pcm"; std::unique_ptr audioCapturer_ = nullptr; std::atomic isAecRunning_ = false; std::thread aecProcessThread_; static constexpr const char* AECTHREADNAME = "AecProcessThread"; + std::atomic isCircuitStartRunning_ = false; + std::thread circuitStartThread_; std::shared_ptr devCallback_; void *aecHandler_ = nullptr; AecEffector *aecProcessor_ = nullptr; constexpr static size_t COND_WAIT_TIME_MS = 10; constexpr static size_t WAIT_MIC_DATA_TIME_US = 5000; - constexpr static size_t REF_QUEUE_MAX_SIZE = 10; + constexpr static size_t REF_QUEUE_MAX_SIZE = 4; std::queue> refDataQueue_; std::queue> outDataQueue_; std::mutex refQueueMtx_; @@ -86,6 +91,8 @@ private: std::atomic isStarted = false; FILE *dumpFileRef_ = nullptr; FILE *dumpFileRec_ = nullptr; + FILE *dumpFileAft_ = nullptr; + FILE *dumpFileCir_ = nullptr; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 0bfd1a84..17b6ca90 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -101,6 +101,8 @@ private: const std::string DUMP_DAUDIO_MIC_READ_FROM_BUF_NAME = "dump_source_mic_read_from_trans.pcm"; const std::string DUMP_DAUDIO_LOWLATENCY_MIC_FROM_BUF_NAME = "dump_source_mic_write_to_ashmem.pcm"; const int32_t ASHMEM_MAX_LEN = 2 * 4096; + static constexpr size_t NOTIFY_WAIT_FRAMES = 5; + static constexpr uint32_t NOTIFY_WAIT_TIME_US = 20000; std::weak_ptr audioEventCallback_; std::mutex dataQueueMtx_; diff --git a/services/audiomanager/managersource/src/daudio_echo_cannel_manager.cpp b/services/audiomanager/managersource/src/daudio_echo_cannel_manager.cpp index 43ce9dee..bae10290 100644 --- a/services/audiomanager/managersource/src/daudio_echo_cannel_manager.cpp +++ b/services/audiomanager/managersource/src/daudio_echo_cannel_manager.cpp @@ -57,23 +57,34 @@ int32_t DAudioEchoCannelManager::SetUp(const AudioCommonParam param, (void) param; devCallback_ = callback; DHLOGI("SetUp EchoCannel."); - int32_t ret = LoadAecProcessor(); - if (ret != DH_SUCCESS) { - DHLOGE("LoadAECProcessor error."); - return ERR_DH_AUDIO_FAILED; + + if (!isCircuitStartRunning_.load()) { + isCircuitStartRunning_.store(true); + circuitStartThread_ = std::thread([this]() { this->CircuitStart(); }); + circuitStartThread_.detach(); + DHLOGI("circuitStartThread_ is on."); } - ret = InitAecProcessor(); - CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "Init Aec Processor error. ret: %{public}d.", ret); DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, DUMP_DAUDIO_AEC_REFERENCE_FILENAME, &dumpFileRef_); DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, DUMP_DAUDIO_AEC_RECORD_FILENAME, &dumpFileRec_); + DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, DUMP_DAUDIO_AEC_CIRCUIT_FILENAME, &dumpFileCir_); + DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, DUMP_DAUDIO_AEC_AFTER_PROCESS_FILENAME, &dumpFileAft_); + return DH_SUCCESS; +} - ret = AudioCaptureSetUp(); - CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "Init Get Reference error. ret: %{public}d.", ret); - +void DAudioEchoCannelManager::CircuitStart() +{ + DHLOGI("Start CircuitStart thread."); + int32_t ret = AudioCaptureSetUp(); + CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "Init Get Reference error. ret: %{public}d.", ret); ret = AudioCaptureStart(); - CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "Start Get Reference error. ret: %{public}d.", ret); - - return DH_SUCCESS; + CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "Start Get Reference error. ret: %{public}d.", ret); + ret = LoadAecProcessor(); + CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "LoadAECProcessor error."); + ret = InitAecProcessor(); + CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "Init Aec Processor error. ret: %{public}d.", ret); + ret = StartAecProcessor(); + CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "Start Aec Processor error. ret: %{public}d.", ret); + DHLOGI("CircuitStart thread end success."); } int32_t DAudioEchoCannelManager::Start() @@ -110,17 +121,19 @@ int32_t DAudioEchoCannelManager::Release() UnLoadAecProcessor(); DumpFileUtil::CloseDumpFile(&dumpFileRef_); DumpFileUtil::CloseDumpFile(&dumpFileRec_); + DumpFileUtil::CloseDumpFile(&dumpFileAft_); + DumpFileUtil::CloseDumpFile(&dumpFileCir_); isStarted.store(false); + isCircuitStartRunning_.store(false); return DH_SUCCESS; } int32_t DAudioEchoCannelManager::OnMicDataReceived(const std::shared_ptr &pipeInData) { - DHLOGI("GetMicDataBeforeAec."); - CHECK_AND_RETURN_RET_LOG(pipeInData == nullptr, ERR_DH_AUDIO_NULLPTR, "pipeInData is nullptr."); + DHLOGD("GetMicDataBeforeAec."); CHECK_AND_RETURN_RET_LOG(devCallback_ == nullptr, ERR_DH_AUDIO_NULLPTR, "callback is nullptr."); - CHECK_AND_RETURN_RET_LOG(aecProcessor_ == nullptr, ERR_DH_AUDIO_NULLPTR, "aec processor is nullptr."); if (isStarted.load()) { + CHECK_AND_RETURN_RET_LOG(pipeInData == nullptr, ERR_DH_AUDIO_NULLPTR, "pipeInData is nullptr."); auto micOutData = std::make_shared(pipeInData->Size()); int32_t ret = ProcessMicData(pipeInData, micOutData); if (ret != DH_SUCCESS) { @@ -129,6 +142,7 @@ int32_t DAudioEchoCannelManager::OnMicDataReceived(const std::shared_ptr(pipeInData->Data()), pipeInData->Size()); + DumpFileUtil::WriteDumpFile(dumpFileAft_, static_cast(micOutData->Data()), micOutData->Size()); devCallback_->OnDecodeTransDataDone(micOutData); } else { devCallback_->OnDecodeTransDataDone(pipeInData); @@ -191,6 +205,9 @@ void DAudioEchoCannelManager::AecProcessData() if (ret != DH_SUCCESS) { DHLOGE("aec effect process pipeInReferenceData fail. errocode:%{public}d", ret); } + if (!isStarted.load()) { + isStarted.store(true); + } if (refOutDataExt != nullptr) { free(refOutDataExt); refOutDataExt = nullptr; @@ -223,7 +240,7 @@ void DAudioEchoCannelManager::OnReadData(size_t length) } audioCapturer_->Enqueue(bufDesc); - + DumpFileUtil::WriteDumpFile(dumpFileCir_, static_cast(audioData->Data()), audioData->Size()); std::lock_guard lock(refQueueMtx_); while (refDataQueue_.size() > REF_QUEUE_MAX_SIZE) { DHLOGE("Ref Data queue overflow. max size : 10"); @@ -256,6 +273,10 @@ int32_t DAudioEchoCannelManager::AudioCaptureSetUp() StreamUsage::STREAM_USAGE_MEDIA); capturerOptions.playbackCaptureConfig.filterOptions.usages.push_back(AudioStandard:: StreamUsage::STREAM_USAGE_UNKNOWN); + capturerOptions.playbackCaptureConfig.filterOptions.usages.push_back(AudioStandard:: + StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION); + capturerOptions.playbackCaptureConfig.filterOptions.usages.push_back(AudioStandard:: + StreamUsage::STREAM_USAGE_MOVIE); audioCapturer_ = AudioStandard::AudioCapturer::Create(capturerOptions); CHECK_AND_RETURN_RET_LOG(audioCapturer_ == nullptr, ERR_DH_AUDIO_FAILED, "Audio capture create failed."); diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 6eba16ab..e60897f9 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -212,6 +212,13 @@ int32_t DMicDev::NotifyEvent(const int32_t streamId, const AudioEvent &event) switch (event.type) { case AudioEventType::AUDIO_START: curStatus_ = AudioStatus::STATUS_START; + while (isTransReady_.load()) { + std::lock_guard lock(dataQueueMtx_); + if (dataQueue_.size() >= NOTIFY_WAIT_FRAMES) { + break; + } + usleep(NOTIFY_WAIT_TIME_US); + } isExistedEmpty_.store(false); break; case AudioEventType::AUDIO_STOP: @@ -235,7 +242,7 @@ int32_t DMicDev::SetUp() DHLOGE("Mic trans set up failed. ret: %{public}d.", ret); return ret; } - echoCannelOn_ = false; + echoCannelOn_ = true; #ifdef ECHO_CANNEL_ENABLE if (echoCannelOn_ && echoManager_ == nullptr) { echoManager_ = std::make_shared(); @@ -270,14 +277,6 @@ int32_t DMicDev::Start() DHLOGE("Wait channel open timeout(%{public}ds).", CHANNEL_WAIT_SECONDS); return ERR_DH_AUDIO_SA_WAIT_TIMEOUT; } -#ifdef ECHO_CANNEL_ENABLE - CHECK_NULL_RETURN(echoManager_, DH_SUCCESS); - ret = echoManager_->Start(); - if (ret != DH_SUCCESS) { - DHLOGE("Echo manager start failed. ret: %{public}d.", ret); - return ret; - } -#endif isOpened_.store(true); return DH_SUCCESS; } -- Gitee