Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

165 lines
4.0 KiB

/******************************************************************************\
* *
* Streaming.C - Hardware abstraction level library. *
* *
* Copyright (c) C-Cube Microsystems 1998 *
* All Rights Reserved. *
* *
* Use of C-Cube Microsystems code is governed by terms and conditions *
* stated in the accompanying licensing statement. *
* *
\******************************************************************************/
#include "headers.h"
#include "bmaster.h"
#include "cl6100.h"
#include "Hwif.h"
#include "boardio.h"
BOOL IsThereDataToSend(PHW_STREAM_REQUEST_BLOCK pSrb,DWORD dwPageToSend,DWORD dwCurrentSample)
{
PKSSCATTER_GATHER pSGList;
DWORD dwCount;
if( (pSGList = pSrb->ScatterGatherBuffer) && (dwCount = pSGList[dwPageToSend].Length) )
return TRUE;
else
return FALSE;
}
void XferData(PHW_STREAM_REQUEST_BLOCK pSrb,PHW_DEVICE_EXTENSION pHwDevExt,DWORD dwPageToSend,
DWORD dwCurrentSample)
{
PKSSCATTER_GATHER pSGList;
DWORD dwCount;
if( (pSGList = pSrb->ScatterGatherBuffer) && (dwCount = pSGList[dwPageToSend].Length) )
{
IssuePendingCommands(pHwDevExt);
if( (dwCount )&& (dwCount <= 2048) )
{
DWORD* pdwPhysAddress = (DWORD*)pSGList[dwPageToSend].PhysicalAddress.LowPart;
// Fire the data
if(pSrb == pHwDevExt->pCurrentVideoSrb)
{
pHwDevExt->dwVideoDataUsed -= dwCount;
}
else if(pSrb == pHwDevExt->pCurrentAudioSrb)
{
pHwDevExt->dwAudioDataUsed -= dwCount;
}
else if(pSrb == pHwDevExt->pCurrentSubPictureSrb)
{
pHwDevExt->dwSubPictureDataUsed -= dwCount;
}
if( !BMA_Send( pdwPhysAddress, dwCount ) )
MonoOutStr("ZiVA: !!!! BMA_Send() has failed\n" );
else
{
PKSSTREAM_HEADER pHeader;
pHeader = (PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray)+
dwCurrentSample;
pHwDevExt->bInterruptPending = TRUE;
//tmp MonoOutULong(pHeader->TypeSpecificFlags >> 16);
//tmp MonoOutStr("(");
}
}
else
{
MonoOutStr("dwCount is 0");
FinishCurrentPacketAndSendNextOne( pHwDevExt );
}
}
else
{
MonoOutStr("NoDataToSend");
FinishCurrentPacketAndSendNextOne( pHwDevExt );
}
}
/*
** HwInterrupt()
**
** Routine is called when an interrupt at the IRQ level specified by the
** ConfigInfo structure passed to the HwInitialize routine is received.
**
** Note: IRQs may be shared, so the device should ensure the IRQ received
** was expected
**
** Arguments:
**
** pHwDevExt - the device extension for the hardware interrupt
**
** Returns:
**
** Side Effects: none
*/
BOOLEAN STREAMAPI HwInterrupt( IN PHW_DEVICE_EXTENSION pHwDevExt )
{
BOOLEAN bMyIRQ = FALSE;
if(!pHwDevExt->bInitialized)
return FALSE;
if(pHwDevExt->bInterruptPending == FALSE)
MonoOutStr("{");
//tmp MonoOutStr("+");
if( BMA_Complete() )
{
//tmp if(pHwDevExt->bInterruptPending == FALSE)
//tmp MonoOutStr("}");
//tmp MonoOutStr(")");
bMyIRQ = TRUE;
pHwDevExt->bInterruptPending = FALSE;
FinishCurrentPacketAndSendNextOne( pHwDevExt );
// dvd_CheckCFIFO();//sri
}
else
{
//tmp if(pHwDevExt->bInterruptPending == FALSE)
//tmp MonoOutStr("]");
if(Aborted())
{
MonoOutStr("HWInt : Abort");
bMyIRQ = TRUE;
pHwDevExt->bInterruptPending = FALSE;
// FinishCurrentPacketAndSendNextOne( pHwDevExt );
}
}
if( BRD_CheckDecoderInterrupt() )
{
INTSOURCES IntSrc;
DVD_Isr( &IntSrc );
// MonoOutStr( "DI" );
bMyIRQ = TRUE;
}
// Returning FALSE indicates that this was not an IRQ for this device, and
// the IRQ dispatcher will pass the IRQ down the chain to the next handler
// for this IRQ level
return bMyIRQ;
}