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。 如果失败,可能的返回代码包括但不限于下表中显示的值。

返回代码 说明
AUDCLNT_E_INVALID_SIZE
NumFramesWritten 值超过了上一次 IAudioRenderClient::GetBuffer 调用中指定的 NumFramesRequested 值。
AUDCLNT_E_BUFFER_SIZE_ERROR
流是独占模式,使用事件驱动的缓冲,但客户端尝试释放的数据包不是缓冲区的大小。
AUDCLNT_E_OUT_OF_ORDER
此调用之前没有对 IAudioRenderClient::GetBuffer 的相应调用。
AUDCLNT_E_DEVICE_INVALIDATED
音频终结点设备已拔出,或者音频硬件或关联的硬件资源已重新配置、禁用、删除或以其他方式不可用。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows 音频服务未运行。
E_INVALIDARG
参数 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

另请参阅

IAudioClient::Initialize

IAudioRenderClient 接口

IAudioRenderClient::GetBuffer