ワーク領域渡しによる初期化

サンプルのディレクトリ

/cri/pc/samples/criatomex/memory_management

サンプルの解説

CRI Atomは独自のメモリアロケーション機能を持っていません。
アプリケーションが指定したメモリアロケータを利用するか、アプリケーションから渡されたワーク領域を使用します。
以下のコードは、アプリケーション側でワーク領域を確保し、CRI Atomに渡して初期化、ハンドルの作成を行う例です。
    CriAtomExPlayerConfig player_config;
    CriAtomExConfig atomex_config;
    CriAtomExAdxVoicePoolConfig adxvp_config;
    CriSint32 atomex_work_size;
    void *atomex_work;
    CriSint32 acf_work_size;
    void *acf_work;
    CriSint32 acb_work_size;
    void *acb_work;
    CriSint32 vp_work_size;
    void *vp_work;
    CriSint32 player_work_size;
    void *player_work;
    CriAtomExPlayerHn player;
    CriAtomExVoicePoolHn voice_pool;
    CriAtomExAcbHn acb_hn;
    /* エラーコールバック関数の登録 */
    criErr_SetCallback(user_error_callback_func);

    /* ライブラリ設定パラメーターの初期化 */
    criAtomEx_SetDefaultConfig(&atomex_config);
    /* ライブラリワークサイズの計算 */
    atomex_work_size = criAtomEx_CalculateWorkSize(&atomex_config);
    /* アプリケーション側でメモリを確保 */
    atomex_work = user_alloc(NULL, atomex_work_size);
    /* アプリケーションから明示的にワーク領域を渡して初期化 */
    smputl_initialize(&atomex_config, atomex_work, atomex_work_size);
    /* ACFファイルの読み込みと登録 */
    acf_work_size = criAtomEx_CalculateWorkSizeForRegisterAcfFile(NULL, PATH ACF_FILE);
    acf_work = user_alloc(NULL, acf_work_size);
    criAtomEx_RegisterAcfFile(NULL, PATH ACF_FILE, acf_work, acf_work_size);
    /* ACBファイルを読み込み、ACBハンドルを作成 */
    acb_work_size = criAtomExAcb_CalculateWorkSizeForLoadAcbFile(NULL, PATH ACB_FILE, NULL, PATH AWB_FILE);
    acb_work = user_alloc(NULL, acb_work_size);
    acb_hn = criAtomExAcb_LoadAcbFile(
        NULL, PATH ACB_FILE, NULL, PATH AWB_FILE, acb_work, acb_work_size);
    /* ADXオンメモリボイスプールの作成 */
    criAtomExVoicePool_SetDefaultConfigForAdxVoicePool(&adxvp_config);
    vp_work_size = criAtomExVoicePool_CalculateWorkSizeForAdxVoicePool(&adxvp_config);
    vp_work = user_alloc(NULL, vp_work_size);
    voice_pool = criAtomExVoicePool_AllocateAdxVoicePool(
        &adxvp_config, vp_work, vp_work_size);
    /* プレーヤーの作成 */
    criAtomExPlayer_SetDefaultConfig(&player_config);
    player_work_size = criAtomExPlayer_CalculateWorkSize(&player_config);
    player_work = user_alloc(NULL, player_work_size);
    player = criAtomExPlayer_Create(
        &player_config, player_work, player_work_size);

任意サイズの動的メモリアロケーションを使うと、広い意味でのメモリフラグメンテーションを回避することが技術的に困難になります。
ワーク領域渡しによりライブラリの初期化やハンドル生成は、メモリを確保するタイミングや確保順序をアプリケーション側で制御し、 メモリフラグメンテーションの問題を回避する点で有効です。

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