SetWritePacket 通知驱动程序 OS 已将有效数据写入 WaveRT 缓冲区。
语法
NTSTATUS SetWritePacket(
[in] ULONG PacketNumber,
[in] DWORD Flags,
[in] ULONG EosPacketLength
);
参数
[in] PacketNumber
OS 写入到 WaveRT 缓冲区的数据包数。
[in] Flags
与数据包或流相关的其他属性。
KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM - 此标志指示此数据包表示数据流的末尾。
[in] EosPacketLength
如果在 Flags 中指定了 KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM,则 EOS 数据包的长度。 零是有效值。 如果未在 Flags 中指定KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM,则忽略此参数。
返回值
如果调用成功,SetWritePacket 返回STATUS_SUCCESS。 否则,该函数将返回适当的错误状态代码。
STATUS_DATA_LATE_ERROR – 如果 OS 通过已传输或当前传输的数据包号,驱动程序将返回此错误。 在这种情况下,出现了故障情况。 驱动程序可以选择使用数据包中的某些数据,或者继续播放以前写入到此数据包编号的数据。
STATUS_DATA_OVERRUN – 如果 OS 传递的数据包号高于 WaveRT 缓冲区,驱动程序将返回此错误。 在这种情况下,出现了故障情况。 驱动程序可以选择忽略数据包中的数据。
STATUS_INVALID_DEVICE_STATE – 如果 OS 在之前设置KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM标志后调用此例程,驱动程序将返回此错误。
STATUS_INVALID_PARAMETER – 如果驱动程序发现任何其他参数无效,则返回此错误,除了其他错误状态的特定情况之外。 这包括上面未专门定义的任何标志值。
言论
OS 调用此例程后,驱动程序可以选择使用提供的信息来优化硬件传输。 例如,驱动程序可能优化 DMA 传输,或程序硬件以停止在指定数据包的末尾传输,以防 OS 不再调用此例程,以通知驱动程序另一个数据包。 这可以缓解下溢的可听到效果,例如引入可听到的间隙,而不是重复循环缓冲区。 但是,驱动程序仍有义务以名义实时速率增加其内部数据包计数器和信号通知事件。
除非 OS 指定KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM标志,数据包大小是 WaveRT 缓冲区大小除以传递给 IMiniportWaveRTStreamNotification::AllocateBufferWithNotification的 NotificationCount。
根据硬件功能,如果指定了KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM标志,驱动程序可能会静默填充在 EOS 数据包后面的 WaveRT 缓冲区的一部分,以防硬件将数据传输到 EOS 位置之外。
要求
| 要求 | 价值 |
|---|---|
| 最低支持的客户端 | 在 Windows 10 及更高版本中可用。 |
| 目标平台 | 窗户 |
| 标头 | portcls.h |
| IRQL | 被动级别 |