Вопрос по ExtAudioFileRead и AudioBuffer для iPhone SDK - PullRequest
3 голосов
/ 15 июня 2010

Я занимаюсь разработкой приложения для iPhone, которое использует расширенные службы аудиофайлов. Я пытаюсь использовать ExtAudioFileRead для чтения аудиофайла и сохранения данных в структуре AudioBufferList.

AudioBufferList определяется как:

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

и AudioBuffer определяется как

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

Я хочу манипулировать mData , но мне интересно, что означает void *. Почему это недействительно *? Как я могу решить, какой тип данных на самом деле хранится в mData?

Ответы [ 2 ]

1 голос
/ 17 сентября 2012

Вы можете определить размер элемента в массиве mData (размер кадра) с помощью

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

Затем вы можете интерпретировать его для любого типа со знаком с таким же размером (для обычных 4 байтов на кадр это может быть Sint32 или Float32).

1 голос
/ 16 июня 2010

поле mData помечено как пустое, потому что разные аудиоформаты имеют разные требования к хранилищу.

в основном в C указатель void может указывать на что угодно.

чтобы вы могли сказать

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

и затем, когда вы захотите его использовать, приведите его к нужному типу данных.

Sint32 *myBuffer = (SInt32 *)mData;
...