【发布时间】:2014-11-26 03:24:55
【问题描述】:
编辑:原来我不需要乘以 FRAMESIZE。框架来自 libsndfile API(我忽略了它),语义与我的程序中定义框架的方式不同。所以 in 是 size frames * 2 而 mono 是 size frames。
我接受了以下不完全正确的答案,但将我推向了正确的方向。谢谢jxh。
我正在做一些音频工作,用 C++ 编写一个效果器。我有一个输入源,它是一个交错的 2 通道样本数组。我发现将立体声阵列转换为单声道阵列 (getMono()) 的函数在一次调用后导致一些 大量 内存膨胀(之前为 12.7MB,之后为 3.69GB)。它也非常慢。在我的测试用例中,立体声阵列的大小为 800254。
我对 C++ 比较陌生。我在大学里做了很多嵌入式 C,但没有这样的。所以,这可能是一个初学者错误。
我已将我的代码缩减为理解和重现错误所需的最少代码量。本质上,setInput 在 Sukothai 构造函数中被调用,然后生成输入数组的单声道版本。
#define SAMPLE float
#define RANDOMWIN .5
#define FRAMESIZE 512
void Sukothai::getMono(SAMPLE * stereo, SAMPLE * mono, int monoSize){
for (int j = 0; j < monoSize; j++) {
mono[j] = .7071*(stereo[j*2] + stereo[j*2+1]);
}
}
void Sukothai::setInput(SAMPLE * in, int frames) {
// per-iteration additional time in terms of seconds
//float extraTime = RANDOMWIN*2;
// new buffer size in terms of samples
//int newSize = ((int)(maxIter*extraTime*2*THE_SRATE)+frames*FRAMESIZE*2);
//SAMPLE * current_buffer = new SAMPLE[newSize];
SAMPLE * mono;
int currentMonoSize = 0;
currentMonoSize = frames*FRAMESIZE;
mono = new SAMPLE[currentMonoSize];
getMono(in, mono, currentMonoSize);
}
现在,这里有三行被注释掉了。这些行创建变量extraTime、newSize 和current_buffer。这些都是我效果的不同部分的一部分。我在这里对它们进行了注释,以表明它们与立体声到单声道功能无关,但是如果我在代码中将它们注释掉,就会出现分段错误。
有人知道这里发生了什么吗?
编辑:添加了 FRAMESIZE 定义
【问题讨论】:
-
什么是
FRAMESIZE? -
啊。 FRAMESIZE 是 512。对不起。我会在描述中添加它。这个更大的程序将音频信号分成大小为 512 的帧。因此,每帧中有 512 个左样本和 512 个右样本。
-
frames代表什么?in中的元素个数? -
是的。传入数组的大小,以便我以后可以使用该知识。
-
你的代码泄露了
mono,因为数组永远不会被返回,也不会在函数返回之前被释放。
标签: c++ arrays audio memory segmentation-fault