编辑:发现我不需要乘以FRAMESIZE。框架来自libsndfile (我忽略了这个API ),其语义与在我的程序中定义框架的方式不同。因此,在尺寸帧*2和单帧是大小帧。
我接受了下面的一个答案,这个答案并不完全正确,但却把我推向了正确的方向。谢谢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定义
发布于 2014-11-26 03:42:37
在输入数组frames中只有in元素,并且计算currentMonoSize为该值的512倍。然后,在getMono()中,继续从in (不称为stereo)读取currentMonoSize的数量的两倍。这意味着您正在阅读的内容远远超出了您指定的in中元素的数量。
从逻辑上讲,mono数组的元素应该是stereo输入的一半。
https://stackoverflow.com/questions/27140806
复制相似问题