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中的 PlayBeginPlayLength 字段指定要播放的区域。 PlayLength 值为 0 表示播放整个缓冲区 (,在这种情况下,PlayBegin 必须是 0,并且) 。

如果应在连续循环中播放全部或部分缓冲区,则可以使用 XAUDIO2_BUFFER 中的 LoopBeginLoopLengthLoopCount 字段来指定循环区域的特征。 LoopBegin 值为 XAUDIO2_NO_LOOP_REGION 意味着不应执行循环,在本例中,LoopLengthLoopCount 必须设置为 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

另请参阅

如何:构建基本的音频处理图

如何:对磁盘中的声音进行流式处理

IXAudio2SourceVoice