CoreAudio在OSX中创建32位浮点aif文件

时间:2014-08-21 17:15:19

标签: macos osx-lion core-audio core-foundation

无法找到或弄清楚什么是正确的 .mFormatFlags 标志,用于通过

成功创建32位浮点线性PCM aif (实际上是aifc)文件
AudioFileCreateWithURL (url, 
                        outfileType, 
                        &streamFormat, 
                        kAudioFileFlags_EraseFile, 
                        &outfile)

其中streamFormat的类型为AudioStreamBasicDescription。用于创建outfileType kAudioFileCAFType 文件

    streamFormat.mFormatFlags =
kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;

按预期工作,但是对于创建outfileType kAudioFileAIFCType ,将返回不支持的格式错误。我知道这与字节序问题有关 - 在OSX“native endian”中不支持Float32 aif但只支持“big endian”。 CalculateLPCMFlags 实用程序也没有给出任何结果。

通过反复试验我发现了不会返回格式错误的标志设置:

outFormat.mFormatFlags =
kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagIsBigEndian;

仍然存在“可怕的”字节交换问题,如果在NSData中传递音频字节,我不知道如何修复:

    if(outfileType == kAudioFileAIFCType){
    Float32 valA;
    for(UInt32 i = 0; i < size; i += sizeof(Float32)){
        memmove((void*)&valA, data.bytes +i, sizeof(Float32));       
        Float32 valB = CASwapFloat32HostToBig(*valA);
        memmove((void*)data.bytes + i, &valB, sizeof(Float32));
    }
}

出于某种原因,这没有任何作用。我怀疑是犯了一些微不足道的错误。有人可以建议修理吗?

提前致谢!

0 个答案:

没有答案