CriAtomDbasについて

CriAtomDbasは、ストリーミングバッファを管理するためのモジュールです。
CRI Atomでストリーミング再生を行う際に必要なストリーミングバッファはD-BASで一括管理されます。

D-BASの基本的な作り方

以下のコードは、D-BASをデフォルト設定で作成する場合のサンプルコードです。
CriAtomDbasConfig   dbas_config;
CriSint32           dbas_wrok_size;
void*               dbas_work;
CriAtomDbasId       dbas_id;

criAtomDbas_SetDefaultConfig(&dbas_config);
dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

 
D-BASの作成に成功すると、 criAtomDbas_Create 関数は有効なD-BAS IDを返します。 D-BASの作成に失敗すると、 criAtomDbas_Create 関数は CRIATOMDBAS_ILLEGAL_ID を返します。

D-BASの生成パラメーター

D-BASの生成パラメーターによって、D-BASが管理するストリーミングバッファのサイズは変化します。 主な生成パラメーターは最大ストリーミング数 CriAtomDbasConfig::max_streams と最大ビットレート CriAtomDbasConfig::max_bps です。 ストリーミングバッファに対して、どちらのパラメーターがどれだけ影響するかは、 パラメーターの組み合わせによって変化します。
目安として、 ストリーミングバッファのサイズは CriAtomDbasConfigmax_streams に正比例し、 CriAtomDbasConfigmax_bps が大きくなればなるほど加速度的に増えていきます。
なお、 デバイスの読み込み性能以上の値を max_bps に設定しようとしても、D-BASの作成に失敗します。 デバイスの読み込み性能を超えたビットレートのデータを再生すると、必ずストリーミング再生が途切れ途切れになるためです。
以下は、ステレオ 48 kHz ADXデータを2本、ステレオ 48 kHz 高品質 HCAデータを2本、合計4本をストリーミング再生する場合の設定です。
CriSint32           adx_bps;
CriSint32           hca_bps;


CriAtomDbasConfig   dbas_config;
CriSint32           dbas_wrok_size;
void*               dbas_work;
CriAtomDbasId       dbas_id;

/* ステレオ 48 kHz ADXデータのビットレートを計算 */
adx_bps = criAtom_CalculateAdxBitrate(2, 48000);
/* ステレオ 48 kHz 高品質 HCAデータのビットレートを計算 */
hca_bps = criAtom_CalculateHcaBitrate(2, 48000, CRIATOM_ENCODE_QUALITY_HIGH);


criAtomDbas_SetDefaultConfig(&dbas_config);

/* ストリーミング本数は合計4本 */
dbas_config.max_streams = 4;
/* ステレオ 48 kHz ADXデータを2本、ステレオ 48 kHz 高品質 HCAデータを2本の合計ビットレートを設定 */
dbas_config.max_bps = adx_bps * 2 + hca_bps * 2;

dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

 

D-BASの生成パラメーターの調整

ゲームシーンによっては5.1ch 48 kHz 最高品質 HCAデータを1本、 別のシーンでは モノラル 24 kHz 最高圧縮 HCAデータを8本、 といったように、シーン毎にストリーム本数と再生ビットレートが変わる場合は多々あります。
D-BAS自身は、状況が変化したとしても、D-BAS生成時に与えられたストリーミングバッファ全体を常に管理します。 あるシーンではストリーミングバッファはより小さくて良いかもしれませんし、 また別のシーンではストリーミングバッファが足りなくなるかもしれません。
どのシーンでも十分なストリーミングバッファをD-BASに割り当てるために、 アプリケーションはシーン毎にD-BASを作り直すか、 どのシーンでもストリーミングバッファが足りるようにD-BASを作るかのどちらかの方法で対応する必要があります。

シーン毎にD-BASを作り直す

シーン毎にD-BASを作り直す方法は簡単です。シーンの切り替わりで criAtomDbas_Destroy 関数を実行し、既存のD-BASを破棄した後、 criAtomDbas_Create 関数で新しいD-BASを作り直すだけです。
CriSint32           adx_bps;
CriSint32           hca_bps;


CriAtomDbasConfig   dbas_config;
CriSint32           dbas_wrok_size;
void*               dbas_work;
CriAtomDbasId       dbas_id;

/* ステレオ 48 kHz ADXデータのビットレートを計算 */
adx_bps = criAtom_CalculateAdxBitrate(2, 48000);
/* ステレオ 48 kHz 高品質 HCAデータのビットレートを計算 */
hca_bps = criAtom_CalculateHcaBitrate(2, 48000, CRIATOM_ENCODE_QUALITY_HIGH);


criAtomDbas_SetDefaultConfig(&dbas_config);

/* ストリーミング本数は合計4本 */
dbas_config.max_streams = 4;
/* ステレオ 48 kHz ADXデータを2本、ステレオ 48 kHz 高品質 HCAデータを2本の合計ビットレートを設定 */
dbas_config.max_bps = adx_bps * 2 + hca_bps * 2;

dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

    :
    :
    :
    /* シーンチェンジ */
    :
    :
    :

/* 既存D-BASの破棄 */
/* 注意)ストリーミング再生中の音声があると、停止待ちによりブロックする */
criAtomDbas_Destroy(dbas_id);

/* パラメーターを変えて作り直し */
criAtomDbas_SetDefaultConfig(&dbas_config);

/* ストリーミング本数を合計2本へ変更 */
dbas_config.max_streams = 2;
/* 全てステレオ 48 kHz 高品質 HCAデータ */
dbas_config.max_bps = hca_bps * 2;

dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

 
この方法は、各シーンでのメモリ消費量を最小に抑える事ができる一方、 D-BASを一旦削除するため、シーンチェンジでストリーミングBGMを流す事ができないというデメリットもあります。

全シーンに対応するD-BASを作る

全シーンに対応するD-BASを作る場合の一番簡単な考え方は、ストリーミング本数と再生ビットレートのそれぞれについて、 アプリケーション中の最悪値を設定してしまう方法です。
例えば、 シーンAではストリーミング本数が 16本、再生ビットレートが 1 mbps、 シーンBでは ストリーミング本数が 4本、2 mbpsだった場合、それぞれの大きい値を採用してD-BASを作成します。
CriAtomDbasConfig   dbas_config;
CriSint32           dbas_wrok_size;
void*               dbas_work;
CriAtomDbasId       dbas_id;

criAtomDbas_SetDefaultConfig(&dbas_config);

/* シーンAのストリーミング本数を設定 */
dbas_config.max_streams = 16;
/* シーンBの再生ビットレートを設定 */
dbas_config.max_bps =  2 * 1000 * 1000; /* 2 mbps */

dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

 
CriAtomDbasConfig::max_streams は、D-BASを使ったストリーミング再生本数の上限でもあります。 そのため、全シーンで共通のD-BASを使いまわす場合、 全シーンを通して最大のストリーミング再生本数を CriAtomDbasConfig::max_streams に設定してください。

D-BASに設定すべきパラメーターを後から調べる

アプリケーション全体でどのようなストリーミング再生が行われるかを事前に把握できないと、 D-BASの生成パラメーターを適切に設定できません。 しかし、ストリーミング本数だけでなく再生ビットレートも設定するとなると、事前に把握する事は難しくなります。
そこで、まずはD-BASを大きめに作っておき、実際に再生しているストリーミング本数、 再生ビットレートを criAtom_GetStreamingInfo 関数を使って取得する事で、D-BASの生成パラメーターを決定するという方法があります。
criAtom_GetStreamingInfo 関数は呼び出した瞬間のストリーミング本数、再生ビットレートを取得する関数です。 アプリケーション実行中にストリーミング本数、再生ビットレートを定期的にロギングしたり、 組み合わせを覚えておき、それらの値を後からD-BASに反映させることで、無駄無くストリーミングバッファを用意する事ができます。
CriAtomStreamingInfo    streaming_info;
CriBool is_succeeded;

is_succeeded = criAtom_GetStreamingInfo(streaming_info);
if (is_succeeded == CRI_TRUE) {
    /* 最大値を覚えておく */
    if (actual_max_streams < streaming_info.num_streaming) {
        actual_max_streams = streaming_info.num_streaming;
    }
    /* 最大値を覚えておく */
    if (actual_max_bps < streaming_info.total_bps) {
        actual_max_bps = streaming_info.total_bps;
    }
}
    :
    :
    :
/* アプリケーション終了時にコンソール出力 */
printf("Actual Max Streams:%d\n", actual_max_streams);
printf("Actual Max Bitrate:%d\n", actual_max_bps);

 

Sofdec2(CRI Mana)との関係

マルチストリーミング再生では、オーディオデータの他にムービーデータを再生する場合があります。
CRI Ware では、オーディオデータの再生をADX2、ムービーデータの再生をSofdec2が担当します。
オーディオデータとムービーデータを同時にマルチストリーミングする場合、 全体のストリーミング流量管理ではオーディオデータもムービーデータも区別しません。 そのため、Sofdec2を併用する場合は、 CriAtomDbasConfig::max_streamsCriAtomDbasConfig::max_bps にムービー再生分のストリーム本数、再生ビットレートを加味する必要があります。
一方、D-BASはADX2が使用するストリーミングバッファのみを管理します。 Sofdec2は独自にストリーミングバッファを持つため、 ムービーを再生した場合であっても、D-BASのストリーミングバッファを消費しません。
そこで、D-BASでムービー分の無駄なストリーミングバッファを確保しないように、 max_mana_streams 、 max_mana_bps にムービー再生本数、ムービーの再生ビットレートを設定します。
以下は、オーディオ4本、ムービー1本を同時に再生するシーンを想定したD-BASの設定例です。
CriAtomDbasConfig   dbas_config;
CriSint32           dbas_wrok_size;
void*               dbas_work;
CriAtomDbasId       dbas_id;

const CriSint32     atom_streams    = 4;                /* オーディオストリーミングは4本   */
const CriSint32     atom_bps        = 320 * 1000;       /* 320 kbps                         */
const CriSint32     mana_streams    = 1;                /* ムービーストリーミングは1本     */
const CriSint32     mana_bps        = 15 * 1000 * 1000; /* 15 mbps                          */


criAtomDbas_SetDefaultConfig(&dbas_config);

/* ムービー分を加味 */
dbas_config.max_streams         = atom_streams  + mana_streams;
dbas_config.max_bps             = atom_bps      + mana_bps;
/* ムービー分のストリーム本数、ビットレートをD-BASに伝える */
dbas_config.max_mana_streams    = mana_streams;
dbas_config.max_mana_bps        = mana_bps;

dbas_wrok_size  = criAtomDbas_CalculateWorkSize(&dbas_config);
dbas_work       = malloc((size_t)dbas_wrok_size);
dbas_id         = criAtomDbas_Create(&dbas_config, dbas_work, dbas_wrok_size);

 
Next:CriAtomAwbについて

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