KsStreamPointerAdvanceOffsets
2025-03-07
0
0
KsStreamPointerAdvanceOffsets用于前移StreamPointer偏移.
NTSTATUS
KsStreamPointerAdvanceOffsets(
IN PKSSTREAM_POINTER StreamPointer,
IN ULONG InUsed,
IN ULONG OutUsed,
IN BOOLEAN Eject
)
{
//首先,StreapPointer的状态必须为锁定状态
if (streamPointer->State != KSPSTREAM_POINTER_STATE_LOCKED) {
return STATUS_DEVICE_NOT_READY;
}
//对于输入数据
if (StreamPointer->OffsetIn.Data && (InUsed || (StreamPointer->OffsetIn.Count == 0)))
{
ASSERT(InUsed <= StreamPointer->OffsetIn.Remaining);
StreamPointer->OffsetIn.Data += InUsed * streamPointer->Stride;
StreamPointer->OffsetIn.Remaining -= InUsed;
if (StreamPointer->OffsetIn.Remaining == 0) {
Eject = TRUE;
}
updateIn = TRUE;
}
//对于输出数据
if (StreamPointer->OffsetOut.Data && (OutUsed || (StreamPointer->OffsetOut.Count == 0)))
{
ASSERT(OutUsed <= StreamPointer->OffsetOut.Remaining);
StreamPointer->OffsetOut.Data += OutUsed * streamPointer->Stride; //指针偏移
StreamPointer->OffsetOut.Remaining -= OutUsed; //无效数据量减少
if (StreamPointer->OffsetOut.Remaining == 0) {
Eject = TRUE;
}
updateOut = TRUE;
}
//更新队列总的统计量
streamPointer->Queue->UpdateByteAvailability(streamPointer, updateIn ? InUsed : 0, updateOut ? OutUsed : 0);
//Eject表示数据空间是否已经完成,即Remaining=0了,表示该SteamFrame已经完了,需要切换到下一下。
//不过这个切法虽然代码看的很迷惑,不过方法就是解锁,再上锁
//这个可参考KsStreamPointerAdvance函数的实现也是这么搞的,只不过他多了一个是否是锁定StreamPoint的功能
if (Eject) {
//
// Advancing a locked stream pointer involves unlocking it and then
// locking it again. If there is no frame to advance to, the pointer
// ends up unlocked and we return an error.
//
streamPointer->Queue->UnlockStreamPointer(streamPointer,KSPSTREAM_POINTER_MOTION_ADVANCE);
if (streamPointer->Queue->LockStreamPointer(streamPointer)) {
status = STATUS_SUCCESS;
} else {
status = STATUS_DEVICE_NOT_READY;
}
} else {
status = STATUS_SUCCESS;
}
}