目次

ターゲットプラットフォーム:
Wwise SDK 2018.1.11
オーディオセッションを理解する

iOS SDKは、アプリ、およびアプリ間のレベルでオペレーティングシステムのオーディオの扱いの仕組みに従うため、Apple オーディオ セッション API に依存しています。この オーディオ セッション の主な目標は、異なるシステムイベント、またはユーザーアクションが発生した場合に、オーディオアプリに既知の動作を提供することです。言い換えれば、オーディオ セッションは、オーディオアプリとiOS オペレーティングシステムの間を仲介して、予測可能なオーディオの動作を提供します。

システムとその他のアプリのアプリケーションオーディオの動作は、オーディオ セッション 一連のカテゴリとサブカテゴリによって制御されており、これをカテゴリオプションと呼んでいます。オーディオを使用、または生成するすべてのiOSアプリは、与えられた オーディオ セッションカテゴリ、そしてその期待されるオーディオ動作を示すため、オプションのカテゴリオプションセットに、それ自身を登録する必要があります。

オーディオ セッションはまた、iOS システムの中断、およびオーディオのルートの変更を扱い、応答するために使用されます。

最後に、オーディオ セッションはまた、iOSが異なるオーディオアプリとシステムサウンドの間の、低レベルハードウェア オーディオ コンポーネントを共有するためにも使用される仕組みでもあります。 従って、システムイベントを適切に扱わないことが原因で起きる、アプリのオーディオの喪失、またはアプリのクラッシュを避けるため、オーディオ セッション要件に従うことは必須です。

オーディオアプリがオーディオをキャプチャ、もしくは生成する場合はいつでも、システムのオーディオ セッションを要求し、アクティブ化する必要があります。 例えば、ある音楽アプリユーザーが「再生」ボタンを押した場合、そのアプリそのオーディオ セッションを要求し、ボタンを押し終わった後にアクティブ化し、ユーザーが「一時停止」ボタンを押した場合には、非アクティブ化します。 多くのiOSに組み込まれているアプリは、オーディオ セッションを使用して、オーディオを出力、またはキャプチャのいずれかを行うので、これがユーザーアプリのオーディオ動作に影響を与えることがあります:

  • カレンダー アプリ (オーディオアラートを介して)
  • カメラ (ビデオ)
  • 時計アプリ (アラーム、ストップウォッチ、タイマー)
  • FaceTime
  • Garage Band
  • iTunes Store
  • 地図
  • 音楽アプリ
  • 電話
  • ポッドキャスト
  • SIRI
  • ボイスメモ

いつの時点でも、iOSはそのアプリのオーディオ セッション を非アクティブ化して、受信通話、タイマーで設定したオーディオのアラーム、またはカレンダーイベントなどの様々なオーディオイベントに対応します。これらは 割り込み イベントとして知られ、オーディオアプリは オーディオ セッション の優先順位の変更に対応し、「割り込み」が終了すると適切に再生や録音を再開しますアプリの切り替え、ホームボタンを押した際のアプリのバックグランド処理、デバイスのロックまたはロック解除などでも、オーディオ セッション のアクティブ化と非アクティブ化が発生します。次のセクションでは、これらのイベントをWwiseがどのように管理し、適切なオーデェオのためにクライアントアプリは何をすべきかについて、細かく説明します。

オーディオ セッションのカテゴリとオプション

iOSで実行するすべてのオーディオアプリは、オーディオ セッションを使用してサウンドの処理、取得、または出力を行う必要があります。すべてのオーディオアプリが、同じ目標や目的でオーディオを使用する訳ではないので (あるオーディオアプリはバックグランド実行でオーディオを取得する必要があり、ゲームでは他のオーディオアプリが起動すると完全に一時停止します)、iOS は、いくつかのオーディオ セッションのカテゴリを定義し、ユーザーアクション、または先に示したようなシステムイベントが発生した場合に期待されるオーディオの動作をグループ化しています。各オーディオアプリは、デバイスでオーディオを処理する前に、自身を与えられたカテゴリに登録する必要があります。

