IMiniportWaveRTStream::AllocateAudioBuffer 方法 (portcls.h)

AllocateAudioBuffer 方法为音频数据分配循环缓冲区。

语法

NTSTATUS AllocateAudioBuffer(
  ULONG               RequestedSize,
  PMDL                *AudioBufferMdl,
  ULONG               *ActualSize,
  ULONG               *OffsetFromFirstPage,
  MEMORY_CACHING_TYPE *CacheType
);

参数

RequestedSize

指定音频缓冲区的请求大小(以字节为单位)。

AudioBufferMdl

内存描述符列表的输出指针 (描述音频缓冲区的 MDL) 。 此参数指向调用方分配的指针变量,方法将指针写入到 MDL。 有关 Windows 内核 MDL 的一般信息,请参阅 使用 MDL

ActualSize

分配的缓冲区的实际大小(以字节为单位)的输出指针。 此参数指向一个 ULONG 变量,方法在其中写入大小值。

OffsetFromFirstPage

缓冲区偏移量的输出指针(以字节为单位),从 MDL 中第一页的开头开始。 此参数指向调用方分配的 ULONG 变量,方法在其中写入偏移值。

CacheType

指定客户端请求音频缓冲区的缓存类型。 此参数是MEMORY_CACHING_TYPE枚举值。 有关详细信息,请参阅下面的“备注”部分。

返回值

此方法返回 NTSTATUS。 如果调用成功,AllocateAudioBuffer 将返回STATUS_SUCCESS。 否则,方法将返回相应的错误状态代码。 下表显示了一些可能的错误消息状态代码。

返回代码 说明
STATUS_UNSUCCESSFUL 驱动程序不支持缓冲区属性的指定组合。
STATUS_INSUFFICIENT_RESOURCES 内存不足,无法分配缓冲区。
STATUS_DEVICE_NOT_READY 设备未准备就绪。

注解

注意:Intel 高清晰度音频编解码器的微型端口必须指定 MmWriteCombined 的 CacheType 以确保缓存一致性。 这是因为 Intel 高清晰度音频控制器可能配置为非窥探操作。

在收到来自客户端 的KSPROPERTY_RTAUDIO_BUFFER 请求后,端口驱动程序调用 AllocateAudioBuffer 方法来分配一个循环缓冲区,端口驱动程序稍后可以映射到客户端的虚拟地址空间。

在调用 AllocateAudioBuffer 期间,微型端口驱动程序通过调用 IPortWaveRTStream::AllocatePagesForMdl 或 IPortWaveRTStream::AllocateContiguousPagesForMdl 来分配循环缓冲区。 微型端口驱动程序还会对音频硬件进行程序,以便从此缓冲区播放或录制到此缓冲区,但在端口驱动程序调用 IMiniportWaveRTStream::SetState 且 State=KSSTATE_RUN 之前,它不会启动 DMA 传输。 AllocateAudioBuffer 方法的输出参数包括音频缓冲区的 MDL、驱动程序分配的缓冲区的实际大小,以及从 MDL 中第一页开始的缓冲区开始偏移量。

RequestedSize 是一个输入参数,指示客户端正在为音频缓冲区请求的大小。 ActualSize 是一个输出参数,指示音频缓冲区的实际大小。

音频设备可能需要音频缓冲区在示例边界上开始和结束,或者满足其他类型的硬件依赖对齐约束。 如果有足够的内存,则缓冲区的实际大小是请求的大小, (向上或向下舍入) 最近的样本或其他硬件约束边界。 实际大小必须至少为请求的大小;否则,音频会话 API (WASAPI) 音频引擎将不使用缓冲区,流创建将失败。

要求

要求
Header portcls.h
IRQL PASSIVE_LEVEL

另请参阅

IMiniPortWaveRTStream