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
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;
|
|
}
|