CRI ADX  Last Updated: 2024-07-17 10:48 p
无缝连接播放

示例目录

/cri/pc/samples/criatomex/seamless_playback


示例描述

Atom运行库提供名为 “无缝连接播放” 功能,用于连接播放多个不同的波形数据。
(通常也称为“无缝播放功能”。)
通过使用无缝连接播放功能,可以循环播放没有循环信息的波形数据(重复播放相同的波形数据),或者以任意组合播放分割成各个部分的波形数据。
使用无缝连接播放功能的步骤如下。
  1. 使用::criAtomExPlayer_Create函数创建AtomExPlayer。
  2. 使用::criAtomExPlayer_SetDataRequestCallback函数,为AtomExPlayer注册数据请求回调函数。
  3. 使用::criAtomExPlayer_SetData函数等指定最初要播放的音频数据。
  4. 使用::criAtomExPlayer_Start函数开始播放。
  5. 由于在设置的音频数据读取完成时执行数据请求回调函数,因此将在回调函数中设置接下来要播放的数据。
播放开始前的处理代码如下。
/* 创建Player */
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)
Start the playback
CriAtomExPlayerHn criAtomExPlayer_Create(const CriAtomExPlayerConfig *config, void *work, CriSint32 work_size)
Create an AtomEx player
void criAtomExPlayer_SetDataRequestCallback(CriAtomExPlayerHn player, CriAtomExPlayerDataRequestCbFunc func, void *obj)
Register the data request callback function
void criAtomExPlayer_SetCueId(CriAtomExPlayerHn player, CriAtomExAcbHn acb_hn, CriAtomExCueId id)
Set the sound data to play (specifying a Cue ID)
 
此外,对AtomExPlayer执行回调设置和初始数据设置,但如果要在回调内添加数据,则必须使用下层(Atom层)的 “ AtomPlayer” 的 API。
例如,在连接播放多个内存数据时,对AtomExPlayer执行::criAtomExPlayer_SetData函数以完成初始数据设置,但要在回调函数中指定后续数据时,需要对于用回调函数的参数传递的AtomPlayer句柄,使用::criAtomPlayer_SetData函数来指定数据。
[备注]
波形数据级别的连接处理是通过Voice执行,不会使用AtomExPlayer。
因此,连接播放的回调不会从AtomExPlayer返回,而是从Voice内部保持的AtomPlayer返回。
此外,由于Atom层不具有播放Cue的功能,因此在连接播放Cue中的波形数据时,必须从Cue中获取AWB句柄和波形数据ID。
播放Cue中的波形数据时,处理步骤如下。
-# 使用::criAtomExAcb_GetWaveformInfoById函数获取Cue中包含的波形数据的信息。
-# 如果波形数据是内存数据,则使用::criAtomExAcb_GetOnMemoryAwbHandle函数获取AWB句柄,如果是流播放数据,则使用::criAtomExAcb_GetStreamingAwbHandle函数获取AWB句柄。
-# 使用AWB句柄和波形ID执行::criAtomPlayer_SetWaveId函数。
.
具体处理代码如下。
CriAtomAwbHn awb_hn;
/* 获取要播放的Cue中包含的波形数据的信息 */
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);
}
/* 设置要连接的波形数据 */
/* 注意)执行AtomPlayer的API,而不是AtomExPlayer。 */
criAtomPlayer_SetWaveId(player, awb_hn, wave_info.wave_id);
/* 备注)如果不需要播放Cue中的波形数据, */ */
/* 而是播放单个文件或加载到内存中的波形数据时, */ */
/* 可以不执行上述操作,直接执行criAtomPlayer_SetFile函数和 */
/* criAtomPlayer_SetData函数。 */
CriAtomAwbHn criAtomExAcb_GetOnMemoryAwbHandle(CriAtomExAcbHn acb_hn)
Get an AWB handle from an ACB handle (for in-memory playback)
CriBool criAtomExAcb_GetWaveformInfoById(CriAtomExAcbHn acb_hn, CriAtomExCueId id, CriAtomExWaveformInfo *waveform_info)
Get information about the waveform played by the Cue whose ID is given
CriAtomAwbHn criAtomExAcb_GetStreamingAwbHandle(CriAtomExAcbHn acb_hn)
Get an AWB handle from an ACB handle (for streaming playback)
struct CriAtomAwbTag * CriAtomAwbHn
AWB handle
Definition: cri_le_atom.h:1349
void criAtomPlayer_SetWaveId(CriAtomPlayerHn player, CriAtomAwbHn awb, CriSint32 id)
Set sound data (specify sound data ID)
Audio waveform information
Definition: cri_le_atom_ex.h:3081
CriBool streaming_flag
Definition: cri_le_atom_ex.h:3087
CriAtomExWaveId wave_id
Definition: cri_le_atom_ex.h:3082
注意
无缝连接播放将Cue中包含同样是 一个波形数据 连接起来。
对于含有多个波形数据的Cue,由于将选择并播放Cue中所含的某个波形,因此无法保证预期的动作。
使用Cue执行无缝连接播放时,请使用不包含多个波形数据的Cue。

请注意:连接的波形数据是通过指定波形ID来播放,因此不会使用音量和Pan设置等对Cue指定的任何参数。
(而第一个播放的Cue的参数将继续使用。)

用于连接播放的波形数据的参数必须全部相同。
具体来说,以下参数必须相同。
  • 编解码器
  • 频道数量
  • 采样率

如果尝试连接参数不同的波形,则可能会出现各种问题,例如以非预期速度播放音频数据或错误回调等。


示例使用的数据中AtomCraft项目的目录

/cri/tools/criatomex/examples/tutorial_data_for_runtime