mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
407 lines
10 KiB
C
407 lines
10 KiB
C
#pragma once
|
|
|
|
#include <ntddk.h>
|
|
#include <portcls.h>
|
|
#include <ksmedia.h>
|
|
#include <hubbusif.h>
|
|
#include <usbbusif.h>
|
|
#include <usbioctl.h>
|
|
#include <usb.h>
|
|
#include <usbdlib.h>
|
|
#include <debug.h>
|
|
|
|
#define USBAUDIO_TAG 'AbsU'
|
|
#define USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE (0x24)
|
|
|
|
/* Universal Serial Bus Device Class Definition for Terminal Types Section 2.2 */
|
|
#define USB_AUDIO_STREAMING_TERMINAL_TYPE (0x0101)
|
|
|
|
#define USB_AUDIO_MICROPHONE_TERMINAL_TYPE (0x0201)
|
|
#define USB_AUDIO_DESKTOP_MICROPHONE_TERMINAL_TYPE (0x0202)
|
|
#define USB_AUDIO_PERSONAL_MICROPHONE_TERMINAL_TYPE (0x0203)
|
|
#define USB_AUDIO_OMMNI_MICROPHONE_TERMINAL_TYPE (0x0204)
|
|
#define USB_AUDIO_ARRAY_MICROPHONE_TERMINAL_TYPE (0x0205)
|
|
#define USB_AUDIO_ARRAY_PROCESSING_MICROPHONE_TERMINAL_TYPE (0x0206)
|
|
|
|
#define USB_AUDIO_SPEAKER_TERMINAL_TYPE (0x0301)
|
|
#define USB_HEADPHONES_SPEAKER_TERMINAL_TYPE (0x0302)
|
|
#define USB_AUDIO_HMDA_TERMINAL_TYPE (0x0303)
|
|
#define USB_AUDIO_DESKTOP_SPEAKER_TERMINAL_TYPE (0x0304)
|
|
#define USB_AUDIO_ROOM_SPEAKER_TERMINAL_TYPE (0x0305)
|
|
#define USB_AUDIO_COMMUNICATION_SPEAKER_TERMINAL_TYPE (0x0306)
|
|
#define USB_AUDIO_SUBWOOFER_TERMINAL_TYPE (0x0307)
|
|
#define USB_AUDIO_UNDEFINED_TERMINAL_TYPE (0xFFFF)
|
|
|
|
#define USB_AUDIO_INPUT_TERMINAL (0x02)
|
|
#define USB_AUDIO_OUTPUT_TERMINAL (0x03)
|
|
|
|
#define DEFINE_KSPROPERTY_ITEM_AUDIO_VOLUME(Handler)\
|
|
DEFINE_KSPROPERTY_ITEM(\
|
|
KSPROPERTY_AUDIO_VOLUMELEVEL,\
|
|
(Handler),\
|
|
sizeof(KSNODEPROPERTY_AUDIO_CHANNEL),\
|
|
sizeof(LONG),\
|
|
(Handler), NULL, 0, NULL, NULL, 0)
|
|
|
|
|
|
#define DEFINE_KSPROPERTY_TABLE_AUDIO_VOLUME(TopologySet, Handler)\
|
|
DEFINE_KSPROPERTY_TABLE(TopologySet) {\
|
|
DEFINE_KSPROPERTY_ITEM_AUDIO_VOLUME(Handler)\
|
|
}
|
|
|
|
#define DEFINE_KSPROPERTY_ITEM_AUDIO_MUTE(Handler)\
|
|
DEFINE_KSPROPERTY_ITEM(\
|
|
KSPROPERTY_AUDIO_MUTE,\
|
|
(Handler),\
|
|
sizeof(KSNODEPROPERTY_AUDIO_CHANNEL),\
|
|
sizeof(BOOL),\
|
|
(Handler), NULL, 0, NULL, NULL, 0)
|
|
|
|
#define DEFINE_KSPROPERTY_TABLE_AUDIO_MUTE(TopologySet, Handler)\
|
|
DEFINE_KSPROPERTY_TABLE(TopologySet) {\
|
|
DEFINE_KSPROPERTY_ITEM_AUDIO_MUTE(Handler)\
|
|
}
|
|
|
|
#include <pshpack1.h>
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
USHORT bcdADC;
|
|
USHORT wTotalLength;
|
|
UCHAR bInCollection;
|
|
UCHAR baInterfaceNr;
|
|
}USB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bTerminalID;
|
|
USHORT wTerminalType;
|
|
UCHAR bAssocTerminal;
|
|
UCHAR bSourceID;
|
|
UCHAR iTerminal;
|
|
}USB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bTerminalID;
|
|
USHORT wTerminalType;
|
|
UCHAR bAssocTerminal;
|
|
UCHAR bNrChannels;
|
|
USHORT wChannelConfig;
|
|
UCHAR iChannelNames;
|
|
UCHAR iTerminal;
|
|
}USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bUnitID;
|
|
UCHAR bSourceID;
|
|
UCHAR bControlSize;
|
|
UCHAR bmaControls[1];
|
|
UCHAR iFeature;
|
|
}USB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bUnitID;
|
|
UCHAR bNrInPins;
|
|
UCHAR baSourceID[1];
|
|
UCHAR bNrChannels;
|
|
USHORT wChannelConfig;
|
|
UCHAR iChannelNames;
|
|
UCHAR bmControls;
|
|
UCHAR iMixer;
|
|
}USB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bUnitID;
|
|
UCHAR bNrInPins;
|
|
UCHAR baSourceID[1];
|
|
UCHAR iSelector;
|
|
}USB_AUDIO_CONTROL_SELECTOR_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_SELECTOR_UNIT_DESCRIPTOR;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bTerminalLink;
|
|
UCHAR bDelay;
|
|
USHORT wFormatTag;
|
|
}USB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR bLength;
|
|
UCHAR bDescriptorType;
|
|
UCHAR bDescriptorSubtype;
|
|
UCHAR bFormatType;
|
|
UCHAR bNrChannels;
|
|
UCHAR bSubframeSize;
|
|
UCHAR bBitResolution;
|
|
UCHAR bSamFreqType;
|
|
UCHAR tSamFreq[1];
|
|
}USB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR;
|
|
|
|
#include <poppack.h>
|
|
|
|
typedef struct
|
|
{
|
|
PUSB_COMMON_DESCRIPTOR Descriptor;
|
|
ULONG NodeCount;
|
|
ULONG Nodes[20];
|
|
}NODE_CONTEXT, *PNODE_CONTEXT;
|
|
|
|
typedef struct __DEVICE_EXTENSION__
|
|
{
|
|
PDEVICE_OBJECT LowerDevice; /* lower device*/
|
|
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; /* usb configuration descriptor */
|
|
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; /* usb device descriptor */
|
|
PUSBD_INTERFACE_INFORMATION InterfaceInfo; /* interface information */
|
|
USBD_CONFIGURATION_HANDLE ConfigurationHandle; /* configuration handle */
|
|
PNODE_CONTEXT NodeContext; /* node context */
|
|
ULONG NodeContextCount; /* node context count */
|
|
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|
|
|
typedef struct
|
|
{
|
|
PDEVICE_EXTENSION DeviceExtension; /* device extension */
|
|
PDEVICE_OBJECT LowerDevice; /* lower device*/
|
|
|
|
}FILTER_CONTEXT, *PFILTER_CONTEXT;
|
|
|
|
typedef struct
|
|
{
|
|
PDEVICE_EXTENSION DeviceExtension; /* device extension */
|
|
PDEVICE_OBJECT LowerDevice; /* lower device*/
|
|
LIST_ENTRY IrpListHead; /* irp list*/
|
|
LIST_ENTRY DoneIrpListHead; /* irp done list head */
|
|
KSPIN_LOCK IrpListLock; /* irp list lock*/
|
|
PUCHAR Buffer; /* iso buffer*/
|
|
ULONG BufferSize; /* iso buffer size */
|
|
ULONG BufferOffset; /* buffer offset */
|
|
ULONG BufferLength; /* remaining render bytes */
|
|
PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; /* interface descriptor */
|
|
WORK_QUEUE_ITEM CaptureWorkItem; /* work item */
|
|
PKSWORKER CaptureWorker; /* capture worker */
|
|
WORK_QUEUE_ITEM StarvationWorkItem; /* work item */
|
|
PKSWORKER StarvationWorker; /* capture worker */
|
|
}PIN_CONTEXT, *PPIN_CONTEXT;
|
|
|
|
/* filter.c */
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioCreateFilterContext(
|
|
PKSDEVICE Device);
|
|
|
|
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
|
|
UsbAudioGetStreamingTerminalDescriptorByIndex(
|
|
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
|
|
IN ULONG Index);
|
|
|
|
/* pool.c */
|
|
PVOID
|
|
NTAPI
|
|
AllocFunction(
|
|
IN ULONG ItemSize);
|
|
|
|
VOID
|
|
NTAPI
|
|
FreeFunction(
|
|
IN PVOID Item);
|
|
|
|
VOID
|
|
NTAPI
|
|
CountTerminalUnits(
|
|
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
|
|
OUT PULONG NonStreamingTerminalDescriptorCount,
|
|
OUT PULONG TotalTerminalDescriptorCount);
|
|
|
|
/* usbaudio.c */
|
|
|
|
NTSTATUS
|
|
SubmitUrbSync(
|
|
IN PDEVICE_OBJECT Device,
|
|
IN PURB Urb);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioAddDevice(
|
|
_In_ PKSDEVICE Device
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPnPStart(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp,
|
|
_In_opt_ PCM_RESOURCE_LIST TranslatedResourceList,
|
|
_In_opt_ PCM_RESOURCE_LIST UntranslatedResourceList
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPnPQueryStop(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPCancelStop(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPStop(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPnPQueryRemove(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPCancelRemove(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPRemove(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPnPQueryCapabilities(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp,
|
|
_Inout_ PDEVICE_CAPABILITIES Capabilities
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPSurpriseRemoval(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPnPQueryPower(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp,
|
|
_In_ DEVICE_POWER_STATE DeviceTo,
|
|
_In_ DEVICE_POWER_STATE DeviceFrom,
|
|
_In_ SYSTEM_POWER_STATE SystemTo,
|
|
_In_ SYSTEM_POWER_STATE SystemFrom,
|
|
_In_ POWER_ACTION Action
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPnPSetPower(
|
|
_In_ PKSDEVICE Device,
|
|
_In_ PIRP Irp,
|
|
_In_ DEVICE_POWER_STATE To,
|
|
_In_ DEVICE_POWER_STATE From
|
|
);
|
|
|
|
/* pin.c*/
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
UsbAudioPinDataIntersect(
|
|
_In_ PVOID Context,
|
|
_In_ PIRP Irp,
|
|
_In_ PKSP_PIN Pin,
|
|
_In_ PKSDATARANGE DataRange,
|
|
_In_ PKSDATARANGE MatchingDataRange,
|
|
_In_ ULONG DataBufferSize,
|
|
_Out_ PVOID Data,
|
|
_Out_ PULONG DataSize);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
UsbAudioCaptureComplete(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PVOID Context);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
UsbAudioRenderComplete(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PVOID Context);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPinCreate(
|
|
_In_ PKSPIN Pin,
|
|
_In_ PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPinClose(
|
|
_In_ PKSPIN Pin,
|
|
_In_ PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPinProcess(
|
|
_In_ PKSPIN Pin);
|
|
|
|
VOID
|
|
NTAPI
|
|
USBAudioPinReset(
|
|
_In_ PKSPIN Pin);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPinSetDataFormat(
|
|
_In_ PKSPIN Pin,
|
|
_In_opt_ PKSDATAFORMAT OldFormat,
|
|
_In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
|
|
_In_ const KSDATARANGE* DataRange,
|
|
_In_opt_ const KSATTRIBUTE_LIST* AttributeRange);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
USBAudioPinSetDeviceState(
|
|
_In_ PKSPIN Pin,
|
|
_In_ KSSTATE ToState,
|
|
_In_ KSSTATE FromState);
|
|
|