カテゴリで異なる主なオーディオ動作には次のようなものがあります:

  • デバイスの着信/サイレントスイッチ (往々にして「ロック」ボタンと言われる)によって、アプリのオーディオを無音にするかどうか;
  • あるオーディオアプリが、ミックス不可能のオーディオアプリとして設定されている他のアプリのオーディオを停止するかどうか; または
  • そのアプリがオーディオ入力 (録音)、オーディオ出力 (再生)、もしくはこの両方を許可するか。

各オーディオアプリは、一度に一つのカテゴリにのみ属することが可能です。カテゴリが明示的に選択されていない場合には、デフォルトの AVAudioSessionCategorySoloAmbient カテゴリが使用されます。iOS Wwise SDKでは、三つの主なカテゴリーが利用できます:

  • AkAudioSessionCategoryAmbient: iOS オーディオ セッション AVAudioSessionCategoryAmbient カテゴリと同等
    • オーディオ再生のみに使用されます (録音はできません)。
    • 着信/サイレントスイッチがアクティブ化 (「ロック」が押される) されると、アプリのオーディオを無音にします。
    • 他のオーディオアプリがその オーディオ セッションをフォアグラウンドでアクティブ化した場合、アプリのオーディオが中断されます。
    • 他のオーディオアプリがその オーディオ セッションをバックグランドでアクティブ化し、このアプリが AkAudioSessionCategoryOptionMixWithOthers オプションを使用して再生と録音ができるように設定されている場合、アプリのオーディオは、他のオーディオとミックスされます (以下参照)。
    • アプリのオーディオは、SFX、会話、または音楽など、多くの種類のサウンドを含むことができます。アプリのオーディオがWwiseでミュートできるBGMとして特にタグされていない限り (詳細は、ユーザーミュージック(BGM)やDVRの取り扱い を参照)、Ambient カテゴリにありすべてのアプリのオーディオは、他のアプリのオーディオをミックスされます。最も典型的なケースは、ユーザーが音楽アプリを起動して、あなたのアプリに切り替える前に音楽の再生を開始した場合です。
    • このカテゴリは、他のアプリのオーディオを体験に取り込みながら、オーディオがアプリに面白い体験を加えるゲームに適しています。このカテゴリを使用すると、ユーザーは例えば、あなたのアプリがSFXや会話を出力している間、音楽アプリを使って音楽を聴くことができます。
    • Ambient は、あなたのアプリからバックグランドでオーディオを再生することは許可しません。ユーザーがあなたのアプリから他のアプリに切り替えた場合、他のアプリがミックス可能なカテゴリを使用していたとしても、あなたのアプリは無音になります。
  • AkAudioSessionCategorySoloAmbient: iOS オーディオ セッション AVAudioSessionCategorySoloAmbient カテゴリと同等
    • オーディオ再生のみに使用されます (録音はできません)。
    • 着信/サイレントスイッチがアクティブ化 (「ロック」が押される) されると、アプリのオーディオを無音にします。
    • Ambient カテゴリとの主な違いは、オーディオ セッションがアクティブ化されると、他のアプリからのオーディオが中断されます。
    • アプリのオーディオは、他のオーディオアプリがそのオーディオ セッションをフォアグラウンドでアクティブ化すると中断されます。
    • アプリのオーディオは、他のオーディオアプリがそのオーディオ セッションを、ミックス可能もしくはミックス不可能なカテゴリの下、バックグランドでアクティブ化すると、中断されます
    • このカテゴリはまた、バックグランドで実行されている他のオーディオアプリとミックスするべきではないオーディオを使用するゲームアプリに推奨します。例えば、音楽アプリで音楽を聞くユーザーがいて、あなたのアプリに切り替えると、アプリが再開した場合に音楽は無音になります。
  • AkAudioSessionCategoryPlayAndRecord: iOS オーディオ セッション AVAudioSessionCategoryPlayAndRecord カテゴリと同等
    • オーディオの再生と録音に使用されます。
    • アプリのオーディオは、着信/サイレントスイッチがアクティブ化されても (「ロック」が押される) 無音にはなりません。
    • アプリのオーディオは、他のオーディオアプリがそのオーディオ セッションをフォアグラウンドでアクティブ化すると中断されます。
    • デフォルトでは、このカテゴリはオーバーライドされた AkAudioSessionCategoryOptionMixWithOthers オプション (以下参照) を使用せず、音楽アプリもしくは他のオーディオストリーミングアプリ (Spotifyなど) からの音楽など、他のアプリのオーディオは、あなたのアプリで再生中のオーディオとミックスされません。
    • カテゴリオプション AkAudioSessionCategoryOptionMixWithOthers (以下参照) を使用している場合には、アプリのオーディオは、他のオーディオアプリがその オーディオ セッションをバックグランドでアクティブ化した際に、他のソースとミックスされます。例えば、音楽アプリで音楽を聞いているユーザーが、あなたのアプリに切り替えると、その音楽なあなたのアプリのオーディオにミックスされます。しかし、AkAudioSessionCategoryAmbient のように, Wwiseでミュートするよう設定されたアプリからのBGMは (詳細は ユーザーミュージック(BGM)やDVRの取り扱い を参照)、このオプションでは出力されません。
    • このカテゴリは、音楽の再生や録音に重点を置く、オーディオが一番に重要なアプリに使用することを推奨します (カラオケアプリ、オーディオストリーミングアプリ、またはオーディオ録音アプリなど)。
    • このカテゴリは、適切に設定されたアプリのplistファイルと共に使用すると、アプリがバックグランドへ切り替えられている間も、オーディオの再生/録音が可能になります。ボイス録音アプリや音楽プレイヤーアプリなどバックグランドでのオーディオ処理のサポートが必要なアプリの場合、このモードはこれを可能にする、Wwiseがサポートする唯一のモードです。これを行うにはしかし、アプリのオプション plist で、Required background mode keyを一つ設定して「App plays audio or streams audio/video using Airplay」フィールドを追加する必要があります。 上記に挙げたオーディオ セッションカテゴリに加えて、あるカテゴリのデフォルト挙動はカテゴリのオプションを使用してオーバーライドすることができます。

オーディオ セッション カテゴリオプションは、enum AkAudioSessionCategoryOptionsで設定できます:

  • AkAudioSessionCategoryOptionMixWithOthers: iOS オーディオ セッション AVAudioSessionCategoryOptionMixWithOthers カテゴリオプションと同等
    • AkAudioSessionCategoryPlayAndRecord カテゴリとのみ使用できます。
    • デフォルトのカテゴリ挙動をオーバーライドして、オーディオを他のミックス可能なオーディオアプリとミックス可能にします。
  • AkAudioSessionCategoryOptionDuckOthers: iOS オーディオ セッション AVAudioSessionCategoryOptionDuckOthers カテゴリオプションと同等
    • AkAudioSessionCategoryPlayAndRecord カテゴリとのみ使用できます。
    • 実行中のアプリのオーディオ セッションがアクティブの場合、 他のアプリからのオーディオを「ダッキング」できます。
  • AkAudioSessionCategoryOptionAllowBluetooth: iOS オーディオ セッション AVAudioSessionCategoryOptionAllowBluetooth カテゴリオプションと同等
    • AkAudioSessionCategoryPlayAndRecord カテゴリとのみ使用できます。
    • 録音中に、Bluetoothデバイスを使用できる入力ルートにできます。
  • AkAudioSessionCategoryOptionDefaultToSpeaker : iOS オーディオ セッション AVAudioSessionCategoryOptionDefaultToSpeaker カテゴリオプションと同等
    • AkAudioSessionCategoryPlayAndRecord カテゴリとのみ使用できます。
    • このオプションを使用し、その他のオーディオルートが使用できない場合には、アプリのオーディオはデバイスの組み込みスピーカーから再生されます。これが使用されず、他のオーディオルートが使用できない場合には、アプリのオーディオはレシーバーから再生されます。
    • このオプションは、レシーバーがあるiPhoneのみに関連します。これは、iPadならびにiPodには影響を与えません。

iOS オーディオイベントのWwiseでの仕組み

iOSデバイスでは、特定の数のユーザーアクション、もしくはシステムイベントは、あなたのアプリがデバイスのオーディオハードウェアを使っている間に発生します。例えば、着信通話では、ユーザーがあなたのアプリを他のアプリに切り替え、鳴っている可聴のタイマーのアラート、ユーザーが差し込み口へ/からヘッドフォンを接続/接続を切る、またはユーザーが着信/サイレントスイッチを押すことは、あなたのアプリのオーディオの挙動に影響を与えるイベントである可能性があります。このセクションでは、そのようなイベントに対するiOSの異なる仕組み、ならびにそれがWwiseを通じてアプリに伝えられるかを示します。

iOSには主に3つのオーディオイベントのファミリーがあります: 音声割り込み、ソースの変更、およびルートの変更です。

- 音声割り込み

異なるシステムイベント、またはユーザーアクションが、 そのアプリの オーディオ セッションの非アクティブ化に繋がる可能性があります。これはまた、オーディオ セッションの中断とも言われます。例えば、着信通話を受ける場合、または他のセッションとミックス出来ないカテゴリで、他のオーディオアプリがそのオーディオ セッションをアクティブ化する場合に、そのような中断が発生します。アプリケーションがOSによってバックグランドに送られたときのサウンドエンジンの対応は、Audio Sessionモードによって異なります。

Solo Ambientカテゴリのオーディオはミックス不可能なので、サウンドエンジンが自ら停止します。つまり、オーディオは一切処理されず、APIコールも対応されません。これはAppleのガイドラインに従い、バッテリーを節約するための対応です。つまり、あなたのゲームも、処理を一時停止し、AK::SoundEngineコールを一切コールしないようにする必要があります。アプリケーションが前面に戻ると、サウンドエンジンが再開され、キューに入っているAPIコールが処理されます。以上の流れは、全て自動で行われます。

AmbientやPlay and Recordのカテゴリ、またはその他のオーディオをほかのアプリケーションとミキシングできるようなモードでは、サウンドエンジンが通常どおりにオーディオを処理し続けます。

そのようなシステムイベントについて、あなたのアプリケーションが知る必要があり、ゲームエンジンがそれを公開しない場合は、AkPlatformInitSettings.audioCallbacks.interruptionCallbackでコールバックファンクションを設定することができます。そうしないと、サウンドエンジン側から見て、これらのイベントに対処するためにできることは、何もありません。

オーディオ セッションの中断が発生すると、そのオーディオ セッションが非アクティブ化されたアプリは、Wwise SDKでアプリケーションコールバックに翻訳されたメッセージを通じて通知を受けます。オーディオ セッションの中断は、2つのイベントに分けることができます: 中断が開始された際の通知、そして中断が終了した際の通知です。Wwise SDKコールバックでは、 中断の開始/終了は、コールバックパラメータを通じて取得することができます。

Wwiseは、これらの中断を受け取るとサウンドエンジン コンポーネントの中断/再開処理を行い、適切なオーディオ セッション のアクティブ化/非アクティブ化のためのユーザー側のアクションはこれ以上必要ありません。オーディオ セッションが中断または再開した際 (例えばUI要素の更新、または中断に視覚的フィードバックを与えるなど)、SDKクライアントアプリで特定の処理が必要な場合には、上記に示したアプリケーションコールバックにコードを追加する必要があります。Wwise SDKで「begin (開始)」の中断を受け取ると、ユーザーコールバックはサウンドエンジンが中断される に呼び出されます。一方、「end (終了)」の中断をWwise SDKで受け取ると、サウンドエンジンはユーザーコールバックメソッドを呼び出すに再開されます。

Caution: 「begin」オーディオ中断コールバックは内部的にサウンドエンジンを停止する前に呼び出されて期待される結果が保証できないので、いずれの種類のオーディオの再生にも使用してはなりません
Caution: ユーザーオーディオ中断コールバックは、UIまたはオブジェクトプロパティの更新などの単純なタスクに使用することのみを意図しています。これは、CUPに負荷をかける処理や、時間のかかる演算には決して使用しないでください。そのような場合、期待される結果は保証されません。
Caution: Apple iOS の取扱説明書は、「begin」中断通知は、中断通知の終了と常に一致するとは限らず、オーディオ セッションがいつ再開できるかを検知する唯一の方法は、アプリがフォアグラウンドに切り替えられた時に呼び出すデレゲートメソッドに依存すると警告をしています。従って、オーディオ中断コールバックは、オーディオアプリでオーディオセッションの復元のための唯一の仕組みではありません。

- ソースの変更

