的论点WinUsb_ReadIsochPipeAsap
:
BOOL __stdcall WinUsb_ReadIsochPipeAsap(
_In_ PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle,
_In_ ULONG Offset,
_In_ ULONG Length,
_In_ BOOL ContinueStream,
_In_ PULONG NumberOfPackets,
PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors,
_In_opt_ LPOVERLAPPED Overlapped
);
根据文档,的含义ContinueStream
是:
ContinueStream [in]
表示只有在可以安排在最后一次挂起传输之后的第一帧中时才应提交传输。
(重点补充)
这是真的。例如,如果你第一次调用WinUsb_ReadIsochPipeAsap
pass TRUE
,你会得到ERROR_INVALID_PARAMETER
,因为没有什么可以继续了。如果您允许超过 1 帧的时间(全速 1 毫秒)并通过TRUE
,您将得到ERROR_INVALID_PARAMETER
因为“最后一次挂起传输后的第一帧”不再可用。
然而,尽管关于“最后一次挂起传输后的第一帧”是默认行为的语言非常相似,但Windows 实际将传输安排在连续帧中的唯一方法是将 ifContinueStream
设置为TRUE
. WinUsb_ReadIsochPipeAsap
无论您拨打多快或拨打多少重叠电话都无关紧要。
解决方案是始终尝试ContinueStream
,但如果出现故障,则退回到不继续(否则在第一次失败后您将永远失败ContinueStream
):
ContinueStream = FALSE;
while (...)
{
if ( !WinUsb_ReadIsochPipeAsap( ..., ContinueStream, ... ) )
{
DWORD lastError = GetLastError();
if ( lastError == ERROR_INVALID_PARAMETER && ContinueStream)
{
ContinueStream = FALSE;
continue;
}
}
ContinueStream = TRUE;
...
}
或者,您可以重写循环以使用WinUsb_ReadIsochPipe
(非 ASAP 版本),但这只需要您自己管理顺序帧号。