2019-12-03

AVAudioSessionの深い話

アドベントカレンダーを毎日書くやる気はないので毎週 1 つ記事あげます。

今回は iOS でおなじみの AVAudioSession の話です。

AVAudioSession では端末のオーディオの振る舞い方を制御することが出来ますが、あまり知られていない機能がいくつかあるのでご紹介します。

Mode

https://developer.apple.com/documentation/avfoundation/avaudiosession/mode

通常は default を選択すると思いますが、このモードは振る舞い方が一部変わります。

例えば voiceChat/videoChat を選ぶと、Voice Processing I/O を使うようになるので、ノイズキャンセリングが有効になるため、VoIP で使うケースでは大変重宝します。 ちなみに VPIO を有効にすると、iPad Pro の場合はマイクに近いほうのスピーカーから音が出なくなりますが仕様みたいです。

measurement は名前の通り測定するときに使います。DSP などは無効化され、信号処理をしやすくするためにするみたいです。

moviePlayback は動画再生のときに使います。これを使うと、端末のスピーカーでステレオ再生が強化されます。例えば iPhone X を横にすると左右のスピーカーから再生されますが、そういったサラウンド感を出すときに使うみたいです。

spokenAudio は途中で音声の割り込みがあるときに使います。このモードを設定すると、カーナビの音声案内など、短い割り込みが入った際に再生中のものを一時停止します。中断が終わり次第、音声が再開できます。詳しい話は Category Options をご覧ください。

videoRecording は動画収録をするときに使います。これは背面マイクを優先的に使うようになります。

Category

https://developer.apple.com/documentation/avfoundation/avaudiosession/category

ambient は、他のアプリが音楽再生中であっても、その音楽は停止しません。スクリーンロックやサイレントにした場合にはこのアプリが再生するサウンドは聞こえなくなります。

playback は、主に再生で使います。アプリを起動していると他のアプリの音楽は停止されます。サイレントスイッチオンまたはスクリーンロックでも再生は継続されます。

record は、主に録音で使います。サウンドの再生は出来ません。ユーザーが録音する場合は権限を付与する必要があります。

playAndRecord は録音と再生の両方を行います。主に VoIP などで使われます。他のアプリで再生しながら録音するには、AVAudioSessionCategoryOptionMixWithOthers を使う必要があります。

multiRoute は複数の出力デバイスへルーティングするときに使います。例えば USB Audio と本体のスピーカーで同時に流したりする場合などに使われます。

Category Options

https://developer.apple.com/documentation/avfoundation/avaudiosession/categoryoptions

mixWitoOthers は、再生中に割り込みが入った際に一時停止せず再生を続けるオプションです。

duckOthers は、再生中に割り込みが入った際に、一時停止はせずに音量を小さくするオプションです。常時有効にせず、カーナビゲーションの音声案内など、瞬間的に割り込みが入った際に音声を下げる場合は interruptSpokenAudioAndMixWithOthers と一緒に使う必要があります。

interruptSpokenAudioAndMixWithOthers は、spokenAudio のモードが設定されているセッションに有効なオプションです。このオプションが設定されている場合、割り込みが入った際に spokenAudio が有効なセッションに対して一時停止を要求します。setActive 時に notifyOthersOnDeactivation がセットされている割り込みセッションの場合は、セッションが解放された場合に通知が飛ぶので、既存のセッションを再開することが出来ます。

allowBluetooth は、Bluetooth を入力ルートとして使えるようにするオプションです。これと似たようなものとして、allowBluetoothA2DP がありますが、こちらは Bluetooth で再生できるようにするオプションです。

allowAirPlay は、AirPlay で再生できるようにするオプションです。

defaultToSperaker は、内蔵スピーカーから明示的に音を出すオプションです。

setPreferredSampleRate

https://developer.apple.com/documentation/avfoundation/avaudiosession/1616523-setpreferredsamplerate

サンプリングレートを指定できます。接続しているデバイスによって、サンプリングレートは変わってくるので、固定してあげたほうが良いでしょう。

ただ、あくまでも優先するだけであって、必ずしもサンプリングレートを固定できるわけではないようです。

setPreferredDataSource

https://developer.apple.com/documentation/avfoundation/avaudiosessionportdescription/1616554-setpreferreddatasource

使うマイクを指定出来ます。先ほど AVAudioSession.Mode の話をしましたが、どうしてもこのマイクを使いたいというときには明示的に指定することができます。

AVAudioSessionDataSourceDescription と組み合わせて使います。

setPreferredInput

https://developer.apple.com/documentation/avfoundation/avaudiosession/1616491-setpreferredinput

上と似ていますが、こちらは使うポートを指定できます。どういうことかというと、例えば USB Audio を優先的に使いたい場合はこちらで指定することができます。

setPreferredDataSource がマイクの向きに大して、setPreferredInput はデバイスを選択するというイメージですね。
こちらは AVAudioSessionPortDescription と組み合わせて使います。

overrideOutputAudioPort

https://developer.apple.com/documentation/avfoundation/avaudiosession/1616443-overrideoutputaudioport

出力ルートを強制的に上書きすることができます。例えば強制的に内臓スピーカーで音を鳴らしたい場合に使うことができます。


今回紹介したもの以外にも AVAudioSession には色々な機能があります。

みなさんも AVAudioSession をマスタして、良いクリスマスをお過ごしください :)