Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med en öppen ström kan en underenhetsdrivrutin börja koppla strömprover till AV/C Streaming. Dessa exempel kan antingen vara läs- eller skrivåtgärder och de kan skickas på samma sätt till FILTERdrivrutinen för AV/C-strömning Avcstrm.sys. Den här tjänsten är alltid asynkron på grund av dess beroende av det aktuella strömtillståndet och dataströmstillgängligheten.
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
);
Eftersom åtgärden är asynkron bör statusen vara STATUS_PENDING. När data har slutförts anropas slutföranderutinen. I slutföranderutinen kan en underenhetsdrivrutin utföra efterbearbetning, inklusive uppdatering av statistik över bearbetade data och eventuellt lägga till presentationstid om underenheten är klockprovidern.
// 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
);