2009-12-08 4 views
4

Xcode/Cocoa 및 ExtAudioFile API를 사용하여 AudioBufferList * 개체를 나중에 사용하기 위해 저장하려고하지만 데이터에 다시 액세스 할 때 문제가 있습니다. 이러한 개체는 반복되는 ExtAudioFileRead 호출에서 비롯됩니다.나중에 사용할 수 있도록 ExtAudioFile API에서 AudioBufferLists 저장하기

나는이 AudioBufferList * 객체를 NSArray에 채울 수는 없다는 것을 알고 있지만 NSPointerArray가 이러한 목적으로 작동한다는 인상 아래에있었습니다. 그러나 오디오 버퍼 목록을 NSPointerArray에 저장 한 후 audioBufferList-> mBuffers [0] .mData에 액세스하려고하면 다시 0으로 되돌아옵니다.

각 ExtAudioFileRead 호출에 대해 동일한 오디오 버퍼 목록을 다시 사용하기 때문에 audioBufferLists를 새로운 audioBufferList 객체에 memcpying했습니다. 그래도 그게 충분한 지 모르겠다면, 그리고 void *를 memcpying * audioBufferList-> mBuffers [0] .mData 객체는 도움이되지 않습니다.

이러한 AudioBufferList * 객체를 저장하는 가장 쉬운 방법은 무엇입니까? 나는 올바른 길을 가고 있는가?

답변

5

AudioBufferLists는 audioBufferList.mBuffers[i].mData에 데이터를 보유합니다.
mDatavoid*이고 실제 값 유형은 지정한 출력 형식에 의해 결정됩니다.

예 :
당신이
kAudioFormatFlagsCanonical을 정의한 경우,
kAudioFormatLinearPCM,
mBitsPerChannel = 32 하고 출력 형식으로
mFramesPerPacket = 1
의 mData 배열은 Float32 A는 유형 AudioSampleType의 값을 (포함 typedef)

다른 형식은 배열에 SInt16 값 또는 다른 것을 포함 할 수 있습니다.
mData의 내용을 복사하려는 경우 출력 유형을 알아야합니다.
당신은 당신이 단순히로 C 배열을

dataCopy = calloc(dataSize, sizeof(Float32)); 

및 방어 적이기 audioBufferList.mBuffers [I] .mData을 만들 수있는 형식을 알고있는 경우.
코코아 NSMutableArray를 사용하려면 NSNumber 객체에 수레를 래핑해야합니다.

+0

또는 데이터의'mutableBytes'에'dataSize' 바이트를,'memcpy'에'mData'를 넣으면 NSMutableData를 생성 할 수 있습니다. –

관련 문제