EVT_ACX_STREAM_PREPARE_HARDWARE回调函数 (acxstreams.h)
EvtAcxStreamPrepareHardware 事件告知驱动程序准备硬件以供流式传输。
语法
EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;
NTSTATUS EvtAcxStreamPrepareHardware(
ACXSTREAM Stream
)
{...}
参数
Stream
ACXSTREAM 对象表示线路创建的音频流。 该流由基于父线路的元素创建的元素列表组成。 有关详细信息,请参阅 ACX - ACX 对象的摘要。
返回值
如果调用成功,则返回 STATUS_SUCCESS
。 否则,它将返回适当的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值。
言论
AcxStream 支持不同的状态。 这些状态指示音频何时流动(RUN 状态),音频未流动,但音频硬件已准备好(PAUSE 状态),或者音频未流动,音频硬件未准备(停止状态)。
EvtAcxStreamPrepareHardware 事件会将流状态从“停止”状态转换为“暂停”状态。 驱动程序应分配此事件中流式传输所需的任何硬件资源,例如 DMA 引擎。
流处于暂停状态后,驱动程序可能会收到 EvtAcxStreamRun 事件以转换为运行状态,或者驱动程序可能会收到 EvtAcxStreamReleaseHardware 事件以转换为 Stop 状态。
ACX 事件类似于 KS 状态,如下表所述。
启动状态 | 结束状态 | 调用 ACX 驱动程序事件 | 笔记 |
---|---|---|---|
停 | 获得 | PrepareHardware | 驱动程序执行硬件分配和准备 |
获得 | 暂停 | (无呼叫) | |
暂停 | 跑 | 跑 | |
跑 | 暂停 | 暂停 | |
暂停 | 获得 | (无呼叫) | |
获得 | 停 | ReleaseHardware | 驱动程序发布硬件分配 |
在 EvtAcxStreamPrepareHardware 之前调用 EvtAcxStreamAllocateRtPackets,以允许在 EvtAcxStreamPrepareHardware 之前进行 RT 数据包分配。
缓冲区分配和 DMA
缓冲区分配通常只涉及分配系统内存的方式,以便可用于 DMA 硬件。 通常,缓冲区分配不会对流式处理硬件产生任何影响。 准备硬件阶段用作驱动程序,通过完成保留带宽、编程 DMA 等任务,并完成请求运行流的准备,从而准备好运行流。 通常,准备硬件代码将使用分配的缓冲区来准备 DMA 和相关活动,以便启动流。
内存清理
数据包分配(系统上的物理内存)在 EvtAcxStreamPrepareHardware 之前完成,其发布(EvtAcxStreamFreeRtPackets)在 EvtAcxStreamReleaseHardware 之后完成。 此模式是嵌入在上层音频流设置流(ks 分配缓冲区属性 init)中的现有旧行为。
可以在驱动程序的流上下文清理(不销毁)中处理流的资源。 从不释放在对象的上下文销毁回调中共享的任何内容。 本指南适用于所有 ACX 对象。
在最后一个 ref 消失后调用销毁回调,当它未知时。
关闭句柄时会调用流的清理回调。 这一点的一个例外是驱动程序在其回调中创建流。 如果 ACX 在从流创建作返回之前未能将此流添加到其流桥,则会取消该流,并且当前线程将错误返回到 create-stream 客户端。 此时,流不应分配任何 mem 分配。
例
示例用法如下所示。
ACX_STREAM_CALLBACKS streamCallbacks;
ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
streamCallbacks.EvtAcxStreamPrepareHardware = Codec_EvtStreamPrepareHardware;
...
status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
_In_ ACXSTREAM Stream
)
{
PSTREAM_CONTEXT ctx;
NTSTATUS status;
PAGED_CODE();
ctx = GetStreamContext(Stream);
status = AllocateStreamHardware(Stream);
if (NT_SUCCESS(status))
{
ctx->StreamState = AcxStreamStatePause;
}
return status;
}
ACX 要求
最低 ACX 版本: 1.0
有关 ACX 版本的详细信息,请参阅 ACX 版本概述。
要求
要求 | 价值 |
---|---|
标头 | acxstreams.h |
IRQL | PASSIVE_LEVEL |