适用于iOS的kAudioDevicePropertyBufferFrameSizereplace

我试图build立一个audio单元来渲染音乐(而不是audio队列..这是太不透明的我的目的).. iOS没有这个属性kAudioDevicePropertyBufferFrameSize ..任何想法如何我可以派生这个值来设置增加我的IO单元的缓冲区大小?

我发现这篇文章有趣..它询问使用kAudioSessionProperty_CurrentHardwareIOBufferDurationkAudioSessionProperty_CurrentHardwareOutputLatencyaudio会话属性的组合来确定该值的可能性..但没有答案..任何想法?

您可以使用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; 

下一步是找出你发送audio的单元的inputstream格式。 基于你的描述,我假设你正在编程生成audio发送给扬声器。 这段代码假设unit是一个AudioUnit你要发送audio,无论是RemoteIO或类似效果audio单元。

 AudioStreamBasicDescription inputASBD; UInt32 propSize = sizeof(AudioStreamBasicDescription); AudioUnitGetProperty(unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &inputASBD, &propSize); 

在此之后, inputASBD.mFormatFlags将是unit所期望的audiostream格式所对应的位字段。 两组最可能的标志被命名为kAudioFormatFlagsCanonicalkAudioFormatFlagsAudioUnitCanonical 。 这两个具有相应的样本typesAudioSampleTypeAudioSampleType ,您可以根据您的大小计算。

另外, AudioSampleType通常表示来自麦克风或者发往扬声器的采样,而AudioUnitSampleType通常用于意图被处理的采样(例如,通过audio单元)。 目前在iOS上, AudioSampleType是一个SInt16, AudioSampleType固定存储在一个SInt32容器中的8.24号码。 这是Core Audio邮件列表中的一篇文章,解释了这种deviseselect

我之所以拒绝说“只使用Float32,它会工作”是因为如果苹果觉得它的实际比特表示可能会改变。

audio单元本身决定实际的缓冲区大小,所以应用程序的audio单元callback必须能够处理给定的任何合理的大小。 您可以build议并轮询kAudioSessionProperty_CurrentHardwareIOBufferDuration属性,但请注意,此值可以在应用程序可以控制的范围之外运行(特别是在屏幕locking或呼叫中断等情况下)。