我正在编写一个 iPhone 应用程序,该应用程序根据Apple 的建议使用 I/O 音频单元同时录制和播放音频。
我想在播放之前对录制的音频应用一些音效(混响等)。为了使这些效果正常工作,我需要样本是浮点数,而不是整数。AudioStreamBasicDescription
通过创建一个with kAudioFormatFlagIsFloat
set on ,这似乎应该是可能的mFormatFlags
。这就是我的代码的样子:
AudioStreamBasicDescription streamDescription;
streamDescription.mSampleRate = 44100.0;
streamDescription.mFormatID = kAudioFormatLinearPCM;
streamDescription.mFormatFlags = kAudioFormatFlagIsFloat;
streamDescription.mBitsPerChannel = 32;
streamDescription.mBytesPerFrame = 4;
streamDescription.mBytesPerPacket = 4;
streamDescription.mChannelsPerFrame = 1;
streamDescription.mFramesPerPacket = 1;
streamDescription.mReserved = 0;
OSStatus status;
status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamDescription, sizeof(streamDescription));
if (status != noErr)
fprintf(stderr, "AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input) returned status %ld\n", status);
status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamDescription, sizeof(streamDescription));
if (status != noErr)
fprintf(stderr, "AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output) returned status %ld\n", status);
但是,当我运行它时(在运行 iPhoneOS 3.1.3 的 iPhone 3GS 上),我得到了这个:
AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input) returned error -10868
AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output) returned error -10868
(-10868 是 的值kAudioUnitErr_FormatNotSupported
)
除了建议坚持使用 16 位 little-endian 整数之外,我在 Apple 的文档中没有发现任何有价值的东西。但是,aurioTouch示例项目至少包含一些与kAudioFormatFlagIsFloat
.
那么,我的流描述是不正确的,还是kAudioFormatFlagIsFloat
iPhoneOS 根本不支持?