FaceAccess/Record/EchoRecord.cpp

70 lines
2.8 KiB
C++
Raw Normal View History

2024-09-04 17:57:23 +08:00
#include "BoostLog.h"
2024-09-05 12:24:05 +08:00
#include "SpeexDsp.h"
#include "Utility.h"
#include "WebRtcAecm.h"
2024-09-04 17:57:23 +08:00
#include "main.h"
#include <memory>
void EchoRecordTask::setVqeEnabled(bool enabled) {
if (m_vqeEnabled != enabled) {
m_vqeEnabled = enabled;
}
}
void EchoRecordTask::setChannels(int channels) {
if (m_channels != channels) {
m_channels = channels;
}
}
2024-09-05 12:24:05 +08:00
// underrun occurred pcm播放饥饿
// 回采信号提前于mic信号时间差<80ms
// ./Record --echo --vqe=false --channels=2
// ./Record --echo --vqe=true --channels=2
// ./Record --echo --vqe=false --channels=1
2024-09-04 17:57:23 +08:00
void EchoRecordTask::run() {
2024-09-05 12:24:05 +08:00
2024-09-04 17:57:23 +08:00
RkAudio::Format format;
format.channels = m_channels;
2024-09-05 12:24:05 +08:00
format.period = 10;
m_speex = std::make_shared<SpeexDsp>();
m_speex->start(format.sampleRate, m_channels, format.period);
m_farendBuffer.resize(m_channels * sizeof(int16_t) * format.sampleRate / 1000 * format.period);
m_nearendBuffer.resize(m_channels * sizeof(int16_t) * format.sampleRate / 1000 * format.period);
m_webRtcAecm = std::make_shared<WebRtcAecm>();
m_webRtcAecm->start(format.sampleRate, format.channels, format.period);
2024-09-04 17:57:23 +08:00
m_output = std::make_shared<RkAudio::Output>();
2024-09-05 12:24:05 +08:00
if (!m_output->open(sizeof(uint16_t), format.sampleRate, 2, format.period, m_vqeEnabled)) {
2024-09-04 17:57:23 +08:00
LOG(error) << "audio output open failed.";
return;
}
2024-09-05 12:24:05 +08:00
m_outBuffer.resize(m_channels * sizeof(int16_t) * format.sampleRate / 1000 * format.period);
2024-09-04 17:57:23 +08:00
m_input = std::make_shared<RkAudio::Input>();
2024-09-05 12:24:05 +08:00
m_input->setDataCallback([this](const RkAudio::Frame &frame) {
memcpy(m_nearendBuffer.data(), frame.data, frame.byteSize);
m_webRtcAecm->echoPlayback(reinterpret_cast<const int16_t *>(m_farendBuffer.data()), m_farendBuffer.size() / 2);
m_webRtcAecm->echoCancellation(reinterpret_cast<int16_t *>(frame.data), reinterpret_cast<int16_t *>(m_nearendBuffer.data()),
reinterpret_cast<int16_t *>(m_outBuffer.data()), frame.frameSize);
// m_speex->echoPlayback(reinterpret_cast<const int16_t *>(frame.data));
// m_speex->echoPlayback(reinterpret_cast<const int16_t *>(m_buffer.data()));
// m_speex->echoCapture(reinterpret_cast<const int16_t *>(frame.data), reinterpret_cast<int16_t *>(m_buffer.data()));
if (m_channels == 2) {
m_output->write(frame.data, frame.byteSize);
} else if (m_channels == 1) {
auto filledData = duplicate(m_outBuffer.data(), m_outBuffer.size());
m_output->write(filledData.data(), filledData.size());
}
memcpy(m_farendBuffer.data(), m_outBuffer.data(), m_outBuffer.size());
// m_output->write(reinterpret_cast<const uint8_t *>(m_buffer.data()), m_buffer.size());
});
2024-09-04 17:57:23 +08:00
m_input->open(format, m_vqeEnabled);
}