目次

Wwise SDKを利用して、オーディオ セッションで作業を行う

Wwise SDKを使用して、あなたのオーディオアプリで簡単、そして正確に オーディオ セッションを管理するためには、特定の簡単なステップが幾つか必要になります。Wwiseは、ユーザーがアプリの本質に集中できるよう、 iOS オーディオ セッションの複雑な部分を影で処理します。すべてのオーディオの中断、ソースの変更の仕組みは、既にWwiseが内部的に処理し、関連するコールバックはエンドユーザー側の完全なオプションとなっています。 これらの場合のサウンドエンジンの停止ならびに再開も、SDKが処理します。

Integration Demoは、 異なるオーディオ セッションパラメーターの設定ならびに初期化方法と、 オーディオ中断コールバックならびにオーディオのルート変更の登録方法を学ぶ最適な出発点と言えます。それらすべてのステップは、IntegrationDemoAppDelegate.mm ソースファイルにあります。

Wwiseでオーディオアプリを設定する

アプリのオーディオ セッションを設定し、異なる利用可能なコールバックを使用するには:

struct AkPlatformInitSettings::AkAudioSessionProperties メンバを使用して、eCategoryeCategoryOptions、および eMode を、望みの オーディオ セッション カテゴリー に、オプションのオーバーライドオプションと、モードと共に設定します。

Note.gif
Note:
  • enum AkAudioSessionCategoryOptions メンバは、複数のカテゴリーオプションを持つように設定可能なビットマスクです。Integration Demoでは、IntegrationDemoAppDelegate.mm、メソッド GetAudioSessionCategoryOptionBitMask() が、入力ブールタイプで、希望のオプションを設定/設定解除する、このマスクを使用方法を示しています。
Note.gif
Note:
  • オーディオ セッションは、iOS レベルで、サウンドエンジン init 呼び出しの間に初期化されます。これは、IntegrationDemoのIntegrationDemoAppDelegate.mm ファイル中、IntegrationDemo::Instance.Init() コールの間に呼び出されます。オーディオ セッションカテゴリーの変更は、 このステップの後、 AVFoundationフレームワークからのAVAudioSessionのsharedInstanceを使って行うことは可能ですが、Integration Demoの didFinishLaunchingWithOptions delegate メソッドのように、アプリケーション作成の最初に AkPlatformInitSettings を相応に設定することを推奨します。

