- CriAtomDbasは、ストリーミングバッファを管理するためのモジュールです。
CRI Atomでストリーミング再生を行う際に必要なストリーミングバッファはD-BASで一括管理されます。
D-BASの基本的な作り方
- 以下のコードは、D-BASをデフォルト設定で作成する場合のサンプルコードです。
CriSint32 dbas_wrok_size;
void* dbas_work;
dbas_work = malloc((size_t)dbas_wrok_size);
CriSint32 CriAtomDbasId
Atom D-BAS ID
Definition: cri_le_atom.h:2519
CriAtomDbasId criAtomDbas_Create(const CriAtomDbasConfig *config, void *work, CriSint32 work_size)
D-BASの作成
#define criAtomDbas_SetDefaultConfig(p_config)
CriAtomDbasConfig へのデフォルトパラメーターのセット
Definition: cri_le_atom.h:430
CriSint32 criAtomDbas_CalculateWorkSize(const CriAtomDbasConfig *config)
D-BAS作成用ワークサイズの計算
D-BAS作成パラメーター構造体
Definition: cri_le_atom.h:2533
-
- 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 です。 ストリーミングバッファに対して、どちらのパラメーターがどれだけ影響するかは、 パラメーターの組み合わせによって変化します。
- 目安として、 ストリーミングバッファのサイズは CriAtomDbasConfig::max_streams に正比例し、 CriAtomDbasConfig::max_bps が大きくなればなるほど加速度的に増えていきます。
- なお、 デバイスの読み込み性能以上の値を max_bps に設定しようとしても、D-BASの作成に失敗します。 デバイスの読み込み性能を超えたビットレートのデータを再生すると、必ずストリーミング再生が途切れ途切れになるためです。
- 以下は、ステレオ 48 kHz ADXデータを2本、ステレオ 48 kHz 高品質 HCAデータを2本、合計4本をストリーミング再生する場合の設定です。
CriSint32 adx_bps;
CriSint32 hca_bps;
CriSint32 dbas_wrok_size;
void* dbas_work;
dbas_config.
max_bps = adx_bps * 2 + hca_bps * 2;
dbas_work = malloc((size_t)dbas_wrok_size);
CriSint32 criAtom_CalculateAdxBitrate(CriSint32 num_channels, CriSint32 sampling_rate)
ADXデータのビットレート計算
CriSint32 criAtom_CalculateHcaBitrate(CriSint32 num_channels, CriSint32 sampling_rate, CriAtomEncodeQuality quality)
HCAデータのビットレート計算
@ CRIATOM_ENCODE_QUALITY_HIGH
Definition: cri_le_atom.h:897
CriSint32 max_bps
最大ビットレート
Definition: cri_le_atom.h:2564
CriSint32 max_streams
最大ストリーミング数
Definition: cri_le_atom.h:2551
-
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;
CriSint32 dbas_wrok_size;
void* dbas_work;
dbas_config.
max_bps = adx_bps * 2 + hca_bps * 2;
dbas_work = malloc((size_t)dbas_wrok_size);
:
:
:
:
:
:
dbas_work = malloc((size_t)dbas_wrok_size);
void criAtomDbas_Destroy(CriAtomDbasId atom_dbas_id)
D-BASの破棄
-
- この方法は、各シーンでのメモリ消費量を最小に抑える事ができる一方、 D-BASを一旦削除するため、シーンチェンジでストリーミングBGMを流す事ができないというデメリットもあります。
全シーンに対応するD-BASを作る
- 全シーンに対応するD-BASを作る場合の一番簡単な考え方は、ストリーミング本数と再生ビットレートのそれぞれについて、 アプリケーション中の最悪値を設定してしまう方法です。
- 例えば、 シーンAではストリーミング本数が 16本、再生ビットレートが 1 mbps、 シーンBでは ストリーミング本数が 4本、2 mbpsだった場合、それぞれの大きい値を採用してD-BASを作成します。
CriSint32 dbas_wrok_size;
void* dbas_work;
dbas_config.
max_bps = 2 * 1000 * 1000;
dbas_work = malloc((size_t)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に反映させることで、無駄無くストリーミングバッファを用意する事ができます。
CriBool is_succeeded;
if (is_succeeded == CRI_TRUE) {
}
if (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);
CriBool criAtom_GetStreamingInfo(CriAtomStreamingInfo *streaming_info)
ストリーミング情報の取得
ストリーミング情報
Definition: cri_le_atom.h:979
CriFloat32 total_bps
現在のストリーミング総ビットレート
Definition: cri_le_atom.h:995
CriSint32 num_streaming
現在のストリーミング数
Definition: cri_le_atom.h:986
-
Sofdec(CRI Mana)との関係
- マルチストリーミング再生では、オーディオデータの他にムービーデータを再生する場合があります。
- CRI Ware では、オーディオデータの再生をADX、ムービーデータの再生をSofdecが担当します。
- オーディオデータとムービーデータを同時にマルチストリーミングする場合、 全体のストリーミング流量管理ではオーディオデータもムービーデータも区別しません。 そのため、Sofdecを併用する場合は、 CriAtomDbasConfig::max_streams 、 CriAtomDbasConfig::max_bps にムービー再生分のストリーム本数、再生ビットレートを加味する必要があります。
- 一方、D-BASはADXが使用するストリーミングバッファのみを管理します。 Sofdecは独自にストリーミングバッファを持つため、 ムービーを再生した場合であっても、D-BASのストリーミングバッファを消費しません。
- そこで、D-BASでムービー分の無駄なストリーミングバッファを確保しないように、 CriAtomDbasConfig::max_mana_streams 、 CriAtomDbasConfig::max_mana_bps にムービー再生本数、ムービーの再生ビットレートを設定します。
- 以下は、オーディオ4本、ムービー1本を同時に再生するシーンを想定したD-BASの設定例です。
CriSint32 dbas_wrok_size;
void* dbas_work;
const CriSint32 atom_streams = 4;
const CriSint32 atom_bps = 320 * 1000;
const CriSint32 mana_streams = 1;
const CriSint32 mana_bps = 15 * 1000 * 1000;
dbas_config.
max_bps = atom_bps + mana_bps;
dbas_work = malloc((size_t)dbas_wrok_size);
CriSint32 max_mana_streams
CRI Mana側で再生する最大ストリーミング数
Definition: cri_le_atom.h:2573
CriSint32 max_mana_bps
CRI Mana側で再生する最大ビットレート
Definition: cri_le_atom.h:2582
-