CRI ADX2  Last Updated: 2022-08-23 19:43 p
データの再生手順


再生に必要なファイル

ツールが出力した以下のファイルが必要になります。


  • ACFファイル(.*acf)
  • ACBファイル(.*acb)
  • AWBファイル(*.awb)
  • 同時に出力されるヘッダーファイル(*.h)
ここではチュートリアルプログラム用データを使います。


使用するデータ
  * cri

  \ * common

    \ * smpdata

      \ * criatomex

        o * SampleProject.acf

        o * AtomCueSheet.acb

        \ * AtomCueSheet.h

 

 

: チュートリアルプログラム

 

: ACFファイル

: ACBファイル

: ACBヘッダーファイル

 


プロジェクトファイルとソースコード

チュートリアルのプロジェクトファイルとソースコードは以下の場所にあります。


チュートリアルソースコードの場所
  * cri

  \ * pc

    \ * tutorials

      \ * criatomex

        \ * playback_cue

          o * pcvc

          | o * playback_cue.sln

          | o * playback_cue.vcxproj

          | \ * playback_cue.vcxproj.filter

          |  

          \ * playback_cue.c

 

[プラットフォーム固有]

: チュートリアルプログラム

 

: キュー再生チュートリアル

: プロジェクトファイルフォルダー

: Visual Studio ソリューションファイル

: Visual Studio プロジェクトファイル

: Visual Studio フィルターファイル

 

: キュー再生チュートリアル

 


プログラムの流れ

プログラムの流れを以下に示します。
  1. ヘッダーファイルのインクルード
  2. CRI Atomライブラリの初期化
  3. 必要なファイルのロード
  4. ボイスプールの作成
  5. AtomExプレーヤの作成
  6. 再生開始
  7. 再生終了待ちと内部状態の更新
  8. 終了処理
  9. 再生の確認
