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(){}
40 VOID NTAPI
SetState( IN KSSTATE State
);
41 VOID NTAPI
CloseStream();
44 IPortWavePci
* m_Port
;
45 IPortFilterWavePci
* m_Filter
;
46 KSPIN_DESCRIPTOR
* m_KsPinDescriptor
;
47 PMINIPORTWAVEPCI m_Miniport
;
48 PSERVICEGROUP m_ServiceGroup
;
49 PDMACHANNEL m_DmaChannel
;
50 PMINIPORTWAVEPCISTREAM m_Stream
;
52 PKSDATAFORMAT m_Format
;
53 KSPIN_CONNECT
* m_ConnectDetails
;
56 PDEVICE_OBJECT m_DeviceObject
;
57 IIrpQueue
* m_IrpQueue
;
61 ULONG m_PostCompleted
;
67 ULONG m_PrefetchOffset
;
69 KSALLOCATOR_FRAMING m_AllocatorFraming
;
73 NTSTATUS NTAPI
HandleKsProperty(IN PVOID InputBuffer
, IN ULONG InputBufferLength
, IN PVOID OutputBuffer
, IN ULONG OutputBufferLength
, IN PIO_STATUS_BLOCK IoStatusBlock
);
74 VOID NTAPI
SetStreamState( IN KSSTATE State
);
80 PIO_WORKITEM WorkItem
;
82 }SETSTREAM_CONTEXT
, *PSETSTREAM_CONTEXT
;
84 //==================================================================================================================================
87 CPortPinWavePci::QueryInterface(
91 DPRINT("CPortPinWavePci::QueryInterface entered\n");
93 if (IsEqualGUIDAligned(refiid
, IID_IIrpTarget
) ||
94 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
96 *Output
= PVOID(PUNKNOWN((IIrpTarget
*)this));
97 PUNKNOWN(*Output
)->AddRef();
98 return STATUS_SUCCESS
;
101 if (IsEqualGUIDAligned(refiid
, IID_IServiceSink
))
103 *Output
= PVOID(PSERVICESINK(this));
104 PUNKNOWN(*Output
)->AddRef();
105 return STATUS_SUCCESS
;
109 if (IsEqualGUIDAligned(refiid
, IID_IPortWavePciStream
))
111 *Output
= PVOID(PPORTWAVEPCISTREAM(this));
112 PUNKNOWN(*Output
)->AddRef();
113 return STATUS_SUCCESS
;
116 return STATUS_UNSUCCESSFUL
;
121 CPortPinWavePci::GetMapping(
123 OUT PPHYSICAL_ADDRESS PhysicalAddress
,
124 OUT PVOID
*VirtualAddress
,
125 OUT PULONG ByteCount
,
129 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
130 return m_IrpQueue
->GetMappingWithTag(Tag
, PhysicalAddress
, VirtualAddress
, ByteCount
, Flags
);
135 CPortPinWavePci::ReleaseMapping(
139 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
140 return m_IrpQueue
->ReleaseMappingWithTag(Tag
);
145 CPortPinWavePci::TerminatePacket()
148 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
149 return STATUS_SUCCESS
;
154 CPortPinWavePci::SetState(KSSTATE State
)
156 ULONG MinimumDataThreshold
;
157 ULONG MaximumDataThreshold
;
159 // Has the audio stream resumed?
160 if (m_IrpQueue
->NumMappings() && State
== KSSTATE_STOP
)
164 if (NT_SUCCESS(m_Stream
->SetState(State
)))
166 // Save new internal state
169 if (m_State
== KSSTATE_STOP
)
171 // reset start stream
172 m_IrpQueue
->CancelBuffers(); //FIX function name
173 //This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup);
174 // increase stop counter
176 // get current data threshold
177 MinimumDataThreshold
= m_IrpQueue
->GetMinimumDataThreshold();
178 // get maximum data threshold
179 MaximumDataThreshold
= ((PKSDATAFORMAT_WAVEFORMATEX
)m_Format
)->WaveFormatEx
.nAvgBytesPerSec
;
180 // increase minimum data threshold by 10 frames
181 MinimumDataThreshold
+= m_AllocatorFraming
.FrameSize
* 10;
183 // assure it has not exceeded
184 MinimumDataThreshold
= min(MinimumDataThreshold
, MaximumDataThreshold
);
185 // store minimum data threshold
186 m_IrpQueue
->SetMinimumDataThreshold(MinimumDataThreshold
);
188 DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u MinimumDataThreshold %u\n", m_PreCompleted
, m_PostCompleted
, m_StopCount
, MinimumDataThreshold
);
190 if (m_State
== KSSTATE_RUN
)
192 // start the notification timer
193 //m_ServiceGroup->RequestDelayedService(m_ServiceGroup, m_Delay);
202 PinWavePciSetStreamWorkerRoutine(
203 IN PDEVICE_OBJECT DeviceObject
,
206 CPortPinWavePci
* This
;
207 PSETSTREAM_CONTEXT Ctx
= (PSETSTREAM_CONTEXT
)Context
;
213 IoFreeWorkItem(Ctx
->WorkItem
);
214 FreeItem(Ctx
, TAG_PORTCLASS
);
216 This
->SetState(State
);
221 CPortPinWavePci::SetStreamState(
224 PDEVICE_OBJECT DeviceObject
;
225 PIO_WORKITEM WorkItem
;
226 PSETSTREAM_CONTEXT Context
;
228 PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL
);
230 // Has the audio stream resumed?
231 if (m_IrpQueue
->NumMappings() && State
== KSSTATE_STOP
)
234 // Has the audio state already been set?
235 if (m_State
== State
)
239 DeviceObject
= GetDeviceObjectFromPortWavePci(m_Port
);
241 // allocate set state context
242 Context
= (PSETSTREAM_CONTEXT
)AllocateItem(NonPagedPool
, sizeof(SETSTREAM_CONTEXT
), TAG_PORTCLASS
);
247 // allocate work item
248 WorkItem
= IoAllocateWorkItem(DeviceObject
);
257 Context
->WorkItem
= WorkItem
;
258 Context
->State
= State
;
260 // queue the work item
261 IoQueueWorkItem(WorkItem
, PinWavePciSetStreamWorkerRoutine
, DelayedWorkQueue
, (PVOID
)Context
);
267 CPortPinWavePci::RequestService()
269 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
271 if (m_IrpQueue
->HasLastMappingFailed())
273 if (m_IrpQueue
->NumMappings() == 0)
275 DPRINT("Stopping stream...\n");
276 SetStreamState(KSSTATE_STOP
);
286 //==================================================================================================================================
290 CPortPinWavePci::NewIrpTarget(
291 OUT
struct IIrpTarget
**OutTarget
,
294 IN POOL_TYPE PoolType
,
295 IN PDEVICE_OBJECT DeviceObject
,
297 IN KSOBJECT_CREATE
*CreateObject
)
301 Irp
->IoStatus
.Information
= 0;
302 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
303 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
305 return STATUS_UNSUCCESSFUL
;
310 CPortPinWavePci::HandleKsProperty(
311 IN PVOID InputBuffer
,
312 IN ULONG InputBufferLength
,
313 IN PVOID OutputBuffer
,
314 IN ULONG OutputBufferLength
,
315 IN PIO_STATUS_BLOCK IoStatusBlock
)
317 PKSPROPERTY Property
;
319 UNICODE_STRING GuidString
;
321 DPRINT("IPortPinWavePci_HandleKsProperty entered\n");
323 if (InputBufferLength
< sizeof(KSPROPERTY
))
325 IoStatusBlock
->Information
= 0;
326 IoStatusBlock
->Status
= STATUS_INVALID_PARAMETER
;
327 return STATUS_INVALID_PARAMETER
;
330 Property
= (PKSPROPERTY
)InputBuffer
;
332 if (IsEqualGUIDAligned(Property
->Set
, KSPROPSETID_Connection
))
334 if (Property
->Id
== KSPROPERTY_CONNECTION_STATE
)
336 PKSSTATE State
= (PKSSTATE
)OutputBuffer
;
338 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
339 if (OutputBufferLength
< sizeof(KSSTATE
))
341 IoStatusBlock
->Information
= sizeof(KSSTATE
);
342 IoStatusBlock
->Status
= STATUS_BUFFER_TOO_SMALL
;
343 return STATUS_BUFFER_TOO_SMALL
;
346 if (Property
->Flags
& KSPROPERTY_TYPE_SET
)
348 Status
= STATUS_UNSUCCESSFUL
;
349 IoStatusBlock
->Information
= 0;
353 Status
= m_Stream
->SetState(*State
);
355 DPRINT1("Setting state %u %x\n", *State
, Status
);
356 if (NT_SUCCESS(Status
))
361 IoStatusBlock
->Status
= Status
;
364 else if (Property
->Flags
& KSPROPERTY_TYPE_GET
)
367 IoStatusBlock
->Information
= sizeof(KSSTATE
);
368 IoStatusBlock
->Status
= STATUS_SUCCESS
;
369 return STATUS_SUCCESS
;
372 else if (Property
->Id
== KSPROPERTY_CONNECTION_DATAFORMAT
)
374 PKSDATAFORMAT DataFormat
= (PKSDATAFORMAT
)OutputBuffer
;
375 if (Property
->Flags
& KSPROPERTY_TYPE_SET
)
377 PKSDATAFORMAT NewDataFormat
;
378 if (!RtlCompareMemory(DataFormat
, m_Format
, DataFormat
->FormatSize
))
380 IoStatusBlock
->Information
= DataFormat
->FormatSize
;
381 IoStatusBlock
->Status
= STATUS_SUCCESS
;
382 return STATUS_SUCCESS
;
385 NewDataFormat
= (PKSDATAFORMAT
)AllocateItem(NonPagedPool
, DataFormat
->FormatSize
, TAG_PORTCLASS
);
388 IoStatusBlock
->Information
= 0;
389 IoStatusBlock
->Status
= STATUS_NO_MEMORY
;
390 return STATUS_NO_MEMORY
;
392 RtlMoveMemory(NewDataFormat
, DataFormat
, DataFormat
->FormatSize
);
397 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL
);
398 ASSERT(NewDataFormat
->FormatSize
== sizeof(KSDATAFORMAT_WAVEFORMATEX
));
399 ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.MajorFormat
, &KSDATAFORMAT_TYPE_AUDIO
));
400 ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.SubFormat
, &KSDATAFORMAT_SUBTYPE_PCM
));
401 ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->DataFormat
.Specifier
, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
));
403 ASSERT(This
->State
== KSSTATE_STOP
);
405 DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.nChannels
,
406 ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.wBitsPerSample
,
407 ((PKSDATAFORMAT_WAVEFORMATEX
)NewDataFormat
)->WaveFormatEx
.nSamplesPerSec
);
409 Status
= m_Stream
->SetFormat(NewDataFormat
);
410 if (NT_SUCCESS(Status
))
413 ExFreePoolWithTag(m_Format
, TAG_PORTCLASS
);
415 m_IrpQueue
->UpdateFormat((PKSDATAFORMAT
)NewDataFormat
);
416 m_Format
= NewDataFormat
;
417 IoStatusBlock
->Information
= DataFormat
->FormatSize
;
418 IoStatusBlock
->Status
= STATUS_SUCCESS
;
419 return STATUS_SUCCESS
;
422 DPRINT1("Failed to set format\n");
423 IoStatusBlock
->Information
= 0;
424 IoStatusBlock
->Status
= STATUS_UNSUCCESSFUL
;
425 return STATUS_UNSUCCESSFUL
;
427 else if (Property
->Flags
& KSPROPERTY_TYPE_GET
)
431 DPRINT1("No format\n");
432 IoStatusBlock
->Information
= 0;
433 IoStatusBlock
->Status
= STATUS_UNSUCCESSFUL
;
434 return STATUS_UNSUCCESSFUL
;
436 if (m_Format
->FormatSize
> OutputBufferLength
)
438 IoStatusBlock
->Information
= m_Format
->FormatSize
;
439 IoStatusBlock
->Status
= STATUS_BUFFER_TOO_SMALL
;
440 return STATUS_BUFFER_TOO_SMALL
;
443 RtlMoveMemory(DataFormat
, m_Format
, m_Format
->FormatSize
);
444 IoStatusBlock
->Information
= DataFormat
->FormatSize
;
445 IoStatusBlock
->Status
= STATUS_SUCCESS
;
446 return STATUS_SUCCESS
;
449 else if (Property
->Id
== KSPROPERTY_CONNECTION_ALLOCATORFRAMING
)
451 PKSALLOCATOR_FRAMING Framing
= (PKSALLOCATOR_FRAMING
)OutputBuffer
;
453 PC_ASSERT_IRQL(DISPATCH_LEVEL
);
454 // Validate input buffer
455 if (OutputBufferLength
< sizeof(KSALLOCATOR_FRAMING
))
457 IoStatusBlock
->Information
= sizeof(KSALLOCATOR_FRAMING
);
458 IoStatusBlock
->Status
= STATUS_BUFFER_TOO_SMALL
;
459 return STATUS_BUFFER_TOO_SMALL
;
461 // copy frame allocator struct
462 RtlMoveMemory(Framing
, &m_AllocatorFraming
, sizeof(KSALLOCATOR_FRAMING
));
464 IoStatusBlock
->Information
= sizeof(KSALLOCATOR_FRAMING
);
465 IoStatusBlock
->Status
= STATUS_SUCCESS
;
466 return STATUS_SUCCESS
;
470 RtlStringFromGUID(Property
->Set
, &GuidString
);
471 DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString
.Buffer
, Property
->Id
, Property
->Flags
);
472 RtlFreeUnicodeString(&GuidString
);
474 IoStatusBlock
->Status
= STATUS_NOT_IMPLEMENTED
;
475 IoStatusBlock
->Information
= 0;
476 return STATUS_NOT_IMPLEMENTED
;
481 CPortPinWavePci::DeviceIoControl(
482 IN PDEVICE_OBJECT DeviceObject
,
485 PIO_STACK_LOCATION IoStack
;
488 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
490 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
)
492 Status
= HandleKsProperty(IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
, IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
, Irp
->UserBuffer
, IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
, &Irp
->IoStatus
);
493 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
500 Irp
->IoStatus
.Information
= 0;
501 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
502 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
504 return STATUS_UNSUCCESSFUL
;
509 CPortPinWavePci::Read(
510 IN PDEVICE_OBJECT DeviceObject
,
513 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
518 CPortPinWavePci::Write(
519 IN PDEVICE_OBJECT DeviceObject
,
522 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
527 CPortPinWavePci::Flush(
528 IN PDEVICE_OBJECT DeviceObject
,
531 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
536 CPortPinWavePci::CloseStream()
538 PMINIPORTWAVEPCISTREAM Stream
;
539 ISubdevice
*ISubDevice
;
541 PSUBDEVICE_DESCRIPTOR Descriptor
;
545 if (m_State
!= KSSTATE_STOP
)
547 m_Stream
->SetState(KSSTATE_STOP
);
553 m_ServiceGroup
->RemoveMember(PSERVICESINK(this));
556 Status
= m_Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&ISubDevice
);
557 if (NT_SUCCESS(Status
))
559 Status
= ISubDevice
->GetDescriptor(&Descriptor
);
560 if (NT_SUCCESS(Status
))
562 Descriptor
->Factory
.Instances
[m_ConnectDetails
->PinId
].CurrentPinInstanceCount
--;
564 ISubDevice
->Release();
569 ExFreePool(m_Format
);
577 DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
584 PinWavePciCloseStreamRoutine(
585 IN PDEVICE_OBJECT DeviceObject
,
588 CPortPinWavePci
* This
;
589 PCLOSESTREAM_CONTEXT Ctx
= (PCLOSESTREAM_CONTEXT
)Context
;
591 This
= (CPortPinWavePci
*)Ctx
->Pin
;
596 Ctx
->Irp
->IoStatus
.Information
= 0;
597 Ctx
->Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
598 IoCompleteRequest(Ctx
->Irp
, IO_NO_INCREMENT
);
600 // free the work item
601 IoFreeWorkItem(Ctx
->WorkItem
);
603 // free work item ctx
604 FreeItem(Ctx
, TAG_PORTCLASS
);
609 CPortPinWavePci::Close(
610 IN PDEVICE_OBJECT DeviceObject
,
613 PCLOSESTREAM_CONTEXT Ctx
;
617 Ctx
= (PCLOSESTREAM_CONTEXT
)AllocateItem(NonPagedPool
, sizeof(CLOSESTREAM_CONTEXT
), TAG_PORTCLASS
);
620 DPRINT1("Failed to allocate stream context\n");
624 Ctx
->WorkItem
= IoAllocateWorkItem(DeviceObject
);
627 DPRINT1("Failed to allocate work item\n");
632 Ctx
->Pin
= (PVOID
)this;
634 IoMarkIrpPending(Irp
);
635 Irp
->IoStatus
.Information
= 0;
636 Irp
->IoStatus
.Status
= STATUS_PENDING
;
639 IoQueueWorkItem(Ctx
->WorkItem
, PinWavePciCloseStreamRoutine
, DelayedWorkQueue
, (PVOID
)Ctx
);
641 return STATUS_PENDING
;
644 Irp
->IoStatus
.Information
= 0;
645 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
646 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
648 return STATUS_SUCCESS
;
653 FreeItem(Ctx
, TAG_PORTCLASS
);
655 Irp
->IoStatus
.Information
= 0;
656 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
657 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
658 return STATUS_UNSUCCESSFUL
;
664 CPortPinWavePci::QuerySecurity(
665 IN PDEVICE_OBJECT DeviceObject
,
668 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
673 CPortPinWavePci::SetSecurity(
674 IN PDEVICE_OBJECT DeviceObject
,
677 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
682 CPortPinWavePci::FastDeviceIoControl(
683 IN PFILE_OBJECT FileObject
,
685 IN PVOID InputBuffer
,
686 IN ULONG InputBufferLength
,
687 OUT PVOID OutputBuffer
,
688 IN ULONG OutputBufferLength
,
689 IN ULONG IoControlCode
,
690 OUT PIO_STATUS_BLOCK StatusBlock
,
691 IN PDEVICE_OBJECT DeviceObject
)
698 CPortPinWavePci::FastRead(
699 IN PFILE_OBJECT FileObject
,
700 IN PLARGE_INTEGER FileOffset
,
705 OUT PIO_STATUS_BLOCK StatusBlock
,
706 IN PDEVICE_OBJECT DeviceObject
)
713 CPortPinWavePci::FastWrite(
714 IN PFILE_OBJECT FileObject
,
715 IN PLARGE_INTEGER FileOffset
,
720 OUT PIO_STATUS_BLOCK StatusBlock
,
721 IN PDEVICE_OBJECT DeviceObject
)
729 CPortPinWavePci::Init(
730 IN PPORTWAVEPCI Port
,
731 IN PPORTFILTERWAVEPCI Filter
,
732 IN KSPIN_CONNECT
* ConnectDetails
,
733 IN KSPIN_DESCRIPTOR
* KsPinDescriptor
,
734 IN PDEVICE_OBJECT DeviceObject
)
737 PKSDATAFORMAT DataFormat
;
745 m_KsPinDescriptor
= KsPinDescriptor
;
746 m_ConnectDetails
= ConnectDetails
;
747 m_Miniport
= GetWavePciMiniport(Port
);
748 m_DeviceObject
= DeviceObject
;
750 DataFormat
= (PKSDATAFORMAT
)(ConnectDetails
+ 1);
752 DPRINT("IPortPinWavePci_fnInit entered\n");
754 m_Format
= (PKSDATAFORMAT
)AllocateItem(NonPagedPool
, DataFormat
->FormatSize
, TAG_PORTCLASS
);
756 return STATUS_INSUFFICIENT_RESOURCES
;
758 RtlMoveMemory(m_Format
, DataFormat
, DataFormat
->FormatSize
);
760 if (KsPinDescriptor
->Communication
== KSPIN_COMMUNICATION_SINK
&& KsPinDescriptor
->DataFlow
== KSPIN_DATAFLOW_IN
)
764 else if (KsPinDescriptor
->Communication
== KSPIN_COMMUNICATION_SINK
&& KsPinDescriptor
->DataFlow
== KSPIN_DATAFLOW_OUT
)
770 DPRINT1("Unexpected Communication %u DataFlow %u\n", KsPinDescriptor
->Communication
, KsPinDescriptor
->DataFlow
);
774 Status
= m_Miniport
->NewStream(&m_Stream
,
777 PPORTWAVEPCISTREAM(this),
778 ConnectDetails
->PinId
,
784 DPRINT("IPortPinWavePci_fnInit Status %x\n", Status
);
786 if (!NT_SUCCESS(Status
))
791 Status
= m_ServiceGroup
->AddMember(PSERVICESINK(this));
792 if (!NT_SUCCESS(Status
))
794 DPRINT1("Failed to add pin to service group\n");
797 m_ServiceGroup
->SupportDelayedService();
800 // delay of 10 milisec
801 m_Delay
= Int32x32To64(10, -10000);
803 Status
= m_Stream
->GetAllocatorFraming(&m_AllocatorFraming
);
804 if (!NT_SUCCESS(Status
))
806 DPRINT1("GetAllocatorFraming failed with %x\n", Status
);
810 DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
811 m_AllocatorFraming
.OptionsFlags
, m_AllocatorFraming
.RequirementsFlags
, m_AllocatorFraming
.PoolType
, m_AllocatorFraming
.Frames
, m_AllocatorFraming
.FrameSize
, m_AllocatorFraming
.FileAlignment
);
813 Status
= NewIrpQueue(&m_IrpQueue
);
814 if (!NT_SUCCESS(Status
))
817 Status
= m_IrpQueue
->Init(ConnectDetails
, m_Format
, DeviceObject
, m_AllocatorFraming
.FrameSize
, m_AllocatorFraming
.FileAlignment
, NULL
);
818 if (!NT_SUCCESS(Status
))
820 DPRINT1("IrpQueue_Init failed with %x\n", Status
);
824 m_State
= KSSTATE_STOP
;
827 return STATUS_SUCCESS
;
832 CPortPinWavePci::GetIrpStream()
834 return (PVOID
)m_IrpQueue
;
840 CPortPinWavePci::GetMiniport()
842 return (PMINIPORT
)m_Miniport
;
848 OUT IPortPinWavePci
** OutPin
)
850 CPortPinWavePci
* This
;
852 This
= new(NonPagedPool
, TAG_PORTCLASS
) CPortPinWavePci(NULL
);
854 return STATUS_INSUFFICIENT_RESOURCES
;
859 *OutPin
= (IPortPinWavePci
*)This
;
861 return STATUS_SUCCESS
;