以下、iOS オーディオ セッションに完全の互換性のある基本的なオーディオアプリを簡単に作成するために、いずれのWwise SDK ユーザーアプリもが必要とする簡単なステップです:

  1. オーディオ セッション カテゴリーを設定する。
    • struct AkPlatformInitSettings.audioSession.eCategoryを、希望する値で設定する。
    • struct AkPlatformInitSettings.audioSession.eCategoryOptionsを、希望する値で設定する (オプション)。

  2. 中断コールバックを登録する (オプション)。
    • struct AkPlatformInitSettings.audioCallbacks.interruptionCallback を、ユーザー定義のコールバックメソッドに設定する。
    • このコールバックメソッドは、AKRESULT callBackName(bool, void*) を形成するための AkAudioSourceChangeCallbackFunc タイプを考慮する必要があります。
    • オーディオアプリケーションの種類やゲームのジャンルによって、ユーザー中断コールバックを使用すると、多くのことを達成することができます:
      • リズムベースのゲームなど、オーディオに依存するアプリケーションでは、ゲーム全体を一時停止するために利用できます。
      • オーディオ再生アプリケーションでは、コールバックを使用して視覚的に中断を反映することにも使用できます。
      • 「begin」オーディオ中断が発生した際、Wwiseは内部的にレンダリングのオプションをtrueに設定したサウンドエンジンを停止しますから、 アプリで完全なオーディオエンジンの無効化が必要な場合には、ユーザー中断コールバックで達成できます。
      • 例えば、電話の呼び出しを扱う場合、中断コールバックの間、バックグランドで出力なしにオーディオエンジンを実行したままにしておくよりは、完全にサウンドエンジンを無効にした方が、CPU効率が良くなります。

  3. ソース変更コールバックの登録 (オプション)。
    • struct AkInitSettings.sourceChangeCallback を、ユーザー定義コールバックメソッドに設定。
    • このコールバックメソッドは、AKRESULT callBackName(bool, void*) を形成するための AkAudioSourceChangeCallbackFunc タイプを考慮する必要があります。
    • ソース変更コールバックは、今あなたのアプリがそのオーディオ セッションをフォアグラウンドで使用している間、他のアプリがそのオーディオ セッションをアクティブ化もしくは非アクティブ化しているのかをユーザーが知りたい場合に利用されます。
    • ユーザーが音楽アプリまたはいずれのオーディオストリーミングアプリを、バックグランドで、例えばイヤホンのロモートコントロールを使用してコントロールしている場合、あなたのアプリがこのイベントに反応して、特定のサウンドバスを無効にしたり、あなたのアプリが必要不可欠である場合には、アプリケーション全体を無効にする場合に便利です。
    • 内部的にWwiseは、 「begin」/「end」ソース変更通知を受け取ると、バックグランドの音楽バスを無効/有効にします。ですから、もしあなたのアプリの音楽トラックがBGMバスを使用していると、ソース変更通知を受け取った際に、その音楽はミュートされます。

  4. ルート変更通知の登録 (オプション)。
    • iOS NotificationCenter に、AVAudioSessionRouteChangeNotification を登録し、これに対するセレクタを提供します (コールバック)
    • Integration Demo ソースコードで簡単なサンプルを参照してください。

  5. アプリのフォアグラウンド/バックグランド切り替えを管理。
    • あなたのアプリ delegate - (void)applicationWillResignActive:(UIApplication *)アプリケーションメソッドで、AK::SoundEngine::Suspend(false) を呼び出して、Wwiseを停止します。
    • あなたのアプリ delegate - (void)applicationDidBecomeActive:(UIApplication *) アプリケーションメソッドで、AK::SoundEngine::WakeupFromSuspend() を呼び出して、Wwiseを再開します
    • あなたのアプリでバックグランド オーディオが必要な場合には、サウンドエンジンを停止/再開しないで、AkAudioSessionCategoryPlayAndRecord カテゴリを、先に説明した修正したアプリ情報plistと共に使用します。
Note.gif
Note: 上記で説明したステップについての詳細は、iOS Integration Demo IntegrationDemoAppDelegate.mm ソースコートで例を参照してください。
Caution.gif
Caution: 上記のすべてのステップ (フォアグラウンド/バックグランド切り替え処理を除く) は、必ず AK::SoundEngine::Init( &in_initSettings, &in_platformInitSettings )でサウンドエンジンを初期化するに行ってください。

アプリのフォアグラウンド/バックグランド切り替え管理

アプリの状態の切り替え処理は通常、すべてのアプリが実装する必要のある、 UIApplicationDelegate プロトコルを通じて行われます。Appleの説明書では、アプリは次の5つの状態のいずれかであると示されています:

  • Not Running (実行されていない)
  • Inactive (フォアグラウンド)
  • Active (フォアグラウンド)
  • Background
  • Suspended

アプリが、ホームボタンを使用して、または例えば電話に応答する場合にはシステムによって、フォアグラウンドからバックグラウンドへ切り替えられた場合、次のdelegateメソッドが、この順番に呼び出されます:

  • (void)applicationWillResignActive:(UIApplication *)application
  • (void)applicationDidEnterBackground:(UIApplication *)application

その逆に、ホームボタンを使用、または以前にアプリを中断した通話を終了するなどで、アプリをバックグラウンドからフォアグラウンドに移動する際には、次のdelegateメソッドが、この順番に呼び出されます:

  • (void)applicationWillEnterForeground:(UIApplication *)application
  • (void)applicationDidBecomeActive:(UIApplication *)application

