ユーザーマルチスレッドモデルでの実装

サンプルのディレクトリ

/cri/pc/samples/criatomex/user_multithread_framework

サンプルの解説

Atomライブラリのサーバー処理をユーザーが独自に作成したスレッドで動作させる場合、以下の操作を行います。
#define USER_THREAD_PRIORITY_AUDIO      (8)
#define USER_THREAD_PRIORITY_FILEACCESS (12)
#define USER_THREAD_PRIORITY_DATADECOMP (24)
/* ユーザーマルチスレッドモデルでADX2を使う場合の各種サーバー処理 */
/* Various server threads used in the user-multithread model of ADX2 */
static void app_audio_process(void *arg)
{
    (void)arg;
    /* CRI ADX2 オーディオ処理 */
    /* Audio processing by CRI ADX2 */
    criAtomEx_ExecuteAudioProcess();
}

static void app_file_access_process(void *arg)
{
    (void)arg;
    /* CRI File System ファイルアクセス(リード)処理 */
    /* ロード完了コールバックはこのスレッドから呼ばれる */
    /* File processing (read-in) by CRI File System */
    /* The load completion callback function is invoked from this thread. */
    criFs_ExecuteFileAccess();
}

static void app_data_decomp_process(void *arg)
{
    (void)arg;
    /* CRI File System データ展開処理*/
    /* Data decompression processing by CRI File System */
    criFs_ExecuteDataDecompression();
}

                :

void Sample_Initialize(void)
{
                :
                :

    /* ユーザーマルチスレッドモデル指定 */
    /* Specify user multithread mode */
    criAtomEx_SetDefaultConfig(&criatomex_config);
    criatomex_config.thread_model = CRIATOMEX_THREAD_MODEL_USER_MULTI;

    /* ライブラリの初期化 */
    /* Library initialization */
    smputl_initialize(&criatomex_config, NULL, 0);

                :
                :

    /* D-Basの作成、ACFファイルの読み込みと登録            */
    /* ACBファイルの読み込みとACBハンドルの作成            */
    /* ボイスプールの作成 プレーヤーの作成とステータス取得 */

                :
                :

    /* 各処理用のスレッドを作成 */
    /* Create a thread for each processing */
    {
        CriUint32 thread_work_size;
        thread_work_size = userThread_CalculateWorkSize();

        /* スレッドのワークを確保 */
        /* Allocate thread work area */
        user_audio_thread_work          = user_alloc_func(NULL, thread_work_size);
        user_file_access_thread_work    = user_alloc_func(NULL, thread_work_size);
        user_data_decomp_thread_work    = user_alloc_func(NULL, thread_work_size);

        /* オーディオ処理はCRI Atomライブラリの初期化と同じスレッドで動作させる */
        user_audio_thread = userThread_Create(
            user_audio_thread_work, thread_work_size,
            app_audio_process, app_obj, USER_THREAD_PRIORITY_AUDIO, 0);
        user_file_access_thread = userThread_Create(
            user_file_access_thread_work, thread_work_size,
            app_file_access_process, app_obj, USER_THREAD_PRIORITY_FILEACCESS, THREAD_AFFINITY_CORE2);
        user_data_decomp_thread = userThread_Create(
            user_data_decomp_thread_work, thread_work_size,
            app_data_decomp_process, app_obj, USER_THREAD_PRIORITY_DATADECOMP, THREAD_AFFINITY_CORE2);
    }
}
注意:
criAtomEx_ExecuteMain関数を使用してサーバー処理を行うと関数内でファイル読み込み完了待ちが発生し、関数内で数Vの間処理がロックされてしまいます。
ユーザーマルチスレッドモデルを使用する場合はメインスレッド上ではcriAtomEx_ExecuteAudioProcess関数のみを実行し、他のスレッドでcriFs_ExecuteFileAccess関数やcriFs_ExecuteDataDecompression関数を実行するようにしてください。

CRI Middleware logo Copyright (c) 2006-2018 CRI Middleware Co., Ltd.