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 상태) 또는 오디오가 흐르지 않고 오디오 하드웨어가 준비되지 않음(STOP 상태)을 나타냅니다.

EvtAcxStreamPrepareHardware 이벤트는 스트림 상태를 중지 상태에서 일시 중지 상태로 전환합니다. 드라이버는 DMA 엔진과 같이 이 이벤트의 스트리밍에 필요한 모든 하드웨어 리소스를 할당해야 합니다.

스트림이 일시 중지 상태가 되면 드라이버는 EvtAcxStreamRun 이벤트를 수신하여 실행 상태로 전환하거나 드라이버가 EvtAcxStreamReleaseHardware 이벤트를 수신하여 중지 상태로 전환할 수 있습니다.

ACX 이벤트는 이 표에 설명된 대로 KS 상태와 유사합니다.

시작 상태 종료 상태 ACX 드라이버 이벤트 호출 참고
STOP 취득 PrepareHardware 드라이버가 하드웨어 할당 및 준비를 수행합니다.
취득 일시 중지 (통화 없음)
일시 중지 실행 실행
실행 일시 중지 일시 중지
일시 중지 취득 (통화 없음)
취득 STOP ReleaseHardware 드라이버가 하드웨어 할당을 해제합니다.

EvtAcxStreamAllocateRtPackets 는 EvtAcxStreamPrepareHardware 이전에 RT 패킷 할당이 발생할 수 있도록 EvtAcxStreamPrepareHardware 전에 호출됩니다.

버퍼 할당 및 DMA

버퍼 할당에는 일반적으로 DMA 하드웨어와 함께 사용할 수 있는 방식으로 시스템 메모리를 할당하는 것만 포함됩니다. 일반적으로 버퍼 할당은 스트리밍 하드웨어에 영향을 주지 않습니다. 하드웨어 준비 단계는 드라이버가 대역폭 예약, DMA 프로그래밍과 같은 작업을 완료하고 스트림 실행 요청 준비를 완료하여 스트림을 실행할 준비를 하는 데 사용됩니다. 일반적으로 하드웨어 준비 코드는 DMA 및 관련 작업을 준비하기 위해 할당된 버퍼를 사용하여 스트림을 시작할 준비를 합니다.

메모리 정리

패킷 할당(시스템의 실제 메모리)은 EvtAcxStreamPrepareHardware 전에 수행되며 EvtAcxStreamReleaseHardware 후에 릴리스(EvtAcxStreamFreeRtPackets)가 수행됩니다. 이 패턴은 상층 오디오 스트림 설정 흐름(ks 할당 버퍼 prop 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 버전 개요를 참조하세요.

요구 사항

요구 사항
헤더 acxstreams.h
IRQL PASSIVE_LEVEL

추가 정보