Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku otwartego strumienia sterownik podrzędny może rozpocząć dołączanie próbek strumienia do AV/C Streaming. Te przykłady mogą być operacjami odczytu lub zapisu i można je przesyłać w taki sam sposób do sterownika filtru AV/C Streaming, Avcstrm.sys. Ta usługa jest zawsze asynchroniczna ze względu na zależność od bieżącego stanu strumienia i dostępności danych strumienia.
INIT_AVCSTRM_HEADER(pAVCStrmReq, (pSrb->Command == SRB_READ_DATA) ? <mark type="enumval">AVCSTRM_READ</mark> : AVCSTRM_WRITE);
pAVCStrmReq->AVCStreamContext = pStrmExt->AVCStreamContext; // from cached context saved in OPEN_STREAM request
// Avcstrm.sys does not act as a clock provider. The subunit driver must provide this functionality if it wants to be the clock provider.
pAVCStrmReq->CommandData.BufferStruct.StreamHeader = pSrb->CommandData.DataBufferArray;
pAVCStrmReq->CommandData.BufferStruct.FrameBuffer =
MmGetSystemAddressForMdlSafe(pSrb->Irp->MdlAddress, NormalPagePriority);
// This is an asynchronous operation
NextIrpStack = IoGetNextIrpStackLocation(pIrpReq);
NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_AVCSTRM_CLASS;
NextIrpStack->Parameters.Others.Argument1 = pAVCStrmReq;
// Cannot be canceled! Use <mark type="enumval">AVCSTRM_ABORT_STREAMING</mark> to abort
IoSetCancelRoutine(
pIrpReq,
NULL
);
IoSetCompletionRoutine(
pIrpReq,
AVCTapeReqReadDataCR,
pDriverReq,
TRUE, // Success
TRUE, // Error
TRUE // or Cancel
);
pSrb->Status = STATUS_PENDING;
Status =
IoCallDriver(
pDevExt->pBusDeviceObject,
pIrpReq
);
Ponieważ operacja jest asynchroniczna, stan powinien być STATUS_PENDING. Po zakończeniu danych zostanie wywołana procedura ukończenia. W procedurze uzupełniania sterownik podjednostki może wykonywać przetwarzanie końcowe, w tym aktualizować statystyki przetwarzanych danych i ewentualnie dodać czas prezentacji, jeśli podjednostka jest dostawcą zegara.
// Keep track of the number of frames processed
pStrmExt->FramesProcessed++;
// Retrieve current stream time
if(pStrmExt->hMasterClock)
pStrmExt->CurrentStreamTime = pSrb->CommandData.DataBufferArray->PresentationTime.Time;
// Update final status
pSrb->Status = pIrpReq->IoStatus.Status;
// Complete this data SRB
StreamClassStreamNotification(
StreamRequestComplete,
pSrb->StreamObject,
pSrb
);