您可以使用kAudioSessionProperty_CurrentHardwareIOBufferDuration 属性,它以秒为单位表示缓冲区大小。将其乘以您从 kAudioSessionProperty_CurrentHardwareSampleRate 获得的采样率,以获得您应该缓冲的样本数。
生成的缓冲区大小应该是 2 的倍数。我相信您可能会得到 512 或 4096,但您应该始终基于从 AudioSessionGetProperty 返回的值。
例子:
Float64 sampleRate;
UInt32 propSize = sizeof(Float64);
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate,
&propSize,
&sampleRate);
Float32 bufferDuration;
propSize = sizeof(Float32);
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,
&propSize,
&bufferDuration);
UInt32 bufferLengthInFrames = sampleRate * bufferDuration;
下一步是找出您要向其发送音频的设备的输入流格式。根据您的描述,我假设您正在以编程方式生成音频以发送到扬声器。此代码假定 unit 是您要向其发送音频的 AudioUnit,无论是 RemoteIO 还是类似效果音频单元的东西。
AudioStreamBasicDescription inputASBD;
UInt32 propSize = sizeof(AudioStreamBasicDescription);
AudioUnitGetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&inputASBD,
&propSize);
在此之后,inputASBD.mFormatFlags 将是对应于unit 期望的音频流格式的位字段。最有可能的两组标志被命名为kAudioFormatFlagsCanonical 和kAudioFormatFlagsAudioUnitCanonical。这两个具有相应的样本类型 AudioSampleType 和 AudioUnitSampleType,您可以根据这些样本类型进行尺寸计算。
顺便说一句,AudioSampleType 通常代表来自麦克风或发往扬声器的样本,而AudioUnitSampleType 通常代表打算处理的样本(例如,由音频单元处理)。目前在 iOS 上,AudioSampleType 是 SInt16,AudioUnitSampleType 是存储在 SInt32 容器中的固定 8.24 数字。 Here's a post on the Core Audio mailing list explaining this design choice
我之所以不愿说“只使用 Float32,它会起作用”之类的话,是因为如果 Apple 愿意,流的实际位表示可能会发生变化。