PTRANSFER_CODEC_VERBS回调函数 (hdaudio.h)

TransferCodecVerbs 例程将一个或多个命令传输到编解码器或编解码器,并检索对这些命令的响应。

TransferCodecVerbs 例程的函数指针类型定义如下。

语法

PTRANSFER_CODEC_VERBS PtransferCodecVerbs;

NTSTATUS PtransferCodecVerbs(
  [in]      PVOID _context,
  [in]      ULONG Count,
  [in, out] PHDAUDIO_CODEC_TRANSFER CodecTransfer,
  [in]      PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback,
            PVOID Context
)
{...}

参数

[in] _context

指定来自HDAUDIO_BUS_INTERFACEHDAUDIO_BUS_INTERFACE_V2HDAUDIO_BUS_INTERFACE_BDL结构的上下文成员的上下文值。

[in] Count

指定 codecTransfer 数组中的元素数。

[in, out] CodecTransfer

指向 HDAUDIO_CODEC_TRANSFER 结构的数组的指针。 每个数组元素都是一个结构,包含调用方输出命令的存储以及编解码器的相应输入响应。

[in] Callback

函数指针指向回调例程。 此参数是HDAUDIO_TRANSFER_COMPLETE_CALLBACK类型的函数指针。 可以将参数指定为 NULL。 有关更多信息,请参见下面的“备注”部分。

Context

返回值

如果调用成功,TransferCodecVerbs 将返回STATUS_SUCCESS。 否则,例程将返回适当的错误代码。 下表显示了可能的返回状态代码。

返回代码 说明
STATUS_NO_MEMORY
指示由于内存不足而无法将请求添加到命令队列。

注解

此例程将一个或多个编解码器命令提交到 HD 音频总线驱动程序。 总线驱动程序向编解码器发出命令,检索编解码器对命令的响应,并将响应输出给调用方。

调用方指定HDAUDIO_CODEC_TRANSFER结构数组中的命令。 每个结构都包含命令和编解码器对此命令的响应的存储。 在调用 TransferCodecVerbs 之前,调用方将填充数组中每个结构中的命令。 每个命令完成后,HD 音频总线驱动程序将检索编解码器的响应并将其写入结构。 最后一个命令完成后,调用方可以从数组读取响应。

例程可以同步或异步运行:

  • 如果调用方为输入参数回调的值指定 NULL,则 HD 音频总线驱动程序会同步完成 codecTransfer 数组中的命令。 (换句话说,例程仅在编解码器处理完所有命令并且对这些命令的响应可用后才会返回。)
  • 如果调用方为回调参数指定非 NULL 值,则例程以异步方式运行。 (换句话说,例程在将命令添加到其内部队列后立即返回,而无需等待编解码器处理所有命令。) 编解码器处理命令后,HD 音频总线驱动程序将调用回调例程。 在异步情况下,调用方不应尝试在总线驱动程序调用回调例程之前读取对命令的响应。
回调参数的函数指针类型定义为:
typedef VOID
  (*PHDAUDIO_TRANSFER_COMPLETE_CALLBACK)
    (HDAUDIO_CODEC_TRANSFER *, PVOID);

第一个调用参数是指向 codecTransfer 数组元素的指针,该元素包含编解码器命令和触发回调的响应。 第二个调用参数是之前在 TransferCodecVerbs 例程的 callbackContext 参数中指定的上下文值。

如果成功, TransferCodecVerbs 将返回STATUS_SUCCESS。 此状态代码的含义取决于例程是同步操作还是异步操作:

  • 在同步情况下, (回调NULL) ,STATUS_SUCCESS意味着总线驱动程序将 codecTransfer 数组中的所有命令都写入编解码器,并且例程已将所有响应写入数组中。 但是,调用方必须检查各个响应,以确定它们是否有效。 由于编解码器超时或 FIFO 溢出,单个响应可能无效。
  • 在异步情况下, (回调 为非 NULL) ,STATUS_SUCCESS意味着例程已成功将命令添加到 HD 音频总线驱动程序的内部队列。 在总线驱动程序调用回调例程之前,调用方不得尝试读取对这些命令的响应。
如果由于 FIFO 溢出而导致响应无效,则可能是因为编解码器响应了命令,但由于响应大小不足的输入环缓冲区而丢失, (RIRB) 。 如果 FIFO 溢出不是无效响应的原因,则可能会发生故障,因为编解码器没有及时响应 (超时) 。 在这种情况下,调用方可以假定命令未到达编解码器。

如果 回调 参数为 NULL,则调用方必须在 IRQL PASSIVE_LEVEL运行。 如果 回调 为非 NULL,则调用方可以在 IRQL = DISPATCH_LEVEL调用 TransferCodecVerbs ,在这种情况下,调用会立即返回,而无需等待编解码器处理所有命令;命令完成后,HD 音频总线驱动程序会在 IRQL <DISPATCH_LEVEL调用回调例程。

调用方必须从非分页池分配 codecTransfer 数组。

要求

   
目标平台 桌面
Header hdaudio.h (包括 Hdaudio.h)
IRQL 请参阅“备注”部分。

请参阅

HDAUDIO_BUS_INTERFACE

HDAUDIO_BUS_INTERFACE_BDL

HDAUDIO_BUS_INTERFACE_V2

HDAUDIO_CODEC_TRANSFER