您可以使用该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 数字。这是 Core Audio 邮件列表上的一篇文章,解释了这种设计选择
我之所以不愿说“只使用 Float32,它会起作用”之类的话,是因为如果 Apple 愿意,流的实际位表示可能会发生变化。