3

私は音楽をレンダリングするためにオーディオユニットをセットアップしようとしていました(私の目的には不透明すぎるオーディオキューの代わりに).iOSにはこのプロパティがありませんkAudioDevicePropertyBufferFrameSize..セットアップするためにこの値をどのように導き出すことができるか考えられません私のIOユニットのバッファサイズ?

私はこのkAudioSessionProperty_CurrentHardwareIOBufferDuration投稿が面白いと思いました..それはその値を決定するためにとオーディオセッションプロパティの組み合わせを使用する可能性について尋ねkAudioSessionProperty_CurrentHardwareOutputLatencyます..しかし答えはありません..何かアイデアはありますか?

4

2 に答える 2

5

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つのフラグのセットには、とという名前が付けられkAudioFormatFlagsCanonicalkAudioFormatFlagsAudioUnitCanonicalいます。これら2つには対応するサンプルタイプがAudioSampleTypeありAudioUnitSampleType、サイズ計算のベースにすることができます。

余談ですが、AudioSampleType通常はマイクからのサンプルまたはスピーカー宛てのサンプルを表しますが、AudioUnitSampleType通常は(たとえば、オーディオユニットによって)処理されることを目的としたサンプルを表します。現時点では、iOSではAudioSampleTypeSInt16でありAudioUnitSampleType、SInt32コンテナに格納されている8.24の数値が修正されています。これは、このデザインの選択を説明するCoreAudioメーリングリストへの投稿です。

「Float32を使用するだけで動作します」などと言うのを控える理由は、Appleがそう感じた場合、ストリームの実際のビット表現が変更される可能性があるためです。

于 2012-10-31T20:24:31.297 に答える
1

オーディオユニット自体が実際のバッファサイズを決定するため、アプリのオーディオユニットコールバックは、指定された適切なサイズを処理できる必要があります。kAudioSessionProperty_CurrentHardwareIOBufferDurationプロパティを提案してポーリングすることはできますが、この値は、アプリの実行中(特に画面ロックや通話の中断中など)に、アプリが制御できる範囲外になる可能性があることに注意してください。

于 2012-10-31T22:55:05.683 に答える