2010-04-21 34 views
1

AudioBufferList的定義看起來奇怪,我...我想我的C不是那麼好核心音頻 - 構建AudioBufferList結構(Q關於C結構定義)

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

爲什麼

AudioBuffer mBuffers[kVariableLengthArray]; 

而不是

AudioBuffer *mBuffers; 

kVariableLengthArray似乎是== 1. Eh?

我想我有它的工作,但會很感激,如果任何人可以設置我直。

回答

3

如果符號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

ahhhh,我明白了。萬分感謝。 – hooleyhoop 2010-04-21 11:16:32

+0

應該是'malloc(sizeof(AudioBufferList)+(num-1)* sizeof(list-> mBuffers [0]));'?謝謝你的耐心。 – hooleyhoop 2010-04-21 13:52:34

+1

@mustISignUp:不,我發現重複類型名稱是不好的,並且始終偏好sizeof表達適當類型的表達式。這樣,如果列表要更改爲不同的指針類型,它仍然會做到這一點。 sizeof *列表正是我的意思。 – unwind 2010-04-21 14:22:42

0
AudioBuffer * mBuffers; 

你聲明的指針AudioBuffer
在這種情況下,你需要使用malloc分配足夠的內存,例如()。
結構將放置在堆上,使用後需要使用free()釋放內存。

AudioBuffer mBuffers[ 1 ]; 

您正在聲明一個AudioBuffer數組。內存在堆棧中自動分配。無需免費通話。

所以當它是一個結構中,更容易的工作陣列,你並不需要顯式地分配內存以結構成員:

AudioBufferList myBufferList; 

否則,你就必須做:

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

對不起,我可能是愚蠢的,但我還是不明白。你是說'AudioBuffer mBuffers [kVariableLengthArray]'爲1個AudioBuffer分配內存? – hooleyhoop 2010-04-21 11:00:41

+0

這是一個列表嗎? – hooleyhoop 2010-04-21 11:08:11

+0

這是一個數組,只有一個元素。但是隨着元素數量的不斷增加,可能會在未來的版本中發生變化。所以用這種方式聲明它可能會有更多的AudioBuffers。 – Macmade 2010-04-21 11:13:47