AVAudioSession 【Swift】

目次

AVAudioSession とは何か

AVAudioSession は、iOS アプリとシステム (OS + デバイスのオーディオハードウェア) のあいだに立つ “仲介役 (audio session)” です。

iOS では、アプリごとに音声出力・入力が競合します。通知音・電話アプリ・ミュージックアプリ・ビデオ会議アプリなど、多くのアプリが音声を扱うため、OS は全てのアプリに対して一貫したオーディオルールを要求します。

その「ルール設定」を行うのが AVAudioSession です。

AVAudioSessionの担当領域

  1. 音声の優先度管理
    • 自分のアプリが他アプリの音を止めるのか?
    • 他アプリの音楽を背面で再生したいのか?
    • サイレントスイッチの影響を受けるのか?
  2. 入出力のルーティング
    • スピーカー
    • 受話口(イヤーピース)
    • Bluetoothデバイス
    • 有線ヘッドホン
    • 内蔵マイク / 外付けマイク
  3. 音声処理 (Voice Processing) の有無
    • ノイズ抑制
    • エコーキャンセル
    • 音声通話品質の最適化
  4. ハードウェアリソースの確保

これらを設定する役割が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通話)
videoChatvoiceChat + 映像チャット向け調整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)ナビ案内
interruptSpokenAudioAndMixWithOthersSpokenAudioを中断して効果音重ねる読み上げ中の通知
allowBluetoothHFPBluetooth HFP(通話)を許可VoIP/通話アプリ
allowBluetoothA2DPBluetooth A2DP(高音質)を許可音楽プレーヤー
allowAirPlayAirPlay 出力を許可動画/音楽アプリ
defaultToSpeaker受話口ではなくスピーカー出力にするVoIP、ビデオ会議
overrideMutedMicrophoneミュートのマイクを上書き特殊な録音用途

AudioSessionを使用した実装方法

AVAudioSessionの使い方の基本は以下の4ステップです。

  1. AVAudioSessionを取得
  2. Category + Mode + Options を設定
  3. AudioSession を有効化
  4. 通知ハンドリング(割り込み)を設定

ここでは例として:

  • 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)")
    }
}

実装の注意点

  1. SetActive(true)のタイミング
    • オーディオを開始する直前に呼ぶのが基本
      • 録音/再生開始のタイミングで呼び出すほうが安全
  2. setActive(false)で解放
    • 長時間使わない場合はハードウェアを解放

まとめ

AVAudioSessionはオーディオを取り扱うアプリケーションでは重要な設定を行います。

Category, Mode, Optionsという3つの設定を行うことでオーディオのアプリの設定を行います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次