0

我一直在尝试将数组传递给 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 函数。

该数组可以是二维或一维数组,具体取决于通道数

4

1 回答 1

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));

这是因为您需要分配一个指向浮点指针的指针。因此,在第一步中,您分配一个二维指针数组到浮点数,这些指针被初始化,NULL因此您必须循环遍历它并分别分配它们。

如果通道在数组内部(例如,第一个索引选择框架而不是通道),那么您应该交换维度。

于 2012-07-22T14:05:24.303 回答