IAudioRenderClient::ReleaseBuffer 方法 (audioclient.h)
ReleaseBuffer 方法释放在对 IAudioRenderClient::GetBuffer 方法的上一次调用中获取的缓冲区空间。
语法
HRESULT ReleaseBuffer(
[in] UINT32 NumFramesWritten,
[in] DWORD dwFlags
);
参数
[in] NumFramesWritten
客户端写入数据包的音频帧数。 此参数的值必须小于或等于数据包的大小,如传递给 IAudioRenderClient::GetBuffer 方法的 NumFramesRequested 参数所指定。
[in] dwFlags
缓冲区配置标志。 调用方可以将此参数设置为 0 或以下 _AUDCLNT_BUFFERFLAGS 枚举值, (标志位) :
AUDCLNT_BUFFERFLAGS_SILENT
如果设置了此标志位,则音频引擎会将数据包视为包含静音,而不考虑数据包中包含的数据值。 此标志使客户端无需将静音数据显式写入呈现缓冲区。
返回值
如果该方法成功,则它会返回 S_OK。 如果失败,可能的返回代码包括但不限于下表中显示的值。
返回代码 | 说明 |
---|---|
|
NumFramesWritten 值超过了上一次 IAudioRenderClient::GetBuffer 调用中指定的 NumFramesRequested 值。 |
|
流是独占模式,使用事件驱动的缓冲,但客户端尝试释放的数据包不是缓冲区的大小。 |
|
此调用之前没有对 IAudioRenderClient::GetBuffer 的相应调用。 |
|
音频终结点设备已拔出,或者音频硬件或关联的硬件资源已重新配置、禁用、删除或以其他方式不可用。 |
|
Windows 音频服务未运行。 |
|
参数 dwFlags 不是有效的值。 |
注解
客户端必须释放其前面对 IAudioRenderClient::GetBuffer 方法的调用中请求的帧数。 此规则的一个例外是,客户端始终可以调用 ReleaseBuffer 以释放 0 帧 (,除非流是独占模式并使用事件驱动的缓冲) 。
此行为为客户端“释放”以前请求的长度为 0 的数据包提供了一种方便的方法。 在这种情况下,对 ReleaseBuffer 的 调用是可选的。 调用 GetBuffer 以获取长度为 0 的数据包后,客户端可以选择在再次调用 GetBuffer 之前不调用 ReleaseBuffer。
此外,如果前面的 GetBuffer 调用获取了非零大小的数据包,则调用 NumFramesRequested 设置为 0 的 ReleaseBuffer 将成功 (,除非流是独占模式并使用事件驱动的缓冲) 。 调用的含义是客户端在释放数据包之前不向数据包写入任何数据。 因此, 方法将数据包表示的缓冲区部分视为未使用,并将在下一个 GetBuffer 调用中使该缓冲区的这一部分再次可供客户端使用。
客户端应避免获取缓冲区的 GetBuffer 调用与释放缓冲区的 ReleaseBuffer 调用之间的过度延迟。 音频引擎的实现假定 GetBuffer 调用和相应的 ReleaseBuffer 调用在同一缓冲区处理期间发生。 延迟释放缓冲区超过一个时间段的客户端可能会丢失示例数据。
有关调用 ReleaseBuffer 方法的代码示例,请参阅以下主题:
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | audioclient.h |