1use ctypes::c_void;
8use shared::guiddef::{GUID, REFIID};
9use shared::minwindef::{DWORD, LPARAM, LPVOID, UINT};
10use shared::wtypes::PROPERTYKEY;
12use um::propidl::PROPVARIANT;
13use um::propsys::IPropertyStore;
14use um::unknwnbase::{IUnknown, IUnknownVtbl};
15use um::winnt::{HRESULT, LPCWSTR, LPWSTR};
16pub const DEVICE_STATE_ACTIVE: DWORD = 0x00000001;
19pub const DEVICE_STATE_DISABLED: DWORD = 0x00000002;
20pub const DEVICE_STATE_NOTPRESENT: DWORD = 0x00000004;
21pub const DEVICE_STATE_UNPLUGGED: DWORD = 0x00000008;
22pub const DEVICE_STATEMASK_ALL: DWORD = 0x0000000F;
23DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_FormFactor,
24 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 0}
25DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_ControlPanelPageProvider,
26 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 1}
27DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_Association,
28 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 2}
29DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_PhysicalSpeakers,
30 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 3}
31DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_GUID,
32 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 4}
33DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_Disable_SysFx,
34 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 5}
35pub const ENDPOINT_SYSFX_ENABLED: DWORD = 0x00000000;
36pub const ENDPOINT_SYSFX_DISABLED: DWORD = 0x00000001;
37DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_FullRangeSpeakers,
38 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 6}
39DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_Supports_EventDriven_Mode,
40 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 7}
41DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_JackSubType,
42 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 8}
43DEFINE_PROPERTYKEY!{PKEY_AudioEndpoint_Default_VolumeInDb,
44 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 9}
45DEFINE_PROPERTYKEY!{PKEY_AudioEngine_DeviceFormat,
46 0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c, 0}
47DEFINE_PROPERTYKEY!{PKEY_AudioEngine_OEMFormat,
48 0xe4870e26, 0x3cc5, 0x4cd2, 0xba, 0x46, 0xca, 0xa, 0x9a, 0x70, 0xed, 0x4, 3}
49DEFINE_PROPERTYKEY!{PKEY_AudioEndpointLogo_IconEffects,
50 0xf1ab780d, 0x2010, 0x4ed3, 0xa3, 0xa6, 0x8b, 0x87, 0xf0, 0xf0, 0xc4, 0x76, 0}
51DEFINE_PROPERTYKEY!{PKEY_AudioEndpointLogo_IconPath,
52 0xf1ab780d, 0x2010, 0x4ed3, 0xa3, 0xa6, 0x8b, 0x87, 0xf0, 0xf0, 0xc4, 0x76, 1}
53DEFINE_PROPERTYKEY!{PKEY_AudioEndpointSettings_MenuText,
54 0x14242002, 0x0320, 0x4de4, 0x95, 0x55, 0xa7, 0xd8, 0x2b, 0x73, 0xc2, 0x86, 0}
55DEFINE_PROPERTYKEY!{PKEY_AudioEndpointSettings_LaunchContract,
56 0x14242002, 0x0320, 0x4de4, 0x95, 0x55, 0xa7, 0xd8, 0x2b, 0x73, 0xc2, 0x86, 1}
57STRUCT!{struct DIRECTX_AUDIO_ACTIVATION_PARAMS {
58 cbDirectXAudioActivationParams: DWORD,
59 guidAudioSession: GUID,
60 dwAudioStreamFlags: DWORD,
61}}
62pub type PDIRECTX_AUDIO_ACTIVATION_PARAMS = *mut DIRECTX_AUDIO_ACTIVATION_PARAMS;
63ENUM!{enum EDataFlow {
64 eRender,
65 eCapture,
66 eAll,
67 EDataFlow_enum_count,
68}}
69ENUM!{enum ERole {
70 eConsole,
71 eMultimedia,
72 eCommunications,
73 ERole_enum_count,
74}}
75ENUM!{enum EndpointFormFactor {
76 RemoteNetworkDevice,
77 Speakers,
78 LineLevel,
79 Headphones,
80 Microphone,
81 Headset,
82 Handset,
83 UnknownDigitalPassthrough,
84 SPDIF,
85 DigitalAudioDisplayDevice,
86 UnknownFormFactor,
87 EndpointFormFactor_enum_count,
88}}
89pub const HDMI: EndpointFormFactor = DigitalAudioDisplayDevice;
90DEFINE_GUID!{DEVINTERFACE_AUDIO_RENDER,
91 0xe6327cad, 0xdcec, 0x4949, 0xae, 0x8a, 0x99, 0x1e, 0x97, 0x6a, 0x79, 0xd2}
92DEFINE_GUID!{DEVINTERFACE_AUDIO_CAPTURE,
93 0x2eef81be, 0x33fa, 0x4800, 0x96, 0x70, 0x1c, 0xd4, 0x74, 0x97, 0x2c, 0x3f}
94DEFINE_GUID!{DEVINTERFACE_MIDI_OUTPUT,
95 0x6dc23320, 0xab33, 0x4ce4, 0x80, 0xd4, 0xbb, 0xb3, 0xeb, 0xbf, 0x28, 0x14}
96DEFINE_GUID!{DEVINTERFACE_MIDI_INPUT,
97 0x504be32c, 0xccf6, 0x4d2c, 0xb7, 0x3f, 0x6f, 0x8b, 0x37, 0x47, 0xe2, 0x2b}
98RIDL!{#[uuid(0x7991eec9, 0x7e89, 0x4d85, 0x83, 0x90, 0x6c, 0x70, 0x3c, 0xec, 0x60, 0xc0)]
99interface IMMNotificationClient(IMMNotificationClientVtbl): IUnknown(IUnknownVtbl) {
100 fn OnDeviceStateChanged(
101 pwstrDeviceId: LPCWSTR,
102 dwNewState: DWORD,
103 ) -> HRESULT,
104 fn OnDeviceAdded(
105 pwstrDeviceId: LPCWSTR,
106 ) -> HRESULT,
107 fn OnDeviceRemoved(
108 pwstrDeviceId: LPCWSTR,
109 ) -> HRESULT,
110 fn OnDefaultDeviceChanged(
111 flow: EDataFlow,
112 role: ERole,
113 pwstrDefaultDeviceId: LPCWSTR,
114 ) -> HRESULT,
115 fn OnPropertyValueChanged(
116 pwstrDeviceId: LPCWSTR,
117 key: PROPERTYKEY,
118 ) -> HRESULT,
119}}
120RIDL!{#[uuid(0xd666063f, 0x1587, 0x4e43, 0x81, 0xf1, 0xb9, 0x48, 0xe8, 0x07, 0x36, 0x3f)]
121interface IMMDevice(IMMDeviceVtbl): IUnknown(IUnknownVtbl) {
122 fn Activate(
123 iid: REFIID,
124 dwClsCtx: DWORD,
125 pActivationParams: *mut PROPVARIANT,
126 ppInterface: *mut LPVOID,
127 ) -> HRESULT,
128 fn OpenPropertyStore(
129 stgmAccess: DWORD,
130 ppProperties: *mut *mut IPropertyStore,
131 ) -> HRESULT,
132 fn GetId(
133 ppstrId: *mut LPWSTR,
134 ) -> HRESULT,
135 fn GetState(
136 pdwState: *mut DWORD,
137 ) -> HRESULT,
138}}
139RIDL!{#[uuid(0x0bd7a1be, 0x7a1a, 0x44db, 0x83, 0x97, 0xcc, 0x53, 0x92, 0x38, 0x7b, 0x5e)]
140interface IMMDeviceCollection(IMMDeviceCollectionVtbl): IUnknown(IUnknownVtbl) {
141 fn GetCount(
142 pcDevices: *const UINT,
143 ) -> HRESULT,
144 fn Item(
145 nDevice: UINT,
146 ppDevice: *mut *mut IMMDevice,
147 ) -> HRESULT,
148}}
149RIDL!{#[uuid(0x1be09788, 0x6894, 0x4089, 0x85, 0x86, 0x9a, 0x2a, 0x6c, 0x26, 0x5a, 0xc5)]
150interface IMMEndpoint(IMMEndpointVtbl): IUnknown(IUnknownVtbl) {
151 fn GetDataFlow(
152 pDataFlow: *mut EDataFlow,
153 ) -> HRESULT,
154}}
155RIDL!{#[uuid(0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6)]
156interface IMMDeviceEnumerator(IMMDeviceEnumeratorVtbl): IUnknown(IUnknownVtbl) {
157 fn EnumAudioEndpoints(
158 dataFlow: EDataFlow,
159 dwStateMask: DWORD,
160 ppDevices: *mut *mut IMMDeviceCollection,
161 ) -> HRESULT,
162 fn GetDefaultAudioEndpoint(
163 dataFlow: EDataFlow,
164 role: ERole,
165 ppEndpoint: *mut *mut IMMDevice,
166 ) -> HRESULT,
167 fn GetDevice(
168 pwstrId: LPCWSTR,
169 ppDevices: *mut *mut IMMDevice,
170 ) -> HRESULT,
171 fn RegisterEndpointNotificationCallback(
172 pClient: *mut IMMNotificationClient,
173 ) -> HRESULT,
174 fn UnregisterEndpointNotificationCallback(
175 pClient: *mut IMMNotificationClient,
176 ) -> HRESULT,
177}}
178RIDL!{#[uuid(0x3b0d0ea4, 0xd0a9, 0x4b0e, 0x93, 0x5b, 0x09, 0x51, 0x67, 0x46, 0xfa, 0xc0)]
179interface IMMDeviceActivator(IMMDeviceActivatorVtbl): IUnknown(IUnknownVtbl) {
180 fn Activate(
181 iid: REFIID,
182 pDevice: *mut IMMDevice,
183 pActivationParams: *mut PROPVARIANT,
184 ppInterface: *mut *mut c_void,
185 ) -> HRESULT,
186}}
187RIDL!{#[uuid(0x41d949ab, 0x9862, 0x444a, 0x80, 0xf6, 0xc2, 0x61, 0x33, 0x4d, 0xa5, 0xeb)]
188interface IActivateAudioInterfaceCompletionHandler(IActivateAudioInterfaceCompletionHandlerVtbl):
189 IUnknown(IUnknownVtbl) {
190 fn ActivateCompleted(
191 activateOperation: *mut IActivateAudioInterfaceAsyncOperation,
192 ) -> HRESULT,
193}}
194RIDL!{#[uuid(0x72a22d78, 0xcde4, 0x431d, 0xb8, 0xcc, 0x84, 0x3a, 0x71, 0x19, 0x9b, 0x6d)]
195interface IActivateAudioInterfaceAsyncOperation(IActivateAudioInterfaceAsyncOperationVtbl):
196 IUnknown(IUnknownVtbl) {
197 fn GetActivateResult(
198 activateResult: *mut HRESULT,
199 activatedInterface: *mut *mut IUnknown,
200 ) -> HRESULT,
201}}
202extern "system" {
203 pub fn ActivateAudioInterfaceAsync(
204 deviceInterfacePath: LPCWSTR,
205 riid: REFIID,
206 activationParams: *mut PROPVARIANT,
207 completionHandler: *mut IActivateAudioInterfaceCompletionHandler,
208 activationOperation: *mut *mut IActivateAudioInterfaceAsyncOperation,
209 ) -> HRESULT;
210}
211STRUCT!{struct AudioExtensionParams {
212 AddPageParam: LPARAM,
213 pEndpoint: *mut IMMDevice,
214 pPnpInterface: *mut IMMDevice,
215 pPnpDevnode: *mut IMMDevice,
216}}
217DEFINE_GUID!{CLSID_MMDeviceEnumerator,
218 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}
219RIDL!{#[uuid(0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E)]
220class MMDeviceEnumerator;}