IAudioClient::GetCurrentPadding 方法 (audioclient.h)

GetCurrentPadding 方法检索终结点缓冲区中填充的帧数。

语法

HRESULT GetCurrentPadding(
  [out] UINT32 *pNumPaddingFrames
);

参数

[out] pNumPaddingFrames

指向 UINT32 变量的指针,该方法将帧计数 (缓冲区) 中填充的音频帧数写入其中。

返回值

如果该方法成功,则它会返回 S_OK。 如果失败,可能的返回代码包括但不限于下表中显示的值。

返回代码 说明
AUDCLNT_E_NOT_INITIALIZED
音频流尚未成功初始化。
AUDCLNT_E_DEVICE_INVALIDATED
音频终结点设备已拔出,或者音频硬件或关联的硬件资源已重新配置、禁用、删除或以其他方式不可用。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows 音频服务未运行。
E_POINTER
参数 pNumPaddingFramesNULL

注解

此方法需要事先初始化 IAudioClient 接口。 在客户端通过成功调用 IAudioClient::Initialize 方法初始化音频流之前,对此方法的所有调用都将失败并出现错误AUDCLNT_E_NOT_INITIALIZED。

此方法检索一个填充值,该值指示终结点缓冲区当前包含的有效未读数据量。 呈现应用程序可以使用填充值来确定它可以安全地写入终结点缓冲区的新数据量,而不会覆盖音频引擎尚未从缓冲区读取的以前写入的数据。 捕获应用程序可以使用填充值来确定它可以安全地从终结点缓冲区中读取多少新数据,而不会从音频引擎尚未将有效数据写入到的缓冲区区域中读取无效数据。

填充值以音频帧数表示。 音频帧的大小由客户端传递给 IAudioClient::Initialize 方法的 WAVEFORMATEX (或 WAVEFORMATEXTENSIBLE) 结构的 nBlockAlign 成员指定。 音频帧的大小(以字节为单位)等于流中的通道数乘以每个通道的样本大小。 例如,包含 16 位样本的立体声 (2 声道) 流的帧大小为 4 个字节。

对于共享模式呈现流, GetCurrentPadding 报告的填充值指定排队在终结点缓冲区中播放的音频帧数。 在写入终结点缓冲区之前,客户端可以通过从缓冲区长度中减去填充值来计算缓冲区中的可用空间量。 若要确保后续调用 IAudioRenderClient::GetBuffer 方法成功,客户端应请求不超过缓冲区中可用空间的数据包长度。 若要获取缓冲区长度,请调用 IAudioClient::GetBufferSize 方法。

对于共享模式捕获流, GetCurrentPadding 报告的填充值指定终结点缓冲区中下一个数据包中可用的捕获数据帧数。 在特定时刻,可能已准备好零个、一个或多个捕获数据包,以便客户端从缓冲区读取数据。 如果当前没有可用的数据包,该方法将报告填充值 0。 在 GetCurrentPadding 调用之后, IAudioCaptureClient::GetBuffer 方法调用将检索其长度完全等于 GetCurrentPadding 报告的填充值的数据包。 每次调用 GetBuffer 都会检索整个数据包。 数据包始终包含整数数量的音频帧。

对于共享模式捕获流,调用 GetCurrentPadding 等效于调用 IAudioCaptureClient::GetNextPacketSize 方法。 也就是说, GetCurrentPadding 报告的填充值等于 GetNextPacketSize 报告的数据包长度。

对于使用 AUDCLNT_STREAMFLAGS_EVENTCALLBACK 标志初始化的独占模式呈现或捕获流,客户端通常对 GetCurrentPadding 报告的填充值没有用。 相反,客户端在每次处理过程中访问整个缓冲区。 每当缓冲区可供处理时,音频引擎都会通过向客户端的事件句柄发出信号来通知客户端。 有关此标志的详细信息,请参阅 IAudioClient::Initialize

对于未使用 AUDCLNT_STREAMFLAGS_EVENTCALLBACK 标志初始化的独占模式呈现或捕获流,客户端可以使用从 GetCurrentPadding 获取的填充值,其方式类似于前面所述的共享模式流。 详细信息如下。

首先,对于独占模式呈现流,填充值指定排队在终结点缓冲区中播放的音频帧数。 与以前一样,客户端可以通过从缓冲区长度中减去填充值来计算缓冲区中的可用空间量。

其次,对于独占模式捕获流, GetCurrentPadding 报告的填充值指定下一个数据包的当前长度。 但是,此填充值是数据包长度的快照,在客户端调用 IAudioCaptureClient::GetBuffer 方法之前,数据包长度可能会增加。 因此,GetBuffer 检索的数据包的长度至少与 GetBuffer调用之前GetCurrentPadding 调用报告的填充值相同,但可能大于。 相比之下,对于共享模式捕获流,从 GetBuffer 获取的数据包的长度始终等于前面的 GetCurrentPadding 调用报告的填充值。

有关调用 GetCurrentPadding 方法的代码示例,请参阅呈现Stream

要求

要求
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 audioclient.h

另请参阅

IAudioCaptureClient::GetBuffer

IAudioCaptureClient::GetNextPacketSize

IAudioClient 接口

IAudioClient::Initialize

IAudioRenderClient::GetBuffer