Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #5
0
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
                     );

}