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.
 
 
 
 
 
 

294 lines
10 KiB

//==========================================================================;
//
// TSndProp.CPP
// WDM TVAudio MiniDriver.
// AIW / AIWPro hardware platform.
// WDM Properties management.
// Copyright (c) 1996 - 1997 ATI Technologies Inc. All Rights Reserved.
//
// $Date: 30 Jul 1998 17:36:30 $
// $Revision: 1.2 $
// $Author: KLEBANOV $
//
//==========================================================================;
extern "C"
{
#include "strmini.h"
#include "ksmedia.h"
#include "wdmdebug.h"
}
#include "wdmdrv.h"
#include "atitvsnd.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 Tv Audio property
* it also returns the required property
* Author : IKLEBANOV
*^^*/
BOOL CWDMTVAudio::AdapterGetProperty( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSpd = pSrb->CommandData.PropertyInfo;
ULONG uiPropertyId = pSpd->Property->Id; // index of the property
ULONG nPropertyOutSize = pSpd->PropertyOutputSize; // size of data requested
if( !::IsEqualGUID(( const struct _GUID &)PROPSETID_VIDCAP_TVAUDIO, ( const struct _GUID &)pSpd->Property->Set))
return( FALSE);
OutputDebugInfo(( "CWDMAVXBar:AdapterGetProperty() Id = %d\n", uiPropertyId));
switch( uiPropertyId)
{
case KSPROPERTY_TVAUDIO_CAPS:
ASSERT( nPropertyOutSize >= sizeof( KSPROPERTY_TVAUDIO_CAPS_S));
{
PKSPROPERTY_TVAUDIO_CAPS_S pTVAudioCaps = ( PKSPROPERTY_TVAUDIO_CAPS_S)pSpd->PropertyInfo;
// Copy the input property info to the output property info
::RtlCopyMemory( pTVAudioCaps, pSpd->Property, sizeof( KSPROPERTY_TVAUDIO_CAPS_S));
pTVAudioCaps->Capabilities = m_ulModesSupported;
pTVAudioCaps->InputMedium = m_wdmTVAudioPinsMediumInfo[0];
pTVAudioCaps->OutputMedium = m_wdmTVAudioPinsMediumInfo[1];
}
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TVAUDIO_CAPS_S);
break;
case KSPROPERTY_TVAUDIO_MODE:
ASSERT( nPropertyOutSize >= sizeof( KSPROPERTY_TVAUDIO_S));
{
PKSPROPERTY_TVAUDIO_S pTVAudioMode = ( PKSPROPERTY_TVAUDIO_S)pSpd->PropertyInfo;
// Copy the input property info to the output property info
::RtlCopyMemory( pTVAudioMode, pSpd->Property, sizeof( KSPROPERTY_TVAUDIO_S));
// GetMode returns the mode the device was set up with, not the current read back from
// the device itself ( current AudioSignal Properties)
pTVAudioMode->Mode = m_ulTVAudioMode;
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TVAUDIO_S);
}
break;
case KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES:
ASSERT( nPropertyOutSize >= sizeof( KSPROPERTY_TVAUDIO_S));
{
ULONG ulAudioMode;
PKSPROPERTY_TVAUDIO_S pTVAudioMode = ( PKSPROPERTY_TVAUDIO_S)pSpd->PropertyInfo;
// Copy the input property info to the output property info
::RtlCopyMemory( pTVAudioMode, pSpd->Property, sizeof( KSPROPERTY_TVAUDIO_S));
if( !GetAudioOperationMode( &ulAudioMode))
return( FALSE);
m_ulTVAudioSignalProperties = ulAudioMode;
pTVAudioMode->Mode = ulAudioMode;
pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TVAUDIO_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 TV Audio property
* it also sets the required property
* Author : IKLEBANOV
*^^*/
BOOL CWDMTVAudio::AdapterSetProperty( 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_TVAUDIO, ( const struct _GUID &)pSpd->Property->Set))
return( FALSE);
OutputDebugInfo(( "CWDMAVXBar:AdapterSetProperty() Id = %d\n", uiPropertyId));
switch( uiPropertyId)
{
case KSPROPERTY_TVAUDIO_MODE:
ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TVAUDIO_S));
{
ULONG ulModeToSet = (( PKSPROPERTY_TVAUDIO_S)pSpd->PropertyInfo)->Mode;
if( ulModeToSet == ( ulModeToSet & m_ulModesSupported))
{
// every mode we're asked to set is supported
if( ulModeToSet != m_ulTVAudioMode)
{
if( !SetAudioOperationMode( ulModeToSet))
return( FALSE);
else
// update the driver
m_ulTVAudioMode = ulModeToSet;
}
}
else
return( FALSE);
}
break;
default:
TRAP;
return( FALSE);
}
return( TRUE);
}
/*^^*
* SetWDMTVAudioKSTopology()
* Purpose : Sets the KSTopology structure
* Called during CWDMTVAudio class construction time.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CWDMTVAudio::SetWDMTVAudioKSTopology( void)
{
GUID wdmTVAudioTopologyCategory[] =
{
STATIC_KSCATEGORY_TVAUDIO
};
::RtlCopyMemory( &m_wdmTVAudioTopologyCategory, wdmTVAudioTopologyCategory, sizeof( wdmTVAudioTopologyCategory));
m_wdmTVAudioTopology.CategoriesCount = 1;
m_wdmTVAudioTopology.Categories = &m_wdmTVAudioTopologyCategory;
m_wdmTVAudioTopology.TopologyNodesCount = 0;
m_wdmTVAudioTopology.TopologyNodes = NULL;
m_wdmTVAudioTopology.TopologyConnectionsCount = 0;
m_wdmTVAudioTopology.TopologyConnections = NULL;
}
/*^^*
* SetWDMTVAudioKSProperties()
* Purpose : Sets the KSProperty structures array
* Called during CWDMTVAudio class construction time.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CWDMTVAudio::SetWDMTVAudioKSProperties( void)
{
DEFINE_KSPROPERTY_TABLE( wdmTVAudioProperties)
{
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_CAPS,
TRUE, // GetSupported or Handler
sizeof( KSPROPERTY_TVAUDIO_CAPS_S), // MinProperty
sizeof( KSPROPERTY_TVAUDIO_CAPS_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_MODE,
TRUE, // GetSupported or Handler
sizeof( KSPROPERTY_TVAUDIO_S), // MinProperty
sizeof( KSPROPERTY_TVAUDIO_S), // MinData
TRUE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES,
TRUE, // GetSupported or Handler
sizeof( KSPROPERTY_TVAUDIO_S), // MinProperty
sizeof( KSPROPERTY_TVAUDIO_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
)
};
DEFINE_KSPROPERTY_SET_TABLE( wdmTVAudioPropertySet)
{
DEFINE_KSPROPERTY_SET
(
&PROPSETID_VIDCAP_TVAUDIO, // Set
KSPROPERTIES_TVAUDIO_NUMBER, // PropertiesCount
m_wdmTVAudioProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
)
};
::RtlCopyMemory( &m_wdmTVAudioProperties, wdmTVAudioProperties, sizeof( wdmTVAudioProperties));
::RtlCopyMemory( &m_wdmTVAudioPropertySet, wdmTVAudioPropertySet, sizeof( wdmTVAudioPropertySet));
}
/*^^*
* SetWDMTVAudioKSEvents()
* Purpose : Sets the KSEvent structures array
* Called during CWDMTVAudio class construction time.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CWDMTVAudio::SetWDMTVAudioKSEvents( void)
{
PKSEVENT_ITEM pKSEventItem = &m_wdmTVAudioEvents[0];
pKSEventItem->EventId = KSEVENT_TVAUDIO_CHANGED;
pKSEventItem->DataInput = pKSEventItem->ExtraEntryData = 0;
pKSEventItem->AddHandler = NULL;
pKSEventItem->RemoveHandler = NULL;
pKSEventItem->SupportHandler = NULL;
m_wdmTVAudioEventsSet[0].Set = &KSEVENTSETID_VIDCAP_TVAUDIO;
m_wdmTVAudioEventsSet[0].EventsCount = 0;
m_wdmTVAudioEventsSet[0].EventItem = pKSEventItem;
}