【问题标题】:Core-audio - constructing an AudioBufferList struct (Q about c struct definition)Core-audio - 构造一个AudioBufferList struct(关于c struct定义的Q)
【发布时间】:2010-04-21 10:16:21
【问题描述】:

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

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

为什么

AudioBuffer mBuffers[kVariableLengthArray];

而不是

AudioBuffer *mBuffers;

?

kVariableLengthArray 似乎 == 1。嗯?

我认为我可以正常工作,但如果有人能纠正我,我将不胜感激。

【问题讨论】:

    标签: c struct core-audio


    【解决方案1】:

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

    AudioBufferList single;
    
    single.mNumberBuffers = 1;
    

    由于结构包含计数,这也意味着您可以创建具有任意数量缓冲区的实例,如下所示:

    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 实例结束,因为将分配适当数量的空间。

    【讨论】:

    • 应该是'malloc( sizeof(AudioBufferList) + (num-1)*sizeof( list->mBuffers[0]) );'?感谢您的耐心等待。
    • @mustISignUp:不,我觉得重复类型名称很糟糕,并且总是更喜欢 sizeof 正确类型的表达式。这样,如果 list 要更改为不同的指针类型,它仍然会做正确的事情。 sizeof *list 正是我的意思。
    • 我绝对相信你,但无法理解 'sizeof *list' 是如何为 struct AudioBufferList 提供足够的内存...
    • @mustISignUp:变量“list”的类型是“指向AudioBufferList”的指针,因此“sizeof *list”的值与“sizeof (AudioBufferList)”相同。如果我只说“sizeof list”它会被破坏,它必须被取消引用以获得指针指向的对象的大小,即 AudioBufferList。
    • 好的,我认为 sizeof *list 将是指针的大小,但当然它是指向对象的大小。感谢您的帮助
    【解决方案2】:
    AudioBuffer * mBuffers;
    

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

    AudioBuffer mBuffers[ 1 ];
    

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

    因此,当它位于结构内部时,使用数组会更容易,因为您不需要显式地为结构成员分配内存:

    AudioBufferList myBufferList;
    

    否则,您将不得不这样做:

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

    【讨论】:

    • 对不起,我可能是愚蠢的,但我还是不明白。您是说“AudioBuffer mBuffers[kVariableLengthArray]”为 1 个 AudioBuffer 分配内存?
    • 这是一个数组,只有一个元素。但是由于元素的数量来自一个常数,也许它会在未来的版本中改变。因此,以这种方式声明它会留下拥有更多 AudioBuffers 的可能性。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多