Leaked source code of windows server 2003
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.
 
 
 
 
 
 

495 lines
22 KiB

//==========================================================================;
//
// XBarProp.CPP
// WDM Audio/Video CrossBar MiniDriver.
// AIW hardware platform.
// WDM Properties management.
// Copyright (c) 1996 - 1997 ATI Technologies Inc. All Rights Reserved.
//
//==========================================================================;
extern "C"
{
#include "strmini.h"
#include "ksmedia.h"
#include "wdmdebug.h"
}
#include "wdmdrv.h"
#include "atixbar.h"
#include "aticonfg.h"
/*^^*
* AdapterGetProperty()
* Purpose : Called when SRB_GET_PROPERTY SRB is received.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns returns FALSE, if it is not a XBar property
* it also returns the required property
* Author : IKLEBANOV
*^^*/
BOOL CWDMAVXBar::AdapterGetProperty( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSpd = pSrb->CommandData.PropertyInfo;
ULONG uiPropertyId = pSpd->Property->Id; // index of the property
if( !::IsEqualGUID(( const struct _GUID &)PROPSETID_VIDCAP_CROSSBAR, ( const struct _GUID &)pSpd->Property->Set))
return( FALSE);
OutputDebugInfo(( "CWDMAVXBar:AdapterGetProperty() Id = %d\n", uiPropertyId));
switch( uiPropertyId)
{
case KSPROPERTY_CROSSBAR_CAPS:
ASSERT( pSpd->PropertyOutputSize >= sizeof( PKSPROPERTY_CROSSBAR_CAPS_S));
{
PKSPROPERTY_CROSSBAR_CAPS_S pAVXBarCaps = ( PKSPROPERTY_CROSSBAR_CAPS_S)pSpd->PropertyInfo;
// Copy the input property info to the output property info
::RtlCopyMemory( pAVXBarCaps, pSpd->Property, sizeof( KSPROPERTY));
pAVXBarCaps->NumberOfInputs = m_nNumberOfVideoInputs + m_nNumberOfAudioInputs;
pAVXBarCaps->NumberOfOutputs = m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs;
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_CROSSBAR_CAPS_S);
break;
case KSPROPERTY_CROSSBAR_PININFO:
ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_CROSSBAR_PININFO_S));
{
PKSPROPERTY_CROSSBAR_PININFO_S pPinInfo = ( PKSPROPERTY_CROSSBAR_PININFO_S)pSpd->PropertyInfo;
ULONG nPinIndex;
// Copy the input property info to the output property info
::RtlCopyMemory( pPinInfo, pSpd->Property, sizeof( KSPROPERTY_CROSSBAR_PININFO_S));
nPinIndex = pPinInfo->Index;
if( pPinInfo->Direction == KSPIN_DATAFLOW_IN)
{
// input pin info is required
if ( nPinIndex < m_nNumberOfVideoInputs + m_nNumberOfAudioInputs)
{
pPinInfo->RelatedPinIndex = m_pXBarInputPinsInfo[nPinIndex].nRelatedPinNumber;
pPinInfo->PinType = m_pXBarInputPinsInfo[nPinIndex].AudioVideoPinType;
pPinInfo->Medium = * m_pXBarInputPinsInfo[nPinIndex].pMedium;
}
else
return ( FALSE);
}
else
{
// output pin info is required
if ( nPinIndex < m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs)
{
pPinInfo->RelatedPinIndex = m_pXBarOutputPinsInfo[nPinIndex].nRelatedPinNumber;
pPinInfo->PinType = m_pXBarOutputPinsInfo[nPinIndex].AudioVideoPinType;
pPinInfo->Medium = * m_pXBarOutputPinsInfo[nPinIndex].pMedium;
}
else
return ( FALSE);
}
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_CROSSBAR_PININFO_S);
break;
case KSPROPERTY_CROSSBAR_CAN_ROUTE:
ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
{
PKSPROPERTY_CROSSBAR_ROUTE_S pRouteInfo = ( PKSPROPERTY_CROSSBAR_ROUTE_S)pSpd->PropertyInfo;
ULONG nInputPin, nOutputPin;
int nAudioSource;
// Copy the input property info to the output property info
::RtlCopyMemory( pRouteInfo, pSpd->Property, sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
nInputPin = pRouteInfo->IndexInputPin;
nOutputPin = pRouteInfo->IndexOutputPin;
if( nInputPin != -1)
{
if(( nInputPin < ( m_nNumberOfVideoInputs + m_nNumberOfAudioInputs)) &&
( nOutputPin < ( m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs)))
{
// both input and output pins index are valid
if(( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType <= KS_PhysConn_Video_SCART) &&
( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType <= KS_PhysConn_Video_SCART))
{
// Video pins connection is required
pRouteInfo->CanRoute = ( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType ==
m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType);
}
else // is video pins connection required?
{
if(( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner) &&
( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner))
{
// Audio pins connection is required
switch( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType)
{
case KS_PhysConn_Audio_Line:
nAudioSource = AUDIOSOURCE_LINEIN;
break;
case KS_PhysConn_Audio_Tuner:
nAudioSource = AUDIOSOURCE_TVAUDIO;
break;
default:
TRAP;
return( FALSE);
}
pRouteInfo->CanRoute = m_CATIConfiguration.CanConnectAudioSource( nAudioSource);
}
else
// mixed video - audio connection is required
pRouteInfo->CanRoute = FALSE;
}
}
else // are the pins index valid?
{
// either input and output pins index is invalid
TRAP;
OutputDebugError(( "CWDMAVXBar:Get...CAN_ROUTE() InPin = %d, OutPin = %d\n",
nInputPin, nOutputPin));
return( FALSE);
}
}
else // if( nInputPin != -1)
{
// There is a new notion of nInputPin = -1. It's valid only for Audio muting
if( nOutputPin < ( m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs))
{
if( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner)
pRouteInfo->CanRoute = m_CATIConfiguration.CanConnectAudioSource( AUDIOSOURCE_MUTE);
else
// we support muting for Audio output pin only
pRouteInfo->CanRoute = FALSE;
}
else
{
// output pin index is invalid
TRAP;
OutputDebugError(( "CWDMAVXBar:Get...CAN_ROUTE() InPin = %d, OutPin = %d\n",
nInputPin, nOutputPin));
return( FALSE);
}
}
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_CROSSBAR_ROUTE_S);
break;
case KSPROPERTY_CROSSBAR_ROUTE:
ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
{
PKSPROPERTY_CROSSBAR_ROUTE_S pRouteInfo = ( PKSPROPERTY_CROSSBAR_ROUTE_S)pSpd->PropertyInfo;
ULONG nOutputPin;
// Copy the input property info to the output property info
::RtlCopyMemory( pRouteInfo, pSpd->Property, sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
nOutputPin = pRouteInfo->IndexOutputPin;
if( nOutputPin < m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs)
pRouteInfo->IndexInputPin = m_pXBarOutputPinsInfo[nOutputPin].nConnectedToPin;
else
{
TRAP;
OutputDebugError(( "CWDMAVXBar:Get...ROUTE() OutPin = %d\n",
nOutputPin));
pRouteInfo->IndexInputPin = -1;
}
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_CROSSBAR_ROUTE_S);
break;
default:
TRAP;
return( FALSE);
}
return( TRUE);
}
/*^^*
* AdapterSetProperty()
* Purpose : Called when SRB_GET_PROPERTY SRB is received.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns FALSE, if it is not a XBar property
* it also sets the required property
* Author : IKLEBANOV
*^^*/
BOOL CWDMAVXBar::AdapterSetProperty( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSpd = pSrb->CommandData.PropertyInfo;
ULONG uiPropertyId = pSpd->Property->Id; // index of the property
BOOL bResult = TRUE;
if( !::IsEqualGUID( ( const struct _GUID &)PROPSETID_VIDCAP_CROSSBAR, ( const struct _GUID &)pSpd->Property->Set))
return( FALSE);
OutputDebugInfo(( "CWDMAVXBar:AdapterSetProperty() Id = %d\n", uiPropertyId));
switch( uiPropertyId)
{
case KSPROPERTY_CROSSBAR_ROUTE:
ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
{
PKSPROPERTY_CROSSBAR_ROUTE_S pRouteInfo = ( PKSPROPERTY_CROSSBAR_ROUTE_S)pSpd->PropertyInfo;
ULONG nInputPin, nOutputPin;
int nAudioSource;
// Copy the input property info to the output property info
::RtlCopyMemory( pRouteInfo, pSpd->Property, sizeof( KSPROPERTY_CROSSBAR_ROUTE_S));
nInputPin = pRouteInfo->IndexInputPin;
nOutputPin = pRouteInfo->IndexOutputPin;
if( nInputPin != -1)
{
if(( nInputPin < ( m_nNumberOfVideoInputs + m_nNumberOfAudioInputs)) &&
( nOutputPin < ( m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs)))
{
// both input and output pins index are valid
if(( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType <= KS_PhysConn_Video_SCART) &&
( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType <= KS_PhysConn_Video_SCART))
{
// Video pins connection is required
pRouteInfo->CanRoute = ( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType ==
m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType);
}
else // is video pins connection required?
{
if(( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner) &&
( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner))
{
// Audio pins connection is required
switch( m_pXBarInputPinsInfo[nInputPin].AudioVideoPinType)
{
case KS_PhysConn_Audio_Line:
nAudioSource = AUDIOSOURCE_LINEIN;
break;
case KS_PhysConn_Audio_Tuner:
nAudioSource = AUDIOSOURCE_TVAUDIO;
break;
default:
TRAP;
return( FALSE);
}
if( m_pXBarOutputPinsInfo[nOutputPin].nConnectedToPin == nInputPin)
// the connection has been made already
pRouteInfo->CanRoute = TRUE;
else // are Audio pins connected already?
{
// the connection has to be made
pRouteInfo->CanRoute = m_CATIConfiguration.CanConnectAudioSource( nAudioSource);
if( pRouteInfo->CanRoute)
{
if( m_CATIConfiguration.ConnectAudioSource( m_pI2CScript,
nAudioSource))
{
// update driver state after routing
m_pXBarOutputPinsInfo[nOutputPin].nConnectedToPin = nInputPin;
m_pXBarOutputPinsInfo[nOutputPin].nRelatedPinNumber = m_pXBarInputPinsInfo[nInputPin].nRelatedPinNumber;
}
else
bResult = FALSE;
}
}
}
else
// mixed audio - video connection is required, fail
pRouteInfo->CanRoute = FALSE;
}
}
else // are the pins index valid?
{
// either input and output pins index is invalid
TRAP;
OutputDebugError(( "CWDMAVXBar:Set...ROUTE() In = %d, Out = %d\n",
nInputPin, nOutputPin));
return( FALSE);
}
}
else // if( nInputPin != -1)
{
// There is a new notion of nInputPin = -1. It's valid only for Audio muting
if( nOutputPin < ( m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs))
{
if( m_pXBarOutputPinsInfo[nOutputPin].AudioVideoPinType >= KS_PhysConn_Audio_Tuner)
if( m_pXBarOutputPinsInfo[nOutputPin].nConnectedToPin == nInputPin)
// the connection has been made already
pRouteInfo->CanRoute = TRUE;
else // are Audio pins connected already?
{
// the connection has to be made
pRouteInfo->CanRoute = m_CATIConfiguration.CanConnectAudioSource( AUDIOSOURCE_MUTE);
if( pRouteInfo->CanRoute)
{
if( m_CATIConfiguration.ConnectAudioSource( m_pI2CScript,
AUDIOSOURCE_MUTE))
// update driver state after routing
m_pXBarOutputPinsInfo[nOutputPin].nConnectedToPin = nInputPin;
else
bResult = FALSE;
}
}
else
// we support muting for Audio output pin only
pRouteInfo->CanRoute = FALSE;
}
else
{
// output pin index is invalid
TRAP;
OutputDebugError(( "CWDMAVXBar:Get...CAN_ROUTE() InPin = %d, OutPin = %d\n",
nInputPin, nOutputPin));
return( FALSE);
}
}
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_CROSSBAR_ROUTE_S);
break;
default:
TRAP;
return( FALSE);
}
return( bResult);
}
/*^^*
* SetWDMAVXBarKSTopology()
* Purpose : Sets the KSTopology structure
* Called during CWDMAVXBar class construction time.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CWDMAVXBar::SetWDMAVXBarKSTopology( void)
{
GUID wdmXBarTopologyCategory[] =
{
STATIC_KSCATEGORY_CROSSBAR
};
::RtlCopyMemory( &m_wdmAVXBarTopologyCategory, wdmXBarTopologyCategory, sizeof( wdmXBarTopologyCategory));
m_wdmAVXBarTopology.CategoriesCount = 1;
m_wdmAVXBarTopology.Categories = &m_wdmAVXBarTopologyCategory;
m_wdmAVXBarTopology.TopologyNodesCount = 0;
m_wdmAVXBarTopology.TopologyNodes = NULL;
m_wdmAVXBarTopology.TopologyConnectionsCount = 0;
m_wdmAVXBarTopology.TopologyConnections = NULL;
}
/*^^*
* SetWDMAVXBarProperties()
* Purpose : Sets the KSProperty structures array
* Called during CWDMAVXBar class construction time.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CWDMAVXBar::SetWDMAVXBarKSProperties( void)
{
DEFINE_KSPROPERTY_TABLE( wdmAVXBarPropertiesCrossBar)
{
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_CROSSBAR_CAPS, // 1
TRUE, // GetSupported or Handler
sizeof(KSPROPERTY_CROSSBAR_CAPS_S), // MinProperty
sizeof(KSPROPERTY_CROSSBAR_CAPS_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
sizeof( ULONG) // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_CROSSBAR_PININFO, // 1
TRUE, // GetSupported or Handler
sizeof(KSPROPERTY_CROSSBAR_PININFO_S), // MinProperty
sizeof(KSPROPERTY_CROSSBAR_PININFO_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_CROSSBAR_CAN_ROUTE, // 1
TRUE, // GetSupported or Handler
sizeof(KSPROPERTY_CROSSBAR_ROUTE_S), // MinProperty
sizeof(KSPROPERTY_CROSSBAR_ROUTE_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
sizeof( ULONG) // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_CROSSBAR_ROUTE, // 1
TRUE, // GetSupported or Handler
sizeof(KSPROPERTY_CROSSBAR_ROUTE_S), // MinProperty
sizeof(KSPROPERTY_CROSSBAR_ROUTE_S), // MinData
TRUE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
sizeof( ULONG) // SerializedSize
)
};
DEFINE_KSPROPERTY_SET_TABLE( wdmAVXBarPropertySet)
{
DEFINE_KSPROPERTY_SET
(
&PROPSETID_VIDCAP_CROSSBAR, // Set
KSPROPERTIES_AVXBAR_NUMBER_CROSSBAR, // PropertiesCount
m_wdmAVXBarPropertiesCrossBar, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
)
};
::RtlCopyMemory( m_wdmAVXBarPropertiesCrossBar, wdmAVXBarPropertiesCrossBar, sizeof( wdmAVXBarPropertiesCrossBar));
::RtlCopyMemory( &m_wdmAVXBarPropertySet, wdmAVXBarPropertySet, sizeof( wdmAVXBarPropertySet));
}