12 #define PACKET_COUNT 10 27 while (CommonDescriptor)
41 if ((
ULONG_PTR)CommonDescriptor + CommonDescriptor->
bLength >= ((
ULONG_PTR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength))
105 if (!SampleRateBuffer)
140 PinContext =
Pin->Context;
173 IN ULONG FormatDescriptorIndex)
204 if (StreamingInterfaceDescriptor !=
NULL)
210 if (FormatDescriptorIndex ==
Index)
225 DPRINT1(
"No Interface found\n");
248 if (DeviceExtension->InterfaceInfo)
256 if (DeviceExtension->InterfaceInfo ==
NULL)
287 PinContext =
Pin->Context;
298 KsGateTurnInputOn(Gate);
329 Irp->IoStatus.Information = 0;
344 PacketCount = TransferBufferSize /
PacketSize;
372 Irp->Tail.Overlay.DriverContext[0] = Urb;
391 PinContext =
Pin->Context;
394 Urb =
Irp->Tail.Overlay.DriverContext[0];
401 Irp->IoStatus.Information = 0;
404 Irp->Tail.Overlay.DriverContext[0] = Urb;
405 Irp->Tail.Overlay.DriverContext[1] =
NULL;
451 PinContext =
Pin->Context;
496 ULONG MaximumPacketSize;
514 PinContext =
Pin->Context;
577 Irp->IoStatus.Information = 0;
602 DPRINT1(
"InitCapturePin Irp %p Urb %p\n",
Irp, Urb);
611 Irp->Tail.Overlay.DriverContext[0] = Urb;
624 KsGateTurnInputOff(Gate);
642 PinContext =
Pin->Context;
675 Irp->IoStatus.Information = 0;
711 DPRINT1(
"GetDataRangeIndexForFormat expected KSDATARANGE_AUDIO\n");
721 CurrentDataRange = DataRanges[
Index];
800 Pin->Context = PinContext;
823 DPRINT1(
"USBAudioSelectAudioStreamingInterface failed with %x\n",
Status);
861 PKSSTREAM_POINTER StreamPointerClone;
867 PinContext =
Pin->Context;
873 StreamPointerClone =
Irp->Tail.Overlay.DriverContext[1];
876 Urb =
Irp->Tail.Overlay.DriverContext[0];
897 if (StreamPointerClone)
921 PinContext =
Pin->Context;
924 Urb =
Irp->Tail.Overlay.DriverContext[0];
966 PinContext =
Pin->Context;
990 PKSSTREAM_POINTER LeadingStreamPointer;
991 PKSSTREAM_POINTER CloneStreamPointer;
1002 if (LeadingStreamPointer ==
NULL)
1007 if (
NULL == LeadingStreamPointer->StreamHeader->Data)
1010 DPRINT1(
"Advancing Streampointer\n");
1015 PinContext =
Pin->Context;
1044 TransferBuffer = CloneStreamPointer->StreamHeader->Data;
1087 PacketCount = (CloneStreamPointer->OffsetIn.Remaining -
Offset) / TotalPacketSize;
1093 Irp->Tail.Overlay.DriverContext[1] = CloneStreamPointer;
1098 PinContext->
BufferLength = CloneStreamPointer->OffsetIn.Remaining - ((PacketCount * TotalPacketSize) +
Offset);
1124 PKSSTREAM_POINTER LeadingStreamPointer;
1137 if (LeadingStreamPointer ==
NULL)
1143 KsGateTurnInputOff(Gate);
1149 PinContext =
Pin->Context;
1166 Urb = (
PURB)
Irp->Tail.Overlay.DriverContext[0];
1187 LeadingStreamPointer->StreamHeader->DataUsed +=
Length;
1189 if (
Length == LeadingStreamPointer->OffsetOut.Remaining)
1206 if (LeadingStreamPointer ==
NULL)
1255 if (LeadingStreamPointer !=
NULL)
1262 KsGateTurnInputOff(Gate);
1303 _In_opt_ const KSATTRIBUTE_LIST* AttributeRange)
1305 if (OldFormat ==
NULL)
1325 PinContext =
Pin->Context;
1344 DPRINT(
"StartCaptureIsocTransfer Irp %p\n",
Irp);
1366 if (FromState != ToState)
1427 PKSPIN_DESCRIPTOR_EX PinDescriptor;
1440 PinDescriptor = (PKSPIN_DESCRIPTOR_EX)&
Filter->Descriptor->PinDescriptors[
Pin->PinId];
1443 if (DataBufferSize == 0)
1450 ASSERT(PinDescriptor->PinDescriptor.DataRangesCount >= 0);
NTSTATUS GetMaxPacketSizeForInterface(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, KSPIN_DATAFLOW DataFlow)
KSDDKAPI VOID NTAPI KsStreamPointerDelete(IN PKSSTREAM_POINTER StreamPointer)
NTSTATUS RenderInitializeUrbAndIrp(IN PKSPIN Pin, IN PPIN_CONTEXT PinContext, IN OUT PIRP Irp, IN PVOID TransferBuffer, IN ULONG TransferBufferSize, IN ULONG PacketSize)
PKSFILTER NTAPI KsPinGetParentFilter(IN PKSPIN Pin)
NTSTATUS NTAPI USBAudioPinProcess(_In_ PKSPIN Pin)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
return STATUS_NOT_SUPPORTED
VOID NTAPI KsPinAcquireProcessingMutex(IN PKSPIN Pin)
NTSTATUS PinRenderProcess(IN PKSPIN Pin)
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS NTAPI KsAddItemToObjectBag(IN KSOBJECT_BAG ObjectBag, IN PVOID Item, IN PFNKSFREE Free OPTIONAL)
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG _In_ ULONG _In_opt_ PVOID _In_opt_ PVOID FilterContext
KS_FRAMING_RANGE PhysicalRange
VOID NTAPI KsPinAttemptProcessing(IN PKSPIN Pin, IN BOOLEAN Asynchronous)
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define STATUS_MORE_PROCESSING_REQUIRED
IN BOOLEAN OUT PSTR Buffer
KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone(IN PKSSTREAM_POINTER StreamPointer, IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL, IN ULONG ContextSize, OUT PKSSTREAM_POINTER *CloneStreamPointer)
PDEVICE_OBJECT LowerDevice
#define STATUS_INVALID_PARAMETER
PKSGATE NTAPI KsPinGetAndGate(IN PKSPIN Pin)
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
ULONG MaximumBitsPerSample
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
#define URB_FUNCTION_CLASS_ENDPOINT
KSDDKAPI NTSTATUS NTAPI _KsEdit(IN KSOBJECT_BAG ObjectBag, IN OUT PVOID *PointerToPointerToItem, IN ULONG NewSize, IN ULONG OldSize, IN ULONG Tag)
#define USBD_TRANSFER_DIRECTION_IN
#define GET_SELECT_INTERFACE_REQUEST_SIZE(totalPipes)
KS_FRAMING_ITEM FramingItem[1]
KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance(IN PKSSTREAM_POINTER StreamPointer)
struct tWAVEFORMATEX WAVEFORMATEX
NTSTATUS UsbAudioSetFormat(IN PKSPIN Pin)
NTSTATUS CapturePinStateChange(_In_ PKSPIN Pin, _In_ KSSTATE ToState, _In_ KSSTATE FromState)
#define InsertTailList(ListHead, Entry)
VOID NTAPI IoInitializeIrp(IN PIRP Irp, IN USHORT PacketSize, IN CCHAR StackSize)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
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)
PDEVICE_EXTENSION DeviceExtension
#define USB_DEVICE_CLASS_AUDIO
#define RtlMoveMemory(Destination, Source, Length)
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)
#define UsbBuildVendorRequest(urb, cmd, length, transferFlags, reservedbits, request, value, index, transferBuffer, transferBufferMDL, transferBufferLength, link)
#define IsEqualGUIDAligned(guid1, guid2)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
KSDDKAPI ULONG NTAPI KsIncrementCountedWorker(IN PKSWORKER Worker)
VOID NTAPI FreeFunction(IN PVOID Item)
NTSTATUS PinCaptureProcess(IN PKSPIN Pin)
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
#define GET_ISO_URB_SIZE(n)
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR UsbAudioGetStreamingTerminalDescriptorByIndex(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG Index)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS NTAPI USBAudioPinSetDeviceState(_In_ PKSPIN Pin, _In_ KSSTATE ToState, _In_ KSSTATE FromState)
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
ULONG GetDataRangeIndexForFormat(IN PKSDATARANGE ConnectionFormat, IN const PKSDATARANGE *DataRanges, IN ULONG DataRangesCount)
#define USBD_TRANSFER_DIRECTION_OUT
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
WORK_QUEUE_ITEM CaptureWorkItem
#define USB_INTERFACE_DESCRIPTOR_TYPE
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
struct _USB_ENDPOINT_DESCRIPTOR * PUSB_ENDPOINT_DESCRIPTOR
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
PIRP PinGetIrpFromReadyList(IN PKSPIN Pin)
KSDDKAPI ULONG NTAPI KsDecrementCountedWorker(IN PKSWORKER Worker)
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
#define ExInitializeWorkItem(Item, Routine, Context)
IN PDCB IN VBO IN ULONG IN BOOLEAN Pin
PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
ULONG MinimumSampleFrequency
#define KeAcquireSpinLock(sl, irql)
NTSTATUS NTAPI UsbAudioCaptureComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
PDEVICE_OBJECT DeviceObject
PUSB_COMMON_DESCRIPTOR NTAPI USBD_ParseDescriptors(PVOID DescriptorBuffer, ULONG TotalLength, PVOID StartPosition, LONG DescriptorType)
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
VOID NTAPI CaptureAvoidPipeStarvationWorker(_In_ PVOID Context)
KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker(IN WORK_QUEUE_TYPE WorkQueueType, IN PWORK_QUEUE_ITEM CountedWorkItem, OUT PKSWORKER *Worker)
NTSTATUS NTAPI USBAudioPinClose(_In_ PKSPIN Pin, _In_ PIRP Irp)
VOID CaptureInitializeUrbAndIrp(IN PKSPIN Pin, IN PIRP Irp)
#define USB_ENDPOINT_DESCRIPTOR_TYPE
NTSTATUS UsbAudioAllocCaptureUrbIso(IN USBD_PIPE_HANDLE PipeHandle, IN ULONG MaxPacketSize, IN PVOID Buffer, IN ULONG BufferLength, OUT PURB *OutUrb)
NTSTATUS SubmitUrbSync(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI CaptureGateOnWorkItem(_In_ PVOID Context)
NTSTATUS InitCapturePin(IN PKSPIN Pin)
NTSTATUS NTAPI UsbAudioRenderComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
_In_ ULONG _In_ ULONG Offset
KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer(IN PKSPIN Pin, IN KSSTREAM_POINTER_STATE State)
PVOID NTAPI AllocFunction(IN ULONG ItemSize)
struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer
NTSTATUS InitStreamPin(IN PKSPIN Pin)
#define STATUS_BUFFER_OVERFLOW
VOID NTAPI KsPinReleaseProcessingMutex(IN PKSPIN Pin)
ULONG MaximumSampleFrequency
#define URB_FUNCTION_ISOCH_TRANSFER
#define IoSizeOfIrp(_StackSize)
struct KSALLOCATOR_FRAMING_EX * PKSALLOCATOR_FRAMING_EX
#define InitializeListHead(ListHead)
KSDDKAPI VOID NTAPI KsStreamPointerUnlock(IN PKSSTREAM_POINTER StreamPointer, IN BOOLEAN Eject)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define KeReleaseSpinLock(sl, irql)
PKSWORKER StarvationWorker
KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp(IN PIRP Irp)
WORK_QUEUE_ITEM StarvationWorkItem
struct USB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR * PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR
KSDDKAPI VOID NTAPI KsUnregisterWorker(IN PKSWORKER Worker)
#define UsbBuildSelectInterfaceRequest(urb, length, configurationHandle, interfaceNumber, alternateSetting)
KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets(IN PKSSTREAM_POINTER StreamPointer, IN ULONG InUsed, IN ULONG OutUsed, IN BOOLEAN Eject)
KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode(IN PKSSTREAM_POINTER StreamPointer, IN NTSTATUS Status)
VOID NTAPI USBAudioPinReset(_In_ PKSPIN Pin)
struct tagContext Context
NTSTATUS StartCaptureIsocTransfer(IN PKSPIN Pin)
KSDDKAPI VOID NTAPI KsStreamPointerAdvanceOffsetsAndUnlock(IN PKSSTREAM_POINTER StreamPointer, IN ULONG InUsed, IN ULONG OutUsed, IN BOOLEAN Eject)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
LIST_ENTRY DoneIrpListHead
#define USBD_START_ISO_TRANSFER_ASAP
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
KS_FRAMING_RANGE_WEIGHTED FramingRange
NTSTATUS USBAudioSelectAudioStreamingInterface(IN PKSPIN Pin, IN PPIN_CONTEXT PinContext, IN PDEVICE_EXTENSION DeviceExtension, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG FormatDescriptorIndex)
NTSTATUS NTAPI USBAudioPinCreate(_In_ PKSPIN Pin, _In_ PIRP Irp)
struct _URB_SELECT_INTERFACE UrbSelectInterface
#define STATUS_DEVICE_DATA_ERROR
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize