バージョン
Wwise SDK 2018.1.11
|
iOS SDKは、アプリ、およびアプリ間のレベルでオペレーティングシステムのオーディオの扱いの仕組みに従うため、Apple オーディオ セッション API に依存しています。この オーディオ セッション の主な目標は、異なるシステムイベント、またはユーザーアクションが発生した場合に、オーディオアプリに既知の動作を提供することです。言い換えれば、オーディオ セッションは、オーディオアプリとiOS オペレーティングシステムの間を仲介して、予測可能なオーディオの動作を提供します。
システムとその他のアプリのアプリケーションオーディオの動作は、オーディオ セッション 一連のカテゴリとサブカテゴリによって制御されており、これをカテゴリオプションと呼んでいます。オーディオを使用、または生成するすべてのiOSアプリは、与えられた オーディオ セッションカテゴリ、そしてその期待されるオーディオ動作を示すため、オプションのカテゴリオプションセットに、それ自身を登録する必要があります。
オーディオ セッションはまた、iOS システムの中断、およびオーディオのルートの変更を扱い、応答するために使用されます。
最後に、オーディオ セッションはまた、iOSが異なるオーディオアプリとシステムサウンドの間の、低レベルハードウェア オーディオ コンポーネントを共有するためにも使用される仕組みでもあります。 従って、システムイベントを適切に扱わないことが原因で起きる、アプリのオーディオの喪失、またはアプリのクラッシュを避けるため、オーディオ セッション要件に従うことは必須です。
オーディオアプリがオーディオをキャプチャ、もしくは生成する場合はいつでも、システムのオーディオ セッションを要求し、アクティブ化する必要があります。 例えば、ある音楽アプリユーザーが「再生」ボタンを押した場合、そのアプリそのオーディオ セッションを要求し、ボタンを押し終わった後にアクティブ化し、ユーザーが「一時停止」ボタンを押した場合には、非アクティブ化します。 多くのiOSに組み込まれているアプリは、オーディオ セッションを使用して、オーディオを出力、またはキャプチャのいずれかを行うので、これがユーザーアプリのオーディオ動作に影響を与えることがあります:
いつの時点でも、iOSはそのアプリのオーディオ セッション を非アクティブ化して、受信通話、タイマーで設定したオーディオのアラーム、またはカレンダーイベントなどの様々なオーディオイベントに対応します。これらは 割り込み
イベントとして知られ、オーディオアプリは オーディオ セッション の優先順位の変更に対応し、「割り込み」が終了すると適切に再生や録音を再開しますアプリの切り替え、ホームボタンを押した際のアプリのバックグランド処理、デバイスのロックまたはロック解除などでも、オーディオ セッション のアクティブ化と非アクティブ化が発生します。次のセクションでは、これらのイベントをWwiseがどのように管理し、適切なオーデェオのためにクライアントアプリは何をすべきかについて、細かく説明します。
iOSで実行するすべてのオーディオアプリは、オーディオ セッションを使用してサウンドの処理、取得、または出力を行う必要があります。すべてのオーディオアプリが、同じ目標や目的でオーディオを使用する訳ではないので (あるオーディオアプリはバックグランド実行でオーディオを取得する必要があり、ゲームでは他のオーディオアプリが起動すると完全に一時停止します)、iOS は、いくつかのオーディオ セッションのカテゴリを定義し、ユーザーアクション、または先に示したようなシステムイベントが発生した場合に期待されるオーディオの動作をグループ化しています。各オーディオアプリは、デバイスでオーディオを処理する前に、自身を与えられたカテゴリに登録する必要があります。
カテゴリで異なる主なオーディオ動作には次のようなものがあります:
各オーディオアプリは、一度に一つのカテゴリにのみ属することが可能です。カテゴリが明示的に選択されていない場合には、デフォルトの AVAudioSessionCategorySoloAmbient
カテゴリが使用されます。iOS Wwise SDKでは、三つの主なカテゴリーが利用できます:
AkAudioSessionCategoryAmbient:
iOS オーディオ セッション AVAudioSessionCategoryAmbient
カテゴリと同等AkAudioSessionCategoryOptionMixWithOthers
オプションを使用して再生と録音ができるように設定されている場合、アプリのオーディオは、他のオーディオとミックスされます (以下参照)。Ambient
カテゴリにありすべてのアプリのオーディオは、他のアプリのオーディオをミックスされます。最も典型的なケースは、ユーザーが音楽アプリを起動して、あなたのアプリに切り替える前に音楽の再生を開始した場合です。Ambient
は、あなたのアプリからバックグランドでオーディオを再生することは許可しません。ユーザーがあなたのアプリから他のアプリに切り替えた場合、他のアプリがミックス可能なカテゴリを使用していたとしても、あなたのアプリは無音になります。AkAudioSessionCategorySoloAmbient:
iOS オーディオ セッション AVAudioSessionCategorySoloAmbient カテゴリと同等Ambient
カテゴリとの主な違いは、オーディオ セッションがアクティブ化されると、他のアプリからのオーディオが中断されます。AkAudioSessionCategoryPlayAndRecord:
iOS オーディオ セッション AVAudioSessionCategoryPlayAndRecord カテゴリと同等AkAudioSessionCategoryOptionMixWithOthers
オプション (以下参照) を使用せず、音楽アプリもしくは他のオーディオストリーミングアプリ (Spotifyなど) からの音楽など、他のアプリのオーディオは、あなたのアプリで再生中のオーディオとミックスされません。AkAudioSessionCategoryOptionMixWithOthers
(以下参照) を使用している場合には、アプリのオーディオは、他のオーディオアプリがその オーディオ セッションをバックグランドでアクティブ化した際に、他のソースとミックスされます。例えば、音楽アプリで音楽を聞いているユーザーが、あなたのアプリに切り替えると、その音楽なあなたのアプリのオーディオにミックスされます。しかし、AkAudioSessionCategoryAmbient
のように, Wwiseでミュートするよう設定されたアプリからのBGMは (詳細は ユーザーミュージック(BGM)やDVRの取り扱い を参照)、このオプションでは出力されません。オーディオ セッション カテゴリオプションは、enum AkAudioSessionCategoryOptions
で設定できます:
AkAudioSessionCategoryOptionMixWithOthers:
iOS オーディオ セッション AVAudioSessionCategoryOptionMixWithOthers
カテゴリオプションと同等AkAudioSessionCategoryPlayAndRecord
カテゴリとのみ使用できます。AkAudioSessionCategoryOptionDuckOthers:
iOS オーディオ セッション AVAudioSessionCategoryOptionDuckOthers
カテゴリオプションと同等AkAudioSessionCategoryPlayAndRecord
カテゴリとのみ使用できます。AkAudioSessionCategoryOptionAllowBluetooth:
iOS オーディオ セッション AVAudioSessionCategoryOptionAllowBluetooth
カテゴリオプションと同等AkAudioSessionCategoryPlayAndRecord
カテゴリとのみ使用できます。AkAudioSessionCategoryOptionDefaultToSpeaker
: iOS オーディオ セッション AVAudioSessionCategoryOptionDefaultToSpeaker
カテゴリオプションと同等AkAudioSessionCategoryPlayAndRecord
カテゴリとのみ使用できます。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。
セッション のアクティブ化/非アクティブ化の、「begin」または「end」の通知状態を反映します。ユーザー定義のオプションであるコールバック cookie もまた、bool
in_bEnterInterruption
パラメータは、他のアプリのオーディオ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を参照して、これを簡単に行う方法の例を参照してください。