2010-06-15 5 views
3

Je développe une application iPhone qui utilise les services de fichiers audio étendus. J'essaie d'utiliser ExtAudioFileRead pour lire le fichier audio et stocker les données dans une structure AudioBufferList.Question sur ExtAudioFileRead et AudioBuffer pour iPhone SDK

AudioBufferList est défini comme:

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

et AudioBuffer est défini comme

struct AudioBuffer { 
    UInt32 mNumberChannels; 
    UInt32 mDataByteSize; 
    void* mData; 
}; 
typedef struct AudioBuffer AudioBuffer; 

Je veux manipuler le MDATA mais je me demande ce que fait le void * signifier. Pourquoi est-il nul *? Comment puis-je décider quel type de données est réellement stocké dans mData?

Répondre

1

Le champ mData est marqué comme vide car différents formats audio ont des exigences de stockage différentes.

Dans C, un pointeur vide peut pointer vers n'importe quoi.

pour que vous puissiez dire

mData = (SInt32 *)malloc(sizeof(Sint32) * numElements); 

et puis quand vous voulez l'utiliser pour le jeter le type de données que vous souhaitez.

Sint32 *myBuffer = (SInt32 *)mData; 
1

Vous pouvez déterminer la taille de l'élément dans le tableau MDATA (taille du cadre) avec

AudioStreamBasicDescription inputFileFormat; 
UInt32 dataSize = (UInt32)sizeof(inputFileFormat); 
ExtAudioFileGetProperty(inputFile, kExtAudioFileProperty_FileDataFormat, &dataSize, &inputFileFormat); 
size_t sizeOfFrame = inputFileFormat.mBytesPerFrame; 

Ensuite, vous pouvez l'interpréter à tout type signé avec la même taille (pour 4 habituels octets par image il peut être Sint32 ou Float32).