IXAudio2SourceVoice::SubmitSourceBuffer 方法 (xaudio2.h)
将新的音频缓冲区添加到语音队列。
语法
HRESULT SubmitSourceBuffer(
[in] const XAUDIO2_BUFFER *pBuffer,
[in] const XAUDIO2_BUFFER_WMA *pBufferWMA
);
参数
[in] pBuffer
指向队列 XAUDIO2_BUFFER 结构的指针。
[in] pBufferWMA
指向提交 WMA 数据时使用的其他 XAUDIO2_BUFFER_WMA 结构的指针。
返回值
如果成功,则返回S_OK,否则返回错误代码。 有关 XAudio2 特定错误代码 的说明,请参阅 XAudio2 错误代码。
注解
语音按提交顺序处理并播放队列中的缓冲区。
XAUDIO2_BUFFER结构包括有关音频缓冲区位置和大小、实际应播放的缓冲区部分、循环区域 ((如果有任何) 和循环计数)的详细信息、要在与此缓冲区相关的任何回调中使用的上下文指针,以及指示它是连续声音的最后一个缓冲区的可选XAUDIO2_END_OF_STREAM标志。
如果语音已启动,并且没有排队的缓冲区,则新缓冲区将立即开始播放。 如果语音停止,缓冲区将添加到语音的队列中,并在语音启动时播放。
如果只应播放给定缓冲区的一部分,则可以使用XAUDIO2_BUFFER中的 PlayBegin 和 PlayLength 字段指定要播放的区域。 PlayLength 值为 0 表示播放整个缓冲区 (,在这种情况下,PlayBegin 必须是 0,并且) 。
如果应在连续循环中播放全部或部分缓冲区,则可以使用 XAUDIO2_BUFFER 中的 LoopBegin、LoopLength 和 LoopCount 字段来指定循环区域的特征。 LoopBegin 值为 XAUDIO2_NO_LOOP_REGION 意味着不应执行循环,在本例中,LoopLength 和 LoopCount 必须设置为 0。 如果指定了循环区域,则它必须是非空 (LoopLength> 0) ,循环计数必须介于 1 到 XAUDIO2_MAX_LOOP_COUNT(包括 (或XAUDIO2_LOOP_INFINITE)之间,以指定仅在) 调用 IXAudio2SourceVoice::ExitLoop 时结束的无限循环。 N 的循环计数表示向后跳过 N 次,即播放循环区域 N+1 次。
如果指定了显式播放区域,则必须在给定的音频缓冲区 (开始和结束,或者在压缩的情况下,在缓冲区将解码为) 的示例集中。 此外,循环区域不能在播放区域的末尾结束。
Xbox 360 |
---|
对于某些音频格式,任何播放或循环区域的有效终结点可能存在其他限制;例如,对于 XMA 缓冲区,区域只能在解码的音频中的 128 个样本边界处开始或结束。 |
调用此方法后,可以立即重复使用或释放 pBuffer 指针,但 pBuffer 引用的实际音频数据必须保持有效,直到缓冲区已由 XAudio2 (IXAudio2VoiceCallback::OnBufferEnd 回调) 指示。
最多XAUDIO2_MAX_QUEUED_BUFFERS缓冲区可以随时在语音上排队。
当使用 OperationSet 为 XAUDIO2_COMMIT_NOW 的 XAudio2 回调调用时,SubmitSourceBuffer 将立即生效。
Xbox 360 |
---|
此方法可以从 Xbox 系统线程调用, (大多数其他 XAudio2 方法无法) 。 但是,一次最多可以从系统线程提交两个源缓冲区。 |
平台要求
Windows 10 (XAudio2.9) ;Windows 8,Windows Phone 8 (XAudio 2.8) ;DirectX SDK (XAudio 2.7)要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | xaudio2.h |