diff --git a/frameworks/native/audioeffect/include/audio_enhance_chain.h b/frameworks/native/audioeffect/include/audio_enhance_chain.h index 51c0f0d6897c9e73ffda39058a4be49a45c31c80..76fe86423fe4d278cb0ff596bef843c130b9168f 100644 --- a/frameworks/native/audioeffect/include/audio_enhance_chain.h +++ b/frameworks/native/audioeffect/include/audio_enhance_chain.h @@ -91,6 +91,7 @@ public: int32_t SetEnhanceProperty(const std::string &effect, const std::string &property); int32_t SetEnhanceParamToHandle(AudioEffectHandle handle); bool IsDefaultChain(); + int32_t SetInputDevice(const std::string &inputDevice); private: void InitAudioEnhanceChain(); diff --git a/frameworks/native/audioeffect/src/audio_enhance_chain.cpp b/frameworks/native/audioeffect/src/audio_enhance_chain.cpp index 5f5deeae4335c1497e361d363108b37c453b40f5..2123e61d1eda192994132153457228ea833714c6 100644 --- a/frameworks/native/audioeffect/src/audio_enhance_chain.cpp +++ b/frameworks/native/audioeffect/src/audio_enhance_chain.cpp @@ -32,11 +32,6 @@ const uint32_t BITLENGTH = 8; const uint32_t MILLISECOND = 1000; const uint32_t DEFAULT_FRAMELENGTH = 20; const uint32_t DEFAULT_SAMPLE_RATE = 48000; -const uint32_t DEFAULT_DATAFORMAT = 16; -const uint32_t DEFAULT_EC_NUM = 0; -const uint32_t DEFAULT_MIC_NUM = 4; -const uint32_t DEFAULT_MIC_REF_NUM = 4; -const uint32_t DEFAULT_OUT_NUM = 4; AudioEnhanceChain::AudioEnhanceChain(const std::string &scene, const AudioEnhanceParamAdapter &algoParam, const AudioEnhanceDeviceAttr &deviceAttr, const bool defaultFlag) @@ -61,8 +56,17 @@ void AudioEnhanceChain::InitAudioEnhanceChain() enhanceLibHandles_.clear(); standByEnhanceHandles_.clear(); - algoSupportedConfig_ = {DEFAULT_FRAMELENGTH, DEFAULT_SAMPLE_RATE, DEFAULT_DATAFORMAT, DEFAULT_MIC_NUM, - DEFAULT_EC_NUM, DEFAULT_MIC_REF_NUM, DEFAULT_OUT_NUM}; + algoSupportedConfig_ = {DEFAULT_FRAMELENGTH, deviceAttr_.micRate, deviceAttr_.micFormat * BITLENGTH, + deviceAttr_.micChannels, deviceAttr_.ecChannels, deviceAttr_.micRefChannels, deviceAttr_.micChannels}; + + uint32_t byteLenPerFrame = DEFAULT_FRAMELENGTH * (deviceAttr_.micRate / MILLISECOND) * deviceAttr_.micFormat; + algoAttr_ = {deviceAttr_.micFormat, deviceAttr_.micChannels, byteLenPerFrame}; + + algoCache_.input.resize(algoAttr_.byteLenPerFrame * algoAttr_.batchLen); + algoCache_.output.resize(algoAttr_.byteLenPerFrame * deviceAttr_.micChannels); + AUDIO_INFO_LOG("micNum: %{public}u byteLenPerFrame: %{public}u inputsize:%{public}zu outputsize:%{public}zu", + algoSupportedConfig_.micNum, byteLenPerFrame, algoCache_.input.size(), algoCache_.output.size()); + if (count(NEED_EC_SCENE.begin(), NEED_EC_SCENE.end(), sceneType_)) { needEcFlag_ = true; } @@ -117,6 +121,27 @@ void AudioEnhanceChain::ReleaseEnhanceChain() enhanceLibHandles_.clear(); } +int32_t AudioEnhanceChain::SetInputDevice(const std::string &inputDevice) +{ + if (inputDevice.size() == 0) { + return SUCCESS; + } + algoParam_.preDevice = inputDevice; + AUDIO_INFO_LOG("update input device %{public}s", inputDevice.c_str()); + std::lock_guard lock(chainMutex_); + int32_t size = standByEnhanceHandles_.size(); + AudioEffectTransInfo cmdInfo = {}; + AudioEffectTransInfo replyInfo = {}; + for (int32_t index = 0; index < size; index++) { + auto &handle = standByEnhanceHandles_[index]; + CHECK_AND_RETURN_RET_LOG(SetEnhanceParamToHandle(handle) == SUCCESS, ERROR, + "[%{public}s] effect EFFECT_CMD_SET_PARAM fail", sceneType_.c_str()); + CHECK_AND_RETURN_RET_LOG((*handle)->command(handle, EFFECT_CMD_INIT, &cmdInfo, &replyInfo) == 0, ERROR, + "[%{public}s] effect EFFECT_CMD_INIT fail", sceneType_.c_str()); + } + return SUCCESS; +} + int32_t AudioEnhanceChain::SetEnhanceParamToHandle(AudioEffectHandle handle) { AudioEffectTransInfo cmdInfo = {}; @@ -199,9 +224,9 @@ int32_t AudioEnhanceChain::UpdateAlgoConfig() algoCache_.input.resize(algoAttr_.byteLenPerFrame * algoAttr_.batchLen); algoCache_.output.resize(algoAttr_.byteLenPerFrame * algoSupportedConfig_.outNum); AUDIO_INFO_LOG("micNum: %{public}u ecNum: %{public}u micRefNum: %{public}u outNum: %{public}u \ - byteLenPerFrame: %{public}u", + byteLenPerFrame: %{public}u inputsize:%{public}zu outputsize:%{public}zu", algoSupportedConfig_.micNum, algoSupportedConfig_.ecNum, algoSupportedConfig_.micRefNum, - algoSupportedConfig_.outNum, byteLenPerFrame); + algoSupportedConfig_.outNum, byteLenPerFrame, algoCache_.input.size(), algoCache_.output.size()); return SUCCESS; } @@ -242,6 +267,8 @@ uint32_t AudioEnhanceChain::GetAlgoBufferSizeMicRef() int32_t AudioEnhanceChain::DeinterleaverData(uint8_t *src, uint32_t channel, uint8_t *dst, uint32_t offset) { + CHECK_AND_RETURN_RET_LOG(src != nullptr, ERROR, "src is nullptr"); + CHECK_AND_RETURN_RET_LOG(dst != nullptr, ERROR, "dst is nullptr"); int32_t ret = 0; uint32_t idx = 0; for (uint32_t i = 0; i < algoAttr_.byteLenPerFrame / algoAttr_.bitDepth; ++i) { @@ -261,19 +288,26 @@ int32_t AudioEnhanceChain::GetOneFrameInputData(std::unique_ptr & CHECK_AND_RETURN_RET_LOG(enhanceBuffer != nullptr, ERROR, "enhance buffer is null"); uint32_t offset = 0; - int32_t ret = DeinterleaverData(enhanceBuffer->ecBuffer.data(), deviceAttr_.ecChannels, &algoCache_.input[offset], - offset); - CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in ec channel memcpy"); - - offset += algoAttr_.byteLenPerFrame * deviceAttr_.ecChannels; - ret = DeinterleaverData(enhanceBuffer->micBufferIn.data(), deviceAttr_.micChannels, &algoCache_.input[offset], - offset); - CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in mic channel memcpy"); - - offset += algoAttr_.byteLenPerFrame * deviceAttr_.micChannels; - ret = DeinterleaverData(enhanceBuffer->micRefBuffer.data(), deviceAttr_.micRefChannels, &algoCache_.input[offset], - offset); - CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in mic ref channel memcpy"); + int32_t ret = 0; + if (enhanceBuffer->ecBuffer.size() != 0) { + ret = DeinterleaverData(enhanceBuffer->ecBuffer.data(), deviceAttr_.ecChannels, + &algoCache_.input[offset], offset); + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in ec channel memcpy"); + offset += algoAttr_.byteLenPerFrame * deviceAttr_.ecChannels; + } + + if (enhanceBuffer->micBufferIn.size() != 0) { + ret = DeinterleaverData(enhanceBuffer->micBufferIn.data(), deviceAttr_.micChannels, + &algoCache_.input[offset], offset); + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in mic channel memcpy"); + offset += algoAttr_.byteLenPerFrame * deviceAttr_.micChannels; + } + + if (enhanceBuffer->micRefBuffer.size() != 0) { + ret = DeinterleaverData(enhanceBuffer->micRefBuffer.data(), deviceAttr_.micRefChannels, + &algoCache_.input[offset], offset); + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "memcpy error in mic ref channel memcpy"); + } return SUCCESS; } diff --git a/frameworks/native/audioeffect/src/audio_enhance_chain_adapter.cpp b/frameworks/native/audioeffect/src/audio_enhance_chain_adapter.cpp index 46507efbce567cfef737a8e91fcd8358c1257a45..2badfe04fce2e61a7b6196028226b9d1c4ec02d7 100644 --- a/frameworks/native/audioeffect/src/audio_enhance_chain_adapter.cpp +++ b/frameworks/native/audioeffect/src/audio_enhance_chain_adapter.cpp @@ -41,18 +41,22 @@ int32_t EnhanceChainManagerCreateCb(const uint32_t sceneKeyCode, struct DeviceAt AudioEnhanceChainManager *audioEnhanceChainMananger = AudioEnhanceChainManager::GetInstance(); CHECK_AND_RETURN_RET_LOG(audioEnhanceChainMananger != nullptr, ERR_INVALID_HANDLE, "null audioEnhanceChainManager"); - AudioEnhanceDeviceAttr deviceAttr; + AudioEnhanceDeviceAttr deviceAttr = {}; deviceAttr.micRate = adapter.micRate; deviceAttr.micChannels = adapter.micChannels; deviceAttr.micFormat = adapter.micFormat; - deviceAttr.needEc = adapter.needEc; - deviceAttr.ecRate = adapter.ecRate; - deviceAttr.ecChannels = adapter.ecChannels; - deviceAttr.ecFormat = adapter.ecFormat; - deviceAttr.needMicRef = adapter.needMicRef; - deviceAttr.micRefRate = adapter.micRefRate; - deviceAttr.micRefChannels = adapter.micRefChannels; - deviceAttr.micRefFormat = adapter.micRefFormat; + if (adapter.needEc) { + deviceAttr.needEc = adapter.needEc; + deviceAttr.ecRate = adapter.ecRate; + deviceAttr.ecChannels = adapter.ecChannels; + deviceAttr.ecFormat = adapter.ecFormat; + } + if (adapter.needMicRef) { + deviceAttr.needMicRef = adapter.needMicRef; + deviceAttr.micRefRate = adapter.micRefRate; + deviceAttr.micRefChannels = adapter.micRefChannels; + deviceAttr.micRefFormat = adapter.micRefFormat; + } return audioEnhanceChainMananger->CreateAudioEnhanceChainDynamic(sceneKeyCode, deviceAttr); } diff --git a/frameworks/native/audioeffect/src/audio_enhance_chain_manager.cpp b/frameworks/native/audioeffect/src/audio_enhance_chain_manager.cpp index a7ecf58cb98941a3b06bab23a91cd98503fd420e..a9195ecbc547c3bc509ec7208d559b4749aa7881 100644 --- a/frameworks/native/audioeffect/src/audio_enhance_chain_manager.cpp +++ b/frameworks/native/audioeffect/src/audio_enhance_chain_manager.cpp @@ -569,7 +569,33 @@ int32_t AudioEnhanceChainManager::ApplyAudioEnhanceChain(const uint32_t sceneKey int32_t AudioEnhanceChainManager::SetInputDevice(const uint32_t &captureId, const DeviceType &inputDevice) { std::lock_guard lock(chainManagerMutex_); - captureIdToDeviceMap_.insert_or_assign(captureId, inputDevice); + auto item = captureIdToDeviceMap_.find(captureId); + if (item == captureIdToDeviceMap_.end()) { + captureIdToDeviceMap_[captureId] = inputDevice; + AUDIO_INFO_LOG("set new inputdevice, captureId: %{public}d, inputDevice: %{public}d", captureId, inputDevice); + return SUCCESS; + } + if (item->second == inputDevice) { + AUDIO_INFO_LOG("set same device, captureId: %{public}d, inputDevice: %{public}d", captureId, inputDevice); + return SUCCESS; + } + // item->second != inputDevice + captureIdToDeviceMap_[captureId] = inputDevice; + std::string inputDeviceStr = ""; + auto deviceItem = SUPPORTED_DEVICE_TYPE.find(inputDevice); + if (deviceItem != SUPPORTED_DEVICE_TYPE.end()) { + inputDeviceStr = deviceItem->second; + } else { + return ERROR; + } + for (auto &[sceneKeyCode, chain] : sceneTypeToEnhanceChainMap_) { + uint32_t tempId = (sceneKeyCode & CAPTURER_ID_MASK) >> 8; + if ((tempId == captureId) && chain) { + if (chain->SetInputDevice(inputDeviceStr) != SUCCESS) { + AUDIO_ERR_LOG("chain:%{public}u set input device failed", tempId); + } + } + } AUDIO_INFO_LOG("success, captureId: %{public}d, inputDevice: %{public}d", captureId, inputDevice); return SUCCESS; } diff --git a/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp b/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp index 6f6f43a335f7ca832bbab1daf1409026c69c2221..38f6c6cf714bfe110e21ecd45a5e77ad5873cbfc 100644 --- a/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp +++ b/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp @@ -720,7 +720,6 @@ int32_t AudioCapturerSourceInner::CreateCapture(struct AudioPort &capturePort) currentActiveDevice_ = DEVICE_TYPE_INVALID; return ERR_NOT_STARTED; } - SetAudioRouteInfoForEnhanceChain(currentActiveDevice_); return 0; } @@ -1150,17 +1149,17 @@ int32_t AudioCapturerSourceInner::SetInputRoute(DeviceType inputDevice, AudioPor { if (inputDevice == currentActiveDevice_) { AUDIO_INFO_LOG("SetInputRoute input device not change. currentActiveDevice %{public}d", currentActiveDevice_); + int32_t ret = SetAudioRouteInfoForEnhanceChain(currentActiveDevice_); + if (ret != SUCCESS) { + AUDIO_WARNING_LOG("SetAudioRouteInfoForEnhanceChain failed"); + } return SUCCESS; } - currentActiveDevice_ = inputDevice; - int32_t ret = SetAudioRouteInfoForEnhanceChain(currentActiveDevice_); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("SetAudioRouteInfoForEnhanceChain failed"); - } + AudioRouteNode source = {}; AudioRouteNode sink = {}; - ret = SetInputPortPin(inputDevice, source); + int32_t ret = SetInputPortPin(inputDevice, source); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetOutputRoute FAILED: %{public}d", ret); inputPortPin = source.ext.device.type; @@ -1190,6 +1189,12 @@ int32_t AudioCapturerSourceInner::SetInputRoute(DeviceType inputDevice, AudioPor ret = audioAdapter_->UpdateAudioRoute(audioAdapter_, &route, &routeHandle_); CHECK_AND_RETURN_RET_LOG(ret == 0, ERR_OPERATION_FAILED, "UpdateAudioRoute failed"); + + currentActiveDevice_ = inputDevice; + ret = SetAudioRouteInfoForEnhanceChain(currentActiveDevice_); + if (ret != SUCCESS) { + AUDIO_WARNING_LOG("SetAudioRouteInfoForEnhanceChain failed"); + } return SUCCESS; } diff --git a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c index f8d97e302795813b45d67711fd3f1624510c45e9..1b523542386448e20bcac323163ed3b99fbc9190 100644 --- a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c +++ b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c @@ -116,7 +116,7 @@ bool g_effectAllStreamVolumeZeroMap[SCENE_TYPE_NUM] = {false}; bool g_effectHaveDisabledMap[SCENE_TYPE_NUM] = {false}; time_t g_effectStartVolZeroTimeMap[SCENE_TYPE_NUM] = {0}; char *const SCENE_TYPE_SET[SCENE_TYPE_NUM] = {"SCENE_DEFAULT", "SCENE_MUSIC", "SCENE_GAME", "SCENE_MOVIE", - "SCENE_SPEECH", "SCENE_RING", "SCENE_VOIP", "SCENE_OTHERS", "EFFECT_NONE"}; + "SCENE_SPEECH", "SCENE_RING", "SCENE_VOIP_DOWN", "SCENE_OTHERS", "EFFECT_NONE"}; const int32_t COMMON_SCENE_TYPE_INDEX = 0; enum HdiInputType { HDI_INPUT_TYPE_PRIMARY, HDI_INPUT_TYPE_OFFLOAD, HDI_INPUT_TYPE_MULTICHANNEL }; diff --git a/frameworks/native/pulseaudio/modules/hdi/hdi_source.c b/frameworks/native/pulseaudio/modules/hdi/hdi_source.c index 44d30c38be48a4bd1ce7f0432701fb6d396cd043..0d9c121efa1d852451879a10f1d9dd0d6992c03f 100644 --- a/frameworks/native/pulseaudio/modules/hdi/hdi_source.c +++ b/frameworks/native/pulseaudio/modules/hdi/hdi_source.c @@ -606,11 +606,12 @@ static void PostDataDefault(pa_source *source, pa_memchunk *chunk, struct Userda } } -static int32_t EcAndMicRefResampleAndCopy(const char *sceneKey, struct Userdata *u) +static int32_t EcResample(const char *sceneKey, struct Userdata *u) { pa_resampler *ecResampler = (pa_resampler *)pa_hashmap_get(u->sceneToEcResamplerMap, sceneKey); - pa_resampler *micRefResampler = (pa_resampler *)pa_hashmap_get(u->sceneToMicRefResamplerMap, sceneKey); - + if (ecResampler == NULL) { + return SUCCESS; + } CHECK_AND_RETURN_RET_LOG(u->bufferEc != NULL, ERROR, "bufferEc is null"); CHECK_AND_RETURN_RET_LOG(u->requestBytesEc != 0, ERROR, "requestBytesEc is 0"); if (ecResampler != NULL) { @@ -627,7 +628,15 @@ static int32_t EcAndMicRefResampleAndCopy(const char *sceneKey, struct Userdata } else { CopyEcdataToEnhanceBufferAdapter(u->bufferEc, u->requestBytesEc); } + return SUCCESS; +} +static int32_t MicRefResample(const char *sceneKey, struct Userdata *u) +{ + pa_resampler *micRefResampler = (pa_resampler *)pa_hashmap_get(u->sceneToMicRefResamplerMap, sceneKey); + if (micRefResampler == NULL) { + return SUCCESS; + } CHECK_AND_RETURN_RET_LOG(u->bufferMicRef != NULL, ERROR, "bufferMicRef is null"); CHECK_AND_RETURN_RET_LOG(u->requestBytesMicRef != 0, ERROR, "requestBytesMicRef is 0"); if (micRefResampler != NULL) { @@ -680,7 +689,8 @@ static int32_t GetCapturerFrameFromHdiAndProcess(pa_memchunk *chunk, struct User enhanceChunk.memblock = pa_memblock_new(u->core->mempool, enhanceChunk.length); pa_memchunk_memcpy(&enhanceChunk, chunk); SampleAlignment((char *)sceneKey, &enhanceChunk, &rChunk, u); - EcAndMicRefResampleAndCopy((char *)sceneKey, u); + EcResample((char *)sceneKey, u); + MicRefResample((char *)sceneKey, u); EnhanceProcessAndPost(u, sceneKeyCode, &rChunk); pa_memblock_unref(enhanceChunk.memblock); if (rChunk.memblock) { diff --git a/interfaces/inner_api/native/audiocommon/include/audio_effect.h b/interfaces/inner_api/native/audiocommon/include/audio_effect.h index c77ffe1860267075f50ef10eac44f376ae066343..6292502146fddfc941632f0326d5cbaa867ed77a 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_effect.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_effect.h @@ -425,7 +425,7 @@ const std::unordered_map EFFECT_CHAIN_TYPE_MAP { {"SCENE_GAME", 5}, {"SCENE_SPEECH", 6}, {"SCENE_RING", 7}, - {"SCENE_VOIP", 8} + {"SCENE_VOIP_DOWN", 8} } ; struct AudioRendererInfoForSpatialization {