アプリに特定のバックグラウンド処理がない場合、バックグランドの状態になるとまもなく、停止状態に移行します。例えば、システムのメモリ容量が低くなるなどの理由で、iOSからいずれの通知もなく停止する場合もあります。

これらのdelegateは実行アプリケーションに紐付けられているため、Wwise ランタイムはこれに気づくことがありません。従ってこのような状態にすべきではありません。あなたのアプリが、バックグラウンドでサウンドの再生もしくは録音をする必要がなければ、CPUの不必要な処理を制限し、システムのオーディオリソースアクセスの制限により、アプリがクラッシュすることを避けるため、アクティブな状態から離れる前に、サウンドを停止することを強く推奨します。同様に、あなたのアプリがバックグラウンドからフォアグラウンドへ移行しようという場合、アプリがそのオーディオ処理を再開できるよう、サウンドエンジンを再開する必要があります。従って、これらの停止/開始処理は、アプリケーションの (void)applicationWillResignActive:(UIApplication *)application ならびに (void)applicationDidEnterBackground:(UIApplication *)application delegate メソッドでそれぞれ行う必要があります。

Note.gif
Note: オーディオ セッション カテゴリー AkAudioSessionCategoryPlayAndRecord のみで、アプリがバックグラウンドの状態でのオーディオ再生および/または録音ができます。この動作が必要な場合には、アプリ情報plistをXcode で修正し、'Required background modes' キーに、'App plays audio or streams audio/video using Airplay' 値と共に追加します。

典型的なオーディオ セッション共有シナリオ

