|
|
|
@@ -41,6 +41,7 @@ protected:
|
|
|
|
|
|
|
|
|
|
VOID UpdateCommonBuffer(ULONG Position, ULONG MaxTransferCount);
|
|
|
|
|
VOID UpdateCommonBufferOverlap(ULONG Position, ULONG MaxTransferCount);
|
|
|
|
|
VOID GeneratePositionEvents(IN ULONG OldCommonBufferOffset, IN ULONG NewCommonBufferOffset);
|
|
|
|
|
NTSTATUS NTAPI HandleKsStream(IN PIRP Irp);
|
|
|
|
|
NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp);
|
|
|
|
|
|
|
|
|
@@ -49,6 +50,8 @@ protected:
|
|
|
|
|
friend NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
friend NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
friend NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
friend NTSTATUS NTAPI PinWaveCyclicAddEndOfStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
|
|
|
|
friend NTSTATUS NTAPI PinWaveCyclicAddLoopedStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
|
|
|
|
|
|
|
|
|
IPortWaveCyclic * m_Port;
|
|
|
|
|
IPortFilterWaveCyclic * m_Filter;
|
|
|
|
@@ -76,6 +79,9 @@ protected:
|
|
|
|
|
KSALLOCATOR_FRAMING m_AllocatorFraming;
|
|
|
|
|
SUBDEVICE_DESCRIPTOR m_Descriptor;
|
|
|
|
|
|
|
|
|
|
KSPIN_LOCK m_EventListLock;
|
|
|
|
|
LIST_ENTRY m_EventList;
|
|
|
|
|
|
|
|
|
|
ULONG m_Delay;
|
|
|
|
|
|
|
|
|
|
LONG m_Ref;
|
|
|
|
@@ -84,19 +90,49 @@ protected:
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
CPortPinWaveCyclic *Pin;
|
|
|
|
|
PIO_WORKITEM WorkItem;
|
|
|
|
|
KSSTATE State;
|
|
|
|
|
}SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
|
|
|
|
|
ULONG bLoopedStreaming;
|
|
|
|
|
ULONGLONG Position;
|
|
|
|
|
}LOOPEDSTREAMING_EVENT_CONTEXT, *PLOOPEDSTREAMING_EVENT_CONTEXT;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
ULONG bLoopedStreaming;
|
|
|
|
|
}ENDOFSTREAM_EVENT_CONTEXT, *PENDOFSTREAM_EVENT_CONTEXT;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicAddEndOfStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
|
|
|
|
NTSTATUS NTAPI PinWaveCyclicAddLoopedStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming);
|
|
|
|
|
DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition);
|
|
|
|
|
|
|
|
|
|
KSEVENT_ITEM PinWaveCyclicConnectionEventSet =
|
|
|
|
|
{
|
|
|
|
|
KSEVENT_CONNECTION_ENDOFSTREAM,
|
|
|
|
|
sizeof(KSEVENTDATA),
|
|
|
|
|
sizeof(ENDOFSTREAM_EVENT_CONTEXT),
|
|
|
|
|
PinWaveCyclicAddEndOfStreamEvent,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
KSEVENT_ITEM PinWaveCyclicStreamingEventSet =
|
|
|
|
|
{
|
|
|
|
|
KSEVENT_LOOPEDSTREAMING_POSITION,
|
|
|
|
|
sizeof(LOOPEDSTREAMING_POSITION_EVENT_DATA),
|
|
|
|
|
sizeof(LOOPEDSTREAMING_EVENT_CONTEXT),
|
|
|
|
|
PinWaveCyclicAddLoopedStreamEvent,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KSPROPERTY_SET PinWaveCyclicPropertySet[] =
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
@@ -115,6 +151,21 @@ KSPROPERTY_SET PinWaveCyclicPropertySet[] =
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
KSEVENT_SET PinWaveCyclicEventSet[] =
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
&KSEVENTSETID_LoopedStreaming,
|
|
|
|
|
sizeof(PinWaveCyclicStreamingEventSet) / sizeof(KSEVENT_ITEM),
|
|
|
|
|
(const KSEVENT_ITEM*)&PinWaveCyclicStreamingEventSet
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
&KSEVENTSETID_Connection,
|
|
|
|
|
sizeof(PinWaveCyclicConnectionEventSet) / sizeof(KSEVENT_ITEM),
|
|
|
|
|
(const KSEVENT_ITEM*)&PinWaveCyclicConnectionEventSet
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//==================================================================================================================================
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
@@ -143,6 +194,80 @@ CPortPinWaveCyclic::QueryInterface(
|
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
|
NTAPI
|
|
|
|
|
PinWaveCyclicAddEndOfStreamEvent(
|
|
|
|
|
IN PIRP Irp,
|
|
|
|
|
IN PKSEVENTDATA EventData,
|
|
|
|
|
IN PKSEVENT_ENTRY EventEntry)
|
|
|
|
|
{
|
|
|
|
|
PENDOFSTREAM_EVENT_CONTEXT Entry;
|
|
|
|
|
PSUBDEVICE_DESCRIPTOR Descriptor;
|
|
|
|
|
CPortPinWaveCyclic *Pin;
|
|
|
|
|
|
|
|
|
|
// get sub device descriptor
|
|
|
|
|
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
|
|
|
|
|
|
|
|
|
|
// sanity check
|
|
|
|
|
PC_ASSERT(Descriptor);
|
|
|
|
|
PC_ASSERT(Descriptor->PortPin);
|
|
|
|
|
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
|
|
|
|
|
|
|
|
|
// cast to pin impl
|
|
|
|
|
Pin = (CPortPinWaveCyclic*)Descriptor->PortPin;
|
|
|
|
|
|
|
|
|
|
// get extra size
|
|
|
|
|
Entry = (PENDOFSTREAM_EVENT_CONTEXT)(EventEntry + 1);
|
|
|
|
|
|
|
|
|
|
// not a looped event
|
|
|
|
|
Entry->bLoopedStreaming = FALSE;
|
|
|
|
|
|
|
|
|
|
// insert item
|
|
|
|
|
(void)ExInterlockedInsertTailList(&Pin->m_EventList, &EventEntry->ListEntry, &Pin->m_EventListLock);
|
|
|
|
|
|
|
|
|
|
// done
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
|
NTAPI
|
|
|
|
|
PinWaveCyclicAddLoopedStreamEvent(
|
|
|
|
|
IN PIRP Irp,
|
|
|
|
|
IN PKSEVENTDATA EventData,
|
|
|
|
|
IN PKSEVENT_ENTRY EventEntry)
|
|
|
|
|
{
|
|
|
|
|
PLOOPEDSTREAMING_POSITION_EVENT_DATA Data;
|
|
|
|
|
PLOOPEDSTREAMING_EVENT_CONTEXT Entry;
|
|
|
|
|
PSUBDEVICE_DESCRIPTOR Descriptor;
|
|
|
|
|
CPortPinWaveCyclic *Pin;
|
|
|
|
|
|
|
|
|
|
// get sub device descriptor
|
|
|
|
|
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSEVENT_ITEM_IRP_STORAGE(Irp);
|
|
|
|
|
|
|
|
|
|
// sanity check
|
|
|
|
|
PC_ASSERT(Descriptor);
|
|
|
|
|
PC_ASSERT(Descriptor->PortPin);
|
|
|
|
|
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
|
|
|
|
|
|
|
|
|
// cast to pin impl
|
|
|
|
|
Pin = (CPortPinWaveCyclic*)Descriptor->PortPin;
|
|
|
|
|
|
|
|
|
|
// cast to looped event
|
|
|
|
|
Data = (PLOOPEDSTREAMING_POSITION_EVENT_DATA)EventData;
|
|
|
|
|
|
|
|
|
|
// get extra size
|
|
|
|
|
Entry = (PLOOPEDSTREAMING_EVENT_CONTEXT)(EventEntry + 1);
|
|
|
|
|
|
|
|
|
|
Entry->bLoopedStreaming = TRUE;
|
|
|
|
|
Entry->Position = Data->Position;
|
|
|
|
|
|
|
|
|
|
// insert item
|
|
|
|
|
(void)ExInterlockedInsertTailList(&Pin->m_EventList, &EventEntry->ListEntry, &Pin->m_EventListLock);
|
|
|
|
|
|
|
|
|
|
// done
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
|
NTAPI
|
|
|
|
|
PinWaveCyclicAllocatorFraming(
|
|
|
|
@@ -154,7 +279,7 @@ PinWaveCyclicAllocatorFraming(
|
|
|
|
|
PSUBDEVICE_DESCRIPTOR Descriptor;
|
|
|
|
|
|
|
|
|
|
// get sub device descriptor
|
|
|
|
|
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
|
|
|
|
|
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSEVENT_ITEM_IRP_STORAGE(Irp);
|
|
|
|
|
|
|
|
|
|
// sanity check
|
|
|
|
|
PC_ASSERT(Descriptor);
|
|
|
|
@@ -413,6 +538,58 @@ PinWaveCyclicDataFormat(
|
|
|
|
|
return STATUS_NOT_SUPPORTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VOID
|
|
|
|
|
CPortPinWaveCyclic::GeneratePositionEvents(
|
|
|
|
|
IN ULONG OldCommonBufferOffset,
|
|
|
|
|
IN ULONG NewCommonBufferOffset)
|
|
|
|
|
{
|
|
|
|
|
PLIST_ENTRY Entry;
|
|
|
|
|
PKSEVENT_ENTRY EventEntry;
|
|
|
|
|
PLOOPEDSTREAMING_EVENT_CONTEXT Context;
|
|
|
|
|
|
|
|
|
|
// acquire event lock
|
|
|
|
|
KeAcquireSpinLockAtDpcLevel(&m_EventListLock);
|
|
|
|
|
|
|
|
|
|
// point to first entry
|
|
|
|
|
Entry = m_EventList.Flink;
|
|
|
|
|
|
|
|
|
|
while(Entry != &m_EventList)
|
|
|
|
|
{
|
|
|
|
|
// get event entry
|
|
|
|
|
EventEntry = (PKSEVENT_ENTRY)CONTAINING_RECORD(Entry, KSEVENT_ENTRY, ListEntry);
|
|
|
|
|
|
|
|
|
|
// get event entry context
|
|
|
|
|
Context = (PLOOPEDSTREAMING_EVENT_CONTEXT)(EventEntry + 1);
|
|
|
|
|
|
|
|
|
|
if (Context->bLoopedStreaming == TRUE)
|
|
|
|
|
{
|
|
|
|
|
if (NewCommonBufferOffset > OldCommonBufferOffset)
|
|
|
|
|
{
|
|
|
|
|
/* buffer progress no overlap */
|
|
|
|
|
if (OldCommonBufferOffset < Context->Position && Context->Position <= NewCommonBufferOffset)
|
|
|
|
|
{
|
|
|
|
|
/* generate event */
|
|
|
|
|
KsGenerateEvent(EventEntry);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* buffer wrap-arround */
|
|
|
|
|
if (OldCommonBufferOffset < Context->Position || NewCommonBufferOffset > Context->Position)
|
|
|
|
|
{
|
|
|
|
|
/* generate event */
|
|
|
|
|
KsGenerateEvent(EventEntry);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// move to next entry
|
|
|
|
|
Entry = Entry->Flink;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// release lock
|
|
|
|
|
KeReleaseSpinLockFromDpcLevel(&m_EventListLock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VOID
|
|
|
|
|
CPortPinWaveCyclic::UpdateCommonBuffer(
|
|
|
|
@@ -516,6 +693,7 @@ CPortPinWaveCyclic::RequestService()
|
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
PUCHAR Buffer;
|
|
|
|
|
ULONG BufferSize;
|
|
|
|
|
ULONG OldCommonBufferOffset;
|
|
|
|
|
|
|
|
|
|
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
|
|
|
|
|
|
|
|
@@ -528,6 +706,8 @@ CPortPinWaveCyclic::RequestService()
|
|
|
|
|
Status = m_Stream->GetPosition(&Position);
|
|
|
|
|
DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
|
|
|
|
|
|
|
|
|
|
OldCommonBufferOffset = m_CommonBufferOffset;
|
|
|
|
|
|
|
|
|
|
if (Position < m_CommonBufferOffset)
|
|
|
|
|
{
|
|
|
|
|
UpdateCommonBufferOverlap(Position, m_FrameSize);
|
|
|
|
@@ -536,6 +716,8 @@ CPortPinWaveCyclic::RequestService()
|
|
|
|
|
{
|
|
|
|
|
UpdateCommonBuffer(Position, m_FrameSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GeneratePositionEvents(OldCommonBufferOffset, m_CommonBufferOffset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
@@ -569,16 +751,6 @@ CPortPinWaveCyclic::HandleKsProperty(
|
|
|
|
|
|
|
|
|
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
|
|
|
|
|
|
|
|
|
if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
|
|
|
|
|
{
|
|
|
|
|
DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
|
|
|
|
|
|
|
|
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status = PcHandlePropertyWithTable(Irp, m_Descriptor.FilterPropertySetCount, m_Descriptor.FilterPropertySet, &m_Descriptor);
|
|
|
|
|
|
|
|
|
|
if (Status == STATUS_NOT_FOUND)
|
|
|
|
@@ -629,6 +801,7 @@ CPortPinWaveCyclic::DeviceIoControl(
|
|
|
|
|
IN PIRP Irp)
|
|
|
|
|
{
|
|
|
|
|
PIO_STACK_LOCATION IoStack;
|
|
|
|
|
NTSTATUS Status = STATUS_NOT_SUPPORTED;
|
|
|
|
|
|
|
|
|
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
|
|
|
|
|
|
|
|
@@ -639,13 +812,11 @@ CPortPinWaveCyclic::DeviceIoControl(
|
|
|
|
|
}
|
|
|
|
|
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT)
|
|
|
|
|
{
|
|
|
|
|
/// FIXME
|
|
|
|
|
/// handle enable event
|
|
|
|
|
Status = PcHandleEnableEventWithTable(Irp, &m_Descriptor);
|
|
|
|
|
}
|
|
|
|
|
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT)
|
|
|
|
|
{
|
|
|
|
|
/// FIXME
|
|
|
|
|
/// handle disable event
|
|
|
|
|
Status = PcHandleDisableEventWithTable(Irp, &m_Descriptor);
|
|
|
|
|
}
|
|
|
|
|
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE)
|
|
|
|
|
{
|
|
|
|
@@ -661,13 +832,13 @@ CPortPinWaveCyclic::DeviceIoControl(
|
|
|
|
|
return KsDefaultDeviceIoCompletion(DeviceObject, Irp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED
|
|
|
|
|
if (Status != STATUS_PENDING)
|
|
|
|
|
{
|
|
|
|
|
Irp->IoStatus.Status = Status;
|
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
|
|
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
|
return Status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
@@ -912,8 +1083,8 @@ CPortPinWaveCyclic::Init(
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
DPRINT("CPortPinWaveCyclic::Init Status %x PinId %u Capture %u\n", Status, ConnectDetails->PinId, Capture);
|
|
|
|
|
DPRINT("Bits %u Samples %u Channels %u Tag %u FrameSize %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize);
|
|
|
|
|
DPRINT1("CPortPinWaveCyclic::Init Status %x PinId %u Capture %u\n", Status, ConnectDetails->PinId, Capture);
|
|
|
|
|
DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize);
|
|
|
|
|
|
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
|
return Status;
|
|
|
|
@@ -933,6 +1104,10 @@ CPortPinWaveCyclic::Init(
|
|
|
|
|
return Status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* initialize event management */
|
|
|
|
|
InitializeListHead(&m_EventList);
|
|
|
|
|
KeInitializeSpinLock(&m_EventListLock);
|
|
|
|
|
|
|
|
|
|
/* set up subdevice descriptor */
|
|
|
|
|
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
|
|
|
|
|
m_Descriptor.FilterPropertySet = PinWaveCyclicPropertySet;
|
|
|
|
@@ -941,6 +1116,10 @@ CPortPinWaveCyclic::Init(
|
|
|
|
|
m_Descriptor.DeviceDescriptor = SubDeviceDescriptor->DeviceDescriptor;
|
|
|
|
|
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
|
|
|
|
|
m_Descriptor.PortPin = (PVOID)this;
|
|
|
|
|
m_Descriptor.EventSetCount = sizeof(PinWaveCyclicEventSet) / sizeof(KSEVENT_SET);
|
|
|
|
|
m_Descriptor.EventSet = PinWaveCyclicEventSet;
|
|
|
|
|
m_Descriptor.EventList = &m_EventList;
|
|
|
|
|
m_Descriptor.EventListLock = &m_EventListLock;
|
|
|
|
|
|
|
|
|
|
// release subdevice descriptor
|
|
|
|
|
Subdevice->Release();
|
|
|
|
@@ -993,12 +1172,6 @@ CPortPinWaveCyclic::Init(
|
|
|
|
|
|
|
|
|
|
RtlMoveMemory(m_Format, DataFormat, DataFormat->FormatSize);
|
|
|
|
|
|
|
|
|
|
PKSDATAFORMAT_WAVEFORMATEX Wave = (PKSDATAFORMAT_WAVEFORMATEX)m_Format;
|
|
|
|
|
|
|
|
|
|
DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u\n", Wave->WaveFormatEx.wBitsPerSample, Wave->WaveFormatEx.nSamplesPerSec, Wave->WaveFormatEx.nChannels, Wave->WaveFormatEx.wFormatTag, m_FrameSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Port->AddRef();
|
|
|
|
|
Filter->AddRef();
|
|
|
|
|
|
|
|
|
|