本チュートリアルでは、CRI Atomを使ってキューを再生する方法を説明します。 
再生に必要なファイル
 ランタイム側で必要なファイルは、ツールを使って作成したACFファイル(.*acf)、ACBファイル(.*acb)、AWBファイル(*.awb)と、同時に出力されるヘッダーファイル(*.h)です。 本チュートリアルでは、サンプルプログラムと同じデータを使用します。具体的には以下のファイルです。 
 
 
プロジェクトファイルとソースコード
 チュートリアルのプロジェクトファイルとソースコードは以下の場所にあります。 
 
 
  
チュートリアルソースコードの場所
 | 
 | 
 |   | 
 |   | 
 |   | 
 |   | 
 |   | 
 |   | 
   
                : Visual Studio ソリューションファイル
   | 
   
            : Visual Studio プロジェクトファイル
   | 
   
    : Visual Studio フィルターファイル
   | 
 |   | 
 |   | 
 |   | 
  
プログラムの流れ
 プログラムの流れを以下に示します。 
- ヘッダーファイルのインクルード
 
- CRI Atomライブラリの初期化
 
- 必要なファイルのロード
 
- ボイスプールの作成
 
- AtomExプレーヤの作成
 
- 再生開始
 
- 再生終了待ちと内部状態の更新
 
- 終了処理
 
- 再生の確認
 
#include <cri_xpt.h>
 
#include <cri_atom_ex.h>
#include <cri_atom_wasapi.h>
 
#include  "../../../../common/smpdata/criatomex/tutorial.h"
 
#define PATH                "..\\..\\..\\..\\..\\common\\smpdata\\criatomex\\"
 
#define ACF_FILE            "TutorialProject.acf"
#define ACB_FILE            "tutorial.acb"
 
CriSint32 main(CriSint32 argc, CriChar8 *argv[])
{
 
    UNUSED(argc);
    UNUSED(argv);
 
    
    tutorial_initialize();
 
    
 
    
    
    
 
    
    
    
 
    
    
    
 
    
    
 
    for(;;) {
        tutorial_sleep(10);
        
 
        
 
        
            break;
        }
    }
 
    
    
    
 
    
 
    
 
    
 
    
    tutorial_finalize();
 
    return 0;
}
CriAtomExAcbObj * CriAtomExAcbHn
ACBハンドル
Definition: cri_le_atom_ex.h:3086
 
CriAtomExAcbHn criAtomExAcb_LoadAcbFile(CriFsBinderHn acb_binder, const CriChar8 *acb_path, CriFsBinderHn awb_binder, const CriChar8 *awb_path, void *work, CriSint32 work_size)
ACBファイルのロード
 
void criAtomExAcb_Release(CriAtomExAcbHn acb_hn)
ACBハンドルのリリース
 
void criAtomEx_UnregisterAcf(void)
ACFの登録解除
 
void criAtomEx_ExecuteMain(void)
サーバー処理の実行
 
CriBool criAtomEx_RegisterAcfFile(CriFsBinderHn binder, const CriChar8 *path, void *work, CriSint32 work_size)
ACFファイルの登録
 
#define criAtomEx_SetUserAllocator(p_malloc_func, p_free_func, p_obj)
ユーザアロケーターの登録
Definition: cri_le_atom_ex.h:313
 
CriAtomExPlayerStatus criAtomExPlayer_GetStatus(CriAtomExPlayerHn player)
ステータスの取得
 
CriAtomExPlaybackId criAtomExPlayer_Start(CriAtomExPlayerHn player)
再生の開始
 
CriAtomExPlayerObj * CriAtomExPlayerHn
プレーヤーハンドル
Definition: cri_le_atom_ex.h:3678
 
CriAtomExPlayerHn criAtomExPlayer_Create(const CriAtomExPlayerConfig *config, void *work, CriSint32 work_size)
AtomExPlayerの作成
 
void criAtomExPlayer_Destroy(CriAtomExPlayerHn player)
AtomExプレーヤーの破棄
 
void criAtomExPlayer_SetCueId(CriAtomExPlayerHn player, CriAtomExAcbHn acb_hn, CriAtomExCueId id)
音声データのセット(キューID指定)
 
enum CriAtomExPlayerStatusTag CriAtomExPlayerStatus
プレーヤーステータス
 
@ CRIATOMEXPLAYER_STATUS_PLAYEND
Definition: cri_le_atom_ex.h:3726
 
CriAtomExVoicePoolHn criAtomExVoicePool_AllocateStandardVoicePool(const CriAtomExStandardVoicePoolConfig *config, void *work, CriSint32 work_size)
標準ボイスプールの作成
 
struct CriAtomExVoicePoolTag * CriAtomExVoicePoolHn
ボイスプールハンドル
Definition: cri_le_atom_ex.h:3276
 
void criAtomExVoicePool_Free(CriAtomExVoicePoolHn pool)
ボイスプールの破棄
 
void criAtomEx_Initialize_WASAPI(const CriAtomExConfig_WASAPI *config, void *work, CriSint32 work_size)
ライブラリの初期化
 
void criAtomEx_Finalize_WASAPI(void)
ライブラリの終了
 
void criErr_SetCallback(CriErrCbFunc cbf)
エラーコールバック関数の登録
 
  
プログラムの解説
 各処理の詳細について説明します。
 
 
 
1.ヘッダーファイルのインクルード
 
#include <cri_xpt.h>
 
#include <cri_atom_ex.h>
#include <cri_atom_wasapi.h>
 
