CRI ADX  Last Updated: 2024-03-21 14:32 p
ユーザーマルチスレッドモデルでの実装

サンプルのディレクトリ

/cri/pc/samples/criatomex/user_multithread_framework

サンプルで使用しているデータ

/cri/common/smpdata/criatomex/
  • SampleProject.acf
  • AtomCueSheet.acb
  • AtomCueSheet.awb

サンプルの解説

Atomライブラリのサーバー処理をユーザーが独自に作成したスレッドで動作させる場合、以下の操作を行います。
  • ライブラリ初期化時にスレッドモデルをユーザーマルチスレッドモデルと指定する。
  • スレッドを作成し、スレッド上でサーバー処理関数を定期的に実行する。
#define USER_THREAD_PRIORITY_AUDIO (8)
#define USER_THREAD_PRIORITY_FILEACCESS (12)
#define USER_THREAD_PRIORITY_DATADECOMP (24)
/* ユーザーマルチスレッドモデルでADXを使う場合の各種サーバー処理 */
/* Various server threads used in the user-multithread model of ADX */
static void app_audio_process(void *arg)
{
(void)arg;
/* CRI ADX オーディオ処理 */
/* Audio processing by CRI ADX */
}
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. */
}
static void app_data_decomp_process(void *arg)
{
(void)arg;
/* CRI File System データ展開処理*/
/* Data decompression processing by CRI File System */
}
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);
}
}
CriError criFs_ExecuteFileAccess(void)
ファイルアクセス処理の実行(非スレッド時環境向け)
CriError criFs_ExecuteDataDecompression(void)
データ展開処理の実行(非スレッド時環境向け)
#define criAtomEx_SetDefaultConfig(p_config)
ライブラリ初期化用コンフィグ構造体にデフォルト値をセット
Definition: cri_atom_ex.h:326
void criAtomEx_ExecuteAudioProcess(void)
ユーザーマルチスレッド用サーバー処理の実行
@ CRIATOMEX_THREAD_MODEL_USER_MULTI
ユーザマルチスレッド
Definition: cri_atom_ex.h:1273
注意
criAtomEx_ExecuteMain関数を使用してサーバー処理を行うと関数内でファイル読み込み完了待ちが発生し、関数内で数Vの間処理がロックされてしまいます。
ユーザーマルチスレッドモデルを使用する場合はメインスレッド上ではcriAtomEx_ExecuteAudioProcess関数のみを実行し、他のスレッドでcriFs_ExecuteFileAccess関数やcriFs_ExecuteDataDecompression関数を実行するようにしてください。