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.

504 lines
20 KiB

  1. //==========================================================================;
  2. //
  3. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. // PURPOSE.
  7. //
  8. // Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
  9. //
  10. //==========================================================================;
  11. extern "C"
  12. {
  13. #include "strmini.h"
  14. #include "ksmedia.h"
  15. #include "wdmdebug.h"
  16. }
  17. #include "wdmdrv.h"
  18. #include "atitunep.h"
  19. #include "aticonfg.h"
  20. /*^^*
  21. * AdapterGetProperty()
  22. * Purpose : Called when SRB_GET_PROPERTY SRB is received.
  23. *
  24. * Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
  25. *
  26. * Outputs : BOOL : returns returns FALSE, if it is not a TVTuner property
  27. * it also returns the required property
  28. * Author : IKLEBANOV
  29. *^^*/
  30. BOOL CATIWDMTuner::AdapterGetProperty( PHW_STREAM_REQUEST_BLOCK pSrb)
  31. {
  32. PSTREAM_PROPERTY_DESCRIPTOR pSpd = pSrb->CommandData.PropertyInfo;
  33. ULONG uiPropertyId = pSpd->Property->Id; // index of the property
  34. BOOL bResult = FALSE;
  35. if( !::IsEqualGUID(( const struct _GUID &)PROPSETID_TUNER, ( const struct _GUID &)pSpd->Property->Set))
  36. return( bResult);
  37. if(( pSpd == NULL) || ( pSpd->PropertyInfo == NULL))
  38. return( bResult);
  39. OutputDebugInfo(( "CATIWDMTuner:AdapterGetProperty() Id = %d\n", uiPropertyId));
  40. bResult = TRUE;
  41. switch( uiPropertyId)
  42. {
  43. case KSPROPERTY_TUNER_CAPS:
  44. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_CAPS_S));
  45. {
  46. KSPIN_MEDIUM NoPinMedium;
  47. PKSPROPERTY_TUNER_CAPS_S pTunerCaps = ( PKSPROPERTY_TUNER_CAPS_S)pSpd->PropertyInfo;
  48. // Copy the input property info to the output property info
  49. ::RtlCopyMemory( pTunerCaps, pSpd->Property, sizeof( KSPROPERTY_TUNER_CAPS_S));
  50. pTunerCaps->ModesSupported = m_ulSupportedModes;
  51. NoPinMedium.Set = GUID_NULL;
  52. NoPinMedium.Id = 0;
  53. NoPinMedium.Flags = 0;
  54. switch( m_ulNumberOfPins)
  55. {
  56. case 2:
  57. case 3:
  58. // TVTuner with TVAudio
  59. /*
  60. pTunerCaps->VideoMedium = &m_pTVTunerPinsMediumInfo[0];
  61. pTunerCaps->TVAudioMedium = &m_pTVTunerPinsMediumInfo[1];
  62. pTunerCaps->RadioAudioMedium = ( m_ulNumberOfPins == 3) ?
  63. &m_pTVTunerPinsMediumInfo[2] : NULL;
  64. */
  65. pTunerCaps->VideoMedium = m_pTVTunerPinsMediumInfo[0];
  66. pTunerCaps->TVAudioMedium = m_pTVTunerPinsMediumInfo[1];
  67. pTunerCaps->RadioAudioMedium = ( m_ulNumberOfPins == 3) ?
  68. m_pTVTunerPinsMediumInfo[2] : NoPinMedium;
  69. break;
  70. case 1:
  71. // it can be FM Tuner only.
  72. /*
  73. pTunerCaps->VideoMedium = NULL;
  74. pTunerCaps->TVAudioMedium = NULL;
  75. pTunerCaps->RadioAudioMedium = &m_pTVTunerPinsMediumInfo[0];
  76. */
  77. pTunerCaps->VideoMedium = NoPinMedium;
  78. pTunerCaps->TVAudioMedium = NoPinMedium;
  79. pTunerCaps->RadioAudioMedium = m_pTVTunerPinsMediumInfo[0];
  80. break;
  81. }
  82. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_CAPS_S);
  83. }
  84. break;
  85. case KSPROPERTY_TUNER_MODE_CAPS:
  86. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_MODE_CAPS_S));
  87. {
  88. PKSPROPERTY_TUNER_MODE_CAPS_S pTunerModeCaps = ( PKSPROPERTY_TUNER_MODE_CAPS_S)pSpd->PropertyInfo;
  89. ULONG ulOperationMode = (( PKSPROPERTY_TUNER_MODE_CAPS_S)pSpd->Property)->Mode;
  90. // Copy the input property info to the output property info
  91. ::RtlCopyMemory( pTunerModeCaps, pSpd->Property, sizeof( PKSPROPERTY_TUNER_MODE_CAPS_S));
  92. if( !( ulOperationMode & m_ulSupportedModes))
  93. {
  94. TRAP;
  95. bResult = FALSE;
  96. break;
  97. }
  98. // There is support for TVTuner at this tinme only. It will be enchanced later on to
  99. // support FM Tuner as well.
  100. switch( ulOperationMode)
  101. {
  102. case KSPROPERTY_TUNER_MODE_TV :
  103. ::RtlCopyMemory( &pTunerModeCaps->StandardsSupported, &m_wdmTunerCaps, sizeof( ATI_KSPROPERTY_TUNER_CAPS));
  104. break;
  105. default:
  106. bResult = FALSE;
  107. break;
  108. }
  109. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_MODE_CAPS_S);
  110. }
  111. break;
  112. case KSPROPERTY_TUNER_MODE:
  113. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_MODE_S));
  114. {
  115. PKSPROPERTY_TUNER_MODE_S pTunerMode = ( PKSPROPERTY_TUNER_MODE_S)pSpd->PropertyInfo;
  116. // Copy the input property info to the output property info
  117. ::RtlCopyMemory( pTunerMode, pSpd->Property, sizeof( PKSPROPERTY_TUNER_MODE_S));
  118. pTunerMode->Mode = m_ulTunerMode;
  119. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_MODE_S);
  120. }
  121. break;
  122. case KSPROPERTY_TUNER_STANDARD:
  123. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_STANDARD_S));
  124. {
  125. PKSPROPERTY_TUNER_STANDARD_S pTunerStandard = ( PKSPROPERTY_TUNER_STANDARD_S)pSpd->PropertyInfo;
  126. // Copy the input property info to the output property info
  127. ::RtlCopyMemory( pTunerStandard, pSpd->Property, sizeof( KSPROPERTY_TUNER_STANDARD_S));
  128. pTunerStandard->Standard = m_ulVideoStandard;
  129. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_STANDARD_S);
  130. }
  131. break;
  132. case KSPROPERTY_TUNER_FREQUENCY:
  133. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_FREQUENCY_S));
  134. {
  135. PKSPROPERTY_TUNER_FREQUENCY_S pTunerFrequency = ( PKSPROPERTY_TUNER_FREQUENCY_S)pSpd->PropertyInfo;
  136. // Copy the input property info to the output property info
  137. ::RtlCopyMemory( pTunerFrequency, pSpd->Property, sizeof( KSPROPERTY_TUNER_FREQUENCY_S));
  138. pTunerFrequency->Frequency = m_ulTuningFrequency;
  139. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_FREQUENCY_S);
  140. }
  141. break;
  142. case KSPROPERTY_TUNER_INPUT:
  143. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_INPUT_S));
  144. {
  145. PKSPROPERTY_TUNER_INPUT_S pTunerInput = ( PKSPROPERTY_TUNER_INPUT_S)pSpd->PropertyInfo;
  146. // Copy the input property info to the output property info
  147. ::RtlCopyMemory( pTunerInput, pSpd->Property, sizeof( KSPROPERTY_TUNER_INPUT_S));
  148. pTunerInput->InputIndex = m_ulTunerInput;
  149. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_INPUT_S);
  150. }
  151. break;
  152. case KSPROPERTY_TUNER_STATUS:
  153. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_STATUS_S));
  154. {
  155. BOOL bBusy;
  156. LONG lPLLOffset;
  157. PKSPROPERTY_TUNER_STATUS_S pTunerStatus = ( PKSPROPERTY_TUNER_STATUS_S)pSpd->PropertyInfo;
  158. if(( bResult = GetTunerPLLOffsetBusyStatus( &lPLLOffset, &bBusy)))
  159. {
  160. OutputDebugInfo(( "CATIWDMTuner:GetStatus() Busy = %d, Quality = %d, Frequency = %ld\n",
  161. bBusy, lPLLOffset, m_ulTuningFrequency));
  162. // Copy the input property info to the output property info
  163. ::RtlCopyMemory( pTunerStatus, pSpd->Property, sizeof( KSPROPERTY_TUNER_STATUS_S));
  164. pTunerStatus->Busy = bBusy;
  165. if( !bBusy)
  166. {
  167. pTunerStatus->PLLOffset = lPLLOffset;
  168. pTunerStatus->CurrentFrequency = m_ulTuningFrequency;
  169. }
  170. pSrb->ActualBytesTransferred = sizeof( KSPROPERTY_TUNER_STATUS_S);
  171. }
  172. else
  173. {
  174. bResult = FALSE;
  175. OutputDebugError(( "CATIWDMTuner:GetStatus() fails\n"));
  176. }
  177. }
  178. break;
  179. default:
  180. TRAP;
  181. bResult = FALSE;
  182. break;
  183. }
  184. return( bResult);
  185. }
  186. /*^^*
  187. * AdapterSetProperty()
  188. * Purpose : Called when SRB_GET_PROPERTY SRB is received.
  189. *
  190. * Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
  191. *
  192. * Outputs : BOOL : returns FALSE, if it is not a TVTuner property
  193. * it also sets the required property
  194. * Author : IKLEBANOV
  195. *^^*/
  196. BOOL CATIWDMTuner::AdapterSetProperty( PHW_STREAM_REQUEST_BLOCK pSrb)
  197. {
  198. PSTREAM_PROPERTY_DESCRIPTOR pSpd = pSrb->CommandData.PropertyInfo;
  199. ULONG uiPropertyId = pSpd->Property->Id; // index of the property
  200. if( !::IsEqualGUID( ( const struct _GUID &)PROPSETID_TUNER, ( const struct _GUID &)pSpd->Property->Set))
  201. return( FALSE);
  202. OutputDebugInfo(( "CATIWDMTuner:AdapterSetProperty() Id = %d\n", uiPropertyId));
  203. switch( uiPropertyId)
  204. {
  205. case KSPROPERTY_TUNER_MODE:
  206. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_MODE_S));
  207. {
  208. ULONG ulModeToSet = (( PKSPROPERTY_TUNER_MODE_S)pSpd->PropertyInfo)->Mode;
  209. if( ulModeToSet & m_ulSupportedModes)
  210. {
  211. if( ulModeToSet != m_ulTunerMode)
  212. if( SetTunerMode( ulModeToSet))
  213. m_ulTunerMode = ulModeToSet;
  214. }
  215. else
  216. return( FALSE);
  217. }
  218. break;
  219. case KSPROPERTY_TUNER_STANDARD:
  220. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_STANDARD_S));
  221. {
  222. ULONG ulStandardToSet = (( PKSPROPERTY_TUNER_STANDARD_S)pSpd->PropertyInfo)->Standard;
  223. if( ulStandardToSet & m_wdmTunerCaps.ulStandardsSupported)
  224. {
  225. if( ulStandardToSet != m_ulVideoStandard)
  226. if( SetTunerVideoStandard( ulStandardToSet))
  227. m_ulVideoStandard = ulStandardToSet;
  228. }
  229. else
  230. return( FALSE);
  231. }
  232. break;
  233. case KSPROPERTY_TUNER_FREQUENCY:
  234. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_FREQUENCY_S));
  235. {
  236. ULONG ulFrequencyToSet = (( PKSPROPERTY_TUNER_FREQUENCY_S)pSpd->PropertyInfo)->Frequency;
  237. BOOL bResult = FALSE;
  238. ENSURE
  239. {
  240. if(( ulFrequencyToSet < m_wdmTunerCaps.ulMinFrequency) ||
  241. ( ulFrequencyToSet > m_wdmTunerCaps.ulMaxFrequency))
  242. FAIL;
  243. if( ulFrequencyToSet != m_ulTuningFrequency)
  244. {
  245. if( !SetTunerFrequency( ulFrequencyToSet))
  246. FAIL;
  247. // update driver
  248. m_ulTuningFrequency = ulFrequencyToSet;
  249. }
  250. bResult = TRUE;
  251. } END_ENSURE;
  252. if( !bResult)
  253. {
  254. OutputDebugError(( "CATIWDMTuner:SetFrequency() fails Frequency = %ld\n", ulFrequencyToSet));
  255. return( FALSE);
  256. }
  257. OutputDebugInfo(( "CATIWDMTuner:SetFrequency() new TuningFrequency = %ld\n", ulFrequencyToSet));
  258. }
  259. break;
  260. case KSPROPERTY_TUNER_INPUT:
  261. ASSERT( pSpd->PropertyOutputSize >= sizeof( KSPROPERTY_TUNER_INPUT_S));
  262. {
  263. ULONG nInputToSet = (( PKSPROPERTY_TUNER_INPUT_S)pSpd->PropertyInfo)->InputIndex;
  264. if( nInputToSet < m_wdmTunerCaps.ulNumberOfInputs)
  265. {
  266. if( nInputToSet != m_ulTunerInput)
  267. if( SetTunerInput( nInputToSet))
  268. m_ulTunerInput = nInputToSet;
  269. else
  270. return( FALSE);
  271. }
  272. else
  273. return( FALSE);
  274. }
  275. break;
  276. default:
  277. TRAP;
  278. return( FALSE);
  279. }
  280. return( TRUE);
  281. }
  282. /*^^*
  283. * SetWDMTunerKSTopology()
  284. * Purpose : Sets the KSTopology structure
  285. * Called during CWDMTuner class construction time.
  286. *
  287. * Inputs : none
  288. *
  289. * Outputs : none
  290. * Author : IKLEBANOV
  291. *^^*/
  292. void CATIWDMTuner::SetWDMTunerKSTopology( void)
  293. {
  294. GUID wdmTunerTopologyCategory[] =
  295. {
  296. STATIC_KSCATEGORY_TVTUNER
  297. };
  298. ::RtlCopyMemory( &m_wdmTunerTopologyCategory, wdmTunerTopologyCategory, sizeof( wdmTunerTopologyCategory));
  299. m_wdmTunerTopology.CategoriesCount = 1;
  300. m_wdmTunerTopology.Categories = &m_wdmTunerTopologyCategory;
  301. m_wdmTunerTopology.TopologyNodesCount = 0;
  302. m_wdmTunerTopology.TopologyNodes = NULL;
  303. m_wdmTunerTopology.TopologyConnectionsCount = 0;
  304. m_wdmTunerTopology.TopologyConnections = NULL;
  305. }
  306. /*^^*
  307. * SetWDMTunerKSProperties()
  308. * Purpose : Sets the KSProperty structures array
  309. * Called during CWDMTuner class construction time.
  310. *
  311. * Inputs : none
  312. *
  313. * Outputs : none
  314. * Author : IKLEBANOV
  315. *^^*/
  316. void CATIWDMTuner::SetWDMTunerKSProperties( void)
  317. {
  318. DEFINE_KSPROPERTY_TABLE( wdmTunerProperties)
  319. {
  320. DEFINE_KSPROPERTY_ITEM
  321. (
  322. KSPROPERTY_TUNER_CAPS, // 1
  323. TRUE, // GetSupported or Handler
  324. sizeof(KSPROPERTY_TUNER_CAPS_S), // MinProperty
  325. sizeof(KSPROPERTY_TUNER_CAPS_S), // MinData
  326. FALSE, // SetSupported or Handler
  327. NULL, // Values
  328. 0, // RelationsCount
  329. NULL, // Relations
  330. NULL, // SupportHandler
  331. 0 // SerializedSize
  332. ),
  333. DEFINE_KSPROPERTY_ITEM
  334. (
  335. KSPROPERTY_TUNER_MODE_CAPS, // 2
  336. TRUE, // GetSupported or Handler
  337. sizeof(KSPROPERTY_TUNER_MODE_CAPS_S), // MinProperty
  338. sizeof(KSPROPERTY_TUNER_MODE_CAPS_S), // MinData
  339. FALSE, // SetSupported or Handler
  340. NULL, // Values
  341. 0, // RelationsCount
  342. NULL, // Relations
  343. NULL, // SupportHandler
  344. 0 // SerializedSize
  345. ),
  346. DEFINE_KSPROPERTY_ITEM
  347. (
  348. KSPROPERTY_TUNER_MODE, // 3
  349. TRUE, // GetSupported or Handler
  350. sizeof(KSPROPERTY_TUNER_MODE_S), // MinProperty
  351. sizeof(KSPROPERTY_TUNER_MODE_S), // MinData
  352. TRUE, // SetSupported or Handler
  353. NULL, // Values
  354. 0, // RelationsCount
  355. NULL, // Relations
  356. NULL, // SupportHandler
  357. 0 // SerializedSize
  358. ),
  359. DEFINE_KSPROPERTY_ITEM
  360. (
  361. KSPROPERTY_TUNER_STANDARD, // 4
  362. TRUE, // GetSupported or Handler
  363. sizeof(KSPROPERTY_TUNER_STANDARD_S), // MinProperty
  364. sizeof(KSPROPERTY_TUNER_STANDARD_S), // MinData
  365. TRUE, // SetSupported or Handler
  366. NULL, // Values
  367. 0, // RelationsCount
  368. NULL, // Relations
  369. NULL, // SupportHandler
  370. sizeof(KSPROPERTY_TUNER_STANDARD_S) // SerializedSize
  371. ),
  372. DEFINE_KSPROPERTY_ITEM
  373. (
  374. KSPROPERTY_TUNER_FREQUENCY, // 5
  375. TRUE, // GetSupported or Handler
  376. sizeof(KSPROPERTY_TUNER_FREQUENCY_S), // MinProperty
  377. sizeof(KSPROPERTY_TUNER_FREQUENCY_S), // MinData
  378. TRUE, // SetSupported or Handler
  379. NULL, // Values
  380. 0, // RelationsCount
  381. NULL, // Relations
  382. NULL, // SupportHandler
  383. sizeof(KSPROPERTY_TUNER_FREQUENCY_S) // SerializedSize
  384. ),
  385. DEFINE_KSPROPERTY_ITEM
  386. (
  387. KSPROPERTY_TUNER_INPUT, // 6
  388. TRUE, // GetSupported or Handler
  389. sizeof(KSPROPERTY_TUNER_INPUT_S), // MinProperty
  390. sizeof(KSPROPERTY_TUNER_INPUT_S), // MinData
  391. TRUE, // SetSupported or Handler
  392. NULL, // Values
  393. 0, // RelationsCount
  394. NULL, // Relations
  395. NULL, // SupportHandler
  396. sizeof(KSPROPERTY_TUNER_INPUT_S) // SerializedSize
  397. ),
  398. DEFINE_KSPROPERTY_ITEM
  399. (
  400. KSPROPERTY_TUNER_STATUS, // 6
  401. TRUE, // GetSupported or Handler
  402. sizeof(KSPROPERTY_TUNER_STATUS_S), // MinProperty
  403. sizeof(KSPROPERTY_TUNER_STATUS_S), // MinData
  404. FALSE, // SetSupported or Handler
  405. NULL, // Values
  406. 0, // RelationsCount
  407. NULL, // Relations
  408. NULL, // SupportHandler
  409. sizeof(KSPROPERTY_TUNER_STATUS_S) // SerializedSize
  410. )
  411. };
  412. DEFINE_KSPROPERTY_SET_TABLE( wdmTunerPropertySet)
  413. {
  414. DEFINE_KSPROPERTY_SET
  415. (
  416. &PROPSETID_TUNER, // Set
  417. KSPROPERTIES_TUNER_LAST, // PropertiesCount
  418. m_wdmTunerProperties, // PropertyItems
  419. 0, // FastIoCount
  420. NULL // FastIoTable
  421. )
  422. };
  423. ::RtlCopyMemory( m_wdmTunerProperties, wdmTunerProperties, sizeof( wdmTunerProperties));
  424. ::RtlCopyMemory( &m_wdmTunerPropertySet, wdmTunerPropertySet, sizeof( wdmTunerPropertySet));
  425. }