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.

735 lines
18 KiB

  1. //==========================================================================;
  2. //
  3. // MMCONFIG.CPP
  4. // CATIMultimediaTable Class implementation.
  5. // Copyright (c) 1996 - 1998 ATI Technologies Inc. All Rights Reserved.
  6. //
  7. // $Date: 23 Jun 1999 11:58:20 $
  8. // $Revision: 1.8 $
  9. // $Author: pleung $
  10. //
  11. //==========================================================================;
  12. extern"C"
  13. {
  14. #include "conio.h"
  15. #include "strmini.h"
  16. #include "wdmdebug.h"
  17. }
  18. #include "wdmdrv.h"
  19. #include "i2cgpio.h"
  20. #include "initguid.h"
  21. #include "mmconfig.h"
  22. #include "atiguids.h"
  23. #include "aticonfg.h"
  24. /*^^*
  25. * operator new
  26. * Purpose : called, before the class constructor, when the class object is created
  27. * by invoking the operator new
  28. *
  29. * Inputs : UINT size_t : size of the object to be placed
  30. *
  31. * Outputs : none
  32. * Author : IKLEBANOV
  33. *^^*/
  34. PVOID CATIMultimediaTable::operator new( size_t stSize)
  35. {
  36. PVOID pvAllocation = NULL;
  37. ENSURE
  38. {
  39. if( stSize != sizeof( CATIMultimediaTable))
  40. FAIL;
  41. pvAllocation = ::ExAllocatePool( PagedPool, stSize);
  42. } END_ENSURE;
  43. return( pvAllocation);
  44. }
  45. /*^^*
  46. * operator delete
  47. * Purpose : called, after the class destructor, when the class object is killed
  48. * by invoking the operator delete
  49. *
  50. * Inputs : PVOID pvAllocation : memory assisiated with the class object
  51. *
  52. * Outputs : none
  53. * Author : IKLEBANOV
  54. *^^*/
  55. void CATIMultimediaTable::operator delete( PVOID pvAllocation)
  56. {
  57. if( pvAllocation != NULL)
  58. ::ExFreePool( pvAllocation);
  59. }
  60. /*^^*
  61. * CATIMultimediaTable()
  62. * Purpose : CATIMultimediaTable Class constructor
  63. *
  64. * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
  65. * GPIOINTERFACE * pGPIOInterface : pointer to GPIO Interface
  66. * PBOOL pbResult : pointer to return success indicator
  67. *
  68. * Outputs : none
  69. * Author : IKLEBANOV
  70. *^^*/
  71. CATIMultimediaTable::CATIMultimediaTable( PDEVICE_OBJECT pDeviceObject,
  72. GPIOINTERFACE * pGPIOInterface,
  73. PBOOL pbResult)
  74. {
  75. GPIOControl gpioAccessBlock;
  76. ATI_QueryPrivateInterface pfnQueryInterface;
  77. BOOL bResult = FALSE;
  78. m_ulRevision = ( DWORD)-1;
  79. m_ulSize = 0;
  80. m_pvConfigurationData = NULL;
  81. // Let's get MultiMedia data using private interfaces exposed by MiniVDD via
  82. // the standard Microsoft-defined GPIO interface
  83. ENSURE
  84. {
  85. if( !QueryGPIOProvider( pDeviceObject, pGPIOInterface, &gpioAccessBlock))
  86. FAIL;
  87. if( !::IsEqualGUID( ( const struct _GUID &)gpioAccessBlock.PrivateInterfaceType,
  88. ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_QueryInterface))
  89. FAIL;
  90. pfnQueryInterface = ( ATI_QueryPrivateInterface)gpioAccessBlock.PrivateInterface;
  91. if( pfnQueryInterface == NULL)
  92. FAIL;
  93. if( !GetMultimediaInfo_IConfiguration2( pDeviceObject,
  94. pfnQueryInterface))
  95. {
  96. OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration2 for pDO = %x\n",
  97. pDeviceObject));
  98. if( !GetMultimediaInfo_IConfiguration1( pDeviceObject,
  99. pfnQueryInterface))
  100. {
  101. OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration1 for pDO = %x\n",
  102. pDeviceObject));
  103. if( !GetMultimediaInfo_IConfiguration( pDeviceObject,
  104. pfnQueryInterface))
  105. {
  106. OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration for pDO = %x\n",
  107. pDeviceObject));
  108. FAIL;
  109. }
  110. }
  111. }
  112. bResult = TRUE;
  113. } END_ENSURE;
  114. * pbResult = bResult;
  115. }
  116. /*^^*
  117. * CATIMultimediaTable()
  118. * Purpose : CATIMultimediaTable Class destructor
  119. *
  120. * Inputs : none
  121. *
  122. * Outputs : none
  123. * Author : IKLEBANOV
  124. *^^*/
  125. CATIMultimediaTable::~CATIMultimediaTable()
  126. {
  127. if( m_pvConfigurationData != NULL)
  128. {
  129. ::ExFreePool( m_pvConfigurationData);
  130. m_pvConfigurationData = NULL;
  131. }
  132. m_ulSize = 0;
  133. m_ulRevision = ( DWORD)-1;
  134. }
  135. /*^^*
  136. * GetMultimediaInfo_IConfiguration2()
  137. * Purpose : Get ATI Multimedia table, using IConfiguration2 interface
  138. *
  139. * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
  140. * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
  141. *
  142. * Outputs : BOOL, returns TRUE, if succeeded
  143. * Author : IKLEBANOV
  144. *^^*/
  145. BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration2( PDEVICE_OBJECT pDeviceObject,
  146. ATI_QueryPrivateInterface pfnQueryInterface)
  147. {
  148. BOOL bResult = FALSE;
  149. ATI_PRIVATE_INTERFACE_CONFIGURATION_Two iConfigurationTwo;
  150. PATI_PRIVATE_INTERFACE_CONFIGURATION_Two pIConfigurationTwo = &iConfigurationTwo;
  151. ENSURE
  152. {
  153. iConfigurationTwo.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_Two);
  154. pfnQueryInterface( pDeviceObject,
  155. ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_Two,
  156. ( PVOID *)&pIConfigurationTwo);
  157. if(( pIConfigurationTwo == NULL) ||
  158. ( pIConfigurationTwo->pfnGetConfigurationRevision == NULL) ||
  159. ( pIConfigurationTwo->pfnGetConfigurationData == NULL))
  160. FAIL;
  161. //let's query GetConfigurationRevision Interface member first
  162. if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationRevision( pIConfigurationTwo->pvContext,
  163. ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
  164. &m_ulRevision))))
  165. FAIL;
  166. if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext,
  167. ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
  168. NULL,
  169. &m_ulSize))))
  170. FAIL;
  171. m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
  172. if( m_pvConfigurationData == NULL)
  173. FAIL;
  174. if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext,
  175. ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
  176. m_pvConfigurationData,
  177. &m_ulSize))))
  178. FAIL;
  179. bResult = TRUE;
  180. } END_ENSURE;
  181. return( bResult);
  182. }
  183. /*^^*
  184. * GetMultimediaInfo_IConfiguration1()
  185. * Purpose : Get ATI Multimedia table, using IConfiguration1 interface
  186. *
  187. * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
  188. * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
  189. *
  190. * Outputs : BOOL, returns TRUE, if succeeded
  191. * Author : IKLEBANOV
  192. *^^*/
  193. BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration1( PDEVICE_OBJECT pDeviceObject,
  194. ATI_QueryPrivateInterface pfnQueryInterface)
  195. {
  196. BOOL bResult = FALSE;
  197. ATI_PRIVATE_INTERFACE_CONFIGURATION_One iConfigurationOne;
  198. PATI_PRIVATE_INTERFACE_CONFIGURATION_One pIConfigurationOne = &iConfigurationOne;
  199. ENSURE
  200. {
  201. iConfigurationOne.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_One);
  202. pfnQueryInterface( pDeviceObject,
  203. ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_One,
  204. ( PVOID *)&pIConfigurationOne);
  205. if(( pIConfigurationOne == NULL) ||
  206. ( pIConfigurationOne->pfnGetMultimediaConfiguration == NULL))
  207. FAIL;
  208. if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext,
  209. NULL,
  210. &m_ulSize))))
  211. FAIL;
  212. if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO))
  213. FAIL;
  214. m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
  215. if( m_pvConfigurationData == NULL)
  216. FAIL;
  217. if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext,
  218. m_pvConfigurationData,
  219. &m_ulSize))))
  220. FAIL;
  221. m_ulRevision = 0;
  222. bResult = TRUE;
  223. } END_ENSURE;
  224. return( bResult);
  225. }
  226. /*^^*
  227. * GetMultimediaInfo_IConfiguration()
  228. * Purpose : Get ATI Multimedia table, using IConfiguration interface
  229. *
  230. * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
  231. * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
  232. *
  233. * Outputs : BOOL, returns TRUE, if succeeded
  234. * Author : IKLEBANOV
  235. *^^*/
  236. BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration( PDEVICE_OBJECT pDeviceObject,
  237. ATI_QueryPrivateInterface pfnQueryInterface)
  238. {
  239. BOOL bResult = FALSE;
  240. PATI_PRIVATE_INTERFACE_CONFIGURATION pIConfiguration = NULL;
  241. ENSURE
  242. {
  243. pfnQueryInterface( pDeviceObject,
  244. ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration,
  245. ( PVOID *)&pIConfiguration);
  246. if(( pIConfiguration == NULL) ||
  247. ( pIConfiguration->pfnGetMultimediaConfiguration == NULL))
  248. FAIL;
  249. if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject,
  250. NULL,
  251. &m_ulSize))))
  252. FAIL;
  253. if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO))
  254. FAIL;
  255. m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
  256. if( m_pvConfigurationData == NULL)
  257. FAIL;
  258. if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject,
  259. m_pvConfigurationData,
  260. &m_ulSize))))
  261. FAIL;
  262. m_ulRevision = 0;
  263. bResult = TRUE;
  264. } END_ENSURE;
  265. return( bResult);
  266. }
  267. /*^^*
  268. * GetTVTunerId()
  269. * Purpose : Retrieves TVTuner Id from the Multimedia configuration table
  270. *
  271. * Inputs : PUSHORT pusTVTunerId : pointer to return TVTuner Id
  272. *
  273. * Outputs : BOOL, returns TRUE, if succeeded
  274. * Author : IKLEBANOV
  275. *^^*/
  276. BOOL CATIMultimediaTable::GetTVTunerId( PUSHORT pusTVTunerId)
  277. {
  278. USHORT usValue;
  279. BOOL bResult = TRUE;
  280. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusTVTunerId != NULL))
  281. {
  282. switch( m_ulRevision)
  283. {
  284. case 0:
  285. usValue = ( USHORT)(( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte0;
  286. break;
  287. case 1:
  288. usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte0) & 0x1F);
  289. break;
  290. default:
  291. bResult = FALSE;
  292. break;
  293. }
  294. }
  295. else
  296. bResult = FALSE;
  297. if( bResult)
  298. * pusTVTunerId = usValue;
  299. else
  300. OutputDebugError(( "CATIMultimediaTable::GetTVTunerId() fails\n"));
  301. return( bResult);
  302. }
  303. /*^^*
  304. * GetVideoDecoderId()
  305. * Purpose : Retrieves Video decoder Id from the Multimedia configuration table
  306. *
  307. * Inputs : PUSHORT pusDecoderId : pointer to return Video decoder Id
  308. *
  309. * Outputs : BOOL, returns TRUE, if succeeded
  310. * Author : IKLEBANOV
  311. *^^*/
  312. BOOL CATIMultimediaTable::GetVideoDecoderId( PUSHORT pusDecoderId)
  313. {
  314. USHORT usValue;
  315. BOOL bResult = TRUE;
  316. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusDecoderId != NULL))
  317. {
  318. switch( m_ulRevision)
  319. {
  320. case 0:
  321. usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte2) & 0x07);
  322. break;
  323. case 1:
  324. usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0x0F);
  325. break;
  326. default:
  327. bResult = FALSE;
  328. break;
  329. }
  330. }
  331. else
  332. bResult = FALSE;
  333. if( bResult)
  334. * pusDecoderId = usValue;
  335. else
  336. OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n"));
  337. return( bResult);
  338. }
  339. /*^^*
  340. * GetOEMId()
  341. * Purpose : Retrieves OEM Id from the Multimedia configuration table
  342. *
  343. * Inputs : PUSHORT pusOEMId : pointer to return OEM Id
  344. *
  345. * Outputs : BOOL, returns TRUE, if succeeded
  346. * Author : IKLEBANOV
  347. *^^*/
  348. BOOL CATIMultimediaTable::GetOEMId( PUSHORT pusOEMId)
  349. {
  350. USHORT usValue;
  351. BOOL bResult = TRUE;
  352. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusOEMId != NULL))
  353. {
  354. switch( m_ulRevision)
  355. {
  356. case 0:
  357. usValue = ( USHORT)((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte4);
  358. break;
  359. case 1:
  360. usValue = ( USHORT)((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte2);
  361. break;
  362. default:
  363. bResult = FALSE;
  364. break;
  365. }
  366. }
  367. else
  368. bResult = FALSE;
  369. if( bResult)
  370. * pusOEMId = usValue;
  371. else
  372. OutputDebugError(( "CATIMultimediaTable::GetOEMId() fails\n"));
  373. return( bResult);
  374. }
  375. /*^^*
  376. * GetATIProductId()
  377. * Purpose : Retrieves ATI Product Id from the Multimedia configuration table
  378. *
  379. * Inputs : PUSHORT pusProductId: pointer to return Product Id
  380. *
  381. * Outputs : BOOL, returns TRUE, if succeeded
  382. * Author : IKLEBANOV
  383. *^^*/
  384. BOOL CATIMultimediaTable::GetATIProductId( PUSHORT pusProductId)
  385. {
  386. USHORT usValue;
  387. BOOL bResult = TRUE;
  388. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusProductId != NULL))
  389. {
  390. switch( m_ulRevision)
  391. {
  392. case 0:
  393. usValue = ( USHORT)((((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte3) >> 4) & 0x0F);
  394. break;
  395. case 1:
  396. usValue = ( USHORT)((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte2);
  397. break;
  398. default:
  399. bResult = FALSE;
  400. break;
  401. }
  402. }
  403. else
  404. bResult = FALSE;
  405. if( bResult)
  406. * pusProductId = usValue;
  407. else
  408. OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n"));
  409. return( bResult);
  410. }
  411. /*^^*
  412. * GetOEMRevisionId()
  413. * Purpose : Retrieves OEM Revision Id from the Multimedia configuration table
  414. *
  415. * Inputs : PUSHORT pusOEMRevisionId : pointer to return OEM Revision Id
  416. *
  417. * Outputs : BOOL, returns TRUE, if succeeded
  418. * Author : IKLEBANOV
  419. *^^*/
  420. BOOL CATIMultimediaTable::GetOEMRevisionId( PUSHORT pusOEMRevisionId)
  421. {
  422. USHORT usValue;
  423. BOOL bResult = TRUE;
  424. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusOEMRevisionId != NULL))
  425. {
  426. switch( m_ulRevision)
  427. {
  428. case 0:
  429. usValue = ( USHORT)((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte5);
  430. break;
  431. case 1:
  432. usValue = ( USHORT)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte1) >> 5) & 0x07);
  433. break;
  434. default:
  435. bResult = FALSE;
  436. break;
  437. }
  438. }
  439. else
  440. bResult = FALSE;
  441. if( bResult)
  442. * pusOEMRevisionId = usValue;
  443. else
  444. OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n"));
  445. return( bResult);
  446. }
  447. /*^^*
  448. * IsATIProduct()
  449. * Purpose : Returnes ATI ownership
  450. *
  451. * Inputs : PUSHORT pusProductId: pointer to return ATI Product ownership
  452. *
  453. * Outputs : BOOL, returns TRUE, if succeeded
  454. * Author : IKLEBANOV
  455. *^^*/
  456. BOOL CATIMultimediaTable::IsATIProduct( PBOOL pbATIProduct)
  457. {
  458. BOOL bATIOwnership;
  459. BOOL bResult = TRUE;
  460. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pbATIProduct != NULL))
  461. {
  462. switch( m_ulRevision)
  463. {
  464. case 0:
  465. bATIOwnership = (( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte4 == OEM_ID_ATI;
  466. break;
  467. case 1:
  468. bATIOwnership = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte1) & 0x10);
  469. break;
  470. default:
  471. bResult = FALSE;
  472. break;
  473. }
  474. }
  475. else
  476. bResult = FALSE;
  477. if( bResult)
  478. * pbATIProduct = bATIOwnership;
  479. else
  480. OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n"));
  481. return( bResult);
  482. }
  483. /*^^*
  484. * QueryGPIOProvider()
  485. * Purpose : queries the GPIOProvider for the pins supported and private interfaces
  486. *
  487. * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to accosiated Device Object
  488. * GPIOINTERFACE * pGPIOInterface : pointer to GPIO interface
  489. * PGPIOControl pgpioAccessBlock : pointer to GPIO control structure
  490. *
  491. * Outputs : BOOL : retunrs TRUE, if the query function was carried on successfully
  492. * Author : IKLEBANOV
  493. *^^*/
  494. BOOL CATIMultimediaTable::QueryGPIOProvider( PDEVICE_OBJECT pDeviceObject,
  495. GPIOINTERFACE * pGPIOInterface,
  496. PGPIOControl pgpioAccessBlock)
  497. {
  498. ENSURE
  499. {
  500. if(( pGPIOInterface->gpioOpen == NULL) ||
  501. ( pGPIOInterface->gpioAccess == NULL) ||
  502. ( pDeviceObject == NULL))
  503. FAIL;
  504. pgpioAccessBlock->Status = GPIO_STATUS_NOERROR;
  505. pgpioAccessBlock->Command = GPIO_COMMAND_QUERY;
  506. pgpioAccessBlock->AsynchCompleteCallback = NULL;
  507. pgpioAccessBlock->Pins = NULL;
  508. if(( !NT_SUCCESS( pGPIOInterface->gpioOpen( pDeviceObject, TRUE, pgpioAccessBlock))) ||
  509. ( pgpioAccessBlock->Status != GPIO_STATUS_NOERROR))
  510. FAIL;
  511. return( TRUE);
  512. } END_ENSURE;
  513. return( FALSE);
  514. }
  515. /*^^*
  516. * GetDigitalAudioProperties()
  517. * Purpose : Gets Digital Audio support and information
  518. * Inputs : Pointer to Digital Audio Info structure
  519. *
  520. * Outputs : BOOL : returns TRUE
  521. * also sets the requested values into the input pointer
  522. * Author : TOM
  523. *^^*/
  524. BOOL CATIMultimediaTable::GetDigialAudioConfiguration( PDIGITAL_AUD_INFO pInput)
  525. {
  526. BOOL bResult = FALSE;
  527. ENSURE
  528. {
  529. if (pInput == NULL)
  530. FAIL;
  531. #if 1
  532. if (m_pvConfigurationData == NULL)
  533. FAIL;
  534. switch( m_ulRevision)
  535. {
  536. case 1:
  537. // Disable I2S in support for the time being - TL
  538. // pInput->bI2SInSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x01);
  539. pInput->bI2SInSupported = 0;
  540. pInput->bI2SOutSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x02);
  541. pInput->wI2S_DAC_Device = ( WORD)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x1c) >> 2);
  542. pInput->bSPDIFSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x20);
  543. pInput->wReference_Clock = ( WORD)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0xf0) >> 4);
  544. bResult = TRUE;
  545. break;
  546. default:
  547. bResult = FALSE;
  548. break;
  549. }
  550. #else
  551. pInput->bI2SInSupported = TRUE;
  552. pInput->bI2SOutSupported = TRUE;
  553. pInput->wI2S_DAC_Device = TDA1309_32;
  554. pInput->wReference_Clock = REF_295MHZ;
  555. pInput->bSPDIFSupported = TRUE;
  556. bResult = TRUE;
  557. #endif
  558. } END_ENSURE;
  559. return (bResult);
  560. }
  561. /*^^*
  562. * GetVideoInCrystalId()
  563. * Purpose : Retrieves Video in crystal ID from the Multimedia configuration table
  564. *
  565. * Inputs : PUSHORT pusVInCrystalId : pointer to return Video in crystal Id
  566. *
  567. * Outputs : BOOL, returns TRUE, if succeeded
  568. * Author : Paul
  569. *^^*/
  570. BOOL CATIMultimediaTable::GetVideoInCrystalId( PUCHAR pucVInCrystalId)
  571. {
  572. UCHAR ucValue;
  573. BOOL bResult = TRUE;
  574. if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pucVInCrystalId != NULL))
  575. {
  576. switch( m_ulRevision)
  577. {
  578. case 0:
  579. ucValue = ( UCHAR)((((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte2) & 0x18) >> 3);
  580. break;
  581. case 1:
  582. ucValue = ( UCHAR)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0xF0) >> 4);
  583. break;
  584. default:
  585. bResult = FALSE;
  586. break;
  587. }
  588. }
  589. else
  590. bResult = FALSE;
  591. if( bResult)
  592. * pucVInCrystalId = ucValue;
  593. else
  594. OutputDebugError(( "CATIMultimediaTable::GetVideoInCrystalId() fails\n"));
  595. return( bResult);
  596. }