2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
5 * PURPOSE: WavePci IRP Audio Pin
6 * PROGRAMMER: Johannes Anderwald
11 class CPortPinWavePci
: public IPortPinWavePci
,
13 public IPortWavePciStream
16 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
18 STDMETHODIMP_(ULONG
) AddRef()
20 InterlockedIncrement(&m_Ref
);
23 STDMETHODIMP_(ULONG
) Release()
25 InterlockedDecrement(&m_Ref
);
36 IMP_IPortWavePciStream
;
37 CPortPinWavePci(IUnknown
*OuterUnknown
) {}
38 virtual ~CPortPinWavePci(){}
41 friend NTSTATUS NTAPI
PinWavePciState(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
42 friend NTSTATUS NTAPI
PinWavePciDataFormat(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
43 friend NTSTATUS NTAPI
PinWavePciAudioPosition(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
44 friend NTSTATUS NTAPI
PinWavePciAllocatorFraming(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
46 IPortWavePci
* m_Port
;
47 IPortFilterWavePci
* m_Filter
;
48 KSPIN_DESCRIPTOR
* m_KsPinDescriptor
;
49 PMINIPORTWAVEPCI m_Miniport
;
50 PSERVICEGROUP m_ServiceGroup
;
51 PDMACHANNEL m_DmaChannel
;
52 PMINIPORTWAVEPCISTREAM m_Stream
;
54 PKSDATAFORMAT m_Format
;
55 KSPIN_CONNECT
* m_ConnectDetails
;
58 PDEVICE_OBJECT m_DeviceObject
;
59 IIrpQueue
* m_IrpQueue
;
62 KSAUDIO_POSITION m_Position
;
68 ULONG m_PrefetchOffset
;
69 SUBDEVICE_DESCRIPTOR m_Descriptor
;
71 KSALLOCATOR_FRAMING m_AllocatorFraming
;
75 NTSTATUS NTAPI
HandleKsProperty(IN PIRP Irp
);
76 NTSTATUS NTAPI
HandleKsStream(IN PIRP Irp
);
82 PIO_WORKITEM WorkItem
;
84 }SETSTREAM_CONTEXT
, *PSETSTREAM_CONTEXT
;
86 NTSTATUS NTAPI
PinWavePciState(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
87 NTSTATUS NTAPI
PinWavePciDataFormat(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
88 NTSTATUS NTAPI
PinWavePciAudioPosition(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
89 NTSTATUS NTAPI
PinWavePciAllocatorFraming(IN PIRP Irp
, IN PKSIDENTIFIER Request
, IN OUT PVOID Data
);
91 DEFINE_KSPROPERTY_CONNECTIONSET(PinWavePciConnectionSet
, PinWavePciState
, PinWavePciDataFormat
, PinWavePciAllocatorFraming
);
92 DEFINE_KSPROPERTY_AUDIOSET(PinWavePciAudioSet
, PinWavePciAudioPosition
);
94 KSPROPERTY_SET PinWavePciPropertySet
[] =
97 &KSPROPSETID_Connection
,
98 sizeof(PinWavePciConnectionSet
) / sizeof(KSPROPERTY_ITEM
),
99 (const KSPROPERTY_ITEM
*)&PinWavePciConnectionSet
,
105 sizeof(PinWavePciAudioSet
) / sizeof(KSPROPERTY_ITEM
),
106 (const KSPROPERTY_ITEM
*)&PinWavePciAudioSet
,
115 PinWavePciAllocatorFraming(
117 IN PKSIDENTIFIER Request
,
120 CPortPinWavePci
*Pin
;
121 PSUBDEVICE_DESCRIPTOR Descriptor
;
123 // get sub device descriptor
124 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)KSPROPERTY_ITEM_IRP_STORAGE(Irp
);
127 PC_ASSERT(Descriptor
);
128 PC_ASSERT(Descriptor
->PortPin
);
129 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
132 Pin
= (CPortPinWavePci
*)Descriptor
->PortPin
;
135 if (Request
->Flags
& KSPROPERTY_TYPE_GET
)
138 RtlMoveMemory(Data
, &Pin
->m_AllocatorFraming
, sizeof(KSALLOCATOR_FRAMING
));
140 Irp
->IoStatus
.Information
= sizeof(KSALLOCATOR_FRAMING
);
141 return STATUS_SUCCESS
;
145 return STATUS_NOT_SUPPORTED
;
150 PinWavePciAudioPosition(
152 IN PKSIDENTIFIER Request
,
155 CPortPinWavePci
*Pin
;
156 PSUBDEVICE_DESCRIPTOR Descriptor
;
158 // get sub device descriptor
159 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)KSPROPERTY_ITEM_IRP_STORAGE(Irp
);
162 PC_ASSERT(Descriptor
);
163 PC_ASSERT(Descriptor
->PortPin
);
164 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
167 Pin
= (CPortPinWavePci
*)Descriptor
->PortPin
;
170 PC_ASSERT(Pin
->m_Stream
);
172 if (Request
->Flags
& KSPROPERTY_TYPE_GET
)
174 // FIXME non multithreading-safe
175 // copy audio position
176 RtlMoveMemory(Data
, &Pin
->m_Position
, sizeof(KSAUDIO_POSITION
));
178 DPRINT("Play %lu Record %lu\n", Pin
->m_Position
.PlayOffset
, Pin
->m_Position
.WriteOffset
);
179 Irp
->IoStatus
.Information
= sizeof(KSAUDIO_POSITION
);
180 return STATUS_SUCCESS
;
184 return STATUS_NOT_SUPPORTED
;
192 IN PKSIDENTIFIER Request
,
195 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
196 CPortPinWavePci
*Pin
;
197 PSUBDEVICE_DESCRIPTOR Descriptor
;
198 PVOID FirstTag
, LastTag
;
199 ULONG MappingsRevoked
;
200 PKSSTATE State
= (PKSSTATE
)Data
;
202 // get sub device descriptor
203 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)KSPROPERTY_ITEM_IRP_STORAGE(Irp
);
206 PC_ASSERT(Descriptor
);
207 PC_ASSERT(Descriptor
->PortPin
);
208 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
211 Pin
= (CPortPinWavePci
*)Descriptor
->PortPin
;
214 PC_ASSERT(Pin
->m_Stream
);
216 if (Request
->Flags
& KSPROPERTY_TYPE_SET
)
219 Status
= Pin
->m_Stream
->SetState(*State
);
221 DPRINT("Setting state %u %x\n", *State
, Status
);
222 if (NT_SUCCESS(Status
))
225 Pin
->m_State
= *State
;
226 if (Pin
->m_ConnectDetails
->Interface
.Id
== KSINTERFACE_STANDARD_LOOPED_STREAMING
&& Pin
->m_State
== KSSTATE_STOP
)
229 // complete with successful state
230 Pin
->m_IrpQueue
->CancelBuffers();
231 while(Pin
->m_IrpQueue
->GetAcquiredTagRange(&FirstTag
, &LastTag
))
233 Status
= Pin
->m_Stream
->RevokeMappings(FirstTag
, LastTag
, &MappingsRevoked
);
234 DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status
, MappingsRevoked
);
235 KeStallExecutionProcessor(10);
237 Pin
->m_Position
.PlayOffset
= 0;
238 Pin
->m_Position
.WriteOffset
= 0;
240 else if (Pin
->m_State
== KSSTATE_STOP
)
242 Pin
->m_IrpQueue
->CancelBuffers();
243 while(Pin
->m_IrpQueue
->GetAcquiredTagRange(&FirstTag
, &LastTag
))
245 Status
= Pin
->m_Stream
->RevokeMappings(FirstTag
, LastTag
, &MappingsRevoked
);
246 DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status
, MappingsRevoked
);
247 KeStallExecutionProcessor(10);
249 Pin
->m_Position
.PlayOffset
= 0;
250 Pin
->m_Position
.WriteOffset
= 0;
253 Irp
->IoStatus
.Information
= sizeof(KSSTATE
);
257 Irp
->IoStatus
.Information
= sizeof(KSSTATE
);
260 else if (Request
->Flags
& KSPROPERTY_TYPE_GET
)
262 // get current stream state
263 *State
= Pin
->m_State
;
265 Irp
->IoStatus
.Information
= sizeof(KSSTATE
);
267 return STATUS_SUCCESS
;
270 // unsupported request
271 return STATUS_NOT_SUPPORTED
;
276 PinWavePciDataFormat(
278 IN PKSIDENTIFIER Request
,
281 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
282 CPortPinWavePci
*Pin
;
283 PSUBDEVICE_DESCRIPTOR Descriptor
;
284 PIO_STACK_LOCATION IoStack
;
286 // get current irp stack location
287 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
289 // get sub device descriptor
290 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)KSPROPERTY_ITEM_IRP_STORAGE(Irp
);
293 PC_ASSERT(Descriptor
);
294 PC_ASSERT(Descriptor
->PortPin
);
297 Pin
= (CPortPinWavePci
*)Descriptor
->PortPin
;
300 PC_ASSERT(Pin
->m_Stream
);
301 PC_ASSERT(Pin
->m_Format
);
303 if (Request
->Flags
& KSPROPERTY_TYPE_SET
)
305 // try to change data format
306 PKSDATAFORMAT NewDataFormat
, DataFormat
= (PKSDATAFORMAT
)Irp
->UserBuffer
;
307 ULONG Size
= min(Pin
->m_Format
->FormatSize
, DataFormat
->FormatSize
);
309 if (RtlCompareMemory(DataFormat
, Pin
->m_Format
, Size
) == Size
)
311 // format is identical
312 Irp
->IoStatus
.Information
= DataFormat
->FormatSize
;
313 return STATUS_SUCCESS
;
316 // new change request
317 PC_ASSERT(Pin
->m_State
== KSSTATE_STOP
);
318 // FIXME queue a work item when Irql != PASSIVE_LEVEL
319 PC_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL
);
321 // allocate new data format
322 NewDataFormat
= (PKSDATAFORMAT
)AllocateItem(NonPagedPool
, DataFormat
->FormatSize
, TAG_PORTCLASS
);
326 return STATUS_NO_MEMORY
;
329 // copy new data format
330 RtlMoveMemory(NewDataFormat
, DataFormat
, DataFormat
->FormatSize
);
333 Status
= Pin
->m_Stream
->SetFormat(NewDataFormat
);
334 if (NT_SUCCESS(Status
))
337 FreeItem(Pin
->m_Format
, TAG_PORTCLASS
);
340 Pin
->m_Format
= NewDataFormat
;
341 Irp
->IoStatus
.Information
= NewDataFormat
->FormatSize
;
344 PC_ASSERT(NewDataFormat
->FormatSize
== sizeof(KSDATAFORMAT_WAVEFORMATEX
));
345 PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.MajorFormat
, KSDATAFORMAT_TYPE_AUDIO
));
346 PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.SubFormat
, KSDATAFORMAT_SUBTYPE_PCM
));
347 PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.Specifier
, KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
));
350 DPRINT("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.nChannels
,
351 ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.wBitsPerSample
,
352 ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.nSamplesPerSec
);
358 // failed to set format
359 FreeItem(NewDataFormat
, TAG_PORTCLASS
);
366 else if (Request
->Flags
& KSPROPERTY_TYPE_GET
)
368 // get current data format
369 PC_ASSERT(Pin
->m_Format
);
371 if (Pin
->m_Format
->FormatSize
> IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
374 Irp
->IoStatus
.Information
= Pin
->m_Format
->FormatSize
;
375 return STATUS_MORE_ENTRIES
;
378 RtlMoveMemory(Data
, Pin
->m_Format
, Pin
->m_Format
->FormatSize
);
380 Irp
->IoStatus
.Information
= Pin
->m_Format
->FormatSize
;
383 return STATUS_SUCCESS
;
386 // unsupported request
387 return STATUS_NOT_SUPPORTED
;
391 //==================================================================================================================================
394 CPortPinWavePci::QueryInterface(
398 //DPRINT("CPortPinWavePci::QueryInterface entered\n");
400 if (IsEqualGUIDAligned(refiid
, IID_IIrpTarget
) ||
401 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
403 *Output
= PVOID(PUNKNOWN((IIrpTarget
*)this));
404 PUNKNOWN(*Output
)->AddRef();
405 return STATUS_SUCCESS
;
408 if (IsEqualGUIDAligned(refiid
, IID_IServiceSink
))
410 *Output
= PVOID(PSERVICESINK(this));
411 PUNKNOWN(*Output
)->AddRef();
412 return STATUS_SUCCESS
;
416 if (IsEqualGUIDAligned(refiid
, IID_IPortWavePciStream
))
418 *Output
= PVOID(PPORTWAVEPCISTREAM(this));
419 PUNKNOWN(*Output
)->AddRef();
420 return STATUS_SUCCESS
;
423 return STATUS_UNSUCCESSFUL
;
428 CPortPinWavePci::GetMapping(
430 OUT PPHYSICAL_ADDRESS PhysicalAddress
,
431 OUT PVOID
*VirtualAddress
,
432 OUT PULONG ByteCount
,
436 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
437 return m_IrpQueue
->GetMappingWithTag(Tag
, PhysicalAddress
, VirtualAddress
, ByteCount
, Flags
);
442 CPortPinWavePci::ReleaseMapping(
446 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
447 return m_IrpQueue
->ReleaseMappingWithTag(Tag
);
452 CPortPinWavePci::TerminatePacket()
455 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
456 return STATUS_SUCCESS
;
462 CPortPinWavePci::RequestService()
464 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
466 if (m_State
== KSSTATE_RUN
)
474 //==================================================================================================================================
478 CPortPinWavePci::NewIrpTarget(
479 OUT
struct IIrpTarget
**OutTarget
,
482 IN POOL_TYPE PoolType
,
483 IN PDEVICE_OBJECT DeviceObject
,
485 IN KSOBJECT_CREATE
*CreateObject
)
489 Irp
->IoStatus
.Information
= 0;
490 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
491 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
493 return STATUS_UNSUCCESSFUL
;
498 CPortPinWavePci::HandleKsProperty(
501 PKSPROPERTY Property
;
503 //UNICODE_STRING GuidString;
504 PIO_STACK_LOCATION IoStack
;
506 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
508 //DPRINT("IPortPinWave_HandleKsProperty entered\n");
510 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
512 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
!= IOCTL_KS_PROPERTY
)
514 //DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
516 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
518 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
519 return STATUS_SUCCESS
;
522 Status
= PcHandlePropertyWithTable(Irp
, m_Descriptor
.FilterPropertySetCount
, m_Descriptor
.FilterPropertySet
, &m_Descriptor
);
524 if (Status
== STATUS_NOT_FOUND
)
526 Property
= (PKSPROPERTY
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
528 RtlStringFromGUID(Property
->Set
, &GuidString
);
529 //DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
530 RtlFreeUnicodeString(&GuidString
);
534 if (Status
!= STATUS_PENDING
)
536 Irp
->IoStatus
.Status
= Status
;
537 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
545 CPortPinWavePci::HandleKsStream(
551 InterlockedIncrement((PLONG
)&m_TotalPackets
);
553 DPRINT("IPortPinWaveCyclic_HandleKsStream entered Total %u State %x MinData %u\n", m_TotalPackets
, m_State
, m_IrpQueue
->NumData());
555 bFailed
= m_IrpQueue
->HasLastMappingFailed();
557 Status
= m_IrpQueue
->AddMapping(Irp
, &Data
);
559 if (NT_SUCCESS(Status
))
562 m_Position
.WriteOffset
+= Data
;
564 m_Position
.WriteOffset
+= Data
;
568 // notify stream of new mapping
569 m_Stream
->MappingAvailable();
572 return STATUS_PENDING
;
581 CPortPinWavePci::DeviceIoControl(
582 IN PDEVICE_OBJECT DeviceObject
,
585 PIO_STACK_LOCATION IoStack
;
587 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
589 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
)
591 return HandleKsProperty(Irp
);
593 else if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_WRITE_STREAM
|| IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_READ_STREAM
)
595 return HandleKsStream(Irp
);
600 Irp
->IoStatus
.Information
= 0;
601 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
602 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
604 return STATUS_UNSUCCESSFUL
;
609 CPortPinWavePci::Read(
610 IN PDEVICE_OBJECT DeviceObject
,
613 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
618 CPortPinWavePci::Write(
619 IN PDEVICE_OBJECT DeviceObject
,
622 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
627 CPortPinWavePci::Flush(
628 IN PDEVICE_OBJECT DeviceObject
,
631 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
636 CPortPinWavePci::Close(
637 IN PDEVICE_OBJECT DeviceObject
,
640 ISubdevice
*SubDevice
;
642 PSUBDEVICE_DESCRIPTOR Descriptor
;
646 m_ServiceGroup
->RemoveMember(PSERVICESINK(this));
651 if (m_State
!= KSSTATE_STOP
)
653 m_Stream
->SetState(KSSTATE_STOP
);
658 Status
= m_Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&SubDevice
);
659 if (NT_SUCCESS(Status
))
661 Status
= SubDevice
->GetDescriptor(&Descriptor
);
662 if (NT_SUCCESS(Status
))
664 Descriptor
->Factory
.Instances
[m_ConnectDetails
->PinId
].CurrentPinInstanceCount
--;
666 SubDevice
->Release();
671 FreeItem(m_Format
, TAG_PORTCLASS
);
675 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
676 Irp
->IoStatus
.Information
= 0;
677 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
679 return STATUS_SUCCESS
;
684 CPortPinWavePci::QuerySecurity(
685 IN PDEVICE_OBJECT DeviceObject
,
688 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
693 CPortPinWavePci::SetSecurity(
694 IN PDEVICE_OBJECT DeviceObject
,
697 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
702 CPortPinWavePci::FastDeviceIoControl(
703 IN PFILE_OBJECT FileObject
,
705 IN PVOID InputBuffer
,
706 IN ULONG InputBufferLength
,
707 OUT PVOID OutputBuffer
,
708 IN ULONG OutputBufferLength
,
709 IN ULONG IoControlCode
,
710 OUT PIO_STATUS_BLOCK StatusBlock
,
711 IN PDEVICE_OBJECT DeviceObject
)
718 CPortPinWavePci::FastRead(
719 IN PFILE_OBJECT FileObject
,
720 IN PLARGE_INTEGER FileOffset
,
725 OUT PIO_STATUS_BLOCK StatusBlock
,
726 IN PDEVICE_OBJECT DeviceObject
)
733 CPortPinWavePci::FastWrite(
734 IN PFILE_OBJECT FileObject
,
735 IN PLARGE_INTEGER FileOffset
,
740 OUT PIO_STATUS_BLOCK StatusBlock
,
741 IN PDEVICE_OBJECT DeviceObject
)
749 CPortPinWavePci::Init(
750 IN PPORTWAVEPCI Port
,
751 IN PPORTFILTERWAVEPCI Filter
,
752 IN KSPIN_CONNECT
* ConnectDetails
,
753 IN KSPIN_DESCRIPTOR
* KsPinDescriptor
,
754 IN PDEVICE_OBJECT DeviceObject
)
757 PKSDATAFORMAT DataFormat
;
765 m_KsPinDescriptor
= KsPinDescriptor
;
766 m_ConnectDetails
= ConnectDetails
;
767 m_Miniport
= GetWavePciMiniport(Port
);
768 m_DeviceObject
= DeviceObject
;
770 DataFormat
= (PKSDATAFORMAT
)(ConnectDetails
+ 1);
772 DPRINT("IPortPinWavePci_fnInit entered\n");
774 m_Format
= (PKSDATAFORMAT
)AllocateItem(NonPagedPool
, DataFormat
->FormatSize
, TAG_PORTCLASS
);
776 return STATUS_INSUFFICIENT_RESOURCES
;
778 RtlMoveMemory(m_Format
, DataFormat
, DataFormat
->FormatSize
);
780 if (KsPinDescriptor
->Communication
== KSPIN_COMMUNICATION_SINK
&& KsPinDescriptor
->DataFlow
== KSPIN_DATAFLOW_IN
)
784 else if (KsPinDescriptor
->Communication
== KSPIN_COMMUNICATION_SINK
&& KsPinDescriptor
->DataFlow
== KSPIN_DATAFLOW_OUT
)
790 DPRINT("Unexpected Communication %u DataFlow %u\n", KsPinDescriptor
->Communication
, KsPinDescriptor
->DataFlow
);
795 Status
= m_Miniport
->NewStream(&m_Stream
,
798 PPORTWAVEPCISTREAM(this),
799 ConnectDetails
->PinId
,
805 DPRINT("IPortPinWavePci_fnInit Status %x\n", Status
);
807 if (!NT_SUCCESS(Status
))
812 Status
= m_ServiceGroup
->AddMember(PSERVICESINK(this));
813 if (!NT_SUCCESS(Status
))
815 DPRINT("Failed to add pin to service group\n");
820 // delay of 10 milisec
821 m_Delay
= Int32x32To64(10, -10000);
823 Status
= m_Stream
->GetAllocatorFraming(&m_AllocatorFraming
);
824 if (!NT_SUCCESS(Status
))
826 DPRINT("GetAllocatorFraming failed with %x\n", Status
);
829 DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
830 m_AllocatorFraming
.OptionsFlags
, m_AllocatorFraming
.RequirementsFlags
, m_AllocatorFraming
.PoolType
, m_AllocatorFraming
.Frames
, m_AllocatorFraming
.FrameSize
, m_AllocatorFraming
.FileAlignment
);
832 ISubdevice
* Subdevice
= NULL
;
833 // get subdevice interface
834 Status
= Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&Subdevice
);
836 if (!NT_SUCCESS(Status
))
839 PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
= NULL
;
841 Status
= Subdevice
->GetDescriptor(&SubDeviceDescriptor
);
842 if (!NT_SUCCESS(Status
))
844 // failed to get descriptor
845 Subdevice
->Release();
849 /* set up subdevice descriptor */
850 RtlZeroMemory(&m_Descriptor
, sizeof(SUBDEVICE_DESCRIPTOR
));
851 m_Descriptor
.FilterPropertySet
= PinWavePciPropertySet
;
852 m_Descriptor
.FilterPropertySetCount
= sizeof(PinWavePciPropertySet
) / sizeof(KSPROPERTY_SET
);
853 m_Descriptor
.UnknownStream
= (PUNKNOWN
)m_Stream
;
854 m_Descriptor
.DeviceDescriptor
= SubDeviceDescriptor
->DeviceDescriptor
;
855 m_Descriptor
.UnknownMiniport
= SubDeviceDescriptor
->UnknownMiniport
;
856 m_Descriptor
.PortPin
= (PVOID
)this;
860 Status
= NewIrpQueue(&m_IrpQueue
);
861 if (!NT_SUCCESS(Status
))
864 Status
= m_IrpQueue
->Init(ConnectDetails
, m_AllocatorFraming
.FrameSize
, m_AllocatorFraming
.FileAlignment
, NULL
);
865 if (!NT_SUCCESS(Status
))
867 DPRINT("IrpQueue_Init failed with %x\n", Status
);
871 m_State
= KSSTATE_STOP
;
874 return STATUS_SUCCESS
;
879 CPortPinWavePci::GetIrpStream()
881 return (PVOID
)m_IrpQueue
;
887 CPortPinWavePci::GetMiniport()
889 return (PMINIPORT
)m_Miniport
;
895 OUT IPortPinWavePci
** OutPin
)
897 CPortPinWavePci
* This
;
899 This
= new(NonPagedPool
, TAG_PORTCLASS
) CPortPinWavePci(NULL
);
901 return STATUS_INSUFFICIENT_RESOURCES
;
906 *OutPin
= (IPortPinWavePci
*)This
;
908 return STATUS_SUCCESS
;