CRI ADX  Last Updated: 2024-03-21 14:32 p
CriAtomDbasについて
CriAtomDbasは、ストリーミングバッファを管理するためのモジュールです。
CRI Atomでストリーミング再生を行う際に必要なストリーミングバッファはD-BASで一括管理されます。

D-BASの基本的な作り方

以下のコードは、D-BASをデフォルト設定で作成する場合のサンプルコードです。
CriAtomDbasConfig dbas_config;
CriSint32 dbas_wrok_size;
void* dbas_work;
CriAtomDbasId dbas_id;
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);
CriSint32 CriAtomDbasId
Atom D-BAS ID
Definition: cri_atom.h:2601
CriAtomDbasId criAtomDbas_Create(const CriAtomDbasConfig *config, void *work, CriSint32 work_size)
D-BASの作成
#define criAtomDbas_SetDefaultConfig(p_config)
CriAtomDbasConfig へのデフォルトパラメーターのセット
Definition: cri_atom.h:470
CriSint32 criAtomDbas_CalculateWorkSize(const CriAtomDbasConfig *config)
D-BAS作成用ワークサイズの計算
D-BAS作成パラメーター構造体
Definition: cri_atom.h:2615
 
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;
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データのビットレートを計算 */
/* ストリーミング本数は合計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);
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_atom.h:937
CriSint32 max_bps
最大ビットレート
Definition: cri_atom.h:2646
CriSint32 max_streams
最大ストリーミング数
Definition: cri_atom.h:2633
 

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データのビットレートを計算 */
/* ストリーミング本数は合計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の破棄 */
/* 注意)ストリーミング再生中の音声があると、停止待ちによりブロックする */
/* パラメーターを変えて作り直し */
/* ストリーミング本数を合計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);
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を作成します。
CriAtomDbasConfig dbas_config;
CriSint32 dbas_wrok_size;
void* dbas_work;
CriAtomDbasId dbas_id;
/* シーン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);
CriBool criAtom_GetStreamingInfo(CriAtomStreamingInfo *streaming_info)
ストリーミング情報の取得
ストリーミング情報
Definition: cri_atom.h:1019
CriFloat32 total_bps
現在のストリーミング総ビットレート
Definition: cri_atom.h:1035
CriSint32 num_streaming
現在のストリーミング数
Definition: cri_atom.h:1026
 

Sofdec(CRI Mana)との関係

マルチストリーミング再生では、オーディオデータの他にムービーデータを再生する場合があります。
CRI Ware では、オーディオデータの再生をADX、ムービーデータの再生をSofdecが担当します。
オーディオデータとムービーデータを同時にマルチストリーミングする場合、 全体のストリーミング流量管理ではオーディオデータもムービーデータも区別しません。 そのため、Sofdecを併用する場合は、 CriAtomDbasConfig::max_streamsCriAtomDbasConfig::max_bps にムービー再生分のストリーム本数、再生ビットレートを加味する必要があります。
一方、D-BASはADXが使用するストリーミングバッファのみを管理します。 Sofdecは独自にストリーミングバッファを持つため、 ムービーを再生した場合であっても、D-BASのストリーミングバッファを消費しません。
そこで、D-BASでムービー分の無駄なストリーミングバッファを確保しないように、 CriAtomDbasConfig::max_mana_streamsCriAtomDbasConfig::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 */
/* ムービー分を加味 */
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);
CriSint32 max_mana_streams
CRI Mana側で再生する最大ストリーミング数
Definition: cri_atom.h:2655
CriSint32 max_mana_bps
CRI Mana側で再生する最大ビットレート
Definition: cri_atom.h:2664