目次
Session概要
AVAudioEngineは、オーディオのリアルタイムキャプチャ、処理、再生を可能にします。音声処理や空間レンダリングモードの選択など、独自のオーディオAppでAVAudioEngine APIの強化点を活用する方法について
AVAudioEngineの新機能
- Voice Processing サポート
- 2つのNodeの追加
- AVAudioSinkNode
- AVAudioSourceNode
- 空間オーディオレンダリングの改善
Voice Processingモード
- ユースケースとしてはエコーキャンセレーション、VoIPアプリケーションで使用する
- 有効にすると、入力されるオーディオ上でシグナルプロセッシングが余分に適用され、デバイスから出る全てのオーディオが消される。
- 有効にするためにはinput/outputの両方でVoice Processingモードを設定している必要がある。両方設定されている場合のみAVAudioEngineがVoice Processingモードに切り替える。
- Voice Processingモードが利用出来るのはオーディオデバイスでのレンダリング時のみで、手動のレンダリングモードでは利用不可
Voice Processingモードの設定方法

setVoiceProcessingEnabled
で設定- 設定時にはAVAudioEngineが停止している必要があり、動的には有効に出来ない
https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing/avaudioengine/using_voice_processing
AVAudioEngineの新しいNode
- AVAudioSourceNode
- AVAudioSinkNode
両Nodeがユーザ定義のブロックをwrapするとアプリケーションがAVAudioEngineと送受信出来るようになる。
オーディオデバイスへのレンダリング中ブロックはリアルタイムで動作するため、ブロック内でメモリアロケーションやLibdispatchの呼び出しがあってはならない。
AVAudioSourceNode
- AVAudioSourceNodeを使用してNodeにブロックを渡し、オーディオデータを出力先に送るため、AVAudioUnitを作る必要がない。
- リアルタイムと手動レンダリングモードで使用可能
- Linear PCM変換をサポート
- outputが1つで、inputはない
Sample code
AVAudioSourceNodeの作り方
公式サンプル
https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing/avaudioengine/building_a_signal_generator
AVAudioSinkNode
- AVAudioSourceNodeの対となるNode
- inputにつながるNodeチェインから入力オーディオを受信するブロックをwrapする
- inputチェインのみに制限されており、入力Nodeのダウンストリームである必要がある
- フォーマット変換はサポートしていない
- そのため、ハードウェアの入力フォーマットと同じでなければならない
Sample code

空間レンダリングの改善点
- 自動の空間レンダリングアルゴリズムの導入
- AVAudioPlayerNodeはマルチチャンネルのオーディオコンテンツの空間化に対応
- 利用することでヘッドホンやスピーカーの設定を基にどのアルゴリズムが最適かを考えなくて良い
- ヘッドホン用に
Near-Field
とIn-Headレンダリング
が追加 - 内蔵スピーカーのバーチャルサラウンドがiOSで利用可能

マルチチャンネルストリームの空間化によりPoint-SourceとAmbienceBedレンダリングをサポートする

- spatializeIfMono: レガシー挙動
- bypass: 通過か出力フォーマットへのDownミックスを意味する
- pointSource: オーディオはMono出力しプレーヤーノード位置でレンダリング
- ambienceBed: オーディオは3Dに固定、プレーヤーノード位置からリスナー方向に回転可能
自動レンダリングモードを用いたambienceBed
の例

AVAudioSessionの新機能
- AVAudioSessionPromptStyle
- スタイル修正の音声プロンプトを表示
- 例えば、Siriが話してる時や電話中は音声ナビゲーションは不必要なのでプロンプトを無効にするなど
- .none: プロンプトを完全に無効
- .short: 短縮されたプロンプト
- .normal: 標準プロンプト
- スタイル修正の音声プロンプトを表示
- Defaultではオーディオレコーディング中hapticsとシステム音をミュートにするが、新しいプロパティではレコーディング中にも許可することが可能
allowHpticsAndSystemSoundsDuringRecording
propertyで設定