1 /******************************************************************************** 2 ** Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved. 3 ** 4 ** Portions Copyright (c) 1998-1999 Intel Corporation 5 ** 6 ********************************************************************************/ 7 8 /* The file shared.h was reviewed by LCA in June 2011 and is acceptable for use by Microsoft. */ 9 10 #ifndef _SHARED_H_ 11 #define _SHARED_H_ 12 13 #define PC_IMPLEMENTATION 1 14 15 // 16 // Get the NTDDK headers instead of the WDM headers that portcls.h wants to include. 17 // 18 #define WIN9X_COMPAT_SPINLOCK 19 20 #ifdef UNDER_NT 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 #include <ntddk.h> 25 #ifdef __cplusplus 26 } // extern "C" 27 #endif 28 #endif 29 30 #include <portcls.h> 31 #include <stdunk.h> 32 #include "ichreg.h" 33 #include "ac97reg.h" 34 #include "debug.h" 35 36 #ifdef __REACTOS__ 37 38 PVOID 39 operator new ( 40 size_t size, 41 POOL_TYPE pool_type, 42 ULONG tag); 43 44 #define GZCALL NTAPI 45 #else 46 #define GZCALL 47 #endif 48 49 /***************************************************************************** 50 * Structures and Typedefs 51 */ 52 53 const ULONG PoolTag = '79CA'; 54 55 // This enum defines all the possible pin configurations. It is pretty easy, 56 // cause a pin can be there or not, depending if the CoDec supports it (like 57 // Headphone output (PINC_HPOUT_PRESENT)) or if the OEM disabled the feature 58 // with a private inf file. 59 // Look at common.h file for the registry string names. 60 // ATTN: Don't change without changing the static struct in common.cpp too. 61 enum TopoPinConfig 62 { 63 PINC_PCBEEP_PRESENT = 0, 64 PINC_PHONE_PRESENT, 65 PINC_MIC2_PRESENT, 66 PINC_VIDEO_PRESENT, 67 PINC_AUX_PRESENT, 68 PINC_HPOUT_PRESENT, 69 PINC_MONOOUT_PRESENT, 70 PINC_MICIN_PRESENT, 71 PINC_MIC_PRESENT, 72 PINC_LINEIN_PRESENT, 73 PINC_CD_PRESENT, 74 PINC_SURROUND_PRESENT, 75 PINC_CENTER_LFE_PRESENT, 76 PINC_TOP_ELEMENT // number of PINC's 77 }; 78 79 // This enum defines the functional configuration, called nodes. Nodes are 80 // black boxes that implement a functionality like 3d (NODEC_3D_PRESENT). 81 // At startup, we probe the Codec for features (like the pins above) and 82 // initialize an array which holds the configuration. 83 enum TopoNodeConfig 84 { 85 NODEC_3D_PRESENT = 0, 86 NODEC_TONE_PRESENT, 87 NODEC_LOUDNESS_PRESENT, 88 NODEC_SIMUL_STEREO_PRESENT, 89 NODEC_6BIT_MASTER_VOLUME, 90 NODEC_6BIT_HPOUT_VOLUME, 91 NODEC_6BIT_MONOOUT_VOLUME, 92 NODEC_6BIT_SURROUND_VOLUME, 93 NODEC_6BIT_CENTER_LFE_VOLUME, 94 NODEC_3D_CENTER_ADJUSTABLE, 95 NODEC_3D_DEPTH_ADJUSTABLE, 96 NODEC_PCM_VARIABLERATE_SUPPORTED, 97 NODEC_PCM_VSR_INDEPENDENT_RATES, 98 NODEC_PCM_DOUBLERATE_SUPPORTED, 99 NODEC_MIC_VARIABLERATE_SUPPORTED, 100 NODEC_CENTER_DAC_PRESENT, 101 NODEC_SURROUND_DAC_PRESENT, 102 NODEC_LFE_DAC_PRESENT, 103 NODEC_TOP_ELEMENT // number of NODES's 104 }; 105 106 // 107 // Pin Defininition goes here 108 // We define all the possible pins in the AC97 CoDec and some "virtual" pins 109 // that are used for the topology to connect special functionality like 3D. 110 // 111 enum TopoPins 112 { 113 // Source is something that goes into the AC97, dest goes out. 114 PIN_WAVEOUT_SOURCE = 0, 115 PIN_PCBEEP_SOURCE, 116 PIN_PHONE_SOURCE, 117 PIN_MIC_SOURCE, 118 PIN_LINEIN_SOURCE, 119 PIN_CD_SOURCE, 120 PIN_VIDEO_SOURCE, 121 PIN_AUX_SOURCE, 122 PIN_VIRT_3D_CENTER_SOURCE, 123 PIN_VIRT_3D_DEPTH_SOURCE, 124 PIN_VIRT_3D_MIX_MONO_SOURCE, 125 PIN_VIRT_TONE_MIX_SOURCE, 126 PIN_VIRT_TONE_MIX_MONO_SOURCE, 127 PIN_VIRT_SURROUND_SOURCE, 128 PIN_VIRT_CENTER_SOURCE, 129 PIN_VIRT_LFE_SOURCE, 130 PIN_VIRT_FRONT_SOURCE, 131 PIN_MASTEROUT_DEST, 132 PIN_HPOUT_SOURCE, 133 PIN_MONOOUT_DEST, 134 PIN_WAVEIN_DEST, 135 PIN_MICIN_DEST, 136 PIN_TOP_ELEMENT, // number of pins 137 PIN_INVALID 138 }; 139 140 #if (DBG) 141 // In case we print some debug information about the pins, we use the names 142 // defined here. 143 const PCHAR TopoPinStrings[] = 144 { 145 "PIN_WAVEOUT_SOURCE", 146 "PIN_PCBEEP_SOURCE", 147 "PIN_PHONE_SOURCE", 148 "PIN_MIC_SOURCE", 149 "PIN_LINEIN_SOURCE", 150 "PIN_CD_SOURCE", 151 "PIN_VIDEO_SOURCE", 152 "PIN_AUX_SOURCE", 153 "PIN_VIRT_3D_CENTER_SOURCE", 154 "PIN_VIRT_3D_DEPTH_SOURCE", 155 "PIN_VIRT_3D_MIX_MONO_SOURCE", 156 "PIN_VIRT_TONE_MIX_SOURCE", 157 "PIN_VIRT_TONE_MIX_MONO_SOURCE", 158 "PIN_VIRT_SURROUND_SOURCE", 159 "PIN_VIRT_CENTER_SOURCE", 160 "PIN_VIRT_LFE_SOURCE", 161 "PIN_VIRT_FRONT_SOURCE", 162 "PIN_MASTEROUT_DEST", 163 "PIN_HPOUT_SOURCE", 164 "PIN_MONOOUT_DEST", 165 "PIN_WAVEIN_DEST", 166 "PIN_MICIN_DEST", 167 "TOP_ELEMENT", // should never dump this 168 "INVALID" // or this either 169 }; 170 #endif 171 172 173 // 174 // Node Definition goes here. 175 // We define all the possible nodes here (nodes are black boxes that represent 176 // a functional block like bass volume) and some virtual nodes, mainly volume 177 // controls, that are used to represent special functionality in the topology 178 // like 3D controls (exposed as volumes) or to give the user volume controls 179 // for each possible record line. In that case, the volume is placed in front 180 // of the record selector (mux). The topology is not parsed correctly if there 181 // are no volume controls between the pins and a muxer. Also, these virtual 182 // controls only represent volumes and no mutes, cause mutes wouldn't be dis- 183 // played by sndvol32. 184 // ATTN: DON'T change without first looking at the table in ac97reg.h!!! 185 enum TopoNodes 186 { 187 NODE_WAVEOUT_VOLUME = 0, 188 NODE_WAVEOUT_MUTE, 189 NODE_VIRT_WAVEOUT_3D_BYPASS, // exposed as AGC control 190 NODE_PCBEEP_VOLUME, 191 NODE_PCBEEP_MUTE, 192 NODE_PHONE_VOLUME, 193 NODE_PHONE_MUTE, 194 NODE_MIC_SELECT, 195 NODE_MIC_BOOST, 196 NODE_MIC_VOLUME, 197 NODE_MIC_MUTE, 198 NODE_LINEIN_VOLUME, 199 NODE_LINEIN_MUTE, 200 NODE_CD_VOLUME, 201 NODE_CD_MUTE, 202 NODE_VIDEO_VOLUME, 203 NODE_VIDEO_MUTE, 204 NODE_AUX_VOLUME, 205 NODE_AUX_MUTE, 206 NODE_MAIN_MIX, 207 NODE_VIRT_3D_CENTER, // we have no 3D control type, so we 208 NODE_VIRT_3D_DEPTH, // expose 2 volume controls and 2 mute 209 NODE_VIRT_3D_ENABLE, // checkboxs (the other is bypass). 210 NODE_BEEP_MIX, 211 NODE_BASS, 212 NODE_TREBLE, 213 NODE_LOUDNESS, 214 NODE_SIMUL_STEREO, 215 NODE_MASTEROUT_VOLUME, 216 NODE_MASTEROUT_MUTE, 217 NODE_HPOUT_VOLUME, 218 NODE_HPOUT_MUTE, 219 NODE_MONOOUT_SELECT, 220 NODE_VIRT_MONOOUT_VOLUME1, // each mono out must have volume 221 NODE_VIRT_MONOOUT_VOLUME2, 222 NODE_WAVEIN_SELECT, 223 NODE_VIRT_MASTER_INPUT_VOLUME1, // boy, each master input must have a 224 NODE_VIRT_MASTER_INPUT_VOLUME2, // volume 225 NODE_VIRT_MASTER_INPUT_VOLUME3, 226 NODE_VIRT_MASTER_INPUT_VOLUME4, 227 NODE_VIRT_MASTER_INPUT_VOLUME5, 228 NODE_VIRT_MASTER_INPUT_VOLUME6, 229 NODE_VIRT_MASTER_INPUT_VOLUME7, 230 NODE_VIRT_MASTER_INPUT_VOLUME8, 231 NODE_MICIN_VOLUME, 232 NODE_MICIN_MUTE, 233 NODE_SURROUND_VOLUME, 234 NODE_SURROUND_MUTE, 235 NODE_CENTER_VOLUME, 236 NODE_CENTER_MUTE, 237 NODE_LFE_VOLUME, 238 NODE_LFE_MUTE, 239 NODE_FRONT_VOLUME, 240 NODE_FRONT_MUTE, 241 NODE_VIRT_MASTERMONO_VOLUME, // used for multichannel or headphone 242 NODE_VIRT_MASTERMONO_MUTE, 243 NODE_TOP_ELEMENT, // number of nodes 244 NODE_INVALID 245 }; 246 247 #if (DBG) 248 // In case we print some debug information about the nodes, we use names 249 // defined here. 250 const PCHAR NodeStrings[] = 251 { 252 "WAVEOUT_VOLUME", 253 "WAVEOUT_MUTE", 254 "WAVEOUT_3D_BYPASS", 255 "PCBEEP_VOLUME", 256 "PCBEEP_MUTE", 257 "PHONE_VOLUME", 258 "PHONE_MUTE", 259 "MIC_SELECT", 260 "MIC_BOOST", 261 "MIC_VOLUME", 262 "MIC_MUTE", 263 "LINEIN_VOLUME", 264 "LINEIN_MUTE", 265 "CD_VOLUME", 266 "CD_MUTE", 267 "VIDEO_VOLUME", 268 "VIDEO_MUTE", 269 "AUX_VOLUME", 270 "AUX_MUTE", 271 "MAIN_MIX", 272 "3D_CENTER", 273 "3D_DEPTH", 274 "3D_ENABLE", 275 "BEEP_MIX", 276 "BASS", 277 "TREBLE", 278 "LOUDNESS", 279 "SIMUL_STEREO", 280 "MASTER_VOLUME", 281 "MASTER_MUTE", 282 "HPOUT_VOLUME", 283 "HPOUT_MUTE", 284 "MONOOUT_SELECT", 285 "MONOOUT_VOLUME_3D_MIX", 286 "MONOOUT_VOLUME_MIC", 287 "WAVEIN_SELECT", 288 "MASTER_INPUT_VOLUME_MIC", 289 "MASTER_INPUT_VOLUME_CD", 290 "MASTER_INPUT_VOLUME_VIDEO", 291 "MASTER_INPUT_VOLUME_AUX", 292 "MASTER_INPUT_VOLUME_LINEIN", 293 "MASTER_INPUT_VOLUME_TONE_MIX", 294 "MASTER_INPUT_VOLUME_TONE_MIX_MONO", 295 "MASTER_INPUT_VOLUME_PHONE", 296 "MICIN_VOLUME", 297 "MICIN_MUTE", 298 "SURROUND_VOLUME", 299 "SURROUND_MUTE", 300 "CENTER_VOLUME", 301 "CENTER_MUTE", 302 "LFE_VOLUME", 303 "LFE_MUTE", 304 "FRONT_VOLUME", 305 "FRONT_MUTE", 306 "VIRT_MASTERMONO_VOLUME", 307 "VIRT_MASTERMONO_MUTE", 308 "TOP_ELEMENT", // should never dump this 309 "INVALID" // or this 310 }; 311 #endif 312 313 // 314 // The pins used for the wave miniport connection. 315 // 316 enum WavePins 317 { 318 PIN_WAVEOUT = 0, 319 PIN_WAVEOUT_BRIDGE, 320 PIN_WAVEIN, 321 PIN_WAVEIN_BRIDGE, 322 PIN_MICIN, 323 PIN_MICIN_BRIDGE 324 }; 325 326 // 327 // The nodes used for the wave miniport connection. 328 // 329 enum WaveNodes 330 { 331 NODE_WAVEOUT_DAC, 332 NODE_WAVEIN_ADC, 333 NODE_MICIN_ADC 334 }; 335 336 /***************************************************************************** 337 * Function prototypes 338 */ 339 340 /***************************************************************************** 341 * NewAdapterCommon() 342 ***************************************************************************** 343 * Create a new adapter common object. 344 */ 345 NTSTATUS NewAdapterCommon 346 ( 347 OUT PUNKNOWN * Unknown, 348 IN REFCLSID, 349 IN PUNKNOWN UnknownOuter OPTIONAL, 350 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 351 __drv_reportError("Must succeed pool allocations are forbidden. " 352 "Allocation failures cause a system crash")) 353 IN POOL_TYPE PoolType 354 ); 355 356 /***************************************************************************** 357 * Class definitions 358 */ 359 360 /***************************************************************************** 361 * IAC97MiniportTopology 362 ***************************************************************************** 363 * Interface for topology miniport. 364 */ 365 DECLARE_INTERFACE_(IAC97MiniportTopology,IMiniportTopology) 366 { 367 STDMETHOD_(NTSTATUS,GetPhysicalConnectionPins) 368 ( THIS_ 369 OUT PULONG WaveOutSource, 370 OUT PULONG WaveInDest, 371 OUT PULONG MicInDest 372 ) PURE; 373 // Used for DRM: 374 STDMETHOD_(void, SetCopyProtectFlag) 375 ( THIS_ 376 IN BOOL 377 ) PURE; 378 }; 379 380 typedef IAC97MiniportTopology *PAC97MINIPORTTOPOLOGY; 381 382 /***************************************************************************** 383 * IAC97AdapterCommon 384 ***************************************************************************** 385 * Interface for adapter common object. 386 */ 387 DECLARE_INTERFACE_(IAC97AdapterCommon,IUnknown) 388 { 389 STDMETHOD_(NTSTATUS,Init) 390 ( THIS_ 391 IN PRESOURCELIST ResourceList, 392 IN PDEVICE_OBJECT DeviceObject 393 ) PURE; 394 STDMETHOD_(BOOL,GetPinConfig) 395 ( THIS_ 396 IN TopoPinConfig 397 ) PURE; 398 STDMETHOD_(void,SetPinConfig) 399 ( THIS_ 400 IN TopoPinConfig, 401 IN BOOL 402 ) PURE; 403 STDMETHOD_(BOOL,GetNodeConfig) 404 ( THIS_ 405 IN TopoNodeConfig 406 ) PURE; 407 STDMETHOD_(void,SetNodeConfig) 408 ( THIS_ 409 IN TopoNodeConfig, 410 IN BOOL 411 ) PURE; 412 STDMETHOD_(AC97Register,GetNodeReg) 413 ( THIS_ 414 IN TopoNodes 415 ) PURE; 416 STDMETHOD_(WORD,GetNodeMask) 417 ( THIS_ 418 IN TopoNodes 419 ) PURE; 420 STDMETHOD_(NTSTATUS,ReadCodecRegister) 421 ( THIS_ 422 _In_range_(0, AC97REG_INVALID) IN AC97Register Register, 423 _Out_ OUT PWORD wData 424 ) PURE; 425 STDMETHOD_(NTSTATUS,WriteCodecRegister) 426 ( THIS_ 427 _In_range_(0, AC97REG_INVALID) IN AC97Register Register, 428 _In_ IN WORD wData, 429 _In_ IN WORD wMask 430 ) PURE; 431 STDMETHOD_(UCHAR,ReadBMControlRegister8) 432 ( THIS_ 433 IN ULONG Offset 434 ) PURE; 435 STDMETHOD_(USHORT,ReadBMControlRegister16) 436 ( THIS_ 437 IN ULONG Offset 438 ) PURE; 439 STDMETHOD_(ULONG,ReadBMControlRegister32) 440 ( THIS_ 441 IN ULONG Offset 442 ) PURE; 443 STDMETHOD_(void,WriteBMControlRegister) 444 ( THIS_ 445 IN ULONG Offset, 446 IN UCHAR Value 447 ) PURE; 448 STDMETHOD_(void,WriteBMControlRegister) 449 ( THIS_ 450 IN ULONG Offset, 451 IN USHORT Value 452 ) PURE; 453 STDMETHOD_(void,WriteBMControlRegister) 454 ( THIS_ 455 IN ULONG Offset, 456 IN ULONG Value 457 ) PURE; 458 STDMETHOD_(NTSTATUS, RestoreCodecRegisters) 459 ( THIS_ 460 void 461 ) PURE; 462 STDMETHOD_(NTSTATUS, ProgramSampleRate) 463 ( THIS_ 464 IN AC97Register Register, 465 IN DWORD dwSampleRate 466 ) PURE; 467 // Used for DRM: 468 STDMETHOD_(void, SetMiniportTopology) 469 ( THIS_ 470 IN PAC97MINIPORTTOPOLOGY 471 ) PURE; 472 STDMETHOD_(PAC97MINIPORTTOPOLOGY, GetMiniportTopology) 473 ( THIS_ 474 void 475 ) PURE; 476 // These are used by the wave miniport. 477 STDMETHOD_(void, ReadChannelConfigDefault) 478 ( THIS_ 479 PDWORD pwChannelConfig, 480 PWORD pwChannels 481 ) PURE; 482 STDMETHOD_(void, WriteChannelConfigDefault) 483 ( THIS_ 484 DWORD dwChannelConfig 485 ) PURE; 486 }; 487 488 typedef IAC97AdapterCommon *PADAPTERCOMMON; 489 490 /***************************************************************************** 491 * Guids for the Interfaces 492 ***************************************************************************** 493 */ 494 495 // {77481FA0-1EF2-11d2-883A-0080C765647D} 496 DEFINE_GUID(IID_IAC97AdapterCommon, 497 0x77481fa0, 0x1ef2, 0x11d2, 0x88, 0x3a, 0x0, 0x80, 0xc7, 0x65, 0x64, 0x7d); 498 499 // {245AE964-49C8-11d2-95D7-00C04FB925D3} 500 DEFINE_GUID(IID_IAC97MiniportTopology, 501 0x245ae964, 0x49c8, 0x11d2, 0x95, 0xd7, 0x0, 0xc0, 0x4f, 0xb9, 0x25, 0xd3); 502 503 #endif //_SHARED_H_ 504 505