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 支持不同的状态。 这些状态指示音频 (运行状态) ,音频未流动,但音频硬件准备 (PAUSE 状态) ,或者音频未流动,音频硬件未准备 (停止状态) 。
EvtAcxStreamPrepareHardware 事件会将流状态从停止状态转换为暂停状态。 驱动程序应分配在此事件中流式处理所需的任何硬件资源,例如 DMA 引擎。
一旦流处于暂停状态,驱动程序可能会收到 EvtAcxStreamRun 事件以转换为“运行”状态,或者驱动程序可能会收到 EvtAcxStreamReleaseHardware 事件以转换为停止状态。
ACX 事件类似于此表中所述的 KS 状态。
开始状态 | 结束状态 | 调用的 ACX 驱动程序事件 | 备注 |
---|---|---|---|
STOP | 获得 | PrepareHardware | 驱动程序执行硬件分配和准备 |
获得 | PAUSE | (无呼叫) | |
PAUSE | 运行 | 运行 | |
运行 | PAUSE | 暂停 | |
PAUSE | 获得 | (无调用) | |
获得 | STOP | ReleaseHardware | 驱动程序发布硬件分配 |
EvtAcxStreamAllocateRtPackets 在 EvtAcxStreamPrepareHardware 之前调用,以允许 RT 数据包分配在 EvtAcxStreamPrepareHardware 之前进行。
缓冲区分配和 DMA
缓冲区分配通常只涉及以可与 DMA 硬件一起使用的方式分配系统内存。 通常,缓冲区分配不会对流式处理硬件产生任何影响。 准备硬件阶段是当驱动程序通过完成任务(例如预留带宽、编程 DMA 和完成运行流的请求的准备)来准备流运行时使用的。 通常,准备硬件代码将使用分配的缓冲区来准备 DMA 和相关活动,以便准备好启动流。
内存清理
系统) 上物理内存 (数据包分配在 EvtAcxStreamPrepareHardware 之前完成,其发布 (EvtAcxStreamFreeRtPackets) 在 EvtAcxStreamReleaseHardware 之后完成。 此模式是嵌入上层音频流设置流的现有旧行为, (ks 分配缓冲区属性 init) 。
可以在驱动程序的流上下文清理中处置流资源, (不会销毁) 。 切勿在对象的上下文销毁回调中处置共享的任何内容。 本指南适用于所有 ACX 对象。
销毁回调在最后一个引用消失后调用,如果它是未知的。
关闭句柄时,将调用流的清理回调。 这种情况的一个例外是驱动程序在其回调中创建流时。 如果 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 版本概述。
要求
要求 | 值 |
---|---|
Header | acxstreams.h |
IRQL | PASSIVE_LEVEL |