/* CRI SDK ヘッダー */
#include <cri_xpt.h>
/* CRI ADX2 ヘッダー */
#include <cri_atom_ex.h>
/* チュートリアルで使用するACBファイルのヘッダーファイル */
#include "AtomCueSheet.h" /* #define CRI_ATOMCUESHEET_BOMB2 (3) */
/* サンプルで使用するファイル名 */
#define ACF_FILE "SampleProject.acf"
#define ACB_FILE "AtomCueSheet.acb"
/* チュートリアル用エラーコールバック関数 */
static void tutorial_error_callback_func(
const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray);
/* main関数 */
Sint32 main(Sint32 argc, Char8 *argv[])
{
/* 最低限の初期化 */
tutorial_initialize();
/* エラーコールバック関数の登録 */
criErr_SetCallback(tutorial_error_callback_func);
/* メモリアロケータの登録 */
criAtomEx_SetUserAllocator(tutorial_alloc, tutorial_free, NULL);
/* ライブラリの初期化 */
/* ACFファイルの読み込みと登録 */
criAtomEx_RegisterAcfFile(NULL, ACF_FILE, NULL, 0);
/* ACBファイルを読み込み、ACBハンドルを作成 */
acb_hn = criAtomExAcb_LoadAcbFile(NULL, ACB_FILE, NULL, NULL, NULL, 0);
/* ボイスプールの作成 */
/* プレーヤの作成 */
player = criAtomExPlayer_Create(NULL, NULL, 0);
/* キューIDの指定 */
criAtomExPlayer_SetCueId(player, acb_hn, CRI_ATOMCUESHEET_BOMB2);
/* 再生の開始 */
for(;;) {
CriAtomExPlayerStatus explayer_status;
tutorial_sleep(10);
/* サーバ処理の実行 */
/* Exプレーヤのステータス確認 */
explayer_status = criAtomExPlayer_GetStatus(player);
/* 再生が終了したらループを抜ける */
if (explayer_status == CRIATOMEXPLAYER_STATUS_PLAYEND) {
break;
}
}
/* Atomハンドルの破棄 */
/* ボイスプールの破棄 */
/* ACBハンドルの破棄 */
/* ACFの登録解除 */
/* ライブラリの終了 */
/* 最小限の終了処理*/
tutorial_finalize();
return 0;
}
void criAtomExPlayer_Destroy(CriAtomExPlayerHn player)
AtomExプレーヤーの破棄
CriAtomExAcbObj * CriAtomExAcbHn
ACBハンドル
Definition: cri_atom_ex.h:2968
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_atom_ex.h:297
CriAtomExPlayerStatus criAtomExPlayer_GetStatus(CriAtomExPlayerHn player)
ステータスの取得
CriAtomExPlaybackId criAtomExPlayer_Start(CriAtomExPlayerHn player)
再生の開始
CriAtomExPlayerObj * CriAtomExPlayerHn
プレーヤーハンドル
Definition: cri_atom_ex.h:3513
CriAtomExPlayerHn criAtomExPlayer_Create(const CriAtomExPlayerConfig *config, void *work, CriSint32 work_size)
AtomExPlayerの作成
void criAtomExPlayer_SetCueId(CriAtomExPlayerHn player, CriAtomExAcbHn acb_hn, CriAtomExCueId id)
音声データのセット(キューID指定)
enum CriAtomExPlayerStatusTag CriAtomExPlayerStatus
プレーヤーステータス
@ CRIATOMEXPLAYER_STATUS_PLAYEND
Definition: cri_atom_ex.h:3561
CriAtomExVoicePoolHn criAtomExVoicePool_AllocateStandardVoicePool(const CriAtomExStandardVoicePoolConfig *config, void *work, CriSint32 work_size)
標準ボイスプールの作成
struct CriAtomExVoicePoolTag * CriAtomExVoicePoolHn
ボイスプールハンドル
Definition: cri_atom_ex.h:3153
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 <windows.h>
#include <stdio.h>
#include <stdlib.h>
/* CRI SDK Header */
#include <cri_xpt.h>
/* CRI ADX2 Headers */
#include <cri_atom_ex.h>
/* チュートリアルで使用するACBファイルのヘッダーファイル */
#include "../../../../common/smpdata/criatomex/AtomCueSheet.h"


cri_xpt.hは、CRI独自の型定義等が記述されているので、一番最初にインクルードします。
他のヘッダーファイルについては、インクルードする順番に依存関係はありません。
cri_atom_ex.hは、CRI Atomの機能を使うためのAPIが宣言されたヘッダーファイルです。
必ずインクルードしてください。
cri_atom_wasapi.hは、WASAPI音声出力向けの機能を使うためのAPIが宣言されたヘッダーファイルです。
WASAPI音声出力向けに用意されたAPI(機種固有の初期化/終了関数等)を実行する際に必要になります。
AtomCueSheet.hは、ACBファイル、AWBファイルのキュー情報が記述されたヘッダーファイルです。
再生するキューIDはこのヘッダーファイルに定数マクロ定義されています。
(マクロを使用せず、キュー名やキューIDを直接指定する場合には、本ヘッダーをインクルードする必要はありません。)

(2) CRI Atomライブラリの初期化


/* エラーコールバック関数の登録 */
criErr_SetCallback(tutorial_error_callback_func);
/* メモリアロケーターの登録 */
criAtomEx_SetUserAllocator(tutorial_alloc, tutorial_free, NULL);
/* ライブラリの初期化 */


CRI Atomライブラリを初期化します。 本チュートリアルでは criAtomEx_Initialize_WASAPI 関数に指定するパラメーターを簡略化しています。 criAtomEx_Initialize_WASAPI 関数の第一引数は初期化パラメーターですが、NULLを指定するとデフォルト設定で初期化を行います。 criAtomEx_Initialize_WASAPI 関数の第二、第三引数は、初期化に必要なワーク領域を指定するパラメーターです。 メモリ確保関数を criAtomEx_SetUserAllocator 関数で設定し、 ワーク領域へのポインタにNULL、ワークサイズに0を指定すると、 criAtomEx_Initialize_WASAPI 関数内部でワーク領域を動的に確保します。


