PALLOCATE_DMA_BUFFER 콜백 함수(hdaudio.h)
AllocateDmaBuffer
루틴은 DMA 엔진에 대한 시스템 메모리에 데이터 버퍼를 할당합니다.
AllocateDmaBuffer
루틴에 대한 함수 포인터 형식은 다음과 같이 정의됩니다.
통사론
PALLOCATE_DMA_BUFFER PallocateDmaBuffer;
NTSTATUS PallocateDmaBuffer(
[in] PVOID _context,
[in] HANDLE Handle,
[in] SIZE_T RequestedBufferSize,
[out] PMDL *BufferMdl,
[out] PSIZE_T AllocatedBufferSize,
[out] PUCHAR StreamId,
[out] PULONG FifoSize
)
{...}
매개 변수
[in] _context
HDAUDIO_BUS_INTERFACE 및 HDAUDIO_BUS_INTERFACE_V2 구조체의 Context 멤버의 컨텍스트 값을 지정합니다.
[in] Handle
DMA 엔진 식별을 처리합니다. 이 핸들 값은 AllocateCaptureDmaEngine 또는 AllocateRenderDmaEngine 이전 호출에서 가져옵니다.
[in] RequestedBufferSize
요청된 버퍼 크기를 바이트 단위로 지정합니다.
[out] BufferMdl
할당된 버퍼가 포함된 실제 메모리 페이지를 검색합니다. 이 매개 변수는 루틴이 버퍼를 설명하는 MDL(메모리 설명자 목록)에 포인터를 쓰는 호출자 할당 PMDL 변수를 가리킵니다.
[out] AllocatedBufferSize
할당된 버퍼 크기를 바이트 단위로 검색합니다. 이 매개 변수는 루틴이 할당된 버퍼의 크기를 쓰는 호출자 할당 SIZE_T 변수를 가리킵니다.
[out] StreamId
스트림 식별자를 검색합니다. 이 매개 변수는 루틴이 스트림에 할당하는 스트림 식별자를 쓰는 호출자 할당 UCHAR 변수를 가리킵니다.
[out] FifoSize
DMA 엔진의 FIFO 크기를 바이트 단위로 검색합니다. 이 매개 변수는 루틴이 FIFO 크기를 쓰는 호출자 할당 ULONG 변수를 가리킵니다.
반환 값
AllocateDmaBuffer
호출이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 루틴이 적절한 오류 코드를 반환합니다. 다음 표에서는 가능한 반환 상태 코드 중 일부를 보여 줍니다.
반환 코드 | 묘사 |
---|---|
|
호출자가 너무 높은 IRQL에서 실행 중임을 나타냅니다. |
|
버퍼 할당이 실패했음을 나타냅니다. |
|
핸들 매개 변수 값이 잘못되었음을 나타냅니다. |
|
매개 변수 값 중 하나가 잘못되었음을 나타냅니다(잘못된 포인터). |
|
하드웨어 프로그래밍 시간이 초과되었음을 나타냅니다. 이 경우 하드웨어가 손상된 상태일 수 있습니다. |
|
스트림이 다시 설정 상태가 아니거나 버퍼가 DMA 엔진에 이미 할당되었음을 나타냅니다. |
발언
AllocateDmaBuffer
루틴은 FreeDmaBuffer 루틴과 함께 사용됩니다. 이러한 두 루틴은 hd Audio DDI의 HDAUDIO_BUS_INTERFACE 및 HDAUDIO_BUS_INTERFACE_V2 버전에서만 사용할 수 있습니다. 이 DDI에는 AllocateDmaBuffer
및 FreeDmaBuffer함께 사용되지 않는 AllocateContiguousDmaBuffer, SetupDmaEngineWithBdl및 FreeContiguousDmaBuffer 루틴이 포함되지 않습니다. 이전에 할당된 DMA 버퍼를 사용하도록 DMA 엔진을 구성하는 SetupDmaEngineWithBdl달리 AllocateDmaBuffer
둘 다 DMA 버퍼를 할당하고 버퍼를 사용하도록 DMA 엔진을 구성합니다.
DMA 엔진이 requestBufferSize 매개 변수요청된 크기의 버퍼를 사용할 수 없는 경우 루틴은 요청된 크기에 최대한 가까운 버퍼를 할당합니다.
오디오 또는 모뎀 코덱의 함수 드라이버는 데이터 전송을 관리하고 스트림 식별자를 인식하도록 코덱을 프로그래밍합니다.
루틴은 버퍼가 포함된 실제 메모리 페이지를 나열하는 MDL을 출력합니다. 버퍼 기본 주소는 목록의 첫 번째 실제 페이지 시작과 일치합니다.
DMA 엔진 핸들의 수명 동안 AllocateDmaBuffer
연속적으로 호출하여 새 DMA 버퍼를 할당할 수 있습니다. 그러나 AllocateDmaBuffer
호출하기 전에 이전에 할당된 모든 DMA 버퍼는 먼저 FreeDmaBuffer호출하여 해제되어야 합니다.
AllocateDmaBuffer
및 FreeDmaBuffer호출하는 동안 DMA 엔진은 다시 설정 스트림 상태에 있어야 합니다. DMA 엔진은XxxDmaEngine 할당 호출 직후 다시 설정 상태입니다. DMA 엔진을 실행 상태로 변경하려면 SetDmaEngineState호출합니다.
FIFO 크기는 DMA 엔진이 내부 버퍼에 보유할 수 있는 최대 바이트 수입니다. 하드웨어 구현에 따라 DMA 엔진의 FIFO 크기는 정적이거나 스트림 형식의 변경 내용에 따라 동적으로 달라질 수 있습니다. FIFO 크기에 대한 자세한 내용은 Intel HD Audio 웹 사이트에서 Intel 고화질 오디오 사양을 참조하세요.
이 루틴은 실패하고 다음 상황 중 하나에서 STATUS_INVALID_DEVICE_REQUEST 오류 코드를 반환합니다.
- 이전에 할당된 DMA 버퍼가 해제되지 않았습니다(FreeDmaBuffer호출).
- 스트림이 다시 설정이 아닌 상태에 있습니다.
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 바탕 화면 |
헤더 | hdaudio.h(Hdaudio.h 포함) |
IRQL | PASSIVE_LEVEL |