362 lines
14 KiB
C
362 lines
14 KiB
C
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// Assumptions for the type definitions:
|
||
|
// ULONGLONG = 64bit unsigned integer
|
||
|
// ULONG = 32bit unsigned integer
|
||
|
// USHORT = 16bit unsigned integer
|
||
|
// UCHAR = 8bit unsigned integer
|
||
|
//
|
||
|
#ifndef _HDAUDIO_H_
|
||
|
#define _HDAUDIO_H_
|
||
|
|
||
|
#pragma warning(disable:4201) // nameless struct/union
|
||
|
#pragma warning(disable:4214) // bit field types other than int
|
||
|
|
||
|
//
|
||
|
// The HDAUDIO_BUS_INTERFACE interface GUID
|
||
|
//
|
||
|
// {D2EAF88B-AB18-41a8-B664-8D592167671B}
|
||
|
DEFINE_GUID (GUID_HDAUDIO_BUS_INTERFACE,
|
||
|
0xd2eaf88b, 0xab18, 0x41a8, 0xb6, 0x64, 0x8d, 0x59, 0x21, 0x67, 0x67, 0x1b);
|
||
|
|
||
|
//
|
||
|
// The HDAUDIO_BUS_INTERFACE_BDL interface GUID
|
||
|
//
|
||
|
// {B4D65397-5634-40b0-B068-F5B9F8B967A5}
|
||
|
DEFINE_GUID(GUID_HDAUDIO_BUS_INTERFACE_BDL,
|
||
|
0xb4d65397, 0x5634, 0x40b0, 0xb0, 0x68, 0xf5, 0xb9, 0xf8, 0xb9, 0x67, 0xa5);
|
||
|
|
||
|
//
|
||
|
// The HDAUDIO_BUS_INTERFACE_V2 interface GUID
|
||
|
//
|
||
|
// {B52AF5FB-424B-4BB9-A160-5B38BE94E568}
|
||
|
DEFINE_GUID (GUID_HDAUDIO_BUS_INTERFACE_V2,
|
||
|
0xb52af5fb, 0x424b, 0x4bb9, 0xa1, 0x60, 0x5b, 0x38, 0xbe, 0x94, 0xe5, 0x68);
|
||
|
|
||
|
//
|
||
|
// The HDAudio bus class GUID
|
||
|
//
|
||
|
// {BBD1A745-ADD6-4575-9C2E-9B428D1C3266}
|
||
|
DEFINE_GUID (GUID_HDAUDIO_BUS_CLASS,
|
||
|
0xbbd1a745, 0xadd6, 0x4575, 0x9c, 0x2e, 0x9b, 0x42, 0x8d, 0x1c, 0x32, 0x66);
|
||
|
|
||
|
#ifndef _HDAUDIO_CODEC_TRANSFER_
|
||
|
#define _HDAUDIO_CODEC_TRANSFER_
|
||
|
//
|
||
|
// Structure for a codec command.
|
||
|
//
|
||
|
typedef struct _HDAUDIO_CODEC_COMMAND
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
ULONG Data : 8;
|
||
|
ULONG VerbId : 12;
|
||
|
ULONG Node : 8;
|
||
|
ULONG CodecAddress : 4;
|
||
|
} Verb8;
|
||
|
struct
|
||
|
{
|
||
|
ULONG Data : 16;
|
||
|
ULONG VerbId : 4;
|
||
|
ULONG Node : 8;
|
||
|
ULONG CodecAddress : 4;
|
||
|
} Verb16;
|
||
|
ULONG Command;
|
||
|
};
|
||
|
} HDAUDIO_CODEC_COMMAND, *PHDAUDIO_CODEC_COMMAND;
|
||
|
|
||
|
//
|
||
|
// Structure to access a codec response.
|
||
|
//
|
||
|
typedef struct _HDAUDIO_CODEC_RESPONSE
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
ULONG Response:21;
|
||
|
ULONG SubTag : 5;
|
||
|
ULONG Tag : 6;
|
||
|
} Unsolicited;
|
||
|
ULONG Response;
|
||
|
};
|
||
|
ULONG SDataIn : 4;
|
||
|
ULONG IsUnsolicitedResponse : 1;
|
||
|
ULONG :25;
|
||
|
ULONG HasFifoOverrun : 1;
|
||
|
ULONG IsValid : 1;
|
||
|
};
|
||
|
ULONGLONG CompleteResponse; // Mostly used for debug print messages.
|
||
|
};
|
||
|
} HDAUDIO_CODEC_RESPONSE, *PHDAUDIO_CODEC_RESPONSE;
|
||
|
|
||
|
//
|
||
|
// The structure passed in for sending CODEC verbs.
|
||
|
//
|
||
|
typedef struct _HDAUDIO_CODEC_TRANSFER
|
||
|
{
|
||
|
HDAUDIO_CODEC_COMMAND Output;
|
||
|
HDAUDIO_CODEC_RESPONSE Input;
|
||
|
} HDAUDIO_CODEC_TRANSFER, *PHDAUDIO_CODEC_TRANSFER;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Replacement for WAVEFORMATEXTENSIBLE which has fields that are not used.
|
||
|
//
|
||
|
typedef struct _HDAUDIO_STREAM_FORMAT
|
||
|
{
|
||
|
ULONG SampleRate;
|
||
|
USHORT ValidBitsPerSample;
|
||
|
USHORT ContainerSize;
|
||
|
USHORT NumberOfChannels;
|
||
|
} HDAUDIO_STREAM_FORMAT, *PHDAUDIO_STREAM_FORMAT;
|
||
|
|
||
|
//
|
||
|
// The stream descriptor format used to program the input/output converters.
|
||
|
//
|
||
|
typedef struct _HDAUDIO_CONVERTER_FORMAT
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
USHORT NumberOfChannels : 4;
|
||
|
USHORT BitsPerSample : 3;
|
||
|
USHORT : 1;
|
||
|
USHORT SampleRate : 7;
|
||
|
USHORT StreamType : 1; // Is always set to 0 by bus driver DDI
|
||
|
};
|
||
|
USHORT ConverterFormat;
|
||
|
};
|
||
|
} HDAUDIO_CONVERTER_FORMAT, *PHDAUDIO_CONVERTER_FORMAT;
|
||
|
|
||
|
//
|
||
|
// The different stream states supported by HDAudio -> STOP (reset), PAUSE or RUN
|
||
|
//
|
||
|
typedef enum _HDAUDIO_STREAM_STATE
|
||
|
{
|
||
|
ResetState = 0,
|
||
|
StopState = 1,
|
||
|
PauseState = 1,
|
||
|
RunState = 2
|
||
|
} HDAUDIO_STREAM_STATE, *PHDAUDIO_STREAM_STATE;
|
||
|
|
||
|
//
|
||
|
// The different power states that HD Audio codecs can support. All states
|
||
|
// are from DEVICE_POWER_STATE except PowerCodecD3Cold.
|
||
|
//
|
||
|
typedef enum _HDAUDIO_CODEC_POWER_STATE {
|
||
|
PowerCodecUnspecified = 0,
|
||
|
PowerCodecD0,
|
||
|
PowerCodecD1,
|
||
|
PowerCodecD2,
|
||
|
PowerCodecD3,
|
||
|
PowerCodecD3Cold,
|
||
|
PowerCodecMaximum
|
||
|
} HDAUDIO_CODEC_POWER_STATE, *PHDAUDIO_CODEC_POWER_STATE;
|
||
|
|
||
|
//
|
||
|
// HDAudio codec transfer complete callback function
|
||
|
//
|
||
|
typedef VOID (*PHDAUDIO_TRANSFER_COMPLETE_CALLBACK)(HDAUDIO_CODEC_TRANSFER *, PVOID);
|
||
|
|
||
|
//
|
||
|
// HDAudio unsolicited response callback function
|
||
|
//
|
||
|
typedef VOID (*PHDAUDIO_UNSOLICITED_RESPONSE_CALLBACK)(HDAUDIO_CODEC_RESPONSE, PVOID);
|
||
|
|
||
|
//
|
||
|
// HDAudio device information structure
|
||
|
//
|
||
|
typedef struct _HDAUDIO_DEVICE_INFORMATION
|
||
|
{
|
||
|
USHORT Size; // size of this structure
|
||
|
USHORT DeviceVersion; // maj.min (maj is high byte, min is low byte)
|
||
|
USHORT DriverVersion; // maj.min (maj is high byte, min is low byte)
|
||
|
USHORT CodecsDetected; // mask of codecs present. Bit number == SDI line number
|
||
|
BOOLEAN IsStripingSupported; // TRUE if striping (2 SDO lines) is supported
|
||
|
} HDAUDIO_DEVICE_INFORMATION, *PHDAUDIO_DEVICE_INFORMATION;
|
||
|
|
||
|
//
|
||
|
// HDAudio Buffer Descriptor list entry
|
||
|
//
|
||
|
typedef struct _HDAUDIO_BUFFER_DESCRIPTOR
|
||
|
{
|
||
|
PHYSICAL_ADDRESS Address;
|
||
|
ULONG Length;
|
||
|
ULONG InterruptOnCompletion;
|
||
|
} HDAUDIO_BUFFER_DESCRIPTOR, *PHDAUDIO_BUFFER_DESCRIPTOR;
|
||
|
|
||
|
|
||
|
|
||
|
typedef __checkReturn NTSTATUS (*PTRANSFER_CODEC_VERBS) (__in PVOID _context, __in ULONG Count, __inout_ecount(Count) PHDAUDIO_CODEC_TRANSFER CodecTransfer, __in PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback, __in PVOID Context);
|
||
|
typedef __checkReturn NTSTATUS (*PALLOCATE_CAPTURE_DMA_ENGINE) (__in PVOID _context, __in UCHAR CodecAddress, __in PHDAUDIO_STREAM_FORMAT StreamFormat, OUT PHANDLE Handle, __out PHDAUDIO_CONVERTER_FORMAT ConverterFormat);
|
||
|
typedef __checkReturn NTSTATUS (*PALLOCATE_RENDER_DMA_ENGINE) (__in PVOID _context, __in PHDAUDIO_STREAM_FORMAT StreamFormat, __in BOOLEAN Stripe, __out PHANDLE Handle, __out PHDAUDIO_CONVERTER_FORMAT ConverterFormat);
|
||
|
typedef __checkReturn NTSTATUS (*PCHANGE_BANDWIDTH_ALLOCATION) (__in PVOID _context, __in HANDLE Handle, __in PHDAUDIO_STREAM_FORMAT StreamFormat, __out PHDAUDIO_CONVERTER_FORMAT ConverterFormat);
|
||
|
typedef __checkReturn NTSTATUS (*PALLOCATE_DMA_BUFFER) (__in PVOID _context, __in HANDLE Handle, __in SIZE_T RequestedBufferSize, __out PMDL *BufferMdl, __out PSIZE_T AllocatedBufferSize, OUT PUCHAR StreamId, __out PULONG FifoSize);
|
||
|
typedef __checkReturn NTSTATUS (*PFREE_DMA_BUFFER) (__in PVOID _context, __in HANDLE Handle);
|
||
|
typedef __checkReturn NTSTATUS (*PFREE_DMA_ENGINE) (__in PVOID _context, __in HANDLE Handle);
|
||
|
typedef __checkReturn NTSTATUS (*PSET_DMA_ENGINE_STATE) (__in PVOID _context, __in HDAUDIO_STREAM_STATE StreamState, __in ULONG NumberOfHandles, __in PHANDLE Handles);
|
||
|
typedef VOID (*PGET_WALL_CLOCK_REGISTER) (__in PVOID _context, __out PULONG *Wallclock);
|
||
|
typedef __checkReturn NTSTATUS (*PGET_LINK_POSITION_REGISTER) (__in PVOID _context, __in HANDLE Handle, __out PULONG *Position);
|
||
|
typedef __checkReturn NTSTATUS (*PREGISTER_EVENT_CALLBACK) (__in PVOID _context, __in PHDAUDIO_UNSOLICITED_RESPONSE_CALLBACK Routine, __in PVOID Context, __out PUCHAR Tag);
|
||
|
typedef __checkReturn NTSTATUS (*PUNREGISTER_EVENT_CALLBACK) (__in PVOID _context, __in UCHAR Tag);
|
||
|
typedef __checkReturn NTSTATUS (*PGET_DEVICE_INFORMATION) (__in PVOID _context, __in __out PHDAUDIO_DEVICE_INFORMATION DeviceInformation);
|
||
|
typedef VOID (*PGET_RESOURCE_INFORMATION) (__in PVOID _context, __out PUCHAR CodecAddress, __out PUCHAR FunctionGroupStartNode);
|
||
|
|
||
|
typedef struct _HDAUDIO_BUS_INTERFACE
|
||
|
{
|
||
|
//
|
||
|
// First we define the standard INTERFACE structure ...
|
||
|
//
|
||
|
USHORT Size;
|
||
|
USHORT Version;
|
||
|
PVOID Context;
|
||
|
PINTERFACE_REFERENCE InterfaceReference;
|
||
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||
|
|
||
|
//
|
||
|
// Then we expand the structure with our interface specific data
|
||
|
//
|
||
|
PTRANSFER_CODEC_VERBS TransferCodecVerbs;
|
||
|
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine;
|
||
|
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine;
|
||
|
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation;
|
||
|
PALLOCATE_DMA_BUFFER AllocateDmaBuffer;
|
||
|
PFREE_DMA_BUFFER FreeDmaBuffer;
|
||
|
PFREE_DMA_ENGINE FreeDmaEngine;
|
||
|
PSET_DMA_ENGINE_STATE SetDmaEngineState;
|
||
|
PGET_WALL_CLOCK_REGISTER GetWallClockRegister;
|
||
|
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister;
|
||
|
PREGISTER_EVENT_CALLBACK RegisterEventCallback;
|
||
|
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback;
|
||
|
PGET_DEVICE_INFORMATION GetDeviceInformation;
|
||
|
PGET_RESOURCE_INFORMATION GetResourceInformation;
|
||
|
} HDAUDIO_BUS_INTERFACE, *PHDAUDIO_BUS_INTERFACE;
|
||
|
|
||
|
//
|
||
|
// To support the Bdl interface...
|
||
|
//
|
||
|
//
|
||
|
// ISR Callback definition for Bdl interface
|
||
|
//
|
||
|
typedef void (*PHDAUDIO_BDL_ISR) (__in VOID *Context, __in ULONG InterruptBitMask);
|
||
|
|
||
|
//
|
||
|
// Additional BDL interface functions.
|
||
|
//
|
||
|
typedef __checkReturn NTSTATUS (*PALLOCATE_CONTIGUOUS_DMA_BUFFER) (__in PVOID _context, __in HANDLE Handle,
|
||
|
ULONG RequestedBufferSize, __out PVOID *DataBuffer, __out PHDAUDIO_BUFFER_DESCRIPTOR *BdlBuffer);
|
||
|
typedef __checkReturn NTSTATUS (*PFREE_CONTIGUOUS_DMA_BUFFER) (__in PVOID _context, __in HANDLE Handle);
|
||
|
typedef __checkReturn NTSTATUS (*PSETUP_DMA_ENGINE_WITH_BDL) (__in_bcount(BufferLength) PVOID _context, __in HANDLE Handle, __in ULONG BufferLength,
|
||
|
__in ULONG Lvi, __in PHDAUDIO_BDL_ISR Isr, __in PVOID Context, __out PUCHAR StreamId, __out PULONG FifoSize);
|
||
|
|
||
|
typedef struct _HDAUDIO_BUS_INTERFACE_BDL
|
||
|
{
|
||
|
//
|
||
|
// First we define the standard INTERFACE structure ...
|
||
|
//
|
||
|
USHORT Size;
|
||
|
USHORT Version;
|
||
|
PVOID Context;
|
||
|
PINTERFACE_REFERENCE InterfaceReference;
|
||
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||
|
|
||
|
//
|
||
|
// Then we expand the structure with the HDAUDIO_BUS_INTERFACE_BDL stuff.
|
||
|
// Many functions are identical (and derived) from the HDAUDIO_BUS_INTERFACE
|
||
|
// interface. PrepareDmaEngineWithBdl was added instead of PrepareDmaEngine
|
||
|
// and GetDeviceInformationBdl instead of GetDeviceInformation.
|
||
|
//
|
||
|
PTRANSFER_CODEC_VERBS TransferCodecVerbs;
|
||
|
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine;
|
||
|
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine;
|
||
|
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation;
|
||
|
PALLOCATE_CONTIGUOUS_DMA_BUFFER AllocateContiguousDmaBuffer;
|
||
|
PSETUP_DMA_ENGINE_WITH_BDL SetupDmaEngineWithBdl;
|
||
|
PFREE_CONTIGUOUS_DMA_BUFFER FreeContiguousDmaBuffer;
|
||
|
PFREE_DMA_ENGINE FreeDmaEngine;
|
||
|
PSET_DMA_ENGINE_STATE SetDmaEngineState;
|
||
|
PGET_WALL_CLOCK_REGISTER GetWallClockRegister;
|
||
|
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister;
|
||
|
PREGISTER_EVENT_CALLBACK RegisterEventCallback;
|
||
|
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback;
|
||
|
PGET_DEVICE_INFORMATION GetDeviceInformation;
|
||
|
PGET_RESOURCE_INFORMATION GetResourceInformation;
|
||
|
} HDAUDIO_BUS_INTERFACE_BDL, *PHDAUDIO_BUS_INTERFACE_BDL;
|
||
|
|
||
|
//
|
||
|
// Additional interface functions for DMA notification support
|
||
|
//
|
||
|
typedef __checkReturn NTSTATUS (*PALLOCATE_DMA_BUFFER_WITH_NOTIFICATION) (__in PVOID _context,
|
||
|
__in HANDLE Handle,
|
||
|
__in ULONG NotificationCount,
|
||
|
__in SIZE_T RequestedBufferSize,
|
||
|
__out PMDL *BufferMdl,
|
||
|
__out PSIZE_T AllocatedBufferSize,
|
||
|
__out PSIZE_T OffsetFromFirstPage,
|
||
|
__out PUCHAR StreamId,
|
||
|
__out PULONG FifoSize);
|
||
|
|
||
|
typedef __checkReturn NTSTATUS (*PFREE_DMA_BUFFER_WITH_NOTIFICATION) ( __in PVOID _context,
|
||
|
__in HANDLE Handle,
|
||
|
__in PMDL BufferMdl,
|
||
|
__in SIZE_T BufferSize);
|
||
|
|
||
|
typedef __checkReturn NTSTATUS (*PREGISTER_NOTIFICATION_EVENT) (__in PVOID _context,
|
||
|
__in HANDLE Handle,
|
||
|
__in PKEVENT NotificationEvent);
|
||
|
|
||
|
typedef __checkReturn NTSTATUS (*PUNREGISTER_NOTIFICATION_EVENT) (__in PVOID _context,
|
||
|
__in HANDLE Handle,
|
||
|
__in PKEVENT NotificationEvent);
|
||
|
|
||
|
typedef struct _HDAUDIO_BUS_INTERFACE_V2
|
||
|
{
|
||
|
//
|
||
|
// First we define the standard INTERFACE structure ...
|
||
|
//
|
||
|
USHORT Size;
|
||
|
USHORT Version;
|
||
|
PVOID Context;
|
||
|
PINTERFACE_REFERENCE InterfaceReference;
|
||
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||
|
|
||
|
//
|
||
|
// Then we expand the structure with the HDAUDIO_BUS_INTERFACE_PING_PONG stuff.
|
||
|
// Many functions are identical (and derived) from the HDAUDIO_BUS_INTERFACE
|
||
|
// interface.
|
||
|
|
||
|
PTRANSFER_CODEC_VERBS TransferCodecVerbs;
|
||
|
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine;
|
||
|
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine;
|
||
|
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation;
|
||
|
PALLOCATE_DMA_BUFFER AllocateDmaBuffer;
|
||
|
PFREE_DMA_BUFFER FreeDmaBuffer;
|
||
|
PFREE_DMA_ENGINE FreeDmaEngine;
|
||
|
PSET_DMA_ENGINE_STATE SetDmaEngineState;
|
||
|
PGET_WALL_CLOCK_REGISTER GetWallClockRegister;
|
||
|
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister;
|
||
|
PREGISTER_EVENT_CALLBACK RegisterEventCallback;
|
||
|
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback;
|
||
|
PGET_DEVICE_INFORMATION GetDeviceInformation;
|
||
|
PGET_RESOURCE_INFORMATION GetResourceInformation;
|
||
|
PALLOCATE_DMA_BUFFER_WITH_NOTIFICATION AllocateDmaBufferWithNotification;
|
||
|
PFREE_DMA_BUFFER_WITH_NOTIFICATION FreeDmaBufferWithNotification;
|
||
|
PREGISTER_NOTIFICATION_EVENT RegisterNotificationEvent;
|
||
|
PUNREGISTER_NOTIFICATION_EVENT UnregisterNotificationEvent;
|
||
|
} HDAUDIO_BUS_INTERFACE_V2, *PHDAUDIO_BUS_INTERFACE_V2;
|
||
|
|
||
|
#pragma warning(default:4201)
|
||
|
#pragma warning(default:4214)
|
||
|
|
||
|
#endif // _HDAUDIO_H_
|
||
|
|