#include  "../../../../common/smpdata/criatomex/tutorial.h"
  
 
 cri_xpt.hは、CRI独自の型定義等が記述されているので、一番最初にインクルードします。 他のヘッダーファイルについては、インクルードする順番に依存関係はありません。 
 
 
 cri_atom_ex.hは、CRI Atomの機能を使うためのAPIが宣言されたヘッダーファイルです。 必ずインクルードしてください。 
 
 
 toturial.hは、ACBファイル、AWBファイルのキュー情報が記述されたヘッダーファイルです。 再生するキューIDはこのヘッダーファイルに定数マクロ定義されています。 
 
 
2.CRI Atomライブラリの初期化
 
 
 
 CRI Atomライブラリを初期化します。 本チュートリアルでは::criAtomEx_Initialize_WASAPI関数に指定するパラメーターを簡略化しています。 
criAtomEx_Initialize_WASAPI 関数の第一引数は初期化パラメーターですが、NULLを指定するとデフォルト設定で初期化を行います。 
criAtomEx_Initialize_WASAPI 関数の第二、第三引数は、初期化に必要なワーク領域を指定するパラメーターです。 メモリ確保関数を::criAtomEx_SetUserAllocator 関数で設定し、 ワーク領域へのポインタにNULL、ワークサイズに0を指定すると、::criAtomEx_Initialize_WASAPI 関数内部でワーク領域を動的に確保します。 
 
 
3.必要なファイルのロード
 
 
 
 criAtomEx_RegisterAcfFile 関数を使用してACFファイルをランタイム側で読み込みます。 このファイルは環境設定ファイルです。 次に、::criAtomExAcb_LoadAcbFile 関数でACBファイルを読み込み、ハンドルを作成します。 ACBハンドルはキュー再生の際にプレーヤに指定します。 
   両関数ともワークサイズを指定する引数を取りますが、本チュートリアルでは簡略化のためにそれぞれNULL、0を指定しています。 NULL、0を指定することで、関数内部で動的にワーク領域を確保して使用します。 
 
 
 criAtomEx_RegisterAcfFile 関数、::criAtomExAcb_LoadAcbFile 関数は同期関数です。 
criAtomExAcb_LoadAcbFile 関数の実行後は、ACBファイルのロードが完了し、 関数が成功していれば有効なACBハンドル(::CriAtomExAcbHn)が返ります。 
  
 
 本チュートリアルではエラー処理を省略していますが、::criAtomEx_RegisterAcfFile 関数、 
criAtomExAcb_LoadAcbFile 関数は「ファイルがみつからない」といった理由で失敗することがあるため、 戻り値のチェックを推奨します。 
 
 
4.ボイスプールの作成
 
 
 
 標準ボイスプールを作成します。 
  第一引数はボイスプールの作成パラメーターですが、本チュートリアルでは省略します。 省略した場合、デフォルト値を使用してボイスプールを作成します。 一度生成したボイスプールはシステム側に登録され、キューを再生する際に自動的にプレーヤに割り当てられるようになります。 
  本チュートリアルではワークメモリを指定しません。 
criAtomExVoicePool_AllocateStandardVoicePool 関数にワークメモリを指定しなかった場合(NULL指定、0サイズ)、 関数内部でメモリを動的に確保します。 
 
 
5.AtomExプレーヤの作成
 
 
 
 AtomExプレーヤ(以下、単にプレーヤと呼びます。)を作成します。 
  第一引数は作成パラメーターですが、本チュートリアルでは省略します。省略した場合、デフォルト値を使用してプレーヤを作成します。 プレーヤを作成するとプレーヤハンドル(::CriAtomExPlayerHn)が得られます。 プレーヤに対する様々な操作は、このプレーヤハンドルを介して行います。 
  本チュートリアルではワークメモリを指定しません。 
criAtomExPlayer_Create 関数にワークメモリを指定しなかった場合(NULL指定、0サイズ)、 関数内部でメモリを動的に確保します。 
 
 
6.再生開始
 
 
 
 再生するキューを 
criAtomExPlayer_SetCueId 関数で指定し、::criAtomExPlayer_Start 関数で再生を開始します。 
criAtomExPlayer_SetCueId 関数の第二引数には、ロード済みのACBハンドルを指定します。 第三引数には、ACB内のキューをID(整数値)で指定します。 
   プレーヤは、指定されたACBハンドルとキューIDを元に、ACB内のキューデータを再生します。 本チュートリアルで指定している CRI_TUTORIAL_BOMB2 は、tutorial.hで定義されています。 
  再生の開始は::criAtomExPlayer_Start 関数で行います。 
criAtomExPlayer_Create 関数で作成したAtomプレーヤハンドルを指定します。 
 
 
7.再生終了待ちと内部状態の更新
 
for(;;) {
    tutorial_sleep(10);
    
 
    
 
    
        break;
    }
}
  
 
 criAtomExPlayer_GetStatus 関数でプレーヤの状態を取得し、 終了状態(::CRIATOMEXPLAYER_STATUS_PLAYEND)になったら再生ループを抜けます。 再生ループ内では、CRI Atomのサーバー処理関数である 
criAtomEx_ExecuteMain 関数を毎V呼びます。 毎V呼び出さないと音声データの読み込みが間に合わなくなり、音途切れの原因になります。 
  
 
 また、プレーヤの状態はCRI Atomのサーバー処理によって更新されるので、::criAtomEx_ExecuteMain 関数を呼び忘れないように注意してください。 
 
 
8.終了処理
 
 
 
 アプリケーションの終了時には、各ハンドルをそれぞれ対応する関数で破棄します。 ハンドル作成時に動的確保されたワーク領域は、それぞれ対応するハンドル破棄関数内で解放されます。 最後に、::criAtomEx_Finalize_WASAPI 関数でライブラリ終了処理を実行します。 
 
 
9.再生の確認
 
 ここまでの作業で、キューを再生することはできたでしょうか? うまく再生できていれば、爆発音が鳴るはずです。