AVAudioSession とは何か
AVAudioSession は、iOS アプリとシステム (OS + デバイスのオーディオハードウェア) のあいだに立つ “仲介役 (audio session)” です。
iOS では、アプリごとに音声出力・入力が競合します。通知音・電話アプリ・ミュージックアプリ・ビデオ会議アプリなど、多くのアプリが音声を扱うため、OS は全てのアプリに対して一貫したオーディオルールを要求します。
その「ルール設定」を行うのが AVAudioSession です。
AVAudioSessionの担当領域
- 音声の優先度管理
- 自分のアプリが他アプリの音を止めるのか?
- 他アプリの音楽を背面で再生したいのか?
- サイレントスイッチの影響を受けるのか?
- 入出力のルーティング
- スピーカー
- 受話口(イヤーピース)
- Bluetoothデバイス
- 有線ヘッドホン
- 内蔵マイク / 外付けマイク
- 音声処理 (Voice Processing) の有無
- ノイズ抑制
- エコーキャンセル
- 音声通話品質の最適化
- ハードウェアリソースの確保
これらを設定する役割がAVAudioSessionになります。以下のCategory, Mode, Optionsによって上記の設定を行います。
Category, Mode, Optionsの位置付け
[Category] = 「何をしたいか?」(再生/録音/両方)
└─ [Mode] = 「どう処理したいか?」(DSPの種類)
└── [Options] = 具体的な挙動(Bluetooth, speaker, mix など)
- Category で基本の音の方向性
- Mode で音声処理パイプライン
- Options で細かい挙動や例外ルール
を設定する構造になっています。
Category
OSに対してアプリが音をどう扱いたいかを宣言するものです。再生だけなのか、録音もするのか、他のアプリの音を止めるのかという音の目的を決定します。
| Category | 再生 | 録音 | 他アプリ音 | 主な用途・特徴 |
|---|---|---|---|---|
| ambient | ○ | × | ミックス(奪わない) | BGM、効果音、環境音アプリ。サイレントスイッチの影響を受ける。 |
| soloAmbient | ○ | × | 停止(奪う) | ゲーム、映像。サイレントスイッチの影響を受ける。 |
| playback | ○ | × | 停止(奪う) | 音楽/動画プレーヤー。サイレント無視可。バックグラウンド再生可。 |
| record | × | ○ | — | 録音専用アプリ(ボイスメモなど) |
| playAndRecord | ○ | ○ | 停止(奪う) | 通話・ボイスチャット(AEC/AGC などが使える)。Bluetooth/HFP 対応。 |
| multiRoute | ○ | ○ | — | 複数の出力/入力を同時使用(iPad向け)。高度な音響システム用。 |
multiRoute は iPhone では制限が多く、基本的には iPad 向けのプロ用途。
Mode
Category の中で、さらに細かい音声処理パイプラインを選択するもの。
特に「通話系」「音声チャット系」で強力な信号処理アルゴリズムが働く。
| Mode | 特徴 | 主な用途 |
|---|---|---|
| default | 特別な処理なし(標準) | BGM、音楽再生、通常録音 |
| voiceChat | 通話最適化 | VoIP(Zoom / Discord / LINE通話) |
| videoChat | voiceChat + 映像チャット向け調整 | FaceTime / Zoom |
| spokenAudio | 音声コンテンツ最適化(再生速度制御など) | 読み上げ、語学学習、ポッドキャスト |
| measurement | 最小遅延・最小処理・リニアな音取得 | 音響解析、SPL測定、FFTアプリ |
| gameChat | ゲーム向け低遅延チャットパイプライン | オンラインゲーム |
| moviePlayback | 映画再生向けの最適化 | サラウンド再生アプリ |
| videoRecording | 動画撮影時の音声最適化 | カメラ録画アプリ |
| voicePrompt | 音声プロンプト再生向け(ナビ案内等) | カーナビ、アシスタント系 |
Mode は OSに隠蔽されている音声処理が自動的に行われます。
- エコーキャンセラー (AEC)
- ノイズ抑制 (NR)
- オートゲイン (AGC)
- ハウリング抑制
- レベル補正
など、アプリで実装したら大変な高度な信号処理を OS が自動で行ってくれます。
Options
Options(AVAudioSession.CategoryOptions)は、Category + Mode で表現しきれない細かな音の挙動を追加で指定するための設定です。
Options は「細かい動作挙動」を決定するオプションスイッチです。
例えば:
- 音をスピーカーに強制的に出すか?
- Bluetooth / AirPods を使えるようにするか?
- 他アプリの音とミックス再生を許可するか?
- サイレントスイッチを無視するか?
- 通知音に duck(音量減) を適用するか?
など、アプリのユーザー体験を左右する重要な要素です。
| Option | 説明 | よく使う用途 |
|---|---|---|
| mixWithOthers | 他アプリ音とミックス再生(奪わない) | 動画編集、読み上げと音楽同時再生 |
| duckOthers | 再生中に他アプリ音量を一時的に下げる(Duck) | ナビ案内 |
| interruptSpokenAudioAndMixWithOthers | SpokenAudioを中断して効果音重ねる | 読み上げ中の通知 |
| allowBluetoothHFP | Bluetooth HFP(通話)を許可 | VoIP/通話アプリ |
| allowBluetoothA2DP | Bluetooth A2DP(高音質)を許可 | 音楽プレーヤー |
| allowAirPlay | AirPlay 出力を許可 | 動画/音楽アプリ |
| defaultToSpeaker | 受話口ではなくスピーカー出力にする | VoIP、ビデオ会議 |
| overrideMutedMicrophone | ミュートのマイクを上書き | 特殊な録音用途 |
AudioSessionを使用した実装方法
AVAudioSessionの使い方の基本は以下の4ステップです。
- AVAudioSessionを取得
- Category + Mode + Options を設定
- AudioSession を有効化
- 通知ハンドリング(割り込み)を設定
ここでは例として:
- Category: playAndRecord
- Mode: voiceChat
- Options: defaultToSpeaker(スピーカーから出す)
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playAndRecord,
mode: .voiceChat,
options: [.defaultToSpeaker, .allowBluetooth]
)
try session.setActive(true)
print("AudioSession configured")
} catch {
print("AudioSession configuration failed: \(error)")
}
}実装の注意点
- SetActive(true)のタイミング
- オーディオを開始する直前に呼ぶのが基本
- 録音/再生開始のタイミングで呼び出すほうが安全
- オーディオを開始する直前に呼ぶのが基本
- setActive(false)で解放
- 長時間使わない場合はハードウェアを解放
まとめ
AVAudioSessionはオーディオを取り扱うアプリケーションでは重要な設定を行います。
Category, Mode, Optionsという3つの設定を行うことでオーディオのアプリの設定を行います。
コメント