幅広いオーディオ セッション共有シナリオで起こる、コールフロー全体を良く理解するために、ここで幾つか例をあげて、Wwise と iOS オーディオ セッションを使用して、アプリ間オーディオを処理する方法を説明します。

  1. あなたのアプリがオーディオを再生/録音中に電話の呼び出しを受け、通話がアクティブな間、アプリの切り替えが発生しない場合:
    • 電話が鳴ると、あなたのアプリの オーディオ セッション は、システムによって非アクティブ化され (電話は常に他のタスクよりもセッションの優先度が高い) 、電話アプリがフォアグラウンドに出されます。
    • このアプリの delegate applicationWillResignActive() が呼び出され、AK::SoundEngine::Suspend(bool in_bRenderAnyway) コールを停止するかは、ユーザーのアプリに任されています。
    • 着信するアクティブ電話呼び出しは、あなたのアプリのオーディオを少しの間停止するので、in_bRenderAnywayfalseを送って、サウンドエンジンのレンダリングを無効にすることを推奨します。
    • Wwise SDKはまた、 「begin」中断通知をiOSから受け取り、これがアプリの中断コールバックが登録されていれば、適切なパラメータと共にこれを呼び出します。
    • サウンドエンジンは即座に停止し、すべてのAACベースのノードは仮想化され、停止中の問題を回避します。
    • 登録されていれば、オーディオルート変更通知も受け取り、アプリにオーディオ セッションのカテゴリーが変更されたことを知らせます。
    • ユーザーが通話を放棄、または通話が終了した場合:
      • あなたのアプリの オーディオ セッションが再開されます。
      • アプリのdelegate applicationDidBecomeActive() が呼び出され、ユーザーはAK::SoundEngine::WakeupFromSuspend() 呼び出しを使用して、サウンドエンジンの処理を再開する必要があります。
      • Wwise SDKは、「end」中断通知をiOSから受け取ります。
      • サウンドエンジンは、ACCノードの再アクティブ化と共に内部的に再開されます。
      • この後、あなたのアプリは「end」中断コールバックをが登録されている場合、適切なパラメータと共に受け取ります。

  2. あなたのアプリがオーディオを再生/録音中に電話の呼び出しを受け、アプリの切り替えが、通話がアクティブな間に発生した場合:
    • 電話が鳴ると、あなたのアプリの オーディオ セッション は、システムによって非アクティブ化され (電話は常に他のタスクよりもセッションの優先度が高い) 、電話アプリがフォアグラウンドに出されます。
    • アプリのdelegate applicationWillResignActive() が呼び出され、AK::SoundEngine::Suspend(bool in_bRenderAnyway) 呼び出しを使用して、Wwiseサウンドエンジンを停止するかは、ユーザーのアプリに任されています。
    • Wwise SDKは、「begin」中断通知を受け取り、アプリの中断コールバックが登録されていれば、適切なパラメータと共にこれを呼び出します。
    • サウンドエンジンは即座に停止し、すべてのAACベースのノードは仮想化され、停止中の問題を回避します。
    • 登録されていれば、オーディオルート変更通知も受け取り、アプリにオーディオ セッションのカテゴリーが変更されたことを知らせます。
    • 通話の間、ユーザーがホームボタンを押してアプリを元に切り替えた場合:
      • あなたのアプリの オーディオ セッションが再開されます。
      • アプリのdelegate applicationDidBecomeActive() が呼び出され、ユーザーは AK::SoundEngine::WakeupFromSuspend() 呼び出しを利用して、サウンドエンジンの処理を再開する必要があります。
      • Wwise SDKは、「begin」ソース変更通知を受け取る可能性もあり、これに呼応して、ソース変更コールバックが登録されている場合、これを呼び出します。
      • あなたのアプリがミックス可能なセッションカテゴリーを使用している場合 (Ambient または PlayAndRecord を'mixable (ミックス可能)' オプションで)、Wwise SDKのソース変更通知は、オーディオ セッションのカテゴリとオプション の説明の通り、バックグラウンドの音楽バスをミュートします。
      • アプリでどのセッションカテゴリーを使用していても、電話アプリからのサウンドが、あなたのアプリのオーディオをフォアグラウンドにした状態でミックスされます。
    • ユーザーが通話に戻った場合:
      • アプリのdelegate applicationWillResignActive() が呼び出され、AK::SoundEngine::Suspend(bool in_bRenderAnyway) 呼び出しを使用して、Wwiseサウンドエンジンを停止するかは、ユーザーのアプリに任されています。

  3. 異なるセッションカテゴリーで、イヤホンをリモートコントロールに使用することの影響
    • あなたのアプリが AkAudioSessionCategoryAmbient カテゴリーを使って設定されている場合:
      • イヤホンのリモートコントロール (再生/停止) ボタンを押すと、バックグランドにある音楽アプリからのユーザーの音楽が (開始/一時停止) します。
      • Wwise SDKは、「再生」または「停止」のいずれかが押されると、「begin」または「end」ソース変更通知を受け取り、これに呼応して、アプリソースの変更コールバックが登録されている場合、これを呼び出します。
      • オーディオ セッションカテゴリーがミックス可能なものなので、 サウンドは音楽アプリとあなたのアプリの間でミックスされます。
    • あなたのアプリが AkAudioSessionCategorySoloAmbient カテゴリーを使って設定されている場合:
      • イヤホンのリモートコントロールボタンを押すと、バックグランドの音楽アプリからのユーザーの音楽が開始されます。
      • このカテゴリーはミックスができないので、あなたのアプリの オーディオ セッション は非アクティブ化され、Wwise SDKは、「begin」オーディオ中断通知を受け取り、ユーザー中断コールバックが登録されている場合、これを呼び出します。
      • Wwise SDKのサウンドエンジンは、内部的に停止されます。
      • リモートコントロールを押してユーザーの音楽を停止した場合、あなたのアプリの オーディオ セッションは復元されます。
      • Wwise SDKは 「end」 ソース変更通知を受け取り、内部的にオーディオエンジンを再開し、AACベースのノードを復元します。
      • この後、登録されていれば、Wwiseはあなたのアプリのソース変更コールバックを呼び出します。
    • あなたのアプリが AkAudioSessionCategoryPlayAndRecord カテゴリーを使って設定されている場合:
      • 動作は AkAudioSessionCategoryAmbient カテゴリーと同様です。