windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/toshiba/devque.cpp
2020-09-26 16:20:57 +08:00

225 lines
3.9 KiB
C++

//***************************************************************************
// Device queue process
//
//***************************************************************************
#include "common.h"
#include "que.h"
void DeviceQueue::init( void )
{
count = 0;
top = bottom = NULL;
}
void DeviceQueue::put( PHW_STREAM_REQUEST_BLOCK pOrigin, PHW_STREAM_REQUEST_BLOCK pSrb )
{
pSrb->NextSRB = NULL;
if ( top == NULL ) {
top = bottom = pSrb;
count++;
return;
}
bottom->NextSRB = pSrb;
bottom = pSrb;
count++;
return;
}
void DeviceQueue::put_first( PHW_STREAM_REQUEST_BLOCK pSrb )
{
// This routine does not called
}
void DeviceQueue::put_from_bottom( PHW_STREAM_REQUEST_BLOCK pSrb )
{
// This routine does not called
}
void DeviceQueue::put_video( PHW_STREAM_REQUEST_BLOCK pSrb )
{
SRBIndex( pSrb ) = 0;
SRBpfnEndSrb( pSrb ) = NULL;
SRBparamSrb( pSrb ) = NULL;
put( top, pSrb );
}
void DeviceQueue::put_audio( PHW_STREAM_REQUEST_BLOCK pSrb )
{
SRBIndex( pSrb ) = 0;
SRBpfnEndSrb( pSrb ) = NULL;
SRBparamSrb( pSrb ) = NULL;
put( top, pSrb );
}
void DeviceQueue::put_subpic( PHW_STREAM_REQUEST_BLOCK pSrb )
{
SRBIndex( pSrb ) = 0;
SRBpfnEndSrb( pSrb ) = NULL;
SRBparamSrb( pSrb ) = NULL;
put( top, pSrb );
}
PHW_STREAM_REQUEST_BLOCK DeviceQueue::get( PULONG index, PBOOLEAN last )
{
PHW_STREAM_REQUEST_BLOCK srb;
if ( top == NULL )
return NULL;
srb = top;
(*index) = SRBIndex( srb );
// debug
#if DBG
if( srb->NumberOfPhysicalPages == 0 )
TRAP;
#endif
if ( SRBIndex( srb ) != ( srb->NumberOfPhysicalPages - 1 ) ) {
(*last) = FALSE;
SRBIndex( srb )++;
return srb;
}
(*last) = TRUE;
top = top->NextSRB;
count--;
if ( count == 0 )
top = bottom = NULL;
return srb;
}
PHW_STREAM_REQUEST_BLOCK DeviceQueue::refer1st( PULONG index, PBOOLEAN last )
{
PHW_STREAM_REQUEST_BLOCK srb;
if( top == NULL )
return NULL;
srb = top;
(*index) = SRBIndex( srb );
if ( SRBIndex( srb ) != ( srb->NumberOfPhysicalPages - 1 ) ) {
(*last) = FALSE;
}
else {
(*last) = TRUE;
}
return srb;
}
PHW_STREAM_REQUEST_BLOCK DeviceQueue::refer2nd( PULONG index, PBOOLEAN last )
{
PHW_STREAM_REQUEST_BLOCK srb;
if( top == NULL )
return NULL;
srb = top;
if( SRBIndex( srb ) != ( srb->NumberOfPhysicalPages - 1) ) {
(*index) = SRBIndex( srb ) + 1;
if( (SRBIndex( srb ) + 1) != ( srb->NumberOfPhysicalPages - 1 ) ) {
(*last) = FALSE;
}
else {
(*last) = TRUE;
}
}
else {
srb = srb->NextSRB;
if( srb == NULL )
return NULL;
(*index) = SRBIndex( srb );
if( SRBIndex( srb ) != ( srb->NumberOfPhysicalPages - 1 ) ) {
(*last) = FALSE;
}
else {
(*last) = TRUE;
}
}
return srb;
}
void DeviceQueue::remove( PHW_STREAM_REQUEST_BLOCK pSrb )
{
if ( top == NULL )
return;
if( top == pSrb ) {
top = top->NextSRB;
count--;
if ( count == 0 )
top = bottom = NULL;
DebugPrint(( DebugLevelTrace, "TOSDVD:DeviceQueue::remove srb = 0x%x\r\n", pSrb ));
return;
}
PHW_STREAM_REQUEST_BLOCK srbPrev;
PHW_STREAM_REQUEST_BLOCK srb;
srbPrev = top;
srb = srbPrev->NextSRB;
while ( srb != NULL ) {
if( srb == pSrb ) {
srbPrev->NextSRB = srb->NextSRB;
if( srbPrev->NextSRB == bottom )
bottom = srbPrev;
count--;
DebugPrint(( DebugLevelTrace, "TOSDVD:DeviceQueue::remove srb = 0x%x\r\n", pSrb ));
break;
}
srbPrev = srb;
srb = srbPrev->NextSRB;
}
}
BOOL DeviceQueue::setEndAddress( PHW_TIMER_ROUTINE pfn, PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_STREAM_REQUEST_BLOCK srb;
srb = top;
while( srb != NULL ) {
if( srb->NextSRB == NULL ) {
SRBpfnEndSrb( srb ) = pfn;
SRBparamSrb( srb ) = pSrb;
DebugPrint(( DebugLevelTrace, "TOSDVD:setEndAddress srb = 0x%x\r\n", srb ));
return TRUE;
}
srb = srb->NextSRB;
}
return FALSE;
}
//--- 97.09.14 K.Chujo
BOOL DeviceQueue::isEmpty( void )
{
if( top==NULL )
return TRUE;
else
return FALSE;
}
ULONG DeviceQueue::getCount( void )
{
return( count );
}
//--- End.