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) 音频引擎不使用缓冲区,流创建将失败。

要求

要求 价值
标头 portcls.h
IRQL PASSIVE_LEVEL

另请参阅

IMiniPortWaveRTStream