女儿:可是…您做的变声话筒感觉少了点什么…
爸爸:少了啥?
女儿:就是那种可以"啊"一声之后,能连续发出"啊啊啊"的那种效果。
爸爸:明白了,加个回声器!
<思路>
- 回声器可以加在录音线程中也可以加在播放线程中。既然播放线程已经有soundtouch块做变调了,那就把回声器加在录音线程吧,让负载均衡点。
- 回声器采用sox effect,而sox effect输入输出均为int32_t,而整个链路的音频格式是float,所以还需要在其前后分别加上一个格式适配器。
<代码实现>
在MyEngineerDaddy_1.cpp
的基础上简单修改一下,变成MyEngineerDaddy_2.cpp
:
#include <lark/lark.h>
#include <klogging.h>
#if defined(__APPLE__)
#define SUFIX ".dylib"
#elif defined(_WIN32)
#define SUFIX ".dll"
#else
#define SUFIX ".so"
#endif
int main()
{
const unsigned int rate = 16000;
const lark::SampleFormat format = lark::SampleFormat_FLOAT;
const unsigned int chNum = 1;
const unsigned int frameDuration_ms = 20;
const lark::samples_t frameSizeInSamples = frameDuration_ms * rate / 1000;
lark::FIFO *fifo = lark::Lark::Instance().NewFIFO(
rate,
lark::SamplesToBytes(format, chNum, 1),
frameSizeInSamples * 8);
if (!fifo) {
KLOGE("Failed to new a FIFO");
return -1;
}
// Create the playback route named RouteA
lark::Route *playbackRoute = lark::Lark::Instance().NewRoute("RouteA");
if (!playbackRoute) {
KLOGE("Failed to create playbackRoute");
return -1;
}
// Create RouteA's blocks
const char *soFileName = "libblkstreamin" SUFIX;
lark::Parameters args;
args.push_back(std::to_string(rate));
args.push_back(std::to_string(format));
args.push_back(std::