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

另请参阅