エラーハンドリングについて
本項では、CRI Atomライブラリが取り扱うエラーの種別や、エラー検知の方法について説明します。
CRI Atomライブラリでは「エラー」と呼ばれる状況が2種類あります。
エラーコールバックの発生」と「ハンドルのエラー状態」です。


エラーコールバックについて

エラーコールバックは、 criErr_SetCallback 関数でアプリケーションが関数登録することで有効になります。
エラーコールバックは主に「致命的なエラー」の場合に発生します。例えば不正な引数を関数に渡したり、関数の使い方を間違った場合など主にプログラムの実装ミスによってエラーコールバックは発生します。ワークメモリ不足もこれに含まれます。
エラーコールバック関数の仕様
エラーコールバック関数の引数には、エラーの原因を特定するために必要な情報(文字列など)が渡されます。
エラー文字列はエラーコードと説明文字列からなっているので、アプリケーションではこの文字列をログ出力するように実装してください。
エラー文字列が 'W'から始まる「警告」というレベルも存在します。
「警告」はプログラム実行上で致命的な問題が発生しているわけではないが正常でもないという状況です。
エラーコールバック関数の実装と登録
エラーコールバック関数内ではエラー情報を確認(ログ出力)する程度の処理に留めてください。
エラーコールバック内でADX2の再生停止関数を呼び出すなどの制御を行うと動作が不正になる場合があります。
具体的なエラーコールバックの実装を紹介します。
/* エラーコールバック関数 */
void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray)
{
    const CriChar8 *err_message;

    /* エラー発生時はこの部分に処理が移ります */

    /* 引数群にエラー情報が入っていますが、                   */
    /* そのままでは可読性が悪いので、一旦書式を変換します  */

    /* エラー情報を書式化されたエラー文字列に変換 */
    err_message = criErr_ConvertIdToMessage(errid, p1, p2);

    /* エラー情報をデバッガに出力 */
    OutputDebugString(err_message);

    return;
}

/* メイン処理 */
main()
{
        :
    /* エラーコールバック関数の登録 */
    /* 備考)この処理は1度実行するだけでOKです */
    criErr_SetCallback(user_error_callback_func);

    /* CRI AtomライブラリAPIの呼び出し */
    criAtomEx_Initialize_WASAPI(…);
        :
}



エラー状態について

エラーコールバックとは別に AtomExプレーヤ などいくつかのハンドルはハンドル状態を持っており、そのなかに「エラー状態」が存在します。
ハンドルがエラー状態になってしまった場合は、エラーコールバックが発生していないかを確認して原因を修正してください。
エラー状態になった場合のプログラムの対応はアプリケーションの方針によって変わりますが、例えば該当のハンドルでの再生を停止してアプリケーションの処理を続行するなどの対策が考えられます。
例えば AtomExプレーヤ の場合、 criAtomExPlayer_GetStatus 関数でハンドル状態を取得できます。
AtomExプレーヤで音声ファイルの再生を行った際に、指定されたファイルが存在しない場合や、リードエラーが起きて読み込みに失敗した場合、 criAtomExPlayer_GetStatus 関数が CRIATOMEXPLAYER_STATUS_ERROR を返します。
ユーザは定期的にAtomExプレーヤのステータスをチェックすることで、エラーの発生を検知することが可能です。

具体的なソースコードは、以下のようになります。
main()
{
        :
    /* キューIDをセット */
    criAtomExPlayer_SetCueId(player, NULL, cue_id);

    /* セットされたキューを再生 */
    criAtomExPlayer_Start(player);

    /* 再生完了待ち */
    for (;;) {
        /* ステータスの取得 */
        status = criAtomExPlayer_GetStatus(player);

        /* ステータスのチェック */
        if (status == CRIATOMEXPLAYER_STATUS_ERROR) {
            /* エラー発生時はエラー処理を行なう */
                :
        }

        /* サーバ処理の実行 */
        criAtomEx_ExecuteMain();

        /* 画面表示の更新等 */
            :
    }
        :
}

CRI Middleware logo Copyright (c) 2012-2018 CRI Middleware Co., Ltd. CRI ADX2 LE マニュアル (for Cocos2d-x) SDKVer.2.10版