在 VST 规范中,传递多 channel 音频数据的缓冲区......
MyClass::ProcessDoubleReplacing(double **inputs, double **outputs, int frames)
{
//and accessed like this...
outputs[channel][sample] = inputs[channel][sample]
}
我想创建一个类似的“二维指针数组”,但没有取得太大成功。我可以创建一个简单的指针并迭代它读取/写入值......
double* samples;
samples[0] = aValue;
...但是我正在举办一个崩溃节,试图实现一些让我能够...
samples[0][0] = aValue;
实现这个的正确方法是什么?
最佳答案
double* samples;
samples[0] = aValue;
这实在是太糟糕了。 :( 请不要这样做!“sample”只是指向您内存中某个位置的指针。 它指向的内 stub 本没有分配,但是你正在写入这个内存......
您可以从堆或堆栈中分配内存块。但是,堆栈有大小限制(在编译器设置中配置) - 因此对于较大的 block (如音频数据),您通常会从堆中分配它。但你必须小心,不要从堆中泄漏内存 - 堆栈内存是由变量的范围自动管理的,因此更容易开始。 在 C/C++ 中,您可以像这样从堆栈分配内存:
double samples[512];
然后你可以做这样的事情:
samples[0] = aValue; // change value of 1st sample in sample buffer with 512 elements
或
double* pointerToSample = samples[255]; // point to 256ths sample in the sample buffer
pointerToSample[127] = aValue; // change value of 384ths sample (256+128) in our sample buffer with 512 elements
等等... 但如果你这样做,
double* pointerToSample;
pointerToSample[127] = aValue;
您实际上正在写入未分配的内存!你的指针指向某个地方,但它后面没有分配的内存。 对此要小心!如果样本变量已经超出范围,也永远不要访问pointerToSample:否则不再分配pointerToSample指向的内存。
要从 C++ 堆中分配内存,可以动态使用关键字 new(分配内存)和 delete(随后释放内存)。
即
double *samples = new double[512];
将为您的示例数据分配一 block 内存。但使用后,您必须手动删除它 - 否则就会泄漏内存。所以就这样做:
delete[] samples;
完成后。
最后但并非最不重要的一点是回答您的问题如何创建二维数组来调用 ProcessDoubleReplacing() 方法
int main(int argc, char ** argv){
/* create 2 dimensional array */
int** samplesIn = new int*[44100];
int** samplesOut = new int*[44100];
for(int i = 0; i < 44100; ++i){ // 1s @ 44.1Khz
samplesIn[i] = new int[2]; // stereo
samplesOut[i] = new int[2]; // stereo
}
/* TODO: fill your input buffer with audio samples from somewhere i.e. file */
ProcessDoubleReplacing(samplesIn, samplesOut, 44100);
/* cleanup */
for(int i = 0; i < 44100; ++i) {
delete [] samplesIn[i];
delete [] samplesOut[i];
}
delete [] samplesIn;
delete [] samplesOut;
return 0;
}
关于c++ - 如何创建与 VST 音频缓冲区相同的指针数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808953/