核心音频 - 构建一个AudioBufferList结构(关于c结构定义的Q)

时间:2010-04-21 10:16:21

标签: c struct core-audio

AudioBufferList的定义对我来说很奇怪......我猜我的C不太好

struct AudioBufferList
{
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[kVariableLengthArray];
};
typedef struct AudioBufferList  AudioBufferList;

为什么

AudioBuffer mBuffers[kVariableLengthArray];

而不是

AudioBuffer *mBuffers;

kVariableLengthArray似乎是== 1. Eh?

我认为我有它的工作,但如果有人能让我直截了当,我会很感激。

2 个答案:

答案 0 :(得分:3)

如果符号kVariableLengthArray是编译时常量,这意味着您可以在堆栈上分配单个缓冲区(“自动”存储类型,在C中)。

AudioBufferList single;

single.mNumberBuffers = 1;

由于struct包含一个count,这也意味着你可以用任意数量的缓冲区创建一个实例,如下所示:

AudioBufferList * get_n_buffers(size_t num)
{
    AudioBufferList *list;

    if(num < 1)
      return NULL;

    list = malloc(sizeof *list + (num - 1) * sizeof list->mBuffers[0]);
    list->mNumberBuffers = num;

    return list;
}

后一代码动态分配AudioBufferList,并依赖于数组最后的事实。因此,在内存中,它将查看AudioBuffer是否以适当数量的AudioBuffer实例结束,因为将分配适当的空间量。

答案 1 :(得分:0)

AudioBuffer * mBuffers;

您正在声明指向AudioBuffer的指针 在这种情况下,您需要分配足够的内存,例如使用malloc() 结构将被放置在堆上,您需要在使用后使用free()释放内存。

AudioBuffer mBuffers[ 1 ];

您正在声明一个AudioBuffer数组。内存在堆栈上自动分配。无需免费拨打电话。

因此,当它位于结构中时,更容易处理数组,因为您不需要将内存显式分配给结构成员:

AudioBufferList myBufferList;

否则,你必须这样做:

AudioBufferList myBufferList;
myBufferList.mBuffers = malloc( sizeof( AudioBuffer ) * kVariableLengthArray );
/* ... */
free( myBufferList.mBuffers );