我一直在尝试将数组传递给DiracLE音频库中的方法。
数组在调试器中看起来像这样
- (OSStatus) readFloatsConsecutive:(SInt64)numFrames intoArray:(float**)audio withOffset:(long)offset
这样填充阵列
if (audio) {
for (long c = 0; c < mExtAFNumChannels; c++) {
if (!audio[c]) continue; // this executes for both channels
// but doesnt proceed into next for loop
for (long v = 0; v < numFrames; v++) {
if (v < loadedPackets) audio[c][v+offset] = (float)data[v*mExtAFNumChannels+c] / 32768.f;
else audio[c][v+offset] = 0.f;
}
}
}
我称之为
[reader readFloatsConsecutive:frameCount intoArray:arrayToFill];
arrayToFill是当前函数范围的参数
[self readAudioDataForFile:temp withArray:tempArray];
最初将数组传递给像这样的函数
// this array was passed into the function as tempArray which is float **tempArray = NULL;
arrayToFill = (float **) malloc ( (frameCount * channelCount) * sizeof( float ));
由于我需要在我的方法中从文件中提取音频数据,我必须在那里malloc数组并将其传递给dirac函数进行填充。我喜欢malloc arrayToFill = (float **) malloc ( (frameCount * channelCount) * sizeof( float ));
,然后将它传递给之前提到的dirac函数。
此数组可以是2维或1维数组,具体取决于通道数
答案 0 :(得分:1)
我认为问题依赖于分配。
分配一维数组看起来像:
arrayToFill = (float *) malloc ( (frameCount * channelCount) * sizeof( float ));
并且它应该是。
分配二维数组会有所不同,因为你必须分配内部数组。如果我理解正确,如果你有两个通道,那么数组是二维的,你应该做类似的事情:
arrayToFill = (float **)calloc(channelCount, sizeof(float*));
for (int i = 0; i < channelCount; ++i)
arrayToFill[i] = (float*)calloc(frameCount, sizeof(float));
这是因为你需要为指向float的指针分配一个指针。因此,在第一步中,您将指针的二维数组分配给float,这些指针初始化为NULL
,因此您必须循环遍历它并单独分配它们。
如果通道在数组内部(例如,第一个索引选择框架而不是通道),则应交换尺寸。