446 lines
14 KiB
C
446 lines
14 KiB
C
/******************************************************************************
|
|
*
|
|
* $RCSfile: AnlgStrm.c $
|
|
* $Source: u:/si/VXP/Wdm/Encore/AnlgStrm.c $
|
|
* $Author: Max $
|
|
* $Date: 1998/09/24 02:23:06 $
|
|
* $Revision: 1.4 $
|
|
*
|
|
* Written by: Max Paklin
|
|
* Purpose: Implementation of analog stream for WDM driver
|
|
*
|
|
*******************************************************************************
|
|
*
|
|
* Copyright © 1996-98, AuraVision Corporation. All rights reserved.
|
|
*
|
|
* AuraVision Corporation makes no warranty of any kind, express or implied,
|
|
* with regard to this software. In no event shall AuraVision Corporation
|
|
* be liable for incidental or consequential damages in connection with or
|
|
* arising from the furnishing, performance, or use of this software.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include "Headers.h"
|
|
#pragma hdrstop
|
|
#include "adapter.h"
|
|
#include "zivawdm.h"
|
|
#include "monovxd.h"
|
|
#ifdef ENCORE
|
|
#include "wingdi.h"
|
|
#include "avwinwdm.h"
|
|
#include "anlgstrm.h"
|
|
#include "AvInt.h"
|
|
|
|
|
|
void STREAMAPI RunAutoSetup( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
if( pHwDevExt->nVGAMode == AP_NEWVGAAFTERFIRSTSTEP )
|
|
{
|
|
if( AV_DWSetColorKey( DEFCOLOR_REFERENCE1 ) )
|
|
DoveGetReferenceStep1();
|
|
pHwDevExt->nVGAMode = AP_NEWVGAAFTERSECONDSTEP;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWVGAAFTERSECONDSTEP )
|
|
{
|
|
DoveGetReferenceStep2();
|
|
pHwDevExt->nVGAMode = AP_NEWMODEAFTERFIRSTSTEP;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWMODEAFTERFIRSTSTEP )
|
|
{ // If any of these functions fail we have to proceed anyway. Just to let it detect
|
|
// the color key...
|
|
AV_DWSetColorKey( DEFCOLOR_AUTOALIGN );
|
|
DoveAutoColorKey2();
|
|
DoveAutoAlign();
|
|
// Typically automatic alignment is not accurate and it makes the window 2-3 points
|
|
// to the right. Let's cheat and move the window 3 points to the left, it'll make the
|
|
// things better in majority of the cases (could make it worse sometimes though)
|
|
AV_SetParameter( AVXPOSITION, AV_GetParameter( AVXPOSITION )-3 );
|
|
pHwDevExt->nVGAMode = AP_NEWMODEAFTERSECONDSTEP;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWMODEAFTERSECONDSTEP )
|
|
{
|
|
BOOL bResult = AV_DWSetColorKey( pHwDevExt->dwColorKey );
|
|
ASSERT( bResult );
|
|
if( !DoveAutoColorKey2() )
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
else
|
|
{
|
|
if( pSrb->Flags & SRB_HW_FLAGS_STREAM_REQUEST )
|
|
pSrb->Status = STATUS_NO_MORE_ENTRIES; // Win32 - ERROR_NO_MORE_ITEMS
|
|
}
|
|
|
|
pHwDevExt->nVGAMode = AP_KNOWNMODE;
|
|
AV_SaveConfiguration();
|
|
AV_UpdateVideo();
|
|
}
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
void STREAMAPI DisplayChange( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
KSDISPLAYCHANGE* pDisplayChange = (KSDISPLAYCHANGE*)pSrb->CommandData.PropertyInfo->PropertyInfo;
|
|
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
pHwDevExt->nVGAMode = AV_SetNewVGAMode( pDisplayChange->DeviceID,
|
|
pDisplayChange->PelsWidth,
|
|
pDisplayChange->PelsHeight,
|
|
pDisplayChange->BitsPerPel );
|
|
if( pHwDevExt->nVGAMode != AP_KNOWNMODE ) // != TRUE
|
|
pSrb->Status = STATUS_MORE_ENTRIES; // Win32 - ERROR_MORE_DATA
|
|
else
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
|
|
static VOID GetAnalogProperty( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
ULONG uId = pSPD->Property->Id;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin GetAnalogProperty()\n" ));
|
|
if( !IsEqualGUID( &KSPROPSETID_OverlayUpdate, &pSPD->Property->Set ) )
|
|
{
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
return;
|
|
}
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
switch( pSrb->CommandData.PropertyInfo->Property->Id )
|
|
{
|
|
case KSPROPERTY_OVERLAYUPDATE_INTERESTS:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_INTERESTS" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyInputSize >= sizeof( ULONG ) )
|
|
{
|
|
*(ULONG*)(pSrb->CommandData.PropertyInfo->PropertyInfo) =
|
|
KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION |
|
|
KSPROPERTY_OVERLAYUPDATE_COLORKEY |
|
|
KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE |
|
|
KSPROPERTY_OVERLAYUPDATE_COLORREF;
|
|
pSrb->ActualBytesTransferred = sizeof( ULONG );
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
|
|
break;
|
|
|
|
case KSPROPERTY_OVERLAYUPDATE_COLORKEY:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_COLORKEY" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyInputSize >= sizeof( COLORKEY ) )
|
|
{
|
|
COLORKEY* pColorKey = (COLORKEY*)pSrb->CommandData.PropertyInfo->PropertyInfo;
|
|
pColorKey->KeyType = CK_RGB;
|
|
pColorKey->PaletteIndex = 0;
|
|
pColorKey->LowColorValue= pColorKey->HighColorValue = pHwDevExt->dwColorKey;
|
|
pSrb->ActualBytesTransferred = sizeof( COLORKEY );
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
|
|
break;
|
|
|
|
case KSPROPERTY_OVERLAYUPDATE_COLORREF:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_COLORREF" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyOutputSize >= sizeof( COLORREF ) )
|
|
{
|
|
COLORREF* pcrColorToReturn = (COLORREF*)pSrb->CommandData.PropertyInfo->PropertyInfo;
|
|
if( pHwDevExt->nVGAMode == AP_NEWVGA )
|
|
{
|
|
*pcrColorToReturn = DEFCOLOR_REFERENCE1;
|
|
pHwDevExt->nVGAMode = AP_NEWVGAAFTERFIRSTSTEP;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWVGAAFTERFIRSTSTEP )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
*pcrColorToReturn = DEFCOLOR_REFERENCE2;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWVGAAFTERSECONDSTEP )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
*pcrColorToReturn = DEFCOLOR_AUTOALIGN;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWMODE )
|
|
{
|
|
pHwDevExt->nVGAMode = AP_NEWMODEAFTERFIRSTSTEP;
|
|
*pcrColorToReturn = DEFCOLOR_AUTOALIGN;
|
|
}
|
|
else if( pHwDevExt->nVGAMode == AP_NEWMODEAFTERFIRSTSTEP )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
*pcrColorToReturn = pHwDevExt->dwColorKey;
|
|
}
|
|
else
|
|
{
|
|
ASSERT( pHwDevExt->nVGAMode == AP_NEWMODEAFTERSECONDSTEP );
|
|
pSrb->Status = STATUS_PENDING;
|
|
}
|
|
pSrb->ActualBytesTransferred = sizeof( COLORREF );
|
|
if( pSrb->Status == STATUS_PENDING )
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension,
|
|
Low, (PHW_PRIORITY_ROUTINE)RunAutoSetup, pSrb );
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
|
|
break;
|
|
}
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End SetAnalogProperty()\n" ));
|
|
}
|
|
|
|
|
|
static VOID SetAnalogProperty( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PHW_STREAM_EXTENSION pStreamExt = (PHW_STREAM_EXTENSION)pSrb->StreamObject->HwStreamExtension;
|
|
ULONG uId = pSPD->Property->Id;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin SetAnalogProperty()\n" ));
|
|
if( !IsEqualGUID( &KSPROPSETID_OverlayUpdate, &pSPD->Property->Set ) )
|
|
{
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
return;
|
|
}
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
switch( pSrb->CommandData.PropertyInfo->Property->Id )
|
|
{
|
|
case KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyOutputSize >= 2*sizeof( RECT ) &&
|
|
pStreamExt->bCanBeRun )
|
|
{
|
|
PRECT pSrcRect = (PRECT)pSrb->CommandData.PropertyInfo->PropertyInfo;
|
|
PRECT pDestRect = pSrcRect+1;
|
|
if( !AV_CreateWindow( pDestRect->left, pDestRect->top,
|
|
pDestRect->right-pDestRect->left, pDestRect->bottom-pDestRect->top, 1 ) )
|
|
{
|
|
DebugPrint(( DebugLevelWarning, "AuraVision's AV_CreateWindow() failed" ));
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case KSPROPERTY_OVERLAYUPDATE_COLORKEY:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_COLORKEY" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyOutputSize >= sizeof( COLORKEY ) )
|
|
{
|
|
COLORKEY* pColorKey = (COLORKEY*)pSrb->CommandData.PropertyInfo->PropertyInfo;
|
|
DWORD dwNewColorKey = pColorKey->HighColorValue-pColorKey->LowColorValue;
|
|
dwNewColorKey = dwNewColorKey+pColorKey->LowColorValue;
|
|
if( dwNewColorKey != pHwDevExt->dwColorKey )
|
|
{
|
|
if( !AV_DWSetColorKey( dwNewColorKey ) )
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
else
|
|
pHwDevExt->dwColorKey = dwNewColorKey;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE:
|
|
DebugPrint(( DebugLevelVerbose, "KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE" ));
|
|
if( pSrb->CommandData.PropertyInfo->PropertyOutputSize >= sizeof( KSDISPLAYCHANGE ) )
|
|
{
|
|
if( pHwDevExt->nVGAMode == AP_KNOWNMODE )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension,
|
|
Low, (PHW_PRIORITY_ROUTINE)DisplayChange, pSrb );
|
|
}
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
|
|
break;
|
|
}
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End GetAnalogProperty()\n" ));
|
|
}
|
|
|
|
|
|
static void STREAMAPI LoadRegistry( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
|
|
if( !AV_Initialize() )
|
|
{
|
|
DebugPrint(( DebugLevelError, "\nZiVA: Can't initialize AuraVision's hardware\n" ));
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
else
|
|
{
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
pHwDevExt->bOverlayInitialized = TRUE;
|
|
}
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pHwDevExt, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
static void STREAMAPI SaveRegistry( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
|
|
if( !AV_SaveConfiguration()
|
|
#ifdef _DEBUG
|
|
|| !AV_Exit()
|
|
#endif
|
|
)
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
else
|
|
{
|
|
#ifdef _DEBUG
|
|
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension)->bOverlayInitialized = FALSE;
|
|
#endif
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
}
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
static void STREAMAPI UninitializeDevice( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
|
|
if( !AV_Exit() )
|
|
pSrb->Status = STATUS_ADAPTER_HARDWARE_ERROR;
|
|
else
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
|
|
BOOL AnalogInitialize( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
AV_SetVxpConfig( (LPVOID)pHwDevExt->dwDVDAMCCBaseAddress );
|
|
AV_SetContextHandle( NULL, pHwDevExt->pPhysicalDeviceObj );
|
|
//AV_SetContext( TRUE, L"\\Registry\\Machine\\Software\\Creative\\DVDEncore\\" );
|
|
|
|
return TRUE;
|
|
}
|
|
VOID AnalogUninitialize( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
if( pHwDevExt->bOverlayInitialized )
|
|
{
|
|
pHwDevExt->bOverlayInitialized = FALSE;
|
|
pSrb->Status = STATUS_PENDING;
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pHwDevExt,
|
|
Low, (PHW_PRIORITY_ROUTINE)UninitializeDevice, pSrb );
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
}
|
|
|
|
VOID AnalogOpenStream( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PHW_STREAM_EXTENSION pStreamExt = (PHW_STREAM_EXTENSION)pSrb->StreamObject->HwStreamExtension;
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: AnalogOpenStream()\n" ));
|
|
|
|
if( !pHwDevExt->bOverlayInitialized )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension,
|
|
Low, (PHW_PRIORITY_ROUTINE)LoadRegistry, pSrb );
|
|
}
|
|
pStreamExt->ksState = KSSTATE_STOP;
|
|
pStreamExt->bCanBeRun = FALSE;
|
|
pStreamExt->bVideoEnabled = FALSE;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: End AnalogOpenStream()\n" ));
|
|
}
|
|
|
|
VOID AnalogCloseStream( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PHW_STREAM_EXTENSION pStreamExt = (PHW_STREAM_EXTENSION)pSrb->StreamObject->HwStreamExtension;
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: AnalogCloseStream()\n" ));
|
|
|
|
ASSERT( pStreamExt->ksState == KSSTATE_STOP );
|
|
if( pHwDevExt->bOverlayInitialized )
|
|
{
|
|
// if( pStreamExt->bVideoEnabled )
|
|
{
|
|
if( !AV_DisableVideo() )
|
|
{
|
|
DebugPrint(( DebugLevelInfo, "AuraVision's AV_DisableVideo() failed" ));
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
}
|
|
|
|
if( NT_SUCCESS( pSrb->Status ) )
|
|
{
|
|
if( pHwDevExt->nAnalogStreamOpened == 0 )
|
|
{
|
|
pSrb->Status = STATUS_PENDING;
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension,
|
|
Low, (PHW_PRIORITY_ROUTINE)SaveRegistry, pSrb );
|
|
}
|
|
else
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: End AnalogCloseStream()\n" ));
|
|
}
|
|
|
|
|
|
VOID STREAMAPI AnalogReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: AnalogReceiveCtrlPacket()\n" ));
|
|
|
|
switch( pSrb->Command )
|
|
{
|
|
case SRB_OPEN_MASTER_CLOCK: // We don't care about this stuff
|
|
case SRB_INDICATE_MASTER_CLOCK:
|
|
case SRB_CLOSE_MASTER_CLOCK:
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
case SRB_SET_STREAM_STATE:
|
|
AdapterSetState( pSrb );
|
|
break;
|
|
|
|
case SRB_GET_STREAM_PROPERTY:
|
|
GetAnalogProperty( pSrb );
|
|
break;
|
|
case SRB_SET_STREAM_PROPERTY:
|
|
SetAnalogProperty( pSrb );
|
|
break;
|
|
|
|
default:
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
AdapterReleaseRequest( pSrb );
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: End AnalogReceiveCtrlPacket()\n" ));
|
|
}
|
|
|
|
|
|
VOID STREAMAPI AnalogReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
// As long as we're not going to process any data we just return error if we got here
|
|
DebugPrint(( DebugLevelError,
|
|
"\nZiVA: AnalogReceiveDataPacket() - we are not supposed to receieve this call!\n" ));
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
AdapterReleaseRequest( pSrb );
|
|
}
|
|
#endif // #ifdef ENCORE
|