NTSTATUS NTAPI PinState( IN PKSPIN Pin, IN KSSTATE ToState, IN KSSTATE FromState) { PKSFILTER Filter; /* should the pin stop */ if (ToState == KSSTATE_STOP) { /* clear pin context */ RtlZeroMemory(Pin->Context, sizeof(PIN_CONTEXT)); } /* get parent filter */ Filter = KsPinGetParentFilter(Pin); /* sanity check */ ASSERT(Filter); /* attempt processing */ KsFilterAttemptProcessing(Filter, TRUE); return STATUS_SUCCESS; }
NTSTATUS NTAPI AudioPositionPropertyHandler( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data) { PKSFILTER Filter; PKSPIN Pin, FirstPin; PFILE_OBJECT FileObject; NTSTATUS Status; ULONG BytesReturned; /* first get the pin */ Pin = KsGetPinFromIrp(Irp); /* sanity check */ ASSERT(Pin); /* get parent filter */ Filter = KsPinGetParentFilter(Pin); /* acquire filter control mutex */ KsFilterAcquireControl(Filter); /* get first pin */ FirstPin = KsFilterGetFirstChildPin(Filter, Pin->Id); /* get connected pin of first pin */ FileObject = KsPinGetConnectedPinFileObject(FirstPin); if (!FileObject) { /* no pin connected */ Status = STATUS_INVALID_PARAMETER; } else { /* perform request */ Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)Request, sizeof(KSPROPERTY), Data, sizeof(KSAUDIO_POSITION), &BytesReturned); /* store result size */ Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION); } /* release control */ KsFilterReleaseControl(Filter); /* done */ return Status; }
NTSTATUS NTAPI PinCreate( IN PKSPIN Pin, IN PIRP Irp) { PKSFILTER Filter; PKSPIN FirstPin; PPIN_CONTEXT PinContext; /* first get the parent filter */ Filter = KsPinGetParentFilter(Pin); /* now get first child pin */ FirstPin = KsFilterGetFirstChildPin(Filter, Pin->Id); /* sanity check */ ASSERT(FirstPin); if (FirstPin != Pin) { /* a previous pin already exists */ if (RtlCompareMemory(FirstPin->ConnectionFormat, Pin->ConnectionFormat, Pin->ConnectionFormat->FormatSize) != Pin->ConnectionFormat->FormatSize) { /* each instantiated pin must have the same connection format */ return STATUS_INVALID_PARAMETER; } } /* allocate pin context */ PinContext = ExAllocatePool(NonPagedPool, sizeof(PIN_CONTEXT)); if (!PinContext) return STATUS_INSUFFICIENT_RESOURCES; /* store pin context */ Pin->Context = PinContext; /* clear pin context */ RtlZeroMemory(PinContext, sizeof(PIN_CONTEXT)); /* FIXME * check allocator framing and apply to all pins */ return STATUS_SUCCESS; }
NTSTATUS CVideoCapturePin:: DispatchCreate( IN PKSPIN Pin, IN PIRP Irp ) { PAGED_CODE(); DBG_ENTER("(Pin=%d)", Pin->Id); NTSTATUS Status = STATUS_SUCCESS; CCaptureFilter* pFilter = reinterpret_cast <CCaptureFilter*>(KsPinGetParentFilter(Pin)->Context); CVideoCapturePin *CapPin = new (NonPagedPoolNx) CVideoCapturePin (Pin); if( !CapPin ) { // Fail if we couldn't create the pin. Status = STATUS_INSUFFICIENT_RESOURCES; } else { Status = CapPin->Initialize(); } if( NT_SUCCESS (Status) ) { // // Adjust the stream header size. The video packets have extended // header info (KS_FRAME_INFO). // pFilter->setPin(CapPin, Pin->Id); } else { // Clean up. delete CapPin; } DBG_LEAVE("(Pin=%d)=0x%08X", Pin->Id, Status); return Status; }
VOID NTAPI PinReset( IN PKSPIN Pin) { PKSFILTER Filter; /* sanity check */ ASSERT(Pin->Context); /* clear pin context */ RtlZeroMemory(Pin->Context, sizeof(PIN_CONTEXT)); /* get parent filter */ Filter = KsPinGetParentFilter(Pin); /* sanity check */ ASSERT(Filter); /* attempt processing */ KsFilterAttemptProcessing(Filter, TRUE); }
CCapturePin:: CCapturePin ( IN PKSPIN Pin ) : m_Pin (Pin), m_State (KSSTATE_STOP) /*++ Routine Description: Construct a new capture pin. Find out the filter associated with this pin and stash a pointer to our parent filter. Arguments: Pin - The AVStream pin object being created. Return Value: None --*/ { PAGED_CODE(); PKSFILTER ParentFilter = KsPinGetParentFilter (Pin); m_ParentFilter = reinterpret_cast <CCaptureFilter *> ( ParentFilter -> Context ); }