(3) 必要なファイルのロード


/* ACFファイルの読み込みと登録 */
criAtomEx_RegisterAcfFile(NULL, PATH ACF_FILE, NULL, 0);
/* ACBファイルを読み込み、ACBハンドルを作成 */
NULL, PATH ACB_FILE, NULL, PATH AWB_FILE, NULL, 0);


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プレーヤの作成


/* プレーヤの作成 */
player = criAtomExPlayer_Create(NULL, NULL, 0);


AtomExプレーヤ(以下、単にプレーヤと呼びます。)を作成します。
第一引数は作成パラメーターですが、本チュートリアルでは省略します。省略した場合、デフォルト値を使用してプレーヤを作成します。 プレーヤを作成するとプレーヤハンドル ( CriAtomExPlayerHn ) が得られます。 プレーヤに対する様々な操作は、このプレーヤハンドルを介して行います。
本チュートリアルではワークメモリを指定しません。 criAtomExPlayer_Create 関数にワークメモリを指定しなかった場合(NULL指定、0サイズ)、 関数内部でメモリを動的に確保します。


(6) 再生開始


/* キューIDの指定 */
criAtomExPlayer_SetCueId(player, acb_hn, CRI_ATOMCUESHEET_BOMB2);
/* 再生の開始 */


再生するキューを criAtomExPlayer_SetCueId 関数で指定し、::criAtomExPlayer_Start 関数で再生を開始します。 criAtomExPlayer_SetCueId 関数の第二引数には、ロード済みのACBハンドルを指定します。 第三引数には、ACB内のキューをID(整数値)で指定します。
プレーヤは、指定されたACBハンドルとキューIDを元に、ACB内のキューデータを再生します。 本チュートリアルで指定している CRI_ATOMCUESHEET_BOMB2 は、AtomCueSheet.hで定義されています。
再生の開始は criAtomExPlayer_Start 関数で行います。 criAtomExPlayer_Create 関数で作成したAtomプレーヤハンドルを指定します。


(7) 再生終了待ちと内部状態の更新


/* 再生ループ */
for(;;) {
CriAtomExPlayerStatus explayer_status;
tutorial_sleep(10);
/* サーバー処理の実行 */
/* Exプレーヤのステータス確認 */
explayer_status = criAtomExPlayer_GetStatus(player);
/* 再生が終了したらループを抜ける */
if (explayer_status == CRIATOMEXPLAYER_STATUS_PLAYEND) {
break;
}
}


criAtomExPlayer_GetStatus 関数でプレーヤの状態を取得し、 終了状態 ( CRIATOMEXPLAYER_STATUS_PLAYEND ) になったら再生ループを抜けます。 再生ループ内では、CRI Atomのサーバー処理関数である criAtomEx_ExecuteMain 関数を毎V呼びます。 毎V呼び出さないと音声データの読み込みが間に合わなくなり、音途切れの原因になります。


また、プレーヤの状態はCRI Atomのサーバー処理によって更新されるので、 criAtomEx_ExecuteMain 関数を呼び忘れないように注意してください。


(8) 終了処理


/* Atomハンドルの破棄 */
/* ボイスプールの破棄 */
/* ACBハンドルの破棄 */
/* ACFの登録解除 */
/* ライブラリの終了 */
/* 最小限の終了処理*/
tutorial_finalize();


アプリケーションの終了時には、各ハンドルをそれぞれ対応する関数で破棄します。 ハンドル作成時に動的確保されたワーク領域は、それぞれ対応するハンドル破棄関数内で解放されます。 最後に、::criAtomEx_Finalize_WASAPI関数でライブラリ終了処理を実行します。


(9) 再生の確認


ここまでの作業で、キューを再生することはできたでしょうか? うまく再生できていれば、爆発音が鳴るはずです。