オーディオアプリがオーディオを再生すると、iOSは他のアプリに、この新規のセッションアクティベーションで、現在アクティブなオーディオ セッションとフォアグラウンドにいることを通知します。環境音、またはあなたのアプリのためにミックス可能オプションがアクティブ化されている再生ならびに録音以外のセッションでは、これはiOSのよるオーディオ セッションを非アクティブ化という結果になります。よって、この通知が本当に有用なのは、ミックス可能なカテゴリが使用されたときのみです。この主な目的は、他のアプリからオーディオが再生された際、アプリにその一部もしくはすべてのオーディオをミュートする/ミュートを解除するべきかどうかを判断させることです。このiOSの通知は、更に Wwise SDK コールバックに翻訳され、先に示したオーディオ中断のようにアプリに登録することができます。ソース変更コールバックはまた「begin」もしくは「end」イベントがあり、もう一つのオーディオアプリケーションがそのオーディオ セッションのアクティブ化/非アクティブ化したかをアプリケーションに通知します。

struct、 AkInitSettings のメンバ sourceChangeCallback は、関数ポインタで、先に示したオーディオソース変更コールバックのためにユーザーコールバックを含みます。Integration Demo ではこれを、static AKRESULT DemoInterruptCallback(bool in_bEnterInterruption, void* in_pCookie ) メソッドで示しています。選択されたメソッドは、関数のアドレスをコールバックメソッドアドレスに設定して、ソース変更コールバックとして登録されます: initSettings.sourceChangeCallback = DemoAudioSourceChangeCallback。bool in_bEnterInterruption パラメータは、他のアプリのオーディオ セッション のアクティブ化/非アクティブ化の、「begin」または「end」の通知状態を反映します。ユーザー定義のオプションであるコールバック cookie もまた、struct "AkInitSettings BGMCallbackCookie" メンバに設定できます。

一度登録すると、すべてのソース変更通知、またはWwise SDKのオーディオソースの明示された認証が、コールバックをトリガーします。

あなたのアプリにミックス可能なカテゴリが使用されている場合 (環境音、またはミックス可能オプションオーバライドの再生ならびに録音)、Wwiseはソース変更通知の「begin」または「end」をそれぞれ受け取ると、BGMバスを内部的にミュートまたはミュートの解除をします。「begin」ソース変更通知を受け取ると、内部的BGMバスはユーザーコールバックメソッドを呼び出す にミュートされます。同様に、「end」ソース変更通知を受け取ると、BGMバスはユーザーコールバックを呼び出すにミュートを解除されます。

ミックス不可能カテゴリ (ソロの環境音、またはミックス可能オプションオーバーライドのない再生ならびに録音)では、もう一つのアプリがそのオーディオ セッションをバックグランドでアクティブ化すると、iOSはソース変更通知の代わりにオーディオ中断「begin」を送るので、ユーザーはそのようなケースでソース変更コールバックが「begin」パラメータで呼び出されることを期待してはなりません。しかしオーディオ中断コールバックも登録されている場合には、ユーザーはソース変更コールバックの代わりに「begin」パラメーターのこのコールバックを受け取ります。

Note: 先述の通り、オーディオ中断「begin」コールバックは、その後に内部的サウンドエンジンの停止が続くので、他のアプリがそのオーディオ セッションを非アクティブ化した時に、これに一致するソース変更「end」コールバックを受け取り、 これが内部的にサウンドエンジンの再開処理を行うので、ユーザーアクションはこれ以上必要ありません。

- ルートの変更

オーディオルートは、デバイスの異なるオーディオハードウェアコンポーネントを通る、与えられたオーディオの経路です。例えば、ユーザーがヘッドセットのプラグを入れたり、外したりすると、オーディオルートは変更されます。サウンドの出力はヘッドセットに送られるか、もしくはデバイスのスピーカーから出る代わりに停止されるかのいずれかになるからです。iOSは、 AVAudioSessionRouteChangeNotification を登録したアプリに、ルートの変更を通知することができます。

Apple オーディオ セッションは、ヘッドフォンのプラグに入れる/外すなどのイベントなどの基本的なルート変更が起きた場合、自動的に実装アプリのオーディオ セッションのアクティブ化/非アクティブ化の処理をします。 Wwise SDKは、先述の中断やオーディオソース変更のケースと異なり、いずれのコールバックの仕組みは提供していません。ユーザーのアプリがそのようなルートの変更を検知して、そのアプリで特定の要素を反映する必要がある場合には、Integration Demoを参照して、これを簡単に行う方法の例を参照してください。