50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
|
#include "WebRtcAecm.h"
|
||
|
#include "BoostLog.h"
|
||
|
#include "modules/audio_processing/aecm/echo_control_mobile.h"
|
||
|
|
||
|
WebRtcAecm::~WebRtcAecm() {
|
||
|
close();
|
||
|
}
|
||
|
|
||
|
void WebRtcAecm::close() {
|
||
|
if (m_hanlde != nullptr) {
|
||
|
webrtc::WebRtcAecm_Free(m_hanlde);
|
||
|
m_hanlde = nullptr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WebRtcAecm::echoPlayback(const int16_t *play, int samples) {
|
||
|
if (webrtc::WebRtcAecm_BufferFarend(m_hanlde, play, samples) != 0) {
|
||
|
LOG(warning) << "failed to buffer farend signal.";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WebRtcAecm::echoCancellation(const int16_t *nearendNoisy, const int16_t *nearendClean, int16_t *out, int samples) {
|
||
|
if (webrtc::WebRtcAecm_Process(m_hanlde, nearendNoisy, nearendClean, out, samples, 60) != 0) {
|
||
|
LOG(warning) << "WebRtcAecm_Process() failed.";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool WebRtcAecm::start(int sampleRate, int channels, int period) {
|
||
|
close();
|
||
|
m_hanlde = webrtc::WebRtcAecm_Create();
|
||
|
if (m_hanlde == nullptr) {
|
||
|
LOG(error) << "WebRtcAecm_Create() failed.";
|
||
|
return false;
|
||
|
}
|
||
|
if (webrtc::WebRtcAecm_Init(m_hanlde, sampleRate) != 0) {
|
||
|
LOG(error) << "WebRtcAecm_Init() failed.";
|
||
|
close();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
webrtc::AecmConfig config;
|
||
|
config.cngMode = webrtc::AecmTrue; // 启用舒适噪声生成
|
||
|
config.echoMode = 3; // 回声消除模式,范围是 0-4
|
||
|
if (WebRtcAecm_set_config(m_hanlde, config) != 0) {
|
||
|
LOG(error) << "WebRtcAecm_set_config() failed.";
|
||
|
close();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|