11. Audio Session管理
これまで延々と説明してきた内容はAudio Sessionというオブジェクトを通して、アプリがiOS機器の中でどのようにオーディオ環境を使いたいか、また使うことができるのか
ということである。これはAudio Sessionとしては一番外側の、しかし最も重要な部分である。
ここまでのカテゴリ、オプション、モードという3つの設定に関しては、AVAudioSessionのドキュメントでいう「Management an Audio Session」という項に分類される メソッドおよびプロパティに含まれている。
Management an Audio Sessionに分類されているメソッドとプロパティの一覧を以下に示す。
上記のメソッドを見た通り、オプションは独立して設定することはできず、カテゴリを設定するときに一緒に指定しなければならない。
モードは独立して設定できる。しかし、モードを設定して、あとからカテゴリを設定した時、モードがそのカテゴリでサポートされていない場合、 モードはDefaultに戻されてしまう。
また、カテゴリとオプションの組み合わせが無効だった場合はエラーになる。
カテゴリを設定したあと、無効なモードを設定するとやはりエラーになる。
確実な手順としてはsetCategory:withOptions:error:メソッドでカテゴリとオプションを設定し、そこでエラーにならなかったことを 確認し、それからsetMode:error:メソッドでモードを設定し、ここでもエラーにならなかったことを確認するのが良いだろう。
設定されたカテゴリ、オプション、モードはプロパティでそれぞれ確認できる。
なぜなら無効な組み合わせかどうかをすべてチェックして有効な組み合わせにしかならないようにしているからである。
ここで設定に関して注意することがある。
前述の手順、カテゴリ&オプション、モードの順で設定してそれぞれがノーエラー、という手順に従っていれば間違いないが、
例えば、PlayAndRecordカテゴリでオプション無し、それからVoiceChatモードを設定をすると、 categoryOptionの値は4、すなわちAllowBluetoothオプションがセットされている。
VoiceChatモードを選択することで、あとからAllowBluetoothオプションが設定されるからである。
しかし、そのままもう一度PlayAndRecordカテゴリでオプション無しを設定すると、ここで一度AllowBluetoothオプションがクリアされてしまう。
しかし、すでに設定されているVoiceChatモードはPlayAndRecordカテゴリでは有効な組み合わせのため、VoiceChatモードはDefaultモードには 戻らない。
この状態でモードをもう一度VoiceChatモードに設定しても、モードが変わっていないため何もしないようなのである。
つまり、AllowBluetoothオプションをセットするという副作用が働かないのである。
これはVideoChatモードも同様だった。
これらのことからカテゴリ、オプション、モードは有効な組み合わせが設定されるように設定メソッドがチェックし、 プロパティに反映する、という役割を持っていることになる。
では実際にそれがアプリのAudio Sessionとして有効になるのはいつなのか。
次に、Audio Sessionのアクティベートについて説明しよう。
ここまでのカテゴリ、オプション、モードという3つの設定に関しては、AVAudioSessionのドキュメントでいう「Management an Audio Session」という項に分類される メソッドおよびプロパティに含まれている。
Management an Audio Sessionに分類されているメソッドとプロパティの一覧を以下に示す。
- category (property)
- categoryOptions (property)
- – setCategory:error:
- – setCategory:withOptions:error:
- mode (property)
- – setMode:error:
- – setActive:error:
- – setActive:withOptions:error:
- – setCategory:error: --- カテゴリの設定をする
- – setCategory:withOptions:error: --- オプション付きでカテゴリの設定をする
- – setMode:error: --- モードの設定をする
上記のメソッドを見た通り、オプションは独立して設定することはできず、カテゴリを設定するときに一緒に指定しなければならない。
モードは独立して設定できる。しかし、モードを設定して、あとからカテゴリを設定した時、モードがそのカテゴリでサポートされていない場合、 モードはDefaultに戻されてしまう。
また、カテゴリとオプションの組み合わせが無効だった場合はエラーになる。
カテゴリを設定したあと、無効なモードを設定するとやはりエラーになる。
確実な手順としてはsetCategory:withOptions:error:メソッドでカテゴリとオプションを設定し、そこでエラーにならなかったことを 確認し、それからsetMode:error:メソッドでモードを設定し、ここでもエラーにならなかったことを確認するのが良いだろう。
設定されたカテゴリ、オプション、モードはプロパティでそれぞれ確認できる。
- category (property)
- categoryOptions (property)
- mode (property)
なぜなら無効な組み合わせかどうかをすべてチェックして有効な組み合わせにしかならないようにしているからである。
ここで設定に関して注意することがある。
前述の手順、カテゴリ&オプション、モードの順で設定してそれぞれがノーエラー、という手順に従っていれば間違いないが、
例えば、PlayAndRecordカテゴリでオプション無し、それからVoiceChatモードを設定をすると、 categoryOptionの値は4、すなわちAllowBluetoothオプションがセットされている。
VoiceChatモードを選択することで、あとからAllowBluetoothオプションが設定されるからである。
しかし、そのままもう一度PlayAndRecordカテゴリでオプション無しを設定すると、ここで一度AllowBluetoothオプションがクリアされてしまう。
しかし、すでに設定されているVoiceChatモードはPlayAndRecordカテゴリでは有効な組み合わせのため、VoiceChatモードはDefaultモードには 戻らない。
この状態でモードをもう一度VoiceChatモードに設定しても、モードが変わっていないため何もしないようなのである。
つまり、AllowBluetoothオプションをセットするという副作用が働かないのである。
これはVideoChatモードも同様だった。
これらのことからカテゴリ、オプション、モードは有効な組み合わせが設定されるように設定メソッドがチェックし、 プロパティに反映する、という役割を持っていることになる。
では実際にそれがアプリのAudio Sessionとして有効になるのはいつなのか。
次に、Audio Sessionのアクティベートについて説明しよう。