CRI ADX  Last Updated: 2024-11-26 16:51 p
シームレス連結再生

サンプルのディレクトリ

/cri/pc/samples/criatomex/seamless_playback

サンプルで使用しているデータ

/cri/common/smpdata/criatomex/
  • SampleProject.acf
  • AtomCueSheet.acb
  • AtomCueSheet.awb

サンプルの解説

Atom ライブラリには、複数の異なる波形データを連結して再生するため 「シームレス連結再生」 という機能が用意されています。
(一般的には「ギャップレス再生機能」とも呼ばれています。)
シームレス連結再生機能を用いることで、ループ情報の付いていない波形データをループ再生(同一の波形データを繰り返し再生)したり、パートごとに分割された波形データを任意の組み合わせで再生することが可能になります。
シームレス連結再生機能の使用手順は以下のとおりです。
  1. criAtomExPlayer_Create 関数で AtomEx プレーヤーを作成する。
  2. criAtomExPlayer_SetDataRequestCallback 関数を使用し、 AtomEx プレーヤーにデータ要求コールバック関数を登録する。
  3. criAtomExPlayer_SetData 関数等で、最初に再生する音声データを指定する。
  4. criAtomExPlayer_Start 関数で再生を開始する。
  5. セットした音声データの読み込みが完了した時点でデータ要求コールバック関数が実行されるので、コールバック関数内で次に再生するデータをセットする。


再生開始までの処理コードは以下のようになります。
/* プレーヤーの作成 */
app_obj->player = criAtomExPlayer_Create(NULL, NULL, 0);
/* シームレス連結再生用にコールバック関数を登録 */
app_obj->player, app_data_request_callback, app_obj);
/* 初回再生データの指定 */
criAtomExPlayer_SetCueId(app_obj->player, app_obj->acb_hn, CRI_ATOMCUESHEET_SEAMLESS_A);
/* 再生の開始 */
criAtomExPlayer_Start(app_obj->player);
CriAtomExPlaybackId criAtomExPlayer_Start(CriAtomExPlayerHn player)
再生の開始
CriAtomExPlayerHn criAtomExPlayer_Create(const CriAtomExPlayerConfig *config, void *work, CriSint32 work_size)
AtomExPlayerの作成
void criAtomExPlayer_SetDataRequestCallback(CriAtomExPlayerHn player, CriAtomExPlayerDataRequestCbFunc func, void *obj)
データ要求コールバック関数の登録
void criAtomExPlayer_SetCueId(CriAtomExPlayerHn player, CriAtomExAcbHn acb_hn, CriAtomExCueId id)
音声データのセット(キューID指定)
 
尚、コールバックの設定や初回のデータ設定は AtomEx プレーヤーに対して行いますが、コールバック内でのデータの追加については、下位レイヤ( Atom レイヤ)の 「 Atom プレーヤー」 の API を使用する必要があります。
例えば、複数のオンメモリデータを連結再生する場合、初回のデータ設定は AtomEx プレーヤーに対して criAtomExPlayer_SetData 関数を実行しますが、コールバック関数内で後続データを指定する際には、コールバック関数の引数で渡って来る Atom プレーヤーハンドルに対し criAtomPlayer_SetData 関数を使用してデータを指定します。
[備考]
波形データレベルのつなぎ合わせ処理は、 AtomEx プレーヤーではなく、ボイスで行われます。
そのため、連結再生用のコールバックは AtomEx プレーヤーからではなく、ボイスが内部的に保持している Atom プレーヤーから返される形になります。
尚、 Atom レイヤにはキューを再生する機能がないため、キュー内の波形データ同士を連結再生する場合、キューから AWB ハンドル、および波形データ ID を取得する必要があります。
キュー内の波形データを再生する場合、処理手順は以下のようになります。
  1. criAtomExAcb_GetWaveformInfoById 関数でキューに含まれる波形データの情報を取得する。
  2. 波形データがオンメモリデータの場合は criAtomExAcb_GetOnMemoryAwbHandle 関数、ストリーミング再生データの場合は criAtomExAcb_GetStreamingAwbHandle 関数を使用して AWB ハンドルを取得する。
  3. AWB ハンドルと波形 ID を使用して criAtomPlayer_SetWaveId 関数を実行する。


具体的な処理コードは以下のとおりです。
CriAtomAwbHn awb_hn;
/* 再生するキューに含まれる波形データの情報を取得 */
criAtomExAcb_GetWaveformInfoById(app_obj->acb_hn, app_obj->request_id, &wave_info);
/* 波形データがストリーミング再生用かどうかをチェック */
if (wave_info.streaming_flag == CRI_FALSE) {
/* ACBハンドルからオンメモリ再生用のAWBハンドルを取得 */
awb_hn = criAtomExAcb_GetOnMemoryAwbHandle(app_obj->acb_hn);
} else {
/* ACBハンドルからストリーミング再生用のAWBハンドルを取得 */
awb_hn = criAtomExAcb_GetStreamingAwbHandle(app_obj->acb_hn);
}
/* 連結する波形データをセット */
/* 注意)AtomExプレーヤーではなくAtomプレーヤーのAPIを実行する。 */
criAtomPlayer_SetWaveId(player, awb_hn, wave_info.wave_id);
/* 備考)キューの中の波形データではなく、単体ファイルやメモリ */
/* 上にロードされた波形データを再生する場合には、 */
/* 上記の操作を行わず、直接criAtomPlayer_SetFile関数や */
/* criAtomPlayer_SetData関数を実行して問題ありません。 */
CriAtomAwbHn criAtomExAcb_GetOnMemoryAwbHandle(CriAtomExAcbHn acb_hn)
オンメモリ再生用 AWB ハンドルの取得
CriBool criAtomExAcb_GetWaveformInfoById(CriAtomExAcbHn acb_hn, CriAtomExCueId id, CriAtomExWaveformInfo *waveform_info)
音声波形情報の取得(キューID指定)
CriAtomAwbHn criAtomExAcb_GetStreamingAwbHandle(CriAtomExAcbHn acb_hn)
ストリーム再生用 AWB ハンドルの取得
struct CriAtomAwbTag * CriAtomAwbHn
AWBハンドル
Definition: cri_le_atom.h:1353
void criAtomPlayer_SetWaveId(CriAtomPlayerHn player, CriAtomAwbHn awb, CriSint32 id)
音声データのセット(音声データIDの指定)
音声波形情報
Definition: cri_le_atom_ex.h:3085
CriBool streaming_flag
Definition: cri_le_atom_ex.h:3091
CriAtomExWaveId wave_id
Definition: cri_le_atom_ex.h:3086
注意
シームレス連結再生は、キューに含まれる 1つの波形データ 同士を連結します。
複数の波形データを含むキューについては、キューに含まれる波形のうちどれかが選択されて再生される形になるため、必ずしも意図した動作をするとは限りません。
キューを使用してシームレス連結再生を行う場合には、複数の波形データを含まないキューを使用してください。

連結する波形データは波形 ID 指定で再生されるため、ボリュームやパンの設定といった、キューに対するパラメーター指定が一切適用されませんのでご注意ください。
(最初に再生するキューのパラメーターが引き続き適用されます。)

連結再生に使用する波形データは、全て同一のパラメーターでなければなりません。
具体的には、以下のパラメーターが同じである必要があります。
  • コーデック
  • チャンネル数
  • サンプリングレート


パラメーターが異なる波形を連結しようとした場合、意図しない速度で音声データが再生されたり、エラーコールバックが発生する等の問題が発生します。