📄 dvdcmd.c
字号:
}
}
// for Debug
// if( pHwDevExt->Rate < 10000 ) {
// DebugPrint( (DebugLevelTrace, "DVDTS: Change PTS for F.F. (Audio)\r\n" ) );
// }
// end
// FastSlowControl( pSrb );
if( pHwDevExt->bAudioQueue == TRUE ) {
DeviceQueue_put_audio( pHwDevExt, pSrb );
}
else {
pSrb->Status = STATUS_SUCCESS;
DebugPrint( (DebugLevelTrace, "DVDTS: AudioData was Discarded\r\n" ) );
break;
}
if( pHwDevExt->pSrbDMA0 == NULL && pHwDevExt->pSrbDMA1 == NULL )
PreDMAxfer( pHwDevExt/*, 0x03 */);
// for Debug
// if( pHwDevExt->Rate < 10000 ) {
// DebugPrint( (DebugLevelTrace, "DVDTS: ReadyForNextStreamDataRequest(Audio)\r\n" ) );
// }
// end
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
return;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
DebugPrint(( DebugLevelTrace, "DVDTS:---------AudioReceiveDataPacket( SRB has no data)\r\n" ));
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** AudioReceiveCtrlPacket()
*/
VOID STREAMAPI AudioReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
DebugPrint( (DebugLevelTrace, "DVDTS:AudioReceiveCtrlPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_SET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_STATE\r\n") );
switch( pSrb->CommandData.StreamState ) {
case KSSTATE_STOP:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_STOP\r\n") );
SetAudioRateDefault( pHwDevExt );
pHwDevExt->bAudioQueue = FALSE;
break;
case KSSTATE_PAUSE:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_PAUSE\r\n") );
break;
case KSSTATE_RUN:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_RUN\r\n") );
break;
}
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_STATE\r\n") );
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_PROPERTY:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_PROPERTY\r\n") );
GetAudioProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_SET_STREAM_PROPERTY:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_PROPERTY\r\n") );
SetAudioProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_OPEN_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_OPEN_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_CLOSE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_CLOSE_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_INDICATE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_INDICATE_MASTER_CLOCK\r\n") );
hClk = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_UNKNOWN_STREAM_COMMAND:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_UNKNOWN_STREAM_COMMAND\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_SET_STREAM_RATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_RATE\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_PROPOSE_DATA_FORMAT:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_PROPOSE_DATA_FORMAT\r\n") );
AudioQueryAccept( pSrb );
break;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** SubpicReceiveDataPacket()
*/
VOID STREAMAPI SubpicReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
DebugPrint( (DebugLevelVerbose, "DVDTS:SubpicReceiveDataPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_WRITE_DATA:
DebugPrint( (DebugLevelVerbose, "DVDTS: SRB_WRITE_DATA\r\n") );
{ // Temporary
ULONG i;
PKSSTREAM_HEADER pStruc;
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
if(!( pStruc->OptionsFlags & (KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ))) {
// DebugPrint(( DebugLevelTrace, "DVDTS: *** Subpic # 0x%x\r\n",
// pStruc->xHdr.MediaSpecificFlags >> 16 ));
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: DATADISCONTINUITY(Subpic)\r\n" ));
SubpicDataDiscontinuity( pHwDevExt );
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: TIMEDISCONTINUITY(Subpic)\r\n" ));
pHwDevExt->TimeDiscontFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: TimeDiscontFlagCount=%ld\r\n", pHwDevExt->TimeDiscontFlagCount ));
if( pHwDevExt->TimeDiscontFlagCount >= pHwDevExt->cOpenInputStream ) {
StreamClassScheduleTimer(
NULL,
pHwDevExt,
1,
(PHW_TIMER_ROUTINE)MenuDecodeStart,
pHwDevExt
);
}
}
if( pStruc->TypeSpecificFlags & KS_AM_UseNewCSSKey ) {
pHwDevExt->CppFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: CppFlagCount=%ld\r\n", pHwDevExt->CppFlagCount ));
if( pHwDevExt->CppFlagCount >= pHwDevExt->cOpenInputStream + 1 )
SetCppFlag( pHwDevExt );
}
}
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
DebugPrint( (DebugLevelVerbose, "DVDTS: SubPicPacket Flag = 0x%x\r\n", pStruc->OptionsFlags ));
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ) {
DebugPrint(( DebugLevelTrace, "DVDTS:TYPECHANGE(subpic)\r\n" ));
TRAP;
i = pSrb->NumberOfBuffers;
break;
}
if( pStruc->DataUsed )
break;
}
if( i == pSrb->NumberOfBuffers ) {
pSrb->Status = STATUS_SUCCESS;
break;
}
}
{
ULONG i;
PKSSTREAM_HEADER pStruc;
for ( i=0; i<pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
SetSubpicID( pHwDevExt, pStruc );
}
}
if( pHwDevExt->bSubpicQueue == TRUE ) {
DeviceQueue_put_subpic( pHwDevExt, pSrb );
}
else {
pSrb->Status = STATUS_SUCCESS;
DebugPrint( (DebugLevelTrace, "DVDTS: SubpicData was Discarded\r\n" ) );
break;
}
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
return;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
DebugPrint(( DebugLevelTrace, "DVDTS:---------SubpicReceiveDataPacket( SRB has no data)\r\n" ));
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** SubpicReceiveCtrlPacket()
*/
VOID STREAMAPI SubpicReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
//h DebugPrint( (DebugLevelTrace, "DVDTS:SubpicReceiveCtrlPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_SET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_STATE\r\n") );
switch( pSrb->CommandData.StreamState ) {
case KSSTATE_STOP:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_STOP\r\n") );
SetSubpicRateDefault( pHwDevExt );
pHwDevExt->bSubpicQueue = FALSE;
break;
case KSSTATE_PAUSE:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_PAUSE\r\n") );
break;
case KSSTATE_RUN:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_RUN\r\n") );
break;
}
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_STATE\r\n") );
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_PROPERTY:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_PROPERTY\r\n") );
GetSubpicProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_SET_STREAM_PROPERTY:
//h DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_PROPERTY\r\n") );
SetSubpicProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_OPEN_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_OPEN_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_CLOSE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_CLOSE_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_INDICATE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_INDICATE_MASTER_CLOCK\r\n") );
hClk = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_UNKNOWN_STREAM_COMMAND:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_UNKNOWN_STREAM_COMMAND\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_SET_STREAM_RATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_RATE\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_PROPOSE_DATA_FORMAT:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_PROPOSE_DATA_FORMAT\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** VpeReceiveDataPacket()
*/
VOID STREAMAPI VpeReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
DebugPrint( (DebugLevelVerbose, "DVDTS:VpeReceiveDataPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_READ_DATA:
DebugPrint( (DebugLevelVerbose, "DVDTS: SRB_READ_DATA\r\n") );
pSrb->ActualBytesTransferred = 0;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_WRITE_DATA:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_WRITE_DATA\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** VpeReceiveCtrlPacket()
*/
VOID STREAMAPI VpeReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
DebugPrint( (DebugLevelTrace, "DVDTS:VpeReceiveCtrlPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_SET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_STATE\r\n") );
switch( pSrb->CommandData.StreamState ) {
case KSSTATE_STOP:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_STOP\r\n") );
break;
case KSSTATE_PAUSE:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_PAUSE\r\n") );
break;
case KSSTATE_RUN:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_RUN\r\n") );
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -