バーチャルボイスの挙動

サンプルのディレクトリ

/cri/pc/samples/criatomex/virtual_voice

サンプルの解説

Atom ライブラリは 「ボイス」 を使用して波形データの再生を行います。
ボイスは、データの読み込みと音声のデコード、発音処理を行うオブジェクトです。
原則、1つの波形データを再生するのに1つのボイスを使用するため、 アプリケーション中で同時に再生可能な波形データの数は、ボイスの数分に制限されます。
[備考]
ボイスの数はボイスプールを作成する際に指定可能なので、 最大同時発音数自体はアプリケーション側で自由にコントロールすることが可能です。
ただし、使用するボイスの数に比例してメモリサイズやCPU負荷も増えるため、 アプリケーションで許容できる範囲までボイス数を絞る必要があります。
また、ボイスがハードウェアボイスを使用するプラットフォームでは、 ハードウェアの制限を超える数のボイスを作成することができません。
Atom ライブラリは、ボイスの他に 「バーチャルボイス」 と呼ばれる仮想的なボイスオブジェクトを使用します。
バーチャルボイスは、パラメーターの管理や再生時刻の管理、音声出力に用いるボイスの管理等を行うオブジェクトです。
通常、バーチャルボイスはボイスとワンセットで動作するため、ユーザーがバーチャルボイスの存在を意識する必要はありませんが、 ボイス確保方式を変更することにより、バーチャルボイスをボイスを持たない仮想音源として用いることも可能です。
デフォルト状態のバーチャルボイスの動作

Atom ライブラリは、デフォルト状態ではバーチャルボイスとボイスをワンセットにして再生を行います。
例えば、AtomEx プレーヤーに音声データをセットし、 criAtomExPlayer_Start 関数を実行すると、 AtomEx プレーヤーはバーチャルボイスとボイスを必要な数分だけ確保します。
この際、バーチャルボイスとボイスの両方が確保できれば音声は再生されますが、 いずれか一方でも確保できない場合には、セットされたデータは発音されません。
[備考]
バーチャルボイスはライブラリ初期化時に任意の数で確保できるため、 ライブラリ初期化時に指定した数以上に再生要求を発行しない限り、 バーチャルボイスの取得に失敗することはありません。
また、ボイスの確保に失敗した場合でも、スタブの再生IDが返されるため、 再生の可否に応じてその後の処理を変更する必要はありません。
バーチャルボイスを仮想音源として使用する方法

AtomEx プレーヤーを作成する際、 CriAtomExPlayerConfig の voice_allocation_method に CRIATOMEXPLAYER_RETRY_VOICE_ALLOCATION を指定すると、 AtomEx プレーヤーは再生開始時にボイスが確保できない場合でも、 バーチャルボイスだけを使用して音声の再生を開始します。
ボイスが確保できていないため、発音処理は行われませんが、 パラメーター変更の記録や再生位置の管理はバーチャルボイスによって行われます。
(スタブの再生IDが返された場合と異なり、 criAtomExPlayback_GetTime 関数で再生時刻が取得可能です。)
また、バーチャルボイスは再生中もボイスに空きがないかを逐次監視し、空きボイスが出来次第ボイスの再取得を行います。
そのため、 CRIATOMEXPLAYER_RETRY_VOICE_ALLOCATION を指定して作成した AtomEx プレーヤーで再生された音声については、 再生開始時点でボイスが確保できない場合や、再生中にプライオリティ制御によりボイスが奪い取られた場合であっても、 その後ボイスに空きができれば、再生を再開することが可能です。
[備考]
バーチャルボイスがボイスの再取得に成功した場合、可能な限り再生開始時点からの経過時間を考慮した位置から発音処理を再開しようとします。
ただし、シーク再生をサポートしないコーデックや、発音開始前( CRIATOMEXPLAYBACK_STATUS_PREP 状態時)にボイスが奪われた場合には、 音声データの先頭位置から再生が開始されることになります。
また、ストリーミング再生の音声については、バッファリングに伴う遅延が発生するため、 経過時間と再開位置が大きくズレる可能性があります。
ボイスの確保方式を変更するコードは以下のとおりです。
    CriAtomExPlayerConfig player_config;

    /* プレーヤー作成用コンフィグ構造体に初期値を設定 */
    criAtomExPlayer_SetDefaultConfig(&player_config);

    /* ボイス確保方式の変更 */
    /* 備考)CRIATOMEXPLAYER_RETRY_VOICE_ALLOCATIONを指定して作成       */
    /*       したプレーヤーは、再生途中にボイスを奪い取られたとしても、 */
    /*       ボイスに空きができた時点で再生を再開します。               */
    player_config.voice_allocation_method = CRIATOMEXPLAYER_RETRY_VOICE_ALLOCATION;

    /* プレーヤーの作成 */
    app_obj->player = criAtomExPlayer_Create(&player_config, NULL, 0);
サンプルでは、発音用のボイスを1つしか確保していませんが、 擬似的にループBGM、ボイス、SEの3つの音を操作しています。
ループBGMはサンプルの起動と同時に再生が開始されます。
ボタン操作でボイスやSEを再生すると、ループBGMを再生しているボイスが奪い取られ、 ボイスやSEが再生されますが、それらの再生が終了すると、ループBGMの再生が再開されます。
注意:
ボタンを連打しすぎると、バーチャルボイス自体が枯渇し、 デバッガーに警告が出力されてループBGMが停止します。

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