Core-audio - создание структуры AudioBufferList (Q о определении структуры c) - PullRequest
1 голос
/ 21 апреля 2010

Определение AudioBufferList выглядит странно для меня ... я думаю, мой C не так хорош

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

Почему

AudioBuffer mBuffers[kVariableLengthArray];

а не

AudioBuffer *mBuffers;

kVariableLengthArray выглядит как == 1. Э?

Я думаю, у меня это работает, но я был бы признателен, если бы кто-то мог меня поправить.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Если символ 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 экземпляров, поскольку будет выделено надлежащее количество места.

0 голосов
/ 21 апреля 2010
AudioBuffer * mBuffers;

Вы объявляете указатель на AudioBufferВ таком случае вам нужно выделить достаточно памяти, например, с помощью malloc ().Структуры будут помещены в кучу, и вам потребуется освободить память с помощью free () после использования.

AudioBuffer mBuffers[ 1 ];

Вы объявляете массив AudioBuffer.Память распределяется автоматически в стеке.Нет необходимости вызывать free.

Поэтому, когда он находится внутри структуры, проще работать с массивами, так как вам не нужно явно выделять память для члена структуры:

AudioBufferList myBufferList;

В противном случае, вам придется сделать:

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