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;
次のステップは、オーディオの送信先のユニットの入力ストリーム形式を確認することです。あなたの説明に基づいて、スピーカーに送信するオーディオをプログラムで生成していると想定しています。このコードは、RemoteIOであろうと、Effect Audio Unitのようなものであろうと、オーディオを送信してunit
いるのはAudioUnit
あなたであると想定しています。
AudioStreamBasicDescription inputASBD;
UInt32 propSize = sizeof(AudioStreamBasicDescription);
AudioUnitGetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&inputASBD,
&propSize);
この後、期待してinputASBD.mFormatFlags
いるオーディオストリームフォーマットに対応するビットフィールドになります。unit
最も可能性の高い2つのフラグのセットには、とという名前が付けられkAudioFormatFlagsCanonical
てkAudioFormatFlagsAudioUnitCanonical
います。これら2つには対応するサンプルタイプがAudioSampleType
ありAudioUnitSampleType
、サイズ計算のベースにすることができます。
余談ですが、AudioSampleType
通常はマイクからのサンプルまたはスピーカー宛てのサンプルを表しますが、AudioUnitSampleType
通常は(たとえば、オーディオユニットによって)処理されることを目的としたサンプルを表します。現時点では、iOSではAudioSampleType
SInt16でありAudioUnitSampleType
、SInt32コンテナに格納されている8.24の数値が修正されています。これは、このデザインの選択を説明するCoreAudioメーリングリストへの投稿です。
「Float32を使用するだけで動作します」などと言うのを控える理由は、Appleがそう感じた場合、ストリームの実際のビット表現が変更される可能性があるためです。