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は途中で音声の割り込みがあるときに使います。一番わかりやすいのはカーナビゲーションの音声案内のときに再生中のソースの音量を一時的に下げて、音声案内を聞き取りやすくするとかでしょうか。

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

Category

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

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

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

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

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

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

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をマスターして、良いクリスマスをお過ごしください :)