空样本**用于声音样本

时间:2012-07-22 03:45:18

标签: objective-c pointers core-audio nslog

我一直在尝试将数组传递给DiracLE音频库中的方法。

数组在调试器中看起来像这样

enter image description here

- (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维数组,具体取决于通道数

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,因此您必须循环遍历它并单独分配它们。

如果通道在数组内部(例如,第一个索引选择框架而不是通道),则应交换尺寸。