1 // Copyright © 2015, Connor Hilarides
2 // Licensed under the MIT License <LICENSE.md>
3 //! Mappings for the contents of sapi.h
4 ENUM!{enum SPDATAKEYLOCATION {
5     SPDKL_DefaultLocation = 0,
6     SPDKL_CurrentUser = 1,
7     SPDKL_LocalMachine = 2,
8     SPDKL_CurrentConfig = 5,
9 }}
10 pub const SPDUI_EngineProperties: &'static str = "EngineProperties";
11 pub const SPDUI_AddRemoveWord: &'static str = "AddRemoveWord";
12 pub const SPDUI_UserTraining: &'static str = "UserTraining";
13 pub const SPDUI_MicTraining: &'static str = "MicTraining";
14 pub const SPDUI_RecoProfileProperties: &'static str = "RecoProfileProperties";
15 pub const SPDUI_AudioProperties: &'static str = "AudioProperties";
16 pub const SPDUI_AudioVolume: &'static str = "AudioVolume";
17 pub const SPDUI_UserEnrollment: &'static str = "UserEnrollment";
18 pub const SPDUI_ShareData: &'static str = "ShareData";
19 pub const SPDUI_Tutorial: &'static str = "Tutorial";
20 ENUM!{enum SPSTREAMFORMAT {
21      SPSF_Default = -1i32 as u32,
22      SPSF_NoAssignedFormat = 0,
23      SPSF_Text = 1,
24      SPSF_NonStandardFormat = 2,
25      SPSF_ExtendedAudioFormat = 3,
26      SPSF_8kHz8BitMono = 4,
27      SPSF_8kHz8BitStereo = 5,
28      SPSF_8kHz16BitMono = 6,
29      SPSF_8kHz16BitStereo = 7,
30      SPSF_11kHz8BitMono = 8,
31      SPSF_11kHz8BitStereo = 9,
32      SPSF_11kHz16BitMono = 10,
33      SPSF_11kHz16BitStereo = 11,
34      SPSF_12kHz8BitMono = 12,
35      SPSF_12kHz8BitStereo = 13,
36      SPSF_12kHz16BitMono = 14,
37      SPSF_12kHz16BitStereo = 15,
38      SPSF_16kHz8BitMono = 16,
39      SPSF_16kHz8BitStereo = 17,
40      SPSF_16kHz16BitMono = 18,
41      SPSF_16kHz16BitStereo = 19,
42      SPSF_22kHz8BitMono = 20,
43      SPSF_22kHz8BitStereo = 21,
44      SPSF_22kHz16BitMono = 22,
45      SPSF_22kHz16BitStereo = 23,
46      SPSF_24kHz8BitMono = 24,
47      SPSF_24kHz8BitStereo = 25,
48      SPSF_24kHz16BitMono = 26,
49      SPSF_24kHz16BitStereo = 27,
50      SPSF_32kHz8BitMono = 28,
51      SPSF_32kHz8BitStereo = 29,
52      SPSF_32kHz16BitMono = 30,
53      SPSF_32kHz16BitStereo = 31,
54      SPSF_44kHz8BitMono = 32,
55      SPSF_44kHz8BitStereo = 33,
56      SPSF_44kHz16BitMono = 34,
57      SPSF_44kHz16BitStereo = 35,
58      SPSF_48kHz8BitMono = 36,
59      SPSF_48kHz8BitStereo = 37,
60      SPSF_48kHz16BitMono = 38,
61      SPSF_48kHz16BitStereo = 39,
62      SPSF_TrueSpeech_8kHz1BitMono = 40,
63      SPSF_CCITT_ALaw_8kHzMono = 41,
64      SPSF_CCITT_ALaw_8kHzStereo = 42,
65      SPSF_CCITT_ALaw_11kHzMono = 43,
66      SPSF_CCITT_ALaw_11kHzStereo = 44,
67      SPSF_CCITT_ALaw_22kHzMono = 45,
68      SPSF_CCITT_ALaw_22kHzStereo = 46,
69      SPSF_CCITT_ALaw_44kHzMono = 47,
70      SPSF_CCITT_ALaw_44kHzStereo = 48,
71      SPSF_CCITT_uLaw_8kHzMono = 49,
72      SPSF_CCITT_uLaw_8kHzStereo = 50,
73      SPSF_CCITT_uLaw_11kHzMono = 51,
74      SPSF_CCITT_uLaw_11kHzStereo = 52,
75      SPSF_CCITT_uLaw_22kHzMono = 53,
76      SPSF_CCITT_uLaw_22kHzStereo = 54,
77      SPSF_CCITT_uLaw_44kHzMono = 55,
78      SPSF_CCITT_uLaw_44kHzStereo = 56,
79      SPSF_ADPCM_8kHzMono = 57,
80      SPSF_ADPCM_8kHzStereo = 58,
81      SPSF_ADPCM_11kHzMono = 59,
82      SPSF_ADPCM_11kHzStereo = 60,
83      SPSF_ADPCM_22kHzMono = 61,
84      SPSF_ADPCM_22kHzStereo = 62,
85      SPSF_ADPCM_44kHzMono = 63,
86      SPSF_ADPCM_44kHzStereo = 64,
87      SPSF_GSM610_8kHzMono = 65,
88      SPSF_GSM610_11kHzMono = 66,
89      SPSF_GSM610_22kHzMono = 67,
90      SPSF_GSM610_44kHzMono = 68,
91      SPSF_NUM_FORMATS = 69,
92 }}
93 pub const SPREG_USER_ROOT: &'static str = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech";
94 pub const SPREG_LOCAL_MACHINE_ROOT: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech";
95 pub const SPCAT_AUDIOOUT: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioOutput";
96 pub const SPCAT_AUDIOIN: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioInput";
97 pub const SPCAT_VOICES: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices";
98 pub const SPCAT_RECOGNIZERS: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Recognizers";
99 pub const SPCAT_APPLEXICONS: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AppLexicons";
100 pub const SPCAT_PHONECONVERTERS: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\PhoneConverters";
101 pub const SPCAT_TEXTNORMALIZERS: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\TextNormalizers";
102 pub const SPCAT_RECOPROFILES: &'static str = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\RecoProfiles";
103 pub const SPMMSYS_AUDIO_IN_TOKEN_ID: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioInput\\TokenEnums\\MMAudioIn\\";
104 pub const SPMMSYS_AUDIO_OUT_TOKEN_ID: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioOutput\\TokenEnums\\MMAudioOut\\";
105 pub const SPCURRENT_USER_LEXICON_TOKEN_ID: &'static str = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\CurrentUserLexicon";
106 pub const SPCURRENT_USER_SHORTCUT_TOKEN_ID: &'static str = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\CurrentUserShortcut";
107 pub const SPTOKENVALUE_CLSID: &'static str = "CLSID";
108 pub const SPTOKENKEY_FILES: &'static str = "Files";
109 pub const SPTOKENKEY_UI: &'static str = "UI";
110 pub const SPTOKENKEY_ATTRIBUTES: &'static str = "Attributes";
111 pub const SPTOKENKEY_RETAINEDAUDIO: &'static str = "SecondsPerRetainedAudioEvent";
112 pub const SPTOKENKEY_AUDIO_LATENCY_WARNING: &'static str = "LatencyWarningThreshold";
113 pub const SPTOKENKEY_AUDIO_LATENCY_TRUNCATE: &'static str = "LatencyTruncateThreshold";
114 pub const SPTOKENKEY_AUDIO_LATENCY_UPDATE_INTERVAL: &'static str = "LatencyUpdateInterval";
115 pub const SPVOICECATEGORY_TTSRATE: &'static str = "DefaultTTSRate";
116 pub const SPPROP_RESOURCE_USAGE: &'static str = "ResourceUsage";
117 pub const SPPROP_HIGH_CONFIDENCE_THRESHOLD: &'static str = "HighConfidenceThreshold";
118 pub const SPPROP_NORMAL_CONFIDENCE_THRESHOLD: &'static str = "NormalConfidenceThreshold";
119 pub const SPPROP_LOW_CONFIDENCE_THRESHOLD: &'static str = "LowConfidenceThreshold";
120 pub const SPPROP_RESPONSE_SPEED: &'static str = "ResponseSpeed";
121 pub const SPPROP_COMPLEX_RESPONSE_SPEED: &'static str = "ComplexResponseSpeed";
122 pub const SPPROP_ADAPTATION_ON: &'static str = "AdaptationOn";
123 pub const SPPROP_PERSISTED_BACKGROUND_ADAPTATION: &'static str = "PersistedBackgroundAdaptation";
124 pub const SPPROP_PERSISTED_LANGUAGE_MODEL_ADAPTATION: &'static str = "PersistedLanguageModelAdaptation";
125 pub const SPPROP_UX_IS_LISTENING: &'static str = "UXIsListening";
126 pub const SPTOPIC_SPELLING: &'static str = "Spelling";
127 pub const SPWILDCARD: &'static str = "...";
128 pub const SPDICTATION: &'static str = "*";
129 pub const SPINFDICTATION: &'static str = "*+";
130 pub const SPREG_SAFE_USER_TOKENS: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\UserTokens";
131 pub const SP_LOW_CONFIDENCE: i32 = -1;
132 pub const SP_NORMAL_CONFIDENCE: i32 = 0;
133 pub const SP_HIGH_CONFIDENCE: i32 = 1;
134 pub const DEFAULT_WEIGHT: i32 = 1;
135 pub const SP_MAX_WORD_LENGTH: i32 = 128;
136 pub const SP_MAX_PRON_LENGTH: i32 = 384;
137 pub const SP_EMULATE_RESULT: i32 = 0x40000000;
138 RIDL!(
139 interface ISpNotifyCallback(ISpNotifyCallbackVtbl) {
140     fn NotifyCallback(&mut self, wParam: ::WPARAM, lParam: ::LPARAM) -> ::HRESULT
141 }
142 );
143 pub type SPNOTIFYCALLBACK = unsafe extern "system" fn(wParam: ::WPARAM, lParam: ::LPARAM);
144 RIDL!(
145 interface ISpNotifySource(ISpNotifySourceVtbl): IUnknown(IUnknownVtbl) {
146     fn SetNotifySink(&mut self, pNotifySink: *mut ISpNotifySink) -> ::HRESULT,
147     fn SetNotifyWindowMessage(
148         &mut self, hWnd: ::HWND, Msg: ::UINT, wParam: ::WPARAM, lParam: ::LPARAM
149     ) -> ::HRESULT,
150     fn SetNotifyCallbackFunction(
151         &mut self, pfnCallback: SPNOTIFYCALLBACK, wParam: ::WPARAM, lParam: ::LPARAM
152     ) -> ::HRESULT,
153     fn SetNotifyCallbackInterface(
154         &mut self, pSpCallback: *mut ISpNotifyCallback, wParam: ::WPARAM, lParam: ::LPARAM
155     ) -> ::HRESULT,
156     fn SetNotifyWin32Event(&mut self) -> ::HRESULT,
157     fn WaitForNotifyEvent(&mut self, dwMilliseconds: ::DWORD) -> ::HRESULT,
158     fn GetNotifyEventHandle(&mut self) -> ::HANDLE
159 }
160 );
161 RIDL!(
162 interface ISpNotifySink(ISpNotifySinkVtbl): IUnknown(IUnknownVtbl) {
163     fn Notify(&mut self) -> ::HRESULT
164 }
165 );
166 RIDL!(
167 interface ISpNotifyTranslator(ISpNotifyTranslatorVtbl): ISpNotifySink(ISpNotifySinkVtbl) {
168     fn InitWindowMessage(
169         &mut self, hWnd: ::HWND, Msg: ::UINT, wParam: ::WPARAM, lParam: ::LPARAM
170     ) -> ::HRESULT,
171     fn InitCallback(
172         &mut self, pfnCallback: SPNOTIFYCALLBACK, wParam: ::WPARAM, lParam: ::LPARAM
173     ) -> ::HRESULT,
174     fn InitSpNotifyCallback(
175         &mut self, pSpCallback: *mut ISpNotifyCallback, wParam: ::WPARAM, lParam: ::LPARAM
176     ) -> ::HRESULT,
177     fn InitWin32Event(&mut self, hEvent: ::HANDLE, fCloseHandleOnRelease: ::BOOL) -> ::HRESULT,
178     fn Wait(&mut self, dwMilliseconds: ::DWORD) -> ::HRESULT,
179     fn GetEventHandle(&mut self) -> ::HANDLE
180 }
181 );
182 RIDL!(
183 interface ISpDataKey(ISpDataKeyVtbl): IUnknown(IUnknownVtbl) {
184     fn SetData(
185         &mut self, pszValueName: ::LPCWSTR, cbData: ::ULONG, pData: *const ::BYTE
186     ) -> ::HRESULT,
187     fn GetData(
188         &mut self, pszValueName: ::LPCWSTR, pcbData: *mut ::ULONG, pData: *mut ::BYTE
189     ) -> ::HRESULT,
190     fn SetStringValue(&mut self, pszValueName: ::LPCWSTR, pszValue: ::LPCWSTR) -> ::HRESULT,
191     fn GetStringValue(&mut self, pszValueName: ::LPCWSTR, ppszValue: *mut ::LPWSTR) -> ::HRESULT,
192     fn SetDWORD(&mut self, pszValueName: ::LPCWSTR, dwValue: ::DWORD) -> ::HRESULT,
193     fn GetDWORD(&mut self, pszValueName: ::LPCWSTR, pdwValue: *mut ::DWORD) -> ::HRESULT,
194     fn OpenKey(&mut self, pszSubKeyName: ::LPCWSTR, ppSubKey: *mut *mut ISpDataKey) -> ::HRESULT,
195     fn CreateKey(&mut self, pszSubKey: ::LPCWSTR, ppSubKey: *mut *mut ISpDataKey) -> ::HRESULT,
196     fn DeleteKey(&mut self, pszSubKey: ::LPCWSTR) -> ::HRESULT,
197     fn DeleteValue(&mut self, pszValueName: ::LPCWSTR) -> ::HRESULT,
198     fn EnumKeys(&mut self, Index: ::ULONG, ppszSubKeyName: *mut ::LPWSTR) -> ::HRESULT,
199     fn EnumValues(&mut self, Index: ::ULONG, ppszValueName: *mut ::LPWSTR) -> ::HRESULT
200 }
201 );
202 RIDL!(
203 interface ISpRegDataKey(ISpRegDataKeyVtbl): ISpDataKey(ISpDataKeyVtbl) {
204     fn SetKey(&mut self, hkey: ::HKEY, fReadOnly: ::BOOL) -> ::HRESULT
205 }
206 );
207 RIDL!(
208 interface ISpObjectTokenCategory(ISpObjectTokenCategoryVtbl): ISpDataKey(ISpDataKeyVtbl) {
209     fn SetId(&mut self, pszCategoryId: ::LPCWSTR, fCreateIfNotExist: ::BOOL) -> ::HRESULT,
210     fn GetId(&mut self, ppszCoMemCategoryId: *mut ::LPWSTR) -> ::HRESULT,
211     fn GetDataKey(
212         &mut self, spdkl: SPDATAKEYLOCATION, pppDataKey: *mut *mut ISpDataKey
213     ) -> ::HRESULT,
214     fn EnumTokens(
215         &mut self, pzsReqAttribs: ::LPCWSTR, pszOptAttribs: ::LPCWSTR,
216         ppEnum: *mut *mut IEnumSpObjectTokens
217     ) -> ::HRESULT,
218     fn SetDefaultTokenId(&mut self, pszTokenId: ::LPCWSTR) -> ::HRESULT,
219     fn GetDefaultTokenId(&mut self, ppszCoMemTokenId: *mut ::LPWSTR) -> ::HRESULT
220 }
221 );
222 RIDL!(
223 interface ISpObjectToken(ISpObjectTokenVtbl): ISpDataKey(ISpDataKeyVtbl) {
224     fn SetId(
225         &mut self, pszCategoryId: ::LPCWSTR, pszTokenId: ::LPCWSTR, fCreateIfNotExist: ::BOOL
226     ) -> ::HRESULT,
227     fn GetId(&mut self, ppszCoMemTokenId: *mut ::LPWSTR) -> ::HRESULT,
228     fn GetCategory(&mut self, ppTokenCategory: *mut *mut ISpObjectTokenCategory) -> ::HRESULT,
229     fn CreateInstance(
230         &mut self, pUnkOuter: *mut ::IUnknown, dwClsContext: ::DWORD, riid: ::REFIID,
231         ppvObject: *mut *mut ::c_void
232     ) -> ::HRESULT,
233     fn GetStorageFileName(
234         &mut self, clsidCaller: ::REFCLSID, pszValueName: ::LPCWSTR,
235         pszFileNameSpecifier: ::LPCWSTR, nFolder: ::ULONG, ppszFilePath: *mut ::LPWSTR
236     ) -> ::HRESULT,
237     fn RemoveStorageFileName(&mut self, pszKeyName: ::LPCWSTR, fDeleteFile: ::BOOL) -> ::HRESULT,
238     fn Remove(&mut self, pclsidCaller: *const ::CLSID) -> ::HRESULT,
239     fn IsUISupported(
240         &mut self, pszTypeOfUI: ::LPCWSTR, pvExtraData: *mut ::c_void, cbExtraData: ::ULONG,
241         punkObject: *mut ::IUnknown, pfSupported: *mut ::BOOL
242     ) -> ::HRESULT,
243     fn DisplayUI(
244         &mut self, hwndParent: ::HWND, pszTitle: ::LPCWSTR, pszTypeOfUI: ::LPCWSTR,
245         pvExtraData: *mut ::c_void, cbExtraData: ::ULONG, punkObject: *mut ::IUnknown
246     ) -> ::HRESULT,
247     fn MatchesAttributes(&mut self, pszAttributes: ::LPCWSTR, pfMatches: *mut ::BOOL) -> ::HRESULT
248 }
249 );
250 RIDL!(
251 interface ISpObjectTokenInit(ISpObjectTokenInitVtbl): ISpObjectToken(ISpObjectTokenVtbl) {
252     fn InitFromDataKey(
253         &mut self, pszCategoryId: ::LPCWSTR, pszTokenId: ::LPCWSTR, pDataKey: *mut ISpDataKey
254     ) -> ::HRESULT
255 }
256 );
257 RIDL!(
258 interface IEnumSpObjectTokens(IEnumSpObjectTokensVtbl): IUnknown(IUnknownVtbl) {
259     fn Next(
260         &mut self, celt: ::ULONG, pelt: *mut *mut ISpObjectToken, pceltFetched: *mut ::ULONG
261     ) -> ::HRESULT,
262     fn Skip(&mut self, celt: ::ULONG) -> ::HRESULT,
263     fn Reset(&mut self) -> ::HRESULT,
264     fn Clone(&mut self, ppEnum: *mut *mut IEnumSpObjectTokens) -> ::HRESULT,
265     fn Item(&mut self, Index: ::ULONG, ppToken: *mut *mut ISpObjectToken) -> ::HRESULT,
266     fn GetCount(&mut self, pCount: *mut ::ULONG) -> ::HRESULT
267 }
268 );
269 RIDL!(
270 interface ISpObjectWithToken(ISpObjectWithTokenVtbl): IUnknown(IUnknownVtbl) {
271     fn SetObjectToken(&mut self, pToken: *mut ISpObjectToken) -> ::HRESULT,
272     fn GetObjectToken(&mut self, ppToken: *mut *mut ISpObjectToken) -> ::HRESULT
273 }
274 );
275 RIDL!(
276 interface ISpResourceManager(ISpResourceManagerVtbl): IServiceProvider(IServiceProviderVtbl) {
277     fn SetObject(&mut self, guidServiceId: ::REFGUID, pUnkObject: *mut ::IUnknown) -> ::HRESULT,
278     fn GetObject(
279         &mut self, guidServiceId: ::REFGUID, ObjectCLSID: ::REFCLSID, ObjectIID: ::REFIID,
280         fReleaseWhenLastExternalRefReleased: ::BOOL, ppObject: *mut *mut ::c_void
281     ) -> ::HRESULT
282 }
283 );
284 ENUM!{enum SPEVENTLPARAMTYPE {
285     SPET_LPARAM_IS_UNDEFINED = 0,
286     SPET_LPARAM_IS_TOKEN,
287     SPET_LPARAM_IS_OBJECT,
288     SPET_LPARAM_IS_POINTER,
289     SPET_LPARAM_IS_STRING,
290 }}
291 ENUM!{enum SPEVENTENUM {
292     SPEI_UNDEFINED = 0,
293     SPEI_START_INPUT_STREAM = 1,
294     SPEI_END_INPUT_STREAM = 2,
295     SPEI_VOICE_CHANGE = 3,
296     SPEI_TTS_BOOKMARK = 4,
297     SPEI_WORD_BOUNDARY = 5,
298     SPEI_PHONEME = 6,
299     SPEI_SENTENCE_BOUNDARY = 7,
300     SPEI_VISEME = 8,
301     SPEI_TTS_AUDIO_LEVEL = 9,
302     SPEI_TTS_PRIVATE = 15,
303     SPEI_END_SR_STREAM = 34,
304     SPEI_SOUND_START = 35,
305     SPEI_SOUND_END = 36,
306     SPEI_PHRASE_START = 37,
307     SPEI_RECOGNITION = 38,
308     SPEI_HYPOTHESIS = 39,
309     SPEI_SR_BOOKMARK = 40,
310     SPEI_PROPERTY_NUM_CHANGE = 41,
311     SPEI_PROPERTY_STRING_CHANGE = 42,
312     SPEI_FALSE_RECOGNITION = 43,
313     SPEI_INTERFERENCE = 44,
314     SPEI_REQUEST_UI = 45,
315     SPEI_RECO_STATE_CHANGE = 46,
316     SPEI_ADAPTATION = 47,
317     SPEI_START_SR_STREAM = 48,
318     SPEI_RECO_OTHER_CONTEXT = 49,
319     SPEI_SR_AUDIO_LEVEL = 50,
320     SPEI_SR_RETAINEDAUDIO = 51,
321     SPEI_SR_PRIVATE = 52,
322     SPEI_ACTIVE_CATEGORY_CHANGED = 53,
323     SPEI_RESERVED5 = 54,
324     SPEI_RESERVED6 = 55,
325     SPEI_RESERVED1 = 30,
326     SPEI_RESERVED2 = 33,
327     SPEI_RESERVED3 = 63,
328 }}
329 pub const SPEI_MIN_TTS: SPEVENTENUM = SPEI_START_INPUT_STREAM;
330 pub const SPEI_MAX_TTS: SPEVENTENUM = SPEI_TTS_PRIVATE;
331 pub const SPEI_MIN_SR: SPEVENTENUM = SPEI_END_SR_STREAM;
332 pub const SPEI_MAX_SR: SPEVENTENUM = SPEI_RESERVED6;
333 pub const SPFEI_FLAGCHECK: u64 = (1 << SPEI_RESERVED1.0 as u64) | (1 << SPEI_RESERVED2.0 as u64);
334 pub const SPFEI_ALL_TTS_EVENTS: u64 = 0x000000000000FFFE | SPFEI_FLAGCHECK;
335 pub const SPFEI_ALL_SR_EVENTS: u64 = 0x003FFFFC00000000 | SPFEI_FLAGCHECK;
336 pub const SPFEI_ALL_EVENTS: u64 = 0xEFFFFFFFFFFFFFFF;
337 #[inline]
338 pub fn SPFEI(SPEI_ord: u64) -> u64 {
339     (1 << SPEI_ord) | SPFEI_FLAGCHECK
340 }
341 STRUCT!{struct SPEVENT {
342     eEventId: ::WORD,
343     elParamType: ::WORD,
344     ulStreamNum: ::ULONG,
345     ullAudioStreamOffset: ::ULONGLONG,
346     wParam: ::WPARAM,
347     lParam: ::LPARAM,
348 }}
349 STRUCT!{struct SPSERIALIZEDEVENT {
350     eEventId: ::WORD,
351     elParamType: ::WORD,
352     ulStreamNum: ::ULONG,
353     ullAudioStreamOffset: ::ULONGLONG,
354     SerializedwParam: ::ULONG,
355     SerializedlParam: ::LONG,
356 }}
357 STRUCT!{struct SPSERIALIZEDEVENT64 {
358     eEventId: ::WORD,
359     elParamType: ::WORD,
360     ulStreamNum: ::ULONG,
361     ullAudioStreamOffset: ::ULONGLONG,
362     SerializedwParam: ::ULONGLONG,
363     SerializedlParam: ::LONGLONG,
364 }}
365 STRUCT!{struct SPEVENTEX {
366     eEventId: ::WORD,
367     elParamType: ::WORD,
368     ulStreamNum: ::ULONG,
369     ullAudioStreamOffset: ::ULONGLONG,
370     wParam: ::WPARAM,
371     lParam: ::LPARAM,
372     ullAudioTimeOffset: ::ULONGLONG,
373 }}
374 ENUM!{enum SPINTERFERENCE {
375     SPINTERFERENCE_NONE = 0,
376     SPINTERFERENCE_NOISE = 1,
377     SPINTERFERENCE_NOSIGNAL = 2,
378     SPINTERFERENCE_TOOLOUD = 3,
379     SPINTERFERENCE_TOOQUIET = 4,
380     SPINTERFERENCE_TOOFAST = 5,
381     SPINTERFERENCE_TOOSLOW = 6,
382     SPINTERFERENCE_LATENCY_WARNING = 7,
383     SPINTERFERENCE_LATENCY_TRUNCATE_BEGIN = 8,
384     SPINTERFERENCE_LATENCY_TRUNCATE_END = 9,
385 }}
386 FLAGS!{enum SPENDSRSTREAMFLAGS {
387     SPESF_NONE = 0,
388     SPESF_STREAM_RELEASED = 1 << 0,
389     SPESF_EMULATED = 1 << 1,
390 }}
391 FLAGS!{enum SPVFEATURE {
392     SPVFEATURE_STRESSED = 1 << 0,
393     SPVFEATURE_EMPHASIS = 1 << 1,
394 }}
395 ENUM!{enum SPVISEMES {
396     SP_VISEME_0 = 0,
397     SP_VISEME_1,
398     SP_VISEME_2,
399     SP_VISEME_3,
400     SP_VISEME_4,
401     SP_VISEME_5,
402     SP_VISEME_6,
403     SP_VISEME_7,
404     SP_VISEME_8,
405     SP_VISEME_9,
406     SP_VISEME_10,
407     SP_VISEME_11,
408     SP_VISEME_12,
409     SP_VISEME_13,
410     SP_VISEME_14,
411     SP_VISEME_15,
412     SP_VISEME_16,
413     SP_VISEME_17,
414     SP_VISEME_18,
415     SP_VISEME_19,
416     SP_VISEME_20,
417     SP_VISEME_21,
418 }}
419 STRUCT!{struct SPEVENTSOURCEINFO {
420     ullEventInterest: ::ULONGLONG,
421     ullQueuedInterest: ::ULONGLONG,
422     ulCount: ::ULONG,
423 }}
424 RIDL!(
425 interface ISpEventSource(ISpEventSourceVtbl): ISpNotifySource(ISpNotifySourceVtbl) {
426     fn SetInterest(
427         &mut self, ullEventInterest: ::ULONGLONG, ullQueuedInterest: ::ULONGLONG
428     ) -> ::HRESULT,
429     fn GetEvents(
430         &mut self, ulCount: ::ULONG, pEventArray: *mut SPEVENT, pulFetched: *mut ::ULONG
431     ) -> ::HRESULT,
432     fn GetInfo(&mut self, pInfo: *mut SPEVENTSOURCEINFO) -> ::HRESULT
433 }
434 );
435 RIDL!(
436 interface ISpEventSource2(ISpEventSource2Vtbl): ISpEventSource(ISpEventSourceVtbl) {
437     fn GetEventsEx(
438         &mut self, ulCount: ::ULONG, pEventArray: *mut SPEVENTEX, pulFetched: *mut ::ULONG
439     ) -> ::HRESULT
440 }
441 );
442 RIDL!(
443 interface ISpEventSink(ISpEventSinkVtbl): IUnknown(IUnknownVtbl) {
444     fn AddEvents(&mut self, pEventArray: *const SPEVENT, ulCount: ::ULONG) -> ::HRESULT,
445     fn GetEventInterest(&mut self, pullEventInterest: *mut ::ULONGLONG) -> ::HRESULT
446 }
447 );
448 RIDL!(
449 interface ISpStreamFormat(ISpStreamFormatVtbl): IStream(IStreamVtbl) {
450     fn GetFormat(
451         &mut self, pguidFormatId: *mut ::GUID, ppCoMemWaveFormatEx: *mut *mut ::WAVEFORMATEX
452     ) -> ::HRESULT
453 }
454 );
455 ENUM!{enum SPFILEMODE {
456     SPFM_OPEN_READONLY = 0,
457     SPFM_OPEN_READWRITE = 1,
458     SPFM_CREATE = 2,
459     SPFM_CREATE_ALWAYS = 3,
460     SPFM_NUM_MODES = 4,
461 }}
462 RIDL!(
463 interface ISpStream(ISpStreamVtbl): ISpStreamFormat(ISpStreamFormatVtbl) {
464     fn SetBaseStream(
465         &mut self, pStream: *mut ::IStream, rguidFormat: ::REFGUID,
466         pWaveFormatEx: *const ::WAVEFORMATEX
467     ) -> ::HRESULT,
468     fn GetBaseStream(&mut self, ppStream: *mut *mut ::IStream) -> ::HRESULT,
469     fn BindToFile(
470         &mut self, pszFileName: ::LPCWSTR, eMode: SPFILEMODE, pFormatId: *const ::GUID,
471         pWaveFormatEx: *const ::WAVEFORMATEX, ullEventInterest: ::ULONGLONG
472     ) -> ::HRESULT,
473     fn Close(&mut self) -> ::HRESULT
474 }
475 );
476 RIDL!(
477 interface ISpStreamFormatConverter(ISpStreamFormatConverterVtbl)
478     : ISpStreamFormat(ISpStreamFormatVtbl) {
479     fn SetBaseStream(
480         &mut self, pStream: *mut ISpStreamFormat, fSetFormatToBaseStreamFormat: ::BOOL,
481         fWriteToBaseStream: ::BOOL
482     ) -> ::HRESULT,
483     fn GetBaseStream(&mut self, ppStream: *mut *mut ISpStreamFormat) -> ::HRESULT,
484     fn SetFormat(
485         &mut self, rguidFormatIdOfConvertedStream: ::REFGUID,
486         pWaveFormatExOfConvertedStream: *const ::WAVEFORMATEX
487     ) -> ::HRESULT,
488     fn ResetSeekPosition(&mut self) -> ::HRESULT,
489     fn ScaleConvertedToBaseOffset(
490         &mut self, ullOffsetConvertedStream: ::ULONGLONG, pullOffsetBaseStream: *mut ::ULONGLONG
491     ) -> ::HRESULT,
492     fn ScaleBaseToConvertedOffset(
493         &mut self, ullOffsetBaseStream: ::ULONGLONG, pullOffsetConvertedStream: *mut ::ULONGLONG
494     ) -> ::HRESULT
495 }
496 );
497 ENUM!{enum SPAUDIOSTATE {
498     SPAS_CLOSED = 0,
499     SPAS_STOP = 1,
500     SPAS_PAUSE = 2,
501     SPAS_RUN = 3,
502 }}
503 STRUCT!{struct SPAUDIOSTATUS {
504     cbFreeBuffSpace: ::LONG,
505     cbNonBlockingIO: ::ULONG,
506     State: SPAUDIOSTATE,
507     CurSeekPos: ::ULONGLONG,
508     CurDevicePos: ::ULONGLONG,
509     dwAudioLevel: ::DWORD,
510     dwReserved2: ::DWORD,
511 }}
512 STRUCT!{struct SPAUDIOBUFFERINFO {
513     ulMsMinNotification: ::ULONG,
514     ulMsBufferSize: ::ULONG,
515     ulMsEventBias: ::ULONG,
516 }}
517 RIDL!(
518 interface ISpAudio(ISpAudioVtbl): ISpStreamFormat(ISpStreamFormatVtbl) {
519     fn SetState(&mut self, NewState: SPAUDIOSTATE, ullReserved: ::ULONGLONG) -> ::HRESULT,
520     fn SetFormat(
521         &mut self, rguidFmtId: ::REFGUID, pWaveFormatEx: *const ::WAVEFORMATEX
522     ) -> ::HRESULT,
523     fn GetStatus(&mut self, pStatus: *mut SPAUDIOSTATUS) -> ::HRESULT,
524     fn SetBufferInfo(&mut self, pBuffInfo: *const SPAUDIOBUFFERINFO) -> ::HRESULT,
525     fn GetBufferInfo(&mut self, pBuffInfo: *mut SPAUDIOBUFFERINFO) -> ::HRESULT,
526     fn GetDefaultFormat(
527         &mut self, pFormatId: *mut ::GUID, ppCoMemWaveFormatEx: *mut *mut ::WAVEFORMATEX
528     ) -> ::HRESULT,
529     fn EventHandle(&mut self) -> ::HANDLE,
530     fn GetVolumeLevel(&mut self, pLevel: *mut ::ULONG) -> ::HRESULT,
531     fn SetVolumeLevel(&mut self, Level: ::ULONG) -> ::HRESULT,
532     fn GetBufferNotifySize(&mut self, pcbSize: *mut ::ULONG) -> ::HRESULT,
533     fn SetBufferNotifySize(&mut self, cbSize: ::ULONG) -> ::HRESULT
534 }
535 );
536 RIDL!(
537 interface ISpMMSysAudio(ISpMMSysAudioVtbl): ISpAudio(ISpAudioVtbl) {
538     fn GetDeviceId(&mut self, puDeviceId: *mut ::UINT) -> ::HRESULT,
539     fn SetDeviceId(&mut self, uDeviceId: ::UINT) -> ::HRESULT,
540     fn GetMMHandle(&mut self, pHandle: *mut *mut ::c_void) -> ::HRESULT,
541     fn GetLineId(&mut self, puLineId: *mut ::UINT) -> ::HRESULT,
542     fn SetLineId(&mut self, uLineId: ::UINT) -> ::HRESULT
543 }
544 );
545 RIDL!(
546 interface ISpTranscript(ISpTranscriptVtbl): IUnknown(IUnknownVtbl) {
547     fn GetTranscript(&mut self, ppszTranscript: *mut ::LPWSTR) -> ::HRESULT,
548     fn AppendTranscript(&mut self, pszTranscript: ::LPCWSTR) -> ::HRESULT
549 }
550 );
551 FLAGS!{enum SPDISPLYATTRIBUTES {
552     SPAF_ONE_TRAILING_SPACE = 0x2,
553     SPAF_TWO_TRAILING_SPACES = 0x4,
554     SPAF_CONSUME_LEADING_SPACES = 0x8,
555     SPAF_BUFFER_POSITION = 0x10,
556     SPAF_ALL = 0x1f,
557     SPAF_USER_SPECIFIED = 0x80,
558 }}
559 pub type SPPHONEID = ::WCHAR;
560 pub type PSPPHONEID = ::LPWSTR;
561 pub type PCSPPHONEID = ::LPCWSTR;
562 STRUCT!{struct SPPHRASEELEMENT {
563     ulAudioTimeOffset: ::ULONG,
564     ulAudioSizeTime: ::ULONG,
565     ulAudioStreamOffset: ::ULONG,
566     ulAudioSizeBytes: ::ULONG,
567     ulRetainedStreamOffset: ::ULONG,
568     ulRetainedSizeBytes: ::ULONG,
569     pszDisplayText: ::LPCWSTR,
570     pszLexicalForm: ::LPCWSTR,
571     pszPronunciation: *const SPPHONEID,
572     bDisplayAttributes: ::BYTE,
573     RequiredConfidence: ::c_char,
574     ActualConfidence: ::c_char,
575     Reserved: ::BYTE,
576     SREngineConfidence: ::c_float,
577 }}
578 STRUCT!{struct SPPHRASERULE {
579     pszName: ::LPCWSTR,
580     ulId: ::ULONG,
581     ulFirstElement: ::ULONG,
582     ulCountOfElements: ::ULONG,
583     pNextSibling: *const SPPHRASERULE,
584     pFirstChild: *const SPPHRASERULE,
585     SREngineConfidence: ::c_float,
586     Confidence: ::c_char,
587 }}
588 ENUM!{enum SPPHRASEPROPERTYUNIONTYPE {
589     SPPPUT_UNUSED = 0,
590     SPPPUT_ARRAY_INDEX,
591 }}
592 STRUCT!{struct SPPHRASEPROPERTY {
593     pszName: ::LPCWSTR,
594     bType: ::BYTE,
595     bReserved: ::BYTE,
596     usArrayIndex: u16,
597     pszValue: ::LPCWSTR,
598     vValue: ::VARIANT,
599     ulFirstElement: ::ULONG,
600     ulCountOfElements: ::ULONG,
601     pNextSibling: *const SPPHRASEPROPERTY,
602     pFirstChild: *const SPPHRASEPROPERTY,
603     SREngineConfidence: ::c_float,
604     Confidence: ::c_char,
605 }}
606 UNION!(SPPHRASEPROPERTY, bType, ulId, ulId_mut, ::ULONG);
607 STRUCT!{struct SPPHRASEREPLACEMENT {
608     bDisplayAttributes: ::BYTE,
609     pszReplacementText: ::LPCWSTR,
610     ulFirstElement: ::ULONG,
611     ulCountOfElements: ::ULONG,
612 }}
613 STRUCT!{struct SPSEMANTICERRORINFO {
614     ulLineNumber: ::ULONG,
615     pszScriptLine: ::LPWSTR,
616     pszSource: ::LPWSTR,
617     pszDescription: ::LPWSTR,
618     hrResultCode: ::HRESULT,
619 }}
620 ENUM!{enum SPSEMANTICFORMAT {
621     SPSMF_SAPI_PROPERTIES = 0,
622     SPSMF_SRGS_SEMANTICINTERPRETATION_MS = 1,
623     SPSMF_SRGS_SAPIPROPERTIES = 2,
624     SPSMF_UPS = 4,
625     SPSMF_SRGS_SEMANTICINTERPRETATION_W3C = 8,
626 }}
627 STRUCT!{struct SPPHRASE_50 {
628     cbSize: ::ULONG,
629     LangID: ::WORD,
630     wHomophoneGroupId: ::WORD,
631     ullGrammarID: ::ULONGLONG,
632     ftStartTime: ::ULONGLONG,
633     ullAudioStreamPosition: ::ULONGLONG,
634     ulAudioSizeBytes: ::ULONG,
635     ulRetainedSizeBytes: ::ULONG,
636     ulAudioSizeTime: ::ULONG,
637     Rule: ::SPPHRASERULE,
638     pProperties: *const ::SPPHRASEPROPERTY,
639     pElements: *const ::SPPHRASEELEMENT,
640     cReplacements: ::ULONG,
641     pReplacements: *const ::SPPHRASEREPLACEMENT,
642     SREngineID: ::GUID,
643     ulSREnginePrivateDataSize: ::ULONG,
644     pSREnginePrivateData: *const ::BYTE,
645 }}
646 STRUCT!{struct SPPHRASE_53 {
647     cbSize: ::ULONG,
648     LangID: ::WORD,
649     wHomophoneGroupId: ::WORD,
650     ullGrammarID: ::ULONGLONG,
651     ftStartTime: ::ULONGLONG,
652     ullAudioStreamPosition: ::ULONGLONG,
653     ulAudioSizeBytes: ::ULONG,
654     ulRetainedSizeBytes: ::ULONG,
655     ulAudioSizeTime: ::ULONG,
656     Rule: ::SPPHRASERULE,
657     pProperties: *const ::SPPHRASEPROPERTY,
658     pElements: *const ::SPPHRASEELEMENT,
659     cReplacements: ::ULONG,
660     pReplacements: *const ::SPPHRASEREPLACEMENT,
661     SREngineID: ::GUID,
662     ulSREnginePrivateDataSize: ::ULONG,
663     pSREnginePrivateData: *const ::BYTE,
664     pSML: ::LPWSTR,
665     pSemanticErrorInfo: *mut SPSEMANTICERRORINFO,
666 }}
667 STRUCT!{struct SPPHRASE {
668     cbSize: ::ULONG,
669     LangID: ::WORD,
670     wHomophoneGroupId: ::WORD,
671     ullGrammarID: ::ULONGLONG,
672     ftStartTime: ::ULONGLONG,
673     ullAudioStreamPosition: ::ULONGLONG,
674     ulAudioSizeBytes: ::ULONG,
675     ulRetainedSizeBytes: ::ULONG,
676     ulAudioSizeTime: ::ULONG,
677     Rule: ::SPPHRASERULE,
678     pProperties: *const ::SPPHRASEPROPERTY,
679     pElements: *const ::SPPHRASEELEMENT,
680     cReplacements: ::ULONG,
681     pReplacements: *const ::SPPHRASEREPLACEMENT,
682     SREngineID: ::GUID,
683     ulSREnginePrivateDataSize: ::ULONG,
684     pSREnginePrivateData: *const ::BYTE,
685     pSML: ::LPWSTR,
686     pSemanticErrorInfo: *mut SPSEMANTICERRORINFO,
687     SemanticTagFormat: SPSEMANTICFORMAT,
688 }}
689 STRUCT!{struct SPSERIALIZEDPHRASE {
690     ulSerializedSize: ::ULONG,
691 }}
692 STRUCT!{struct SPRULE {
693     pszRuleName: ::LPCWSTR,
694     ulRuleId: ::ULONG,
695     dwAttributes: ::DWORD,
696 }}
697 FLAGS!{enum SPVALUETYPE {
698     SPDF_PROPERTY = 0x1,
699     SPDF_REPLACEMENT = 0x2,
700     SPDF_RULE = 0x4,
701     SPDF_DISPLAYTEXT = 0x8,
702     SPDF_LEXICALFORM = 0x10,
703     SPDF_PRONUNCIATION = 0x20,
704     SPDF_AUDIO = 0x40,
705     SPDF_ALTERNATES = 0x80,
706     SPDF_ALL = 0xff,
707 }}
708 STRUCT!{struct SPBINARYGRAMMAR {
709     ulTotalSerializedSize: ::ULONG,
710 }}
711 ENUM!{enum SPPHRASERNG {
712     SPPR_ALL_ELEMENTS = -1i32 as u32,
713 }}
714 pub const SP_GETWHOLEPHRASE: SPPHRASERNG = SPPR_ALL_ELEMENTS;
715 pub const SPRR_ALL_ELEMENTS: SPPHRASERNG = SPPR_ALL_ELEMENTS;
716 DECLARE_HANDLE!(SPSTATEHANDLE, SPSTATEHANDLE__);
717 FLAGS!{enum SPRECOEVENTFLAGS {
718     SPREF_AutoPause = 1 << 0,
719     SPREF_Emulated = 1 << 1,
720     SPREF_SMLTimeout = 1 << 2,
721     SPREF_ExtendableParse = 1 << 3,
722     SPREF_ReSent = 1 << 4,
723     SPREF_Hypothesis = 1 << 5,
724     SPREF_FalseRecognition = 1 << 6,
725 }}
726 ENUM!{enum SPPARTOFSPEECH {
727     SPPS_NotOverriden = -1i32 as u32,
728     SPPS_Unknown = 0,
729     SPPS_Noun = 0x1000,
730     SPPS_Verb = 0x2000,
731     SPPS_Modifier = 0x3000,
732     SPPS_Function = 0x4000,
733     SPPS_Interjection = 0x5000,
734     SPPS_Noncontent = 0x6000,
735     SPPS_LMA = 0x7000,
736     SPPS_SuppressWord = 0xf000,
737 }}
738 FLAGS!{enum SPLEXICONTYPE {
739     eLEXTYPE_USER = 1 << 0,
740     eLEXTYPE_APP = 1 << 1,
741     eLEXTYPE_VENDORLEXICON = 1 << 2,
742     eLEXTYPE_LETTERTOSOUND = 1 << 3,
743     eLEXTYPE_MORPHOLOGY = 1 << 4,
744     eLEXTYPE_RESERVED4 = 1 << 5,
745     eLEXTYPE_USER_SHORTCUT = 1 << 6,
746     eLEXTYPE_RESERVED6 = 1 << 7,
747     eLEXTYPE_RESERVED7 = 1 << 8,
748     eLEXTYPE_RESERVED8 = 1 << 9,
749     eLEXTYPE_RESERVED9 = 1 << 10,
750     eLEXTYPE_RESERVED10 = 1 << 11,
751     eLEXTYPE_PRIVATE1 = 1 << 12,
752     eLEXTYPE_PRIVATE2 = 1 << 13,
753     eLEXTYPE_PRIVATE3 = 1 << 14,
754     eLEXTYPE_PRIVATE4 = 1 << 15,
755     eLEXTYPE_PRIVATE5 = 1 << 16,
756     eLEXTYPE_PRIVATE6 = 1 << 17,
757     eLEXTYPE_PRIVATE7 = 1 << 18,
758     eLEXTYPE_PRIVATE8 = 1 << 19,
759     eLEXTYPE_PRIVATE9 = 1 << 20,
760     eLEXTYPE_PRIVATE10 = 1 << 21,
761     eLEXTYPE_PRIVATE11 = 1 << 22,
762     eLEXTYPE_PRIVATE12 = 1 << 23,
763     eLEXTYPE_PRIVATE13 = 1 << 24,
764     eLEXTYPE_PRIVATE14 = 1 << 25,
765     eLEXTYPE_PRIVATE15 = 1 << 26,
766     eLEXTYPE_PRIVATE16 = 1 << 27,
767     eLEXTYPE_PRIVATE17 = 1 << 28,
768     eLEXTYPE_PRIVATE18 = 1 << 29,
769     eLEXTYPE_PRIVATE19 = 1 << 30,
770     eLEXTYPE_PRIVATE20 = 1 << 31,
771 }}
772 FLAGS!{enum SPWORDTYPE {
773     eWORDTYPE_ADDED = 1 << 0,
774     eWORDTYPE_DELETED = 1 << 1,
775 }}
776 FLAGS!{enum SPPRONUNCIATIONFLAGS {
777     ePRONFLAG_USED = 1 << 0,
778 }}
779 STRUCT!{struct SPWORDPRONUNCIATION {
780     pNextWordPronunciation: *mut SPWORDPRONUNCIATION,
781     eLexiconType: SPLEXICONTYPE,
782     LangID: ::WORD,
783     wPronunciationFlags: ::WORD,
784     ePartOfSpeech: SPPARTOFSPEECH,
785     szPronunciation: [SPPHONEID; 1],
786 }}
787 STRUCT!{struct SPWORDPRONUNCIATIONLIST {
788     ulSize: ::ULONG,
789     pvBuffer: *mut ::BYTE,
790     pFirstWordPronunciation: *mut SPWORDPRONUNCIATION,
791 }}
792 STRUCT!{struct SPWORD {
793     pNextWord: *mut SPWORD,
794     LangID: ::WORD,
795     wReserved: ::WORD,
796     eWordType: SPWORDTYPE,
797     pszWord: ::LPWSTR,
798     pFirstWordPronunciation: *mut SPWORDPRONUNCIATION,
799 }}
800 STRUCT!{struct SPWORDLIST {
801     ulSize: ::ULONG,
802     pvBuffer: *mut ::BYTE,
803     pFirstWord: *mut SPWORD,
804 }}
805 RIDL!(
806 interface ISpLexicon(ISpLexiconVtbl): IUnknown(IUnknownVtbl) {
807     fn GetPronunciations(
808         &mut self, pszWord: ::LPCWSTR, LangID: ::WORD, dwFlags: ::DWORD,
809         pWordPronunciationList: *mut SPWORDPRONUNCIATIONLIST
810     ) -> ::HRESULT,
811     fn AddPronunciation(
812         &mut self, pszWord: ::LPCWSTR, LangID: ::WORD, ePartOfSpeech: SPPARTOFSPEECH,
813         pszPronunciation: PCSPPHONEID
814     ) -> ::HRESULT,
815     fn RemovePronunciation(
816         &mut self, pszWord: ::LPCWSTR, LangID: ::WORD, ePartOfSpeech: SPPARTOFSPEECH,
817         pszPronunciation: PCSPPHONEID
818     ) -> ::HRESULT,
819     fn GetGeneration(&mut self, pdwGeneration: *mut ::DWORD) -> ::HRESULT,
820     fn GetGenerationChange(
821         &mut self, dwFlags: ::DWORD, pdwGeneration: *mut ::DWORD, pWordList: *mut SPWORDLIST
822     ) -> ::HRESULT,
823     fn GetWords(
824         &mut self, dwFlags: ::DWORD, pdwGeneration: *mut ::DWORD, pdwCookie: *mut ::DWORD,
825         pWordList: *mut SPWORDLIST
826     ) -> ::HRESULT
827 }
828 );
829 RIDL!(
830 interface ISpContainerLexicon(ISpContainerLexiconVtbl): ISpLexicon(ISpLexiconVtbl) {
831     fn AddLexicon(&mut self, pAddLexicon: *mut ISpLexicon, dwFlags: ::DWORD) -> ::HRESULT
832 }
833 );
834 ENUM!{enum SPSHORTCUTTYPE {
835     SPSHT_NotOverriden = -1i32 as u32,
836     SPSHT_Unknown = 0,
837     SPSHT_EMAIL = 0x1000,
838     SPSHT_OTHER = 0x2000,
839     SPPS_RESERVED1 = 0x3000,
840     SPPS_RESERVED2 = 0x4000,
841     SPPS_RESERVED3 = 0x5000,
842     SPPS_RESERVED4 = 0xf000,
843 }}
844 STRUCT!{struct SPSHORTCUTPAIR {
845     pNextSHORTCUTPAIR: *mut SPSHORTCUTPAIR,
846     LangID: ::WORD,
847     shType: SPSHORTCUTTYPE,
848     pszDisplay: ::LPWSTR,
849     pszSpoken: ::LPWSTR,
850 }}
851 STRUCT!{struct SPSHORTCUTPAIRLIST {
852     ulSize: ::ULONG,
853     pvBuffer: *mut ::BYTE,
854     pFirstShortcutPair: *mut SPSHORTCUTPAIR,
855 }}
856 RIDL!(
857 interface ISpShortcut(ISpShortcutVtbl): IUnknown(IUnknownVtbl) {
858     fn AddShortcut(
859         &mut self, pszDisplay: ::LPCWSTR, LangID: ::WORD, pszSpoken: ::LPCWSTR,
860         shType: SPSHORTCUTTYPE
861     ) -> ::HRESULT,
862     fn RemoveShortcut(
863         &mut self, pszDisplay: ::LPCWSTR, LangID: ::WORD, pszSpoken: ::LPCWSTR,
864         shType: SPSHORTCUTTYPE
865     ) -> ::HRESULT,
866     fn GetShortcuts(
867         &mut self, LangId: ::WORD, pShortcutpairList: *mut SPSHORTCUTPAIRLIST
868     ) -> ::HRESULT,
869     fn GetGeneration(&mut self, pdwGeneration: *mut ::DWORD) -> ::HRESULT,
870     fn GetWordsFromGenerationChange(
871         &mut self, pdwGeneration: *mut ::DWORD, pWordList: *mut SPWORDLIST
872     ) -> ::HRESULT,
873     fn GetWords(
874         &mut self, pdwGeneration: *mut ::DWORD, pdwCookie: *mut ::DWORD, pWordList: *mut SPWORDLIST
875     ) -> ::HRESULT,
876     fn GetShortcutsForGeneration(
877         &mut self, pdwGeneration: *mut ::DWORD, pdwCookie: *mut ::DWORD,
878         pShortcutpairList: *mut SPSHORTCUTPAIRLIST
879     ) -> ::HRESULT,
880     fn GetGenerationChange(
881         &mut self, pdwGeneration: *mut ::DWORD, pShortcutpairList: *mut SPSHORTCUTPAIRLIST
882     ) -> ::HRESULT
883 }
884 );
885 RIDL!(
886 interface ISpPhoneConverter(ISpPhoneConverterVtbl): ISpObjectWithToken(ISpObjectWithTokenVtbl) {
887     fn PhoneToId(&mut self, pszPhone: ::LPCWSTR, pId: *mut SPPHONEID) -> ::HRESULT,
888     fn IdToPhone(&mut self, pId: PCSPPHONEID, pszPhone: *mut ::WCHAR) -> ::HRESULT
889 }
890 );
891 RIDL!(
892 interface ISpPhoneticAlphabetConverter(ISpPhoneticAlphabetConverterVtbl): IUnknown(IUnknownVtbl) {
893     fn GetLangId(&mut self, pLangID: *mut ::WORD) -> ::HRESULT,
894     fn SetLangId(&mut self, LangID: *mut ::WORD) -> ::HRESULT,
895     fn SAPI2UPS(
896         &mut self, pszSAPIId: *const SPPHONEID, pszUPSId: *mut SPPHONEID, cMaxLength: ::DWORD
897     ) -> ::HRESULT,
898     fn UPS2SAPI(
899         &mut self, pszUPSId: *const SPPHONEID, pszSAPIId: *mut SPPHONEID, cMaxLength: ::DWORD
900     ) -> ::HRESULT,
901     fn GetMaxConvertLength(
902         &mut self, cSrcLength: ::DWORD, bSAPI2UPS: ::BOOL, pcMaxDestLength: *mut ::DWORD
903     ) -> ::HRESULT
904 }
905 );
906 RIDL!(
907 interface ISpPhoneticAlphabetSelection(ISpPhoneticAlphabetSelectionVtbl): IUnknown(IUnknownVtbl) {
908     fn IsAlphabetUPS(&mut self, pfIsUPS: *mut ::BOOL) -> ::HRESULT,
909     fn SetAlphabetToUPS(&mut self, fForceUPS: ::BOOL) -> ::HRESULT
910 }
911 );
912 STRUCT!{struct SPVPITCH {
913     MiddleAdj: ::c_long,
914     RangeAdj: ::c_long,
915 }}
916 ENUM!{enum SPVACTIONS {
917     SPVA_Speak = 0,
918     SPVA_Silence,
919     SPVA_Pronounce,
920     SPVA_Bookmark,
921     SPVA_SpellOut,
922     SPVA_Section,
923     SPVA_ParseUnknownTag,
924 }}
925 STRUCT!{struct SPVCONTEXT {
926     pCategory: ::LPCWSTR,
927     pBefore: ::LPCWSTR,
928     pAfter: ::LPCWSTR,
929 }}
930 STRUCT!{struct SPVSTATE {
931     eAction: SPVACTIONS,
932     LangID: ::WORD,
933     wReserved: ::WORD,
934     EmphAdj: ::c_long,
935     RateAdj: ::c_long,
936     Volume: ::ULONG,
937     PitchAdj: SPVPITCH,
938     SilenceMSecs: ::ULONG,
939     pPhoneIds: *mut SPPHONEID,
940     ePartOfSpeech: SPPARTOFSPEECH,
941     Context: SPVCONTEXT,
942 }}
943 ENUM!{enum SPRUNSTATE {
944     SPRS_DONE = 1 << 0,
945     SPRS_IS_SPEAKING = 1 << 1,
946 }}
947 ENUM!{enum SPVLIMITS {
948     SPMIN_VOLUME = 0,
949     SPMAX_VOLUME = 100,
950     SPMIN_RATE = -10i32 as u32,
951     SPMAX_RATE = 10,
952 }}
953 ENUM!{enum SPVPRIORITY {
954     SPVPRI_NORMAL = 0,
955     SPVPRI_ALERT = 1 << 0,
956     SPVPRI_OVER = 1 << 1,
957 }}
958 STRUCT!{struct SPVOICESTATUS {
959     ulCurrentStream: ::ULONG,
960     ulLastStreamQueued: ::ULONG,
961     hrLastResult: ::HRESULT,
962     dwRunningState: ::DWORD,
963     ulInputWordPos: ::ULONG,
964     ulInputWordLen: ::ULONG,
965     ulInputSentPos: ::ULONG,
966     ulInputSentLen: ::ULONG,
967     lBookmarkId: ::LONG,
968     PhonemeId: SPPHONEID,
969     VisemeId: SPVISEMES,
970     dwReserved1: ::DWORD,
971     dwReserved2: ::DWORD,
972 }}
973 FLAGS!{enum SPEAKFLAGS {
974     SPF_DEFAULT = 0,
975     SPF_ASYNC = 1 << 0,
976     SPF_PURGEBEFORESPEAK = 1 << 1,
977     SPF_IS_FILENAME = 1 << 2,
978     SPF_IS_XML = 1 << 3,
979     SPF_IS_NOT_XML = 1 << 4,
980     SPF_PERSIST_XML = 1 << 5,
981     SPF_NLP_SPEAK_PUNC = 1 << 6,
982     SPF_PARSE_SAPI = 1 << 7,
983     SPF_PARSE_SSML = 1 << 8,
984 }}
985 pub const SPF_PARSE_AUTODETECT: SPEAKFLAGS = SPF_DEFAULT;
986 pub const SPF_NLP_MASK: SPEAKFLAGS = SPF_NLP_SPEAK_PUNC;
987 pub const SPF_PARSE_MASK: i32 = SPF_PARSE_SAPI.0 as i32 | SPF_PARSE_SSML.0 as i32;
988 pub const SPF_VOICE_MASK: i32 =
989     SPF_ASYNC.0 as i32 | SPF_PURGEBEFORESPEAK.0 as i32 | SPF_IS_FILENAME.0 as i32 | SPF_IS_XML.0 as i32 |
990     SPF_IS_NOT_XML.0 as i32 | SPF_NLP_MASK.0 as i32 | SPF_PERSIST_XML.0 as i32 | SPF_PARSE_MASK;
991 pub const SPF_UNUSED_FLAGS: i32 = !SPF_VOICE_MASK;
992 RIDL!(
993 interface ISpVoice(ISpVoiceVtbl): ISpEventSource(ISpEventSourceVtbl) {
994     fn SetOutput(&mut self, pUnkOutput: *mut ::IUnknown, fAllowFormatChanges: ::BOOL) -> ::HRESULT,
995     fn GetOutputObjectToken(&mut self, ppObjectToken: *mut *mut ISpObjectToken) -> ::HRESULT,
996     fn GetOutputStream(&mut self, ppStream: *mut *mut ISpStreamFormat) -> ::HRESULT,
997     fn Pause(&mut self) -> ::HRESULT,
998     fn Resume(&mut self) -> ::HRESULT,
999     fn SetVoice(&mut self, pToken: *mut ISpObjectToken) -> ::HRESULT,
1000     fn GetVoice(&mut self, ppToken: *mut *mut ISpObjectToken) -> ::HRESULT,
1001     fn Speak(
1002         &mut self, pwcs: ::LPCWSTR, dwFlags: ::DWORD, pulStreamNumber: *mut ::ULONG
1003     ) -> ::HRESULT,
1004     fn SpeakStream(
1005         &mut self, pStream: *mut ::IStream, dwFlags: ::DWORD, pulStreamNumber: *mut ::ULONG
1006     ) -> ::HRESULT,
1007     fn GetStatus(
1008         &mut self, pStatus: *mut SPVOICESTATUS, ppszLastBookmark: *mut ::LPWSTR
1009     ) -> ::HRESULT,
1010     fn Skip(
1011         &mut self, pItemType: ::LPCWSTR, lNumItems: ::c_long, pulNumSkipped: *mut ::ULONG
1012     ) -> ::HRESULT,
1013     fn SetPriority(&mut self, ePriority: SPVPRIORITY) -> ::HRESULT,
1014     fn GetPriority(&mut self, pePriority: *mut SPVPRIORITY) -> ::HRESULT,
1015     fn SetAlertBoundary(&mut self, eBoundary: SPEVENTENUM) -> ::HRESULT,
1016     fn GetAlertBoundary(&mut self, peBoundary: *mut SPEVENTENUM) -> ::HRESULT,
1017     fn SetRate(&mut self, RateAdjust: ::c_long) -> ::HRESULT,
1018     fn GetRate(&mut self, pRateAdjust: *mut ::c_long) -> ::HRESULT,
1019     fn SetVolume(&mut self, usVolume: ::USHORT) -> ::HRESULT,
1020     fn GetVolume(&mut self, pusVolume: *mut ::USHORT) -> ::HRESULT,
1021     fn WaitUntilDone(&mut self, msTimeout: ::ULONG) -> ::HRESULT,
1022     fn SetSyncSpeakTimeout(&mut self, msTimeout: ::ULONG) -> ::HRESULT,
1023     fn GetSyncSpeakTimeout(&mut self, pmsTimeout: *mut ::ULONG) -> ::HRESULT,
1024     fn SpeakCompleteEvent(&mut self) -> ::HANDLE,
1025     fn IsUISupported(
1026         &mut self, pszTypeOfUI: ::LPCWSTR, pvExtraData: *mut ::c_void, cbExtraData: ::ULONG,
1027         pfSupported: *mut ::BOOL
1028     ) -> ::HRESULT,
1029     fn DisplayUI(
1030         &mut self, hwndParent: ::HWND, pszTitle: ::LPCWSTR, pszTypeOfUI: ::LPCWSTR,
1031         pvExtraData: *mut ::c_void, cbExtraData: ::ULONG
1032     ) -> ::HRESULT
1033 }
1034 );
1035 DEFINE_GUID!(
1036     UuidOfISpVoice,
1037     0x6C44DF74, 0x72B9, 0x4992, 0xA1, 0xEC, 0xEF, 0x99, 0x6E, 0x04, 0x22, 0xD4
1038 );
1039 RIDL!(
1040 interface ISpPhrase(ISpPhraseVtbl): IUnknown(IUnknownVtbl) {
1041     fn GetPhrase(&mut self, ppCoMemPhrase: *mut *mut SPPHRASE) -> ::HRESULT,
1042     fn GetSerializedPhrase(&mut self, ppCoMemPhrase: *mut *mut SPSERIALIZEDPHRASE) -> ::HRESULT,
1043     fn GetText(
1044         &mut self, ulStart: ::ULONG, ulCount: ::ULONG, fUseTextReplacements: ::BOOL,
1045         ppszCoMemText: *mut ::LPWSTR, pbDisplayAttributes: *mut ::BYTE
1046     ) -> ::HRESULT,
1047     fn Discard(&mut self, dwValueTypes: ::DWORD) -> ::HRESULT
1048 }
1049 );
1050 RIDL!(
1051 interface ISpPhraseAlt(ISpPhraseAltVtbl): ISpPhrase(ISpPhraseVtbl) {
1052     fn GetAltInfo(
1053         &mut self, pParent: *mut *mut ISpPhrase, pulStartElementInParent: *mut ::ULONG,
1054         pcElementsInParent: *mut ::ULONG, pcElementsInAlt: *mut ::ULONG
1055     ) -> ::HRESULT,
1056     fn Commit(&mut self) -> ::HRESULT
1057 }
1058 );
1059 ENUM!{enum SPXMLRESULTOPTIONS {
1060     SPXRO_SML = 0,
1061     SPXRO_Alternates_SML = 1,
1062 }}
1063 RIDL!(
1064 interface ISpPhrase2(ISpPhrase2Vtbl): ISpPhrase(ISpPhraseVtbl) {
1065     fn GetXMLResult(
1066         &mut self, ppszCoMemXMLResult: *mut ::LPWSTR, Options: SPXMLRESULTOPTIONS
1067     ) -> ::HRESULT,
1068     fn GetXMLErrorInfo(&mut self, pSemanticErrorInfo: *mut SPSEMANTICERRORINFO) -> ::HRESULT,
1069     fn GetAudio(
1070         &mut self, ulStartElement: ::ULONG, cElements: ::ULONG, ppStream: *mut *mut ISpStreamFormat
1071     ) -> ::HRESULT
1072 }
1073 );
1074 STRUCT!{struct SPRECORESULTTIMES {
1075     ftStreamTime: ::FILETIME,
1076     ullLength: ::ULONGLONG,
1077     dwTickCount: ::DWORD,
1078     ullStart: ::ULONGLONG,
1079 }}
1080 STRUCT!{struct SPSERIALIZEDRESULT {
1081     ulSerializedSize: ::ULONG,
1082 }}
1083 RIDL!(
1084 interface ISpRecoResult(ISpRecoResultVtbl): ISpPhrase(ISpPhraseVtbl) {
1085     fn GetResultTimes(&mut self, pTimes: *mut SPRECORESULTTIMES) -> ::HRESULT,
1086     fn GetAlternates(
1087         &mut self, ulStartElement: ::ULONG, cElements: ::ULONG, ulRequestCount: ::ULONG,
1088         ppPhrases: *mut *mut ISpPhraseAlt, pcPhrasesReturned: *mut ::ULONG
1089     ) -> ::HRESULT,
1090     fn GetAudio(
1091         &mut self, ulStartElement: ::ULONG, cElements: ::ULONG, ppStream: *mut *mut ISpStreamFormat
1092     ) -> ::HRESULT,
1093     fn SpeakAudio(
1094         &mut self, ulStartElement: ::ULONG, cElements: ::ULONG, dwFlags: ::DWORD,
1095         pulStreamNumber: *mut ::ULONG
1096     ) -> ::HRESULT,
1097     fn Serialize(&mut self, ppCoMemSerializedResult: *mut *mut SPSERIALIZEDRESULT) -> ::HRESULT,
1098     fn ScaleAudio(
1099         &mut self, pAudioFormatId: *const ::GUID, pWaveFormatEx: *const ::WAVEFORMATEX
1100     ) -> ::HRESULT,
1101     fn GetRecoContext(&mut self, ppRecoContext: *mut *mut ISpRecoContext) -> ::HRESULT
1102 }
1103 );
1104 FLAGS!{enum SPCOMMITFLAGS {
1105     SPCF_NONE = 0,
1106     SPCF_ADD_TO_USER_LEXICON = 1 << 0,
1107     SPCF_DEFINITE_CORRECTION = 1 << 1,
1108 }}
1109 RIDL!(
1110 interface ISpRecoResult2(ISpRecoResult2Vtbl): ISpRecoResult(ISpRecoResultVtbl) {
1111     fn CommitAlternate(
1112         &mut self, pPhraseAlt: *mut ISpPhraseAlt, ppNewResult: *mut *mut ISpRecoResult
1113     ) -> ::HRESULT,
1114     fn CommitText(
1115         &mut self, ulStartElement: ::ULONG, cElements: ::ULONG, pszCorrectedData: ::LPCWSTR,
1116         eCommitFlags: ::DWORD
1117     ) -> ::HRESULT,
1118     fn SetTextFeedback(&mut self, pszFeedback: ::LPCWSTR, fSuccessful: ::BOOL) -> ::HRESULT
1119 }
1120 );
1121 RIDL!(
1122 interface ISpXMLRecoResult(ISpXMLRecoResultVtbl): ISpRecoResult(ISpRecoResultVtbl) {
1123     fn GetXMLResult(
1124         &mut self, ppszCoMemXMLResult: *mut ::LPWSTR, Options: SPXMLRESULTOPTIONS
1125     ) -> ::HRESULT,
1126     fn GetXMLErrorInfo(&mut self, pSemanticErrorInfo: *mut SPSEMANTICERRORINFO) -> ::HRESULT
1127 }
1128 );
1129 STRUCT!{struct SPTEXTSELECTIONINFO {
1130     ulStartActiveOffset: ::ULONG,
1131     cchActiveChars: ::ULONG,
1132     ulStartSelection: ::ULONG,
1133     cchSelection: ::ULONG,
1134 }}
1135 ENUM!{enum SPWORDPRONOUNCEABLE {
1136     SPWP_UNKNOWN_WORD_UNPRONOUNCEABLE = 0,
1137     SPWP_UNKNOWN_WORD_PRONOUNCEABLE = 1,
1138     SPWP_KNOWN_WORD_PRONOUNCEABLE = 2,
1139 }}
1140 ENUM!{enum SPGRAMMARSTATE {
1141     SPGS_DISABLED = 0,
1142     SPGS_ENABLED = 1,
1143     SPGS_EXCLUSIVE = 3,
1144 }}
1145 ENUM!{enum SPCONTEXTSTATE {
1146     SPCS_DISABLED = 0,
1147     SPCS_ENABLED = 1,
1148 }}
1149 ENUM!{enum SPRULESTATE {
1150     SPRS_INACTIVE = 0,
1151     SPRS_ACTIVE = 1,
1152     SPRS_ACTIVE_WITH_AUTO_PAUSE = 3,
1153     SPRS_ACTIVE_USER_DELIMITED = 4,
1154 }}
1155 pub const SP_STREAMPOS_ASAP: ::INT = 0;
1156 pub const SP_STREAMPOS_REALTIME: ::INT = -1;
1157 pub const SPRULETRANS_TEXTBUFFER: SPSTATEHANDLE = -1isize as SPSTATEHANDLE;
1158 pub const SPRULETRANS_WILDCARD: SPSTATEHANDLE = -2isize as SPSTATEHANDLE;
1159 pub const SPRULETRANS_DICTATION: SPSTATEHANDLE = -3isize as SPSTATEHANDLE;
1160 ENUM!{enum SPGRAMMARWORDTYPE {
1161     SPWT_DISPLAY = 0,
1162     SPWT_LEXICAL = 1,
1163     SPWT_PRONUNCIATION = 2,
1164     SPWT_LEXICAL_NO_SPECIAL_CHARS = 3,
1165 }}
1166 STRUCT!{struct SPPROPERTYINFO {
1167     pszName: ::LPCWSTR,
1168     ulId: ::ULONG,
1169     pszValue: ::LPCWSTR,
1170     vValue: ::VARIANT,
1171 }}
1172 FLAGS!{enum SPCFGRULEATTRIBUTES {
1173     SPRAF_TopLevel = 1 << 0,
1174     SPRAF_Active = 1 << 1,
1175     SPRAF_Export = 1 << 2,
1176     SPRAF_Import = 1 << 3,
1177     SPRAF_Interpreter = 1 << 4,
1178     SPRAF_Dynamic = 1 << 5,
1179     SPRAF_Root = 1 << 6,
1180     SPRAF_AutoPause = 1 << 16,
1181     SPRAF_UserDelimited = 1 << 17,
1182 }}
1183 RIDL!(
1184 interface ISpGrammarBuilder(ISpGrammarBuilderVtbl): IUnknown(IUnknownVtbl) {
1185     fn ResetGrammar(&mut self, NewLanguage: ::WORD) -> ::HRESULT,
1186     fn GetRule(
1187         &mut self, pszRuleName: ::LPCWSTR, dwRuleId: ::DWORD, dwAttributes: ::DWORD,
1188         fCreateIfNotExist: ::BOOL, phInitialState: *mut SPSTATEHANDLE
1189     ) -> ::HRESULT,
1190     fn ClearRule(&mut self, hState: SPSTATEHANDLE) -> ::HRESULT,
1191     fn CreateNewState(&mut self, hState: SPSTATEHANDLE, phState: *mut SPSTATEHANDLE) -> ::HRESULT,
1192     fn AddWordTransition(
1193         &mut self, hFromState: SPSTATEHANDLE, hToState: SPSTATEHANDLE, psz: ::LPCWSTR,
1194         pszSeparators: ::LPCWSTR, eWordType: SPGRAMMARWORDTYPE, Weight: ::c_float,
1195         pPropInfo: *const SPPROPERTYINFO
1196     ) -> ::HRESULT,
1197     fn AddRuleTransition(
1198         &mut self, hFromState: SPSTATEHANDLE, hToState: SPSTATEHANDLE, hRule: SPSTATEHANDLE,
1199         Weight: ::c_float, pPropInfo: *const SPPROPERTYINFO
1200     ) -> ::HRESULT,
1201     fn AddResource(
1202         &mut self, hRuleState: SPSTATEHANDLE, pszResourceName: ::LPCWSTR,
1203         pszResourceValue: ::LPCWSTR
1204     ) -> ::HRESULT,
1205     fn Commit(&mut self, dwReserved: ::DWORD) -> ::HRESULT
1206 }
1207 );
1208 ENUM!{enum SPLOADOPTIONS {
1209     SPLO_STATIC = 0,
1210     SPLO_DYNAMIC = 1,
1211 }}
1212 RIDL!(
1213 interface ISpRecoGrammar(ISpRecoGrammarVtbl): ISpGrammarBuilder(ISpGrammarBuilderVtbl) {
1214     fn GetGrammarId(&mut self, pullGrammarId: *mut ::ULONGLONG) -> ::HRESULT,
1215     fn GetRecoContext(&mut self, ppRecoCtxt: *mut *mut ISpRecoContext) -> ::HRESULT,
1216     fn LoadCmdFromFile(&mut self, pszFileName: ::LPCWSTR, Options: SPLOADOPTIONS) -> ::HRESULT,
1217     fn LoadCmdFromObject(
1218         &mut self, rcid: ::REFCLSID, pszGrammarName: ::LPCWSTR, Options: SPLOADOPTIONS
1219     ) -> ::HRESULT,
1220     fn LoadCmdFromResource(
1221         &mut self, hModule: ::HMODULE, pszResourceName: ::LPCWSTR, pszResourceType: ::LPCWSTR,
1222         wLanguage: ::WORD, Options: SPLOADOPTIONS
1223     ) -> ::HRESULT,
1224     fn LoadCmdFromMemory(
1225         &mut self, pGrammar: *const SPBINARYGRAMMAR, Options: SPLOADOPTIONS
1226     ) -> ::HRESULT,
1227     fn LoadCmdFromProprietaryGrammar(
1228         &mut self, rguidParam: ::REFGUID, pszStringParam: ::LPCWSTR, pvDataPrarm: *const ::c_void,
1229         cbDataSize: ::ULONG, Options: SPLOADOPTIONS
1230     ) -> ::HRESULT,
1231     fn SetRuleState(
1232         &mut self, pszName: ::LPCWSTR, pReserved: *mut ::c_void, NewState: SPRULESTATE
1233     ) -> ::HRESULT,
1234     fn SetRuleIdState(&mut self, ulRuleId: ::ULONG, NewState: SPRULESTATE) -> ::HRESULT,
1235     fn LoadDictation(&mut self, pszTopicName: ::LPCWSTR, Options: SPLOADOPTIONS) -> ::HRESULT,
1236     fn UnloadDictation(&mut self) -> ::HRESULT,
1237     fn SetDictationState(&mut self, NewState: SPRULESTATE) -> ::HRESULT,
1238     fn SetWordSequenceData(
1239         &mut self, pText: *const ::WCHAR, cchText: ::ULONG, pInfo: *const SPTEXTSELECTIONINFO
1240     ) -> ::HRESULT,
1241     fn SetTextSelection(&mut self, pInfo: *const SPTEXTSELECTIONINFO) -> ::HRESULT,
1242     fn IsPronounceable(
1243         &mut self, pszWord: ::LPCWSTR, pWordPronounceable: *mut SPWORDPRONOUNCEABLE
1244     ) -> ::HRESULT,
1245     fn SetGrammarState(&mut self, eGrammarState: SPGRAMMARSTATE) -> ::HRESULT,
1246     fn SaveCmd(&mut self, pStream: *mut ::IStream, ppszCoMemErrorText: *mut ::LPWSTR) -> ::HRESULT,
1247     fn GetGrammarState(&mut self, peGrammarState: *mut SPGRAMMARSTATE) -> ::HRESULT
1248 }
1249 );
1250 ENUM!{enum SPMATCHINGMODE {
1251     AllWords = 0,
1252     Subsequence = 1,
1253     OrderedSubset = 3,
1254     SubsequenceContentRequired = 5,
1255     OrderedSubsetContentRequired = 7,
1256 }}
1257 ENUM!{enum PHONETICALPHABET {
1258     PA_Ipa = 0,
1259     PA_Ups = 1,
1260     PA_Sapi = 2,
1261 }}
1262 RIDL!(
1263 interface ISpGrammarBuilder2(ISpGrammarBuilder2Vtbl): IUnknown(IUnknownVtbl) {
1264     fn AddTextSubset(
1265         &mut self, hFromState: SPSTATEHANDLE, hToState: SPSTATEHANDLE, psz: ::LPCWSTR,
1266         eMatchMode: SPMATCHINGMODE
1267     ) -> ::HRESULT,
1268     fn SetPhoneticAlphabet(&mut self, phoneticALphabet: PHONETICALPHABET) -> ::HRESULT
1269 }
1270 );
1271 RIDL!(
1272 interface ISpRecoGrammar2(ISpRecoGrammar2Vtbl): IUnknown(IUnknownVtbl) {
1273     fn GetRules(&mut self, ppCoMemRules: *mut *mut SPRULE, puNumRules: *mut ::UINT) -> ::HRESULT,
1274     fn LoadCmdFromFile2(
1275         &mut self, pszFileName: ::LPCWSTR, Options: SPLOADOPTIONS, pszSharingUri: ::LPCWSTR,
1276         pszBaseUri: ::LPCWSTR
1277     ) -> ::HRESULT,
1278     fn LoadCmdFromMemory2(
1279         &mut self, pGrammar: *const SPBINARYGRAMMAR, Options: SPLOADOPTIONS,
1280         pszSharingUri: ::LPCWSTR, pszBaseUri: ::LPCWSTR
1281     ) -> ::HRESULT,
1282     fn SetRulePriority(
1283         &mut self, pszRuleName: ::LPCWSTR, ulRuleId: ::ULONG, nRulePriority: ::c_int
1284     ) -> ::HRESULT,
1285     fn SetRuleWeight(
1286         &mut self, pszRuleName: ::LPCWSTR, ulRuleId: ::ULONG, flWeight: ::c_float
1287     ) -> ::HRESULT,
1288     fn SetDictationWeight(&mut self, flWeight: ::c_float) -> ::HRESULT,
1289     fn SetGrammarLoader(&mut self, pLoader: *mut ISpeechResourceLoader) -> ::HRESULT,
1290     fn SetSMLSecurityManager(
1291         &mut self, pSMLSecurityManager: *mut ::IInternetSecurityManager
1292     ) -> ::HRESULT
1293 }
1294 );
1295 RIDL!(
1296 interface ISpeechResourceLoader(ISpeechResourceLoaderVtbl): IDispatch(IDispatchVtbl) {
1297     fn LoadResource(
1298         &mut self, bstrResourceUri: ::BSTR, fAlwaysReload: ::VARIANT_BOOL,
1299         pStream: *mut *mut ::IUnknown, pbstrMIMEType: *mut ::BSTR, pfModified: *mut ::VARIANT_BOOL,
1300         pbstrRedirectUrl: *mut ::BSTR
1301     ) -> ::HRESULT,
1302     fn GetLocalCopy(
1303         &mut self, bstrResourceUri: ::BSTR, pbstrLocalPath: *mut ::BSTR,
1304         pbstrMIMEType: *mut ::BSTR, pbstrRedirectUrl: *mut ::BSTR
1305     ) -> ::HRESULT,
1306     fn ReleaseLocalCopy(&mut self, pbstrLocalPath: ::BSTR) -> ::HRESULT
1307 }
1308 );
1309 STRUCT!{nodebug struct SPRECOCONTEXTSTATUS {
1310     eInterference: SPINTERFERENCE,
1311     szRequestTypeOfUI: [::WCHAR; 255],
1312     dwReserved1: ::DWORD,
1313     dwReserved2: ::DWORD,
1314 }}
1315 FLAGS!{enum SPBOOKMARKOPTIONS {
1316     SPBO_NONE = 0,
1317     SPBO_PAUSE = 1 << 0,
1318     SPBO_AHEAD = 1 << 1,
1319     SPBO_TIME_UNITS = 1 << 2,
1320 }}
1321 FLAGS!{enum SPAUDIOOPTIONS {
1322     SPAO_NONE = 0,
1323     SPAO_RETAIN_AUDIO = 1 << 0,
1324 }}
1325 RIDL!(
1326 interface ISpRecoContext(ISpRecoContextVtbl): ISpEventSource(ISpEventSourceVtbl) {
1327     fn GetRecognizer(&mut self, ppRecognizer: *mut *mut ISpRecognizer) -> ::HRESULT,
1328     fn CreateGrammer(
1329         &mut self, ullGrammarId: ::ULONGLONG, ppGrammar: *mut *mut ISpRecoGrammar
1330     ) -> ::HRESULT,
1331     fn GetStatus(&mut self, pState: *mut SPRECOCONTEXTSTATUS) -> ::HRESULT,
1332     fn GetMaxAlternates(&mut self, pcAlternates: *mut ::ULONG) -> ::HRESULT,
1333     fn SetMaxAlternates(&mut self, cAlternates: ::ULONG) -> ::HRESULT,
1334     fn SetAudioOptions(
1335         &mut self, Options: SPAUDIOOPTIONS, pAudioFormatId: *const ::GUID,
1336         pWaveFormatEx: *const ::WAVEFORMATEX
1337     ) -> ::HRESULT,
1338     fn GetAudioOptions(
1339         &mut self, pOptions: *mut SPAUDIOOPTIONS, pAudioFormatId: *mut ::GUID,
1340         ppCoMemWFEX: *mut *mut ::WAVEFORMATEX
1341     ) -> ::HRESULT,
1342     fn DeserializeResult(
1343         &mut self, pSerializedResult: *const SPSERIALIZEDRESULT, ppResult: *mut *mut ISpRecoResult
1344     ) -> ::HRESULT,
1345     fn Bookmark(
1346         &mut self, Options: SPBOOKMARKOPTIONS, ullStreamPosition: ::ULONGLONG,
1347         lparamEvent: ::LPARAM
1348     ) -> ::HRESULT,
1349     fn SetAdaptionData(&mut self, pAdaptionData: ::LPCWSTR, cch: ::ULONG) -> ::HRESULT,
1350     fn Pause(&mut self, dwReserved: ::DWORD) -> ::HRESULT,
1351     fn Resume(&mut self, dwReserved: ::DWORD) -> ::HRESULT,
1352     fn SetVoice(&mut self, pVoice: *mut ISpVoice, fAllowFormatChanges: ::BOOL) -> ::HRESULT,
1353     fn GetVoice(&mut self, ppVoice: *mut *mut ISpVoice) -> ::HRESULT,
1354     fn SetVoicePurgeEvent(&mut self, ullEventIntereset: ::ULONGLONG) -> ::HRESULT,
1355     fn GetVoicePurgeEvent(&mut self, pullEventIntereset: *mut ::ULONGLONG) -> ::HRESULT,
1356     fn SetContextState(&mut self, eContextState: SPCONTEXTSTATE) -> ::HRESULT,
1357     fn GetContextState(&mut self, peContextState: *mut SPCONTEXTSTATE) -> ::HRESULT
1358 }
1359 );
1360 FLAGS!{enum SPGRAMMAROPTIONS {
1361     SPGO_SAPI = 0x1,
1362     SPGO_SRGS = 0x2,
1363     SPGO_UPS = 0x4,
1364     SPGO_SRGS_MS_SCRIPT = 0x8,
1365     SPGO_SRGS_W3C_SCRIPT = 0x100,
1366     SPGO_SRGS_STG_SCRIPT = 0x200,
1367     SPGO_SRGS_SCRIPT =
1368         SPGO_SRGS.0 | SPGO_SRGS_MS_SCRIPT.0 | SPGO_SRGS_W3C_SCRIPT.0 |
1369              SPGO_SRGS_STG_SCRIPT.0,
1370     SPGO_FILE = 0x10,
1371     SPGO_HTTP = 0x20,
1372     SPGO_RES = 0x40,
1373     SPGO_OBJECT = 0x80,
1374     SPGO_DEFAULT = 0x3fb,
1375     SPGO_ALL = 0x3ff,
1376 }}
1377 FLAGS!{enum SPADAPTATIONSETTINGS {
1378     SPADS_Default = 0,
1379     SPADS_CurrentRecognizer = 0x1,
1380     SPADS_RecoProfile = 0x2,
1381     SPADS_Immediate = 0x4,
1382     SPADS_Reset = 0x8,
1383     SPADS_HighVolumeDataSource = 0x10,
1384 }}
1385 ENUM!{enum SPADAPTATIONRELEVANCE {
1386     SPAR_Unknown = 0,
1387     SPAR_Low = 1,
1388     SPAR_Medium = 2,
1389     SPAR_High = 3,
1390 }}
1391 RIDL!(
1392 interface ISpRecoContext2(ISpRecoContext2Vtbl): IUnknown(IUnknownVtbl) {
1393     fn SetGrammarOptions(&mut self, eGrammarOptions: ::DWORD) -> ::HRESULT,
1394     fn GetGrammarOptions(&mut self, peGrammarOptions: *mut ::DWORD) -> ::HRESULT,
1395     fn SetAdaptationData2(
1396         &mut self, pAdaptationData: ::LPCWSTR, cch: ::ULONG, pTopicName: ::LPCWSTR,
1397         eAdaptationSettings: ::DWORD, eRelevance: SPADAPTATIONRELEVANCE
1398     ) -> ::HRESULT
1399 }
1400 );
1401 RIDL!(
1402 interface ISpProperties(ISpPropertiesVtbl): IUnknown(IUnknownVtbl) {
1403     fn SetPropertyNum(&mut self, pName: ::LPCWSTR, lValue: ::LONG) -> ::HRESULT,
1404     fn GetPropertyNum(&mut self, pName: ::LPCWSTR, plValue: *mut ::LONG) -> ::HRESULT,
1405     fn SetPropertyString(&mut self, pName: ::LPCWSTR, pValue: ::LPCWSTR) -> ::HRESULT,
1406     fn GetPropertyString(&mut self, pName: ::LPCWSTR, ppCoMemValue: *mut ::LPWSTR) -> ::HRESULT
1407 }
1408 );
1409 STRUCT!{struct SPRECOGNIZERSTATUS {
1410     AudioStatus: SPAUDIOSTATUS,
1411     ullRecognitionStreamPos: ::ULONGLONG,
1412     ulStreamNumber: ::ULONG,
1413     ulNumActive: ::ULONG,
1414     clsidEngine: ::CLSID,
1415     cLangIDs: ::ULONG,
1416     aLangID: [::WORD; 20],
1417     ullRecognitionStreamTime: ::ULONGLONG,
1418 }}
1419 ENUM!{enum SPWAVEFORMATTYPE {
1420     SPWF_INPUT = 0,
1421     SPWF_SRENGINE = 1,
1422 }}
1423 pub type SPSTREAMFORMATTYPE = SPWAVEFORMATTYPE;
1424 ENUM!{enum SPRECOSTATE {
1425     SPRST_INACTIVE = 0,
1426     SPRST_ACTIVE = 1,
1427     SPRST_ACTIVE_ALWAYS = 2,
1428     SPRST_INACTIVE_WITH_PURGE = 3,
1429     SPRST_NUM_STATES = 4,
1430 }}
1431 RIDL!(
1432 interface ISpRecognizer(ISpRecognizerVtbl): ISpProperties(ISpPropertiesVtbl) {
1433     fn SetRecognizer(&mut self, pRecognizer: *mut ISpObjectToken) -> ::HRESULT,
1434     fn GetRecognizer(&mut self, ppRecognizer: *mut *mut ISpObjectToken) -> ::HRESULT,
1435     fn SetInput(&mut self, pUnkInput: *mut ::IUnknown, fAllowFormatChanges: ::BOOL) -> ::HRESULT,
1436     fn GetInputObjectToken(&mut self, ppToken: *mut *mut ISpObjectToken) -> ::HRESULT,
1437     fn GetInputStream(&mut self, ppStream: *mut *mut ISpStreamFormat) -> ::HRESULT,
1438     fn CreateRecoContext(&mut self, ppNewCtxt: *mut *mut ISpRecoContext) -> ::HRESULT,
1439     fn GetRecoProfile(&mut self, ppToken: *mut *mut ISpObjectToken) -> ::HRESULT,
1440     fn SetRecoProfile(&mut self, pToken: *mut ISpObjectToken) -> ::HRESULT,
1441     fn IsSharedInstance(&mut self) -> ::HRESULT,
1442     fn GetRecoState(&mut self, pState: *mut SPRECOSTATE) -> ::HRESULT,
1443     fn SetRecoState(&mut self, NewState: SPRECOSTATE) -> ::HRESULT,
1444     fn GetStatus(&mut self, pStatus: *mut SPRECOGNIZERSTATUS) -> ::HRESULT,
1445     fn GetFormat(
1446         &mut self, WaveFormatType: SPSTREAMFORMATTYPE, pFormatId: *mut ::GUID,
1447         ppCoMemWFEX: *mut ::WAVEFORMATEX
1448     ) -> ::HRESULT,
1449     fn IsUISupported(
1450         &mut self, pszTypeOfUI: ::LPCWSTR, pvExtraData: *mut ::c_void, cbExtraData: ::ULONG,
1451         pfSupported: *mut ::BOOL
1452     ) -> ::HRESULT,
1453     fn DisplayUI(
1454         &mut self, hwndParent: ::HWND, pszTitle: ::LPCWSTR, pszTypeOfUI: ::LPCWSTR,
1455         pvExtraData: *mut ::c_void, cbExtraData: ::ULONG
1456     ) -> ::HRESULT,
1457     fn EmulateRecognition(&mut self, pPhrase: *mut ISpPhrase) -> ::HRESULT
1458 }
1459 );
1460 RIDL!(
1461 interface ISpSerializeState(ISpSerializeStateVtbl): IUnknown(IUnknownVtbl) {
1462     fn GetSerializedState(
1463         &mut self, ppbData: *mut *mut ::BYTE, pulSize: *mut ::ULONG, dwReserved: ::DWORD
1464     ) -> ::HRESULT,
1465     fn SetSerializedState(
1466         &mut self, pbData: *mut ::BYTE, ulSize: ::ULONG, dwReserved: ::DWORD
1467     ) -> ::HRESULT
1468 }
1469 );
1470 RIDL!(
1471 interface ISpRecognizer2(ISpRecognizer2Vtbl): IUnknown(IUnknownVtbl) {
1472     fn EmulateRecognitionEx(
1473         &mut self, pPhrase: *mut ISpPhrase, dwCompareFlags: ::DWORD
1474     ) -> ::HRESULT,
1475     fn SetTrainingState(
1476         &mut self, fDoingTraining: ::BOOL, fAdaptFromTrainingData: ::BOOL
1477     ) -> ::HRESULT,
1478     fn ResetAcousticModelAdaptation(&mut self) -> ::HRESULT
1479 }
1480 );
1481 ENUM!{enum SPCATEGORYTYPE {
1482     SPCT_COMMAND = 0,
1483     SPCT_DICTATION,
1484     SPCT_SLEEP,
1485     SPCT_SUB_COMMAND,
1486     SPCT_SUB_DICTATION,
1487 }}
1488 RIDL!(
1489 interface ISpRecoCategory(ISpRecoCategoryVtbl): IUnknown(IUnknownVtbl) {
1490     fn GetType(&mut self, peCategoryType: *mut SPCATEGORYTYPE) -> ::HRESULT
1491 }
1492 );
1493 RIDL!(
1494 interface ISpRecognizer3(ISpRecognizer3Vtbl): IUnknown(IUnknownVtbl) {
1495     fn GetCategory(
1496         &mut self, categoryType: SPCATEGORYTYPE, ppCategory: *mut *mut ISpRecoCategory
1497     ) -> ::HRESULT,
1498     fn SetActiveCategory(&mut self, pCategory: *mut ISpRecoCategory) -> ::HRESULT,
1499     fn GetActiveCategory(&mut self, ppCategory: *mut *mut ISpRecoCategory) -> ::HRESULT
1500 }
1501 );
1502 STRUCT!{struct SPNORMALIZATIONLIST {
1503     ulSize: ::ULONG,
1504     ppszzNormalizedList: *mut *mut ::WCHAR,
1505 }}
1506 RIDL!(
1507 interface ISpEnginePronunciation(ISpEnginePronunciationVtbl): IUnknown(IUnknownVtbl) {
1508     fn Normalize(
1509         &mut self, pszWord: ::LPCWSTR, pszLeftContext: ::LPCWSTR, pszRightContext: ::LPCWSTR,
1510         LangID: ::WORD, pNormalizationList: *mut SPNORMALIZATIONLIST
1511     ) -> ::HRESULT,
1512     fn GetPronunciations(
1513         &mut self, pszWord: ::LPCWSTR, pszLeftContext: ::LPCWSTR, pszRightContext: ::LPCWSTR,
1514         LangID: ::WORD, pEnginePronunciationList: *mut SPWORDPRONUNCIATIONLIST
1515     ) -> ::HRESULT
1516 }
1517 );
1518 STRUCT!{struct SPDISPLAYTOKEN {
1519     pszLexical: *const ::WCHAR,
1520     pszDisplay: *const ::WCHAR,
1521     bDisplayAttributes: ::BYTE,
1522 }}
1523 STRUCT!{struct SPDISPLAYPHRASE {
1524     ulNumTokens: ::ULONG,
1525     pTokens: *mut SPDISPLAYTOKEN,
1526 }}
1527 RIDL!(
1528 interface ISpDisplayAlternates(ISpDisplayAlternatesVtbl): IUnknown(IUnknownVtbl) {
1529     fn GetDisplayAlternates(
1530         &mut self, pPhrase: *const SPDISPLAYPHRASE, cRequestCount: ::ULONG,
1531         ppCoMemPhrases: *mut *mut SPDISPLAYPHRASE, pcPhrasesReturned: *mut ::ULONG
1532     ) -> ::HRESULT,
1533     fn SetFullStopTrailSpace(&mut self, ulTrailSpace: ::ULONG) -> ::HRESULT
1534 }
1535 );
1536 pub type SpeechLanguageId = ::c_long;
1537 ENUM!{enum DISPID_SpeechDataKey {
1538     DISPID_SDKSetBinaryValue = 1,
1539     DISPID_SDKGetBinaryValue,
1540     DISPID_SDKSetStringValue,
1541     DISPID_SDKGetStringValue,
1542     DISPID_SDKSetLongValue,
1543     DISPID_SDKGetlongValue,
1544     DISPID_SDKOpenKey,
1545     DISPID_SDKCreateKey,
1546     DISPID_SDKDeleteKey,
1547     DISPID_SDKDeleteValue,
1548     DISPID_SDKEnumKeys,
1549     DISPID_SDKEnumValues,
1550 }}
1551 ENUM!{enum DISPID_SpeechObjectToken {
1552     DISPID_SOTId = 1,
1553     DISPID_SOTDataKey,
1554     DISPID_SOTCategory,
1555     DISPID_SOTGetDescription,
1556     DISPID_SOTSetId,
1557     DISPID_SOTGetAttribute,
1558     DISPID_SOTCreateInstance,
1559     DISPID_SOTRemove,
1560     DISPID_SOTGetStorageFileName,
1561     DISPID_SOTRemoveStorageFileName,
1562     DISPID_SOTIsUISupported,
1563     DISPID_SOTDisplayUI,
1564     DISPID_SOTMatchesAttributes,
1565 }}
1566 ENUM!{enum SpeechDataKeyLocation {
1567     SDKLDefaultLocation = SPDKL_DefaultLocation.0,
1568     SDKLCurrentUser = SPDKL_CurrentUser.0,
1569     SDKLLocalMachine = SPDKL_LocalMachine.0,
1570     SDKLCurrentConfig = SPDKL_CurrentConfig.0,
1571 }}
1572 ENUM!{enum SpeechTokenContext {
1573     STCInprocServer = ::CLSCTX_INPROC_SERVER,
1574     STCInprocHandler = ::CLSCTX_INPROC_HANDLER,
1575     STCLocalServer = ::CLSCTX_LOCAL_SERVER,
1576     STCRemoteServer = ::CLSCTX_REMOTE_SERVER,
1577     STCAll = ::CLSCTX_INPROC_SERVER | ::CLSCTX_INPROC_HANDLER |
1578              ::CLSCTX_LOCAL_SERVER | ::CLSCTX_REMOTE_SERVER,
1579 }}
1580 ENUM!{enum SpeechTokenShellFolder {
1581     STSF_AppData = 0x1a,
1582     STSF_LocalAppData = 0x1c,
1583     STSF_CommonAppData = 0x23,
1584     STSF_FlagCreate = 0x8000,
1585 }}
1586 ENUM!{enum DISPID_SpeechObjectTokens {
1587     DISPID_SOTsCount = 1,
1588     DISPID_SOTsItem = ::DISPID_VALUE as u32,
1589     DISPID_SOTs_NewEnum = ::DISPID_NEWENUM as u32,
1590 }}
1591 ENUM!{enum DISPID_SpeechObjectTokenCategory {
1592     DISPID_SOTCId = 1,
1593     DISPID_SOTCDefault,
1594     DISPID_SOTCSetId,
1595     DISPID_SOTCGetDataKey,
1596     DISPID_SOTCEnumerateTokens,
1597 }}
1598 ENUM!{enum SpeechAudioFormatType {
1599     SAFTDefault = -1i32 as u32,
1600     SAFTNoAssignedFormat = 0,
1601     SAFTText = 1,
1602     SAFTNonStandardFormat = 2,
1603     SAFTExtendedAudioFormat = 3,
1604     SAFT8kHz8BitMono = 4,
1605     SAFT8kHz8BitStereo = 5,
1606     SAFT8kHz16BitMono = 6,
1607     SAFT8kHz16BitStereo = 7,
1608     SAFT11kHz8BitMono = 8,
1609     SAFT11kHz8BitStereo = 9,
1610     SAFT11kHz16BitMono = 10,
1611     SAFT11kHz16BitStereo = 11,
1612     SAFT12kHz8BitMono = 12,
1613     SAFT12kHz8BitStereo = 13,
1614     SAFT12kHz16BitMono = 14,
1615     SAFT12kHz16BitStereo = 15,
1616     SAFT16kHz8BitMono = 16,
1617     SAFT16kHz8BitStereo = 17,
1618     SAFT16kHz16BitMono = 18,
1619     SAFT16kHz16BitStereo = 19,
1620     SAFT22kHz8BitMono = 20,
1621     SAFT22kHz8BitStereo = 21,
1622     SAFT22kHz16BitMono = 22,
1623     SAFT22kHz16BitStereo = 23,
1624     SAFT24kHz8BitMono = 24,
1625     SAFT24kHz8BitStereo = 25,
1626     SAFT24kHz16BitMono = 26,
1627     SAFT24kHz16BitStereo = 27,
1628     SAFT32kHz8BitMono = 28,
1629     SAFT32kHz8BitStereo = 29,
1630     SAFT32kHz16BitMono = 30,
1631     SAFT32kHz16BitStereo = 31,
1632     SAFT44kHz8BitMono = 32,
1633     SAFT44kHz8BitStereo = 33,
1634     SAFT44kHz16BitMono = 34,
1635     SAFT44kHz16BitStereo = 35,
1636     SAFT48kHz8BitMono = 36,
1637     SAFT48kHz8BitStereo = 37,
1638     SAFT48kHz16BitMono = 38,
1639     SAFT48kHz16BitStereo = 39,
1640     SAFTTrueSpeech_8kHz1BitMono = 40,
1641     SAFTCCITT_ALaw_8kHzMono = 41,
1642     SAFTCCITT_ALaw_8kHzStereo = 42,
1643     SAFTCCITT_ALaw_11kHzMono = 43,
1644     SAFTCCITT_ALaw_11kHzStereo = 44,
1645     SAFTCCITT_ALaw_22kHzMono = 45,
1646     SAFTCCITT_ALaw_22kHzStereo = 46,
1647     SAFTCCITT_ALaw_44kHzMono = 47,
1648     SAFTCCITT_ALaw_44kHzStereo = 48,
1649     SAFTCCITT_uLaw_8kHzMono = 49,
1650     SAFTCCITT_uLaw_8kHzStereo = 50,
1651     SAFTCCITT_uLaw_11kHzMono = 51,
1652     SAFTCCITT_uLaw_11kHzStereo = 52,
1653     SAFTCCITT_uLaw_22kHzMono = 53,
1654     SAFTCCITT_uLaw_22kHzStereo = 54,
1655     SAFTCCITT_uLaw_44kHzMono = 55,
1656     SAFTCCITT_uLaw_44kHzStereo = 56,
1657     SAFTADPCM_8kHzMono = 57,
1658     SAFTADPCM_8kHzStereo = 58,
1659     SAFTADPCM_11kHzMono = 59,
1660     SAFTADPCM_11kHzStereo = 60,
1661     SAFTADPCM_22kHzMono = 61,
1662     SAFTADPCM_22kHzStereo = 62,
1663     SAFTADPCM_44kHzMono = 63,
1664     SAFTADPCM_44kHzStereo = 64,
1665     SAFTGSM610_8kHzMono = 65,
1666     SAFTGSM610_11kHzMono = 66,
1667     SAFTGSM610_22kHzMono = 67,
1668     SAFTGSM610_44kHzMono = 68,
1669 }}
1670 ENUM!{enum DISPID_SpeechAudioFormat {
1671     DISPID_SAFType = 1,
1672     DISPID_SAFGuid,
1673     DISPID_SAFGetWaveFormatEx,
1674     DISPID_SAFSetWaveFormatEx,
1675 }}
1676 ENUM!{enum DISPID_SpeechBaseStream {
1677     DISPID_SBSFormat = 1,
1678     DISPID_SBSRead,
1679     DISPID_SBSWrite,
1680     DISPID_SBSSeek,
1681 }}
1682 ENUM!{enum SpeechStreamSeekPositionType {
1683     SSSPTRelativeToStart = ::STREAM_SEEK_SET.0,
1684     SSSPTRelativeToCurrentPosition = ::STREAM_SEEK_CUR.0,
1685     SSSPTRelativeToEnd = ::STREAM_SEEK_END.0,
1686 }}
1687 ENUM!{enum DISPID_SpeechAudio {
1688     DISPID_SAStatus = 200,
1689     DISPID_SABufferInfo,
1690     DISPID_SADefaultFormat,
1691     DISPID_SAVolume,
1692     DISPID_SABufferNotifySize,
1693     DISPID_SAEventHandle,
1694     DISPID_SASetState,
1695 }}
1696 ENUM!{enum SpeechAudioState {
1697     SASClosed = SPAS_CLOSED.0,
1698     SASStop = SPAS_STOP.0,
1699     SASPause = SPAS_PAUSE.0,
1700     SASRun = SPAS_RUN.0,
1701 }}
1702 ENUM!{enum DISPID_SpeechMMSysAudio {
1703     DISPID_SMSADeviceId = 300,
1704     DISPID_SMSALineId,
1705     DISPID_SMSAMMHandle,
1706 }}
1707 ENUM!{enum DISPID_SpeechFileStream {
1708     DISPID_SFSOpen = 100,
1709     DISPID_SFSClose,
1710 }}
1711 ENUM!{enum SpeechStreamFileMode {
1712     SSFMOpenForRead = SPFM_OPEN_READONLY.0,
1713     SSFMOpenReadWrite = SPFM_OPEN_READWRITE.0,
1714     SSFMCreate = SPFM_CREATE.0,
1715     SSFMCreateForWrite = SPFM_CREATE_ALWAYS.0,
1716 }}
1717 ENUM!{enum DISPID_SpeechCustomStream {
1718     DISPID_SCSBaseStream = 100,
1719 }}
1720 ENUM!{enum DISPID_SpeechMemoryStream {
1721     DISPID_SMSSetData = 100,
1722     DISPID_SMSGetData,
1723 }}
1724 ENUM!{enum DISPID_SpeechAudioStatus {
1725     DISPID_SASFreeBufferSpace = 1,
1726     DISPID_SASNonBlockingIO,
1727     DISPID_SASState,
1728     DISPID_SASCurrentSeekPosition,
1729     DISPID_SASCurrentDevicePosition,
1730 }}
1731 ENUM!{enum DISPID_SpeechAudioBufferInfo {
1732     DISPID_SABIMinNotification = 1,
1733     DISPID_SABIBufferSize,
1734     DISPID_SABIEventBias,
1735 }}
1736 ENUM!{enum DISPID_SpeechWaveFormatEx {
1737     DISPID_SWFEFormatTag = 1,
1738     DISPID_SWFEChannels,
1739     DISPID_SWFESamplesPerSec,
1740     DISPID_SWFEAvgBytesPerSec,
1741     DISPID_SWFEBlockAlign,
1742     DISPID_SWFEBitsPerSample,
1743     DISPID_SWFEExtraData,
1744 }}
1745 ENUM!{enum DISPID_SpeechVoice {
1746     DISPID_SVStatus = 1,
1747     DISPID_SVVoice,
1748     DISPID_SVAudioOutput,
1749     DISPID_SVAudioOutputStream,
1750     DISPID_SVRate,
1751     DISPID_SVVolume,
1752     DISPID_SVAllowAudioOuputFormatChangesOnNextSet,
1753     DISPID_SVEventInterests,
1754     DISPID_SVPriority,
1755     DISPID_SVAlertBoundary,
1756     DISPID_SVSyncronousSpeakTimeout,
1757     DISPID_SVSpeak,
1758     DISPID_SVSpeakStream,
1759     DISPID_SVPause,
1760     DISPID_SVResume,
1761     DISPID_SVSkip,
1762     DISPID_SVGetVoices,
1763     DISPID_SVGetAudioOutputs,
1764     DISPID_SVWaitUntilDone,
1765     DISPID_SVSpeakCompleteEvent,
1766     DISPID_SVIsUISupported,
1767     DISPID_SVDisplayUI,
1768 }}
1769 ENUM!{enum SpeechVoicePriority {
1770     SVPNormal = SPVPRI_NORMAL.0,
1771     SVPAlert = SPVPRI_ALERT.0,
1772     SVPOver = SPVPRI_OVER.0,
1773 }}
1774 FLAGS!{enum SpeechVoiceSpeakFlags {
1775     SVSFDefault = SPF_DEFAULT.0,
1776     SVSFlagsAsync = SPF_ASYNC.0,
1777     SVSFPurgeBeforeSpeak = SPF_PURGEBEFORESPEAK.0,
1778     SVSFIsFilename = SPF_IS_FILENAME.0,
1779     SVSFIsXML = SPF_IS_XML.0,
1780     SVSFIsNotXML = SPF_IS_NOT_XML.0,
1781     SVSFPersistXML = SPF_PERSIST_XML.0,
1782     SVSFNLPSpeakPunc = SPF_NLP_SPEAK_PUNC.0,
1783     SVSFParseSapi = SPF_PARSE_SAPI.0,
1784     SVSFParseSsml = SPF_PARSE_SSML.0,
1785     SVSFParseMask = SPF_PARSE_MASK as u32,
1786     SVSFVoiceMask = SPF_VOICE_MASK as u32,
1787     SVSFUnusedFlags = SPF_UNUSED_FLAGS as u32,
1788 }}
1789 pub const SVSFParseAutodetect: SpeechVoiceSpeakFlags = SVSFDefault;
1790 pub const SVSFNLPMask: SpeechVoiceSpeakFlags = SVSFNLPSpeakPunc;
1791 FLAGS!{enum SpeechVoiceEvents {
1792     SVEStartInputStream = 1 << 1,
1793     SVEEndInputStream = 1 << 2,
1794     SVEVoiceChange = 1 << 3,
1795     SVEBookmark = 1 << 4,
1796     SVEWordBoundary = 1 << 5,
1797     SVEPhoneme = 1 << 6,
1798     SVESentenceBoundary = 1 << 7,
1799     SVEViseme = 1 << 8,
1800     SVEAudioLevel = 1 << 9,
1801     SVEPrivate = 1 << 15,
1802     SVEAllEvents = 0x83fe,
1803 }}
1804 ENUM!{enum DISPID_SpeechVoiceStatus {
1805     DISPID_SVSCurrentStreamNumber = 1,
1806     DISPID_SVSLastStreamNumberQueued,
1807     DISPID_SVSLastResult,
1808     DISPID_SVSRunningState,
1809     DISPID_SVSInputWordPosition,
1810     DISPID_SVSInputWordLength,
1811     DISPID_SVSInputSentencePosition,
1812     DISPID_SVSInputSentenceLength,
1813     DISPID_SVSLastBookmark,
1814     DISPID_SVSLastBookmarkId,
1815     DISPID_SVSPhonemeId,
1816     DISPID_SVSVisemeId,
1817 }}
1818 ENUM!{enum SpeechRunState {
1819     SRSEDone = SPRS_DONE.0,
1820     SRSEIsSpeaking = SPRS_IS_SPEAKING.0,
1821 }}
1822 ENUM!{enum SpeechVisemeType {
1823     SVP_0 = 0,
1824     SVP_1,
1825     SVP_2,
1826     SVP_3,
1827     SVP_4,
1828     SVP_5,
1829     SVP_6,
1830     SVP_7,
1831     SVP_8,
1832     SVP_9,
1833     SVP_10,
1834     SVP_11,
1835     SVP_12,
1836     SVP_13,
1837     SVP_14,
1838     SVP_15,
1839     SVP_16,
1840     SVP_17,
1841     SVP_18,
1842     SVP_19,
1843     SVP_20,
1844     SVP_21,
1845 }}
1846 ENUM!{enum SpeechVisemeFeature {
1847     SVF_None = 0,
1848     SVF_Stressed = SPVFEATURE_STRESSED.0,
1849     SVF_Emphasis = SPVFEATURE_EMPHASIS.0,
1850 }}
1851 ENUM!{enum DISPID_SpeechVoiceEvent {
1852     DISPID_SVEStreamStart = 1,
1853     DISPID_SVEStreamEnd,
1854     DISPID_SVEVoiceChange,
1855     DISPID_SVEBookmark,
1856     DISPID_SVEWord,
1857     DISPID_SVEPhoneme,
1858     DISPID_SVESentenceBoundary,
1859     DISPID_SVEViseme,
1860     DISPID_SVEAudioLevel,
1861     DISPID_SVEEnginePrivate,
1862 }}
1863 ENUM!{enum DISPID_SpeechRecognizer {
1864     DISPID_SRRecognizer = 1,
1865     DISPID_SRAllowAudioInputFormatChangesOnNextSet,
1866     DISPID_SRAudioInput,
1867     DISPID_SRAudioInputStream,
1868     DISPID_SRIsShared,
1869     DISPID_SRState,
1870     DISPID_SRStatus,
1871     DISPID_SRProfile,
1872     DISPID_SREmulateRecognition,
1873     DISPID_SRCreateRecoContext,
1874     DISPID_SRGetFormat,
1875     DISPID_SRSetPropertyNumber,
1876     DISPID_SRGetPropertyNumber,
1877     DISPID_SRSetPropertyString,
1878     DISPID_SRGetPropertyString,
1879     DISPID_SRIsUISupported,
1880     DISPID_SRDisplayUI,
1881     DISPID_SRGetRecognizers,
1882     DISPID_SVGetAudioInputs,
1883     DISPID_SVGetProfiles,
1884 }}
1885 ENUM!{enum SpeechRecognizerState {
1886     SRSInactive = SPRST_INACTIVE.0,
1887     SRSActive = SPRST_ACTIVE.0,
1888     SRSActiveAlways = SPRST_ACTIVE_ALWAYS.0,
1889     SRSInactiveWithPurge = SPRST_INACTIVE_WITH_PURGE.0,
1890 }}
1891 ENUM!{enum SpeechDisplayAttributes {
1892     SDA_No_Trailing_Space = 0,
1893     SDA_One_Trailing_Space = SPAF_ONE_TRAILING_SPACE.0,
1894     SDA_Two_Trailing_Spaces = SPAF_TWO_TRAILING_SPACES.0,
1895     SDA_Consume_Leading_Spaces = SPAF_CONSUME_LEADING_SPACES.0,
1896 }}
1897 ENUM!{enum SpeechFormatType {
1898     SFTInput = SPWF_INPUT.0,
1899     SFTSREngine = SPWF_SRENGINE.0,
1900 }}
1901 FLAGS!{enum SpeechEmulationCompareFlags {
1902     SECFIgnoreCase = 0x1,
1903     SECFIgnoreKanaType = 0x10000,
1904     SECFIgnoreWidth = 0x20000,
1905     SECFNoSpecialChars = 0x20000000,
1906     SECFEmulateResult = 0x40000000,
1907     SECFDefault = SECFIgnoreCase.0 | SECFIgnoreKanaType.0 | SECFIgnoreWidth.0,
1908 }}
1909 ENUM!{enum DISPID_SpeechRecognizerStatus {
1910     DISPID_SRSAudioStatus = 1,
1911     DISPID_SRSCurrentStreamPosition,
1912     DISPID_SRSCurrentStreamNumber,
1913     DISPID_SRSNumberOfActiveRules,
1914     DISPID_SRSClsidEngine,
1915     DISPID_SRSSupportedLanguages,
1916 }}
1917 ENUM!{enum DISPID_SpeechRecoContext {
1918     DISPID_SRCRecognizer = 1,
1919     DISPID_SRCAudioInInterferenceStatus,
1920     DISPID_SRCRequestedUIType,
1921     DISPID_SRCVoice,
1922     DISPID_SRAllowVoiceFormatMatchingOnNextSet,
1923     DISPID_SRCVoicePurgeEvent,
1924     DISPID_SRCEventInterests,
1925     DISPID_SRCCmdMaxAlternates,
1926     DISPID_SRCState,
1927     DISPID_SRCRetainedAudio,
1928     DISPID_SRCRetainedAudioFormat,
1929     DISPID_SRCPause,
1930     DISPID_SRCResume,
1931     DISPID_SRCCreateGrammar,
1932     DISPID_SRCCreateResultFromMemory,
1933     DISPID_SRCBookmark,
1934     DISPID_SRCSetAdaptationData,
1935 }}
1936 ENUM!{enum SpeechRetainedAudioOptions {
1937     SRAONone = SPAO_NONE.0,
1938     SRAORetainAudio = SPAO_RETAIN_AUDIO.0,
1939 }}
1940 ENUM!{enum SpeechBookmarkOptions {
1941     SBONone = SPBO_NONE.0,
1942     SBOPause = SPBO_PAUSE.0,
1943 }}
1944 ENUM!{enum SpeechInterference {
1945     SINone = SPINTERFERENCE_NONE.0,
1946     SINoise = SPINTERFERENCE_NOISE.0,
1947     SINoSignal = SPINTERFERENCE_NOSIGNAL.0,
1948     SITooLoud = SPINTERFERENCE_TOOLOUD.0,
1949     SITooQuiet = SPINTERFERENCE_TOOQUIET.0,
1950     SITooFast = SPINTERFERENCE_TOOFAST.0,
1951     SITooSlow = SPINTERFERENCE_TOOSLOW.0,
1952 }}
1953 FLAGS!{enum SpeechRecoEvents {
1954     SREStreamEnd = 1 << 0,
1955     SRESoundStart = 1 << 1,
1956     SRESoundEnd = 1 << 2,
1957     SREPhraseStart = 1 << 3,
1958     SRERecognition = 1 << 4,
1959     SREHypothesis = 1 << 5,
1960     SREBookmark = 1 << 6,
1961     SREPropertyNumChange = 1 << 7,
1962     SREPropertyStringChange = 1 << 8,
1963     SREFalseRecognition = 1 << 9,
1964     SREInterference = 1 << 10,
1965     SRERequestUI = 1 << 11,
1966     SREStateChange = 1 << 12,
1967     SREAdaptation = 1 << 13,
1968     SREStreamStart = 1 << 14,
1969     SRERecoOtherContext = 1 << 15,
1970     SREAudioLevel = 1 << 16,
1971     SREPrivate = 1 << 18,
1972     SREAllEvents = 0x5ffff,
1973 }}
1974 ENUM!{enum SpeechRecoContextState {
1975     SRCS_Disabled = SPCS_DISABLED.0,
1976     SRCS_Enabled = SPCS_ENABLED.0,
1977 }}
1978 ENUM!{enum DISPIDSPRG {
1979     DISPID_SRGId = 1,
1980     DISPID_SRGRecoContext,
1981     DISPID_SRGState,
1982     DISPID_SRGRules,
1983     DISPID_SRGReset,
1984     DISPID_SRGCommit,
1985     DISPID_SRGCmdLoadFromFile,
1986     DISPID_SRGCmdLoadFromObject,
1987     DISPID_SRGCmdLoadFromResource,
1988     DISPID_SRGCmdLoadFromMemory,
1989     DISPID_SRGCmdLoadFromProprietaryGrammar,
1990     DISPID_SRGCmdSetRuleState,
1991     DISPID_SRGCmdSetRuleIdState,
1992     DISPID_SRGDictationLoad,
1993     DISPID_SRGDictationUnload,
1994     DISPID_SRGDictationSetState,
1995     DISPID_SRGSetWordSequenceData,
1996     DISPID_SRGSetTextSelection,
1997     DISPID_SRGIsPronounceable,
1998 }}
1999 ENUM!{enum SpeechLoadOption {
2000     SLOStatic = SPLO_STATIC.0,
2001     SLODynamic = SPLO_DYNAMIC.0,
2002 }}
2003 ENUM!{enum SpeechWordPronounceable {
2004     SWPUnknownWordUnpronounceable = SPWP_UNKNOWN_WORD_UNPRONOUNCEABLE.0,
2005     SWPUnknownWordPronounceable = SPWP_UNKNOWN_WORD_PRONOUNCEABLE.0,
2006     SWPKnownWordPronounceable = SPWP_KNOWN_WORD_PRONOUNCEABLE.0,
2007 }}
2008 ENUM!{enum SpeechGrammarState {
2009     SGSEnabled = SPGS_ENABLED.0,
2010     SGSDisabled = SPGS_DISABLED.0,
2011     SGSExclusive = SPGS_EXCLUSIVE.0,
2012 }}
2013 ENUM!{enum SpeechRuleState {
2014     SGDSInactive = SPRS_INACTIVE.0,
2015     SGDSActive = SPRS_ACTIVE.0,
2016     SGDSActiveWithAutoPause = SPRS_ACTIVE_WITH_AUTO_PAUSE.0,
2017     SGDSActiveUserDelimited = SPRS_ACTIVE_USER_DELIMITED.0,
2018 }}
2019 ENUM!{enum SpeechRuleAttributes {
2020     SRATopLevel = SPRAF_TopLevel.0,
2021     SRADefaultToActive = SPRAF_Active.0,
2022     SRAExport = SPRAF_Export.0,
2023     SRAImport = SPRAF_Import.0,
2024     SRAInterpreter = SPRAF_Interpreter.0,
2025     SRADynamic = SPRAF_Dynamic.0,
2026     SRARoot = SPRAF_Root.0,
2027 }}
2028 ENUM!{enum SpeechGrammarWordType {
2029     SGDisplay = SPWT_DISPLAY.0,
2030     SGLexical = SPWT_LEXICAL.0,
2031     SGPronounciation = SPWT_PRONUNCIATION.0,
2032     SGLexicalNoSpecialChars = SPWT_LEXICAL_NO_SPECIAL_CHARS.0,
2033 }}
2034 ENUM!{enum DISPID_SpeechRecoContextEvents {
2035     DISPID_SRCEStartStream = 1,
2036     DISPID_SRCEEndStream,
2037     DISPID_SRCEBookmark,
2038     DISPID_SRCESoundStart,
2039     DISPID_SRCESoundEnd,
2040     DISPID_SRCEPhraseStart,
2041     DISPID_SRCERecognition,
2042     DISPID_SRCEHypothesis,
2043     DISPID_SRCEPropertyNumberChange,
2044     DISPID_SRCEPropertyStringChange,
2045     DISPID_SRCEFalseRecognition,
2046     DISPID_SRCEInterference,
2047     DISPID_SRCERequestUI,
2048     DISPID_SRCERecognizerStateChange,
2049     DISPID_SRCEAdaptation,
2050     DISPID_SRCERecognitionForOtherContext,
2051     DISPID_SRCEAudioLevel,
2052     DISPID_SRCEEnginePrivate,
2053 }}
2054 ENUM!{enum SpeechRecognitionType {
2055     SRTStandard = 0,
2056     SRTAutopause = SPREF_AutoPause.0,
2057     SRTEmulated = SPREF_Emulated.0,
2058     SRTSMLTimeout = SPREF_SMLTimeout.0,
2059     SRTExtendableParse = SPREF_ExtendableParse.0,
2060     SRTReSent = SPREF_ReSent.0,
2061 }}
2062 ENUM!{enum DISPID_SpeechGrammarRule {
2063     DISPID_SGRAttributes = 1,
2064     DISPID_SGRInitialState,
2065     DISPID_SGRName,
2066     DISPID_SGRId,
2067     DISPID_SGRClear,
2068     DISPID_SGRAddResource,
2069     DISPID_SGRAddState,
2070 }}
2071 ENUM!{enum DISPID_SpeechGrammarRules {
2072     DISPID_SGRsCount = 1,
2073     DISPID_SGRsDynamic,
2074     DISPID_SGRsAdd,
2075     DISPID_SGRsCommit,
2076     DISPID_SGRsCommitAndSave,
2077     DISPID_SGRsFindRule,
2078     DISPID_SGRsItem = ::DISPID_VALUE as u32,
2079     DISPID_SGRs_NewEnum = ::DISPID_NEWENUM as u32,
2080 }}
2081 ENUM!{enum DISPID_SpeechGrammarRuleState {
2082     DISPID_SGRSRule = 1,
2083     DISPID_SGRSTransitions,
2084     DISPID_SGRSAddWordTransition,
2085     DISPID_SGRSAddRuleTransition,
2086     DISPID_SGRSAddSpecialTransition,
2087 }}
2088 ENUM!{enum SpeechSpecialTransitionType {
2089     SSTTWildcard = 1,
2090     SSTTDictation,
2091     SSTTTextBuffer,
2092 }}
2093 ENUM!{enum DISPID_SpeechGrammarRuleStateTransitions {
2094     DISPID_SGRSTsCount = 1,
2095     DISPID_SGRSTsItem = ::DISPID_VALUE as u32,
2096     DISPID_SGRSTs_NewEnum = ::DISPID_NEWENUM as u32,
2097 }}
2098 ENUM!{enum DISPID_SpeechGrammarRuleStateTransition {
2099     DISPID_SGRSTType = 1,
2100     DISPID_SGRSTText,
2101     DISPID_SGRSTRule,
2102     DISPID_SGRSTWeight,
2103     DISPID_SGRSTPropertyName,
2104     DISPID_SGRSTPropertyId,
2105     DISPID_SGRSTPropertyValue,
2106     DISPID_SGRSTNextState,
2107 }}
2108 ENUM!{enum SpeechGrammarRuleStateTransitionType {
2109     SGRSTTEpsilon = 0,
2110     SGRSTTWord,
2111     SGRSTTRule,
2112     SGRSTTDictation,
2113     SGRSTTWildcard,
2114     SGRSTTTextBuffer,
2115 }}
2116 ENUM!{enum DISPIDSPTSI {
2117     DISPIDSPTSI_ActiveOffset = 1,
2118     DISPIDSPTSI_ActiveLength,
2119     DISPIDSPTSI_SelectionOffset,
2120     DISPIDSPTSI_SelectionLength,
2121 }}
2122 ENUM!{enum DISPID_SpeechRecoResult {
2123     DISPID_SRRRecoContext = 1,
2124     DISPID_SRRTimes,
2125     DISPID_SRRAudioFormat,
2126     DISPID_SRRPhraseInfo,
2127     DISPID_SRRAlternates,
2128     DISPID_SRRAudio,
2129     DISPID_SRRSpeakAudio,
2130     DISPID_SRRSaveToMemory,
2131     DISPID_SRRDiscardResultInfo,
2132 }}
2133 ENUM!{enum SpeechDiscardType {
2134     SDTProperty = SPDF_PROPERTY.0,
2135     SDTReplacement = SPDF_REPLACEMENT.0,
2136     SDTRule = SPDF_RULE.0,
2137     SDTDisplayText = SPDF_DISPLAYTEXT.0,
2138     SDTLexicalForm = SPDF_LEXICALFORM.0,
2139     SDTPronunciation = SPDF_PRONUNCIATION.0,
2140     SDTAudio = SPDF_AUDIO.0,
2141     SDTAlternates = SPDF_ALTERNATES.0,
2142     SDTAll = SPDF_ALL.0,
2143 }}
2144 ENUM!{enum DISPID_SpeechXMLRecoResult {
2145     DISPID_SRRGetXMLResult,
2146     DISPID_SRRGetXMLErrorInfo,
2147 }}
2148 ENUM!{enum DISPID_SpeechRecoResult2 {
2149     DISPID_SRRSetTextFeedback,
2150 }}
2151 ENUM!{enum DISPID_SpeechPhraseBuilder {
2152     DISPID_SPPBRestorePhraseFromMemory = 1,
2153 }}
2154 ENUM!{enum DISPID_SpeechRecoResultTimes {
2155     DISPID_SRRTStreamTime = 1,
2156     DISPID_SRRTLength,
2157     DISPID_SRRTTickCount,
2158     DISPID_SRRTOffsetFromStart,
2159 }}
2160 ENUM!{enum DISPID_SpeechPhraseAlternate {
2161     DISPID_SPARecoResult = 1,
2162     DISPID_SPAStartElementInResult,
2163     DISPID_SPANumberOfElementsInResult,
2164     DISPID_SPAPhraseInfo,
2165     DISPID_SPACommit,
2166 }}
2167 ENUM!{enum DISPID_SpeechPhraseAlternates {
2168     DISPID_SPAsCount = 1,
2169     DISPID_SPAsItem = ::DISPID_VALUE as u32,
2170     DISPID_SPAs_NewEnum = ::DISPID_NEWENUM as u32,
2171 }}
2172 ENUM!{enum DISPID_SpeechPhraseInfo {
2173     DISPID_SPILanguageId = 1,
2174     DISPID_SPIGrammarId,
2175     DISPID_SPIStartTime,
2176     DISPID_SPIAudioStreamPosition,
2177     DISPID_SPIAudioSizeBytes,
2178     DISPID_SPIRetainedSizeBytes,
2179     DISPID_SPIAudioSizeTime,
2180     DISPID_SPIRule,
2181     DISPID_SPIProperties,
2182     DISPID_SPIElements,
2183     DISPID_SPIReplacements,
2184     DISPID_SPIEngineId,
2185     DISPID_SPIEnginePrivateData,
2186     DISPID_SPISaveToMemory,
2187     DISPID_SPIGetText,
2188     DISPID_SPIGetDisplayAttributes,
2189 }}
2190 ENUM!{enum DISPID_SpeechPhraseElement {
2191     DISPID_SPEAudioTimeOffset = 1,
2192     DISPID_SPEAudioSizeTime,
2193     DISPID_SPEAudioStreamOffset,
2194     DISPID_SPEAudioSizeBytes,
2195     DISPID_SPERetainedStreamOffset,
2196     DISPID_SPERetainedSizeBytes,
2197     DISPID_SPEDisplayText,
2198     DISPID_SPELexicalForm,
2199     DISPID_SPEPronunciation,
2200     DISPID_SPEDisplayAttributes,
2201     DISPID_SPERequiredConfidence,
2202     DISPID_SPEActualConfidence,
2203     DISPID_SPEEngineConfidence,
2204 }}
2205 ENUM!{enum SpeechEngineConfidence {
2206     SECLowConfidence = -1i32 as u32,
2207     SECNormalConfidence = 0,
2208     SECHighConfidence = 1,
2209 }}
2210 ENUM!{enum DISPID_SpeechPhraseElements {
2211     DISPID_SPEsCount = 1,
2212     DISPID_SPEsItem = ::DISPID_VALUE as u32,
2213     DISPID_SPEs_NewEnum = ::DISPID_NEWENUM as u32,
2214 }}
2215 ENUM!{enum DISPID_SpeechPhraseReplacement {
2216     DISPID_SPRDisplayAttributes = 1,
2217     DISPID_SPRText,
2218     DISPID_SPRFirstElement,
2219     DISPID_SPRNumberOfElements,
2220 }}
2221 ENUM!{enum DISPID_SpeechPhraseReplacements {
2222     DISPID_SPRsCount = 1,
2223     DISPID_SPRsItem = ::DISPID_VALUE as u32,
2224     DISPID_SPRs_NewEnum = ::DISPID_NEWENUM as u32,
2225 }}
2226 ENUM!{enum DISPID_SpeechPhraseProperty {
2227     DISPID_SPPName = 1,
2228     DISPID_SPPId,
2229     DISPID_SPPValue,
2230     DISPID_SPPFirstElement,
2231     DISPID_SPPNumberOfElements,
2232     DISPID_SPPEngineConfidence,
2233     DISPID_SPPConfidence,
2234     DISPID_SPPParent,
2235     DISPID_SPPChildren,
2236 }}
2237 ENUM!{enum DISPID_SpeechPhraseProperties {
2238     DISPID_SPPsCount = 1,
2239     DISPID_SPPsItem = ::DISPID_VALUE as u32,
2240     DISPID_SPPs_NewEnum = ::DISPID_NEWENUM as u32,
2241 }}
2242 ENUM!{enum DISPID_SpeechPhraseRule {
2243     DISPID_SPRuleName = 1,
2244     DISPID_SPRuleId,
2245     DISPID_SPRuleFirstElement,
2246     DISPID_SPRuleNumberOfElements,
2247     DISPID_SPRuleParent,
2248     DISPID_SPRuleChildren,
2249     DISPID_SPRuleConfidence,
2250     DISPID_SPRuleEngineConfidence,
2251 }}
2252 ENUM!{enum DISPID_SpeechPhraseRules {
2253     DISPID_SPRulesCount = 1,
2254     DISPID_SPRulesItem = ::DISPID_VALUE as u32,
2255     DISPID_SPRules_NewEnum = ::DISPID_NEWENUM as u32,
2256 }}
2257 ENUM!{enum DISPID_SpeechLexicon {
2258     DISPID_SLGenerationId = 1,
2259     DISPID_SLGetWords,
2260     DISPID_SLAddPronunciation,
2261     DISPID_SLAddPronunciationByPhoneIds,
2262     DISPID_SLRemovePronunciation,
2263     DISPID_SLRemovePronunciationByPhoneIds,
2264     DISPID_SLGetPronunciations,
2265     DISPID_SLGetGenerationChange,
2266 }}
2267 ENUM!{enum SpeechLexiconType {
2268     SLTUser = eLEXTYPE_USER.0,
2269     SLTApp = eLEXTYPE_APP.0,
2270 }}
2271 ENUM!{enum SpeechPartOfSpeech {
2272     SPSNotOverriden = SPPS_NotOverriden.0,
2273     SPSUnknown = SPPS_Unknown.0,
2274     SPSNoun = SPPS_Noun.0,
2275     SPSVerb = SPPS_Verb.0,
2276     SPSModifier = SPPS_Modifier.0,
2277     SPSFunction = SPPS_Function.0,
2278     SPSInterjection = SPPS_Interjection.0,
2279     SPSLMA = SPPS_LMA.0,
2280     SPSSuppressWord = SPPS_SuppressWord.0,
2281 }}
2282 ENUM!{enum DISPID_SpeechLexiconWords {
2283     DISPID_SLWsCount = 1,
2284     DISPID_SLWsItem = ::DISPID_VALUE as u32,
2285     DISPID_SLWs_NewEnum = ::DISPID_NEWENUM as u32,
2286 }}
2287 ENUM!{enum SpeechWordType {
2288     SWTAdded = eWORDTYPE_ADDED.0,
2289     SWTDeleted = eWORDTYPE_DELETED.0,
2290 }}
2291 ENUM!{enum DISPID_SpeechLexiconWord {
2292     DISPID_SLWLangId = 1,
2293     DISPID_SLWType,
2294     DISPID_SLWWord,
2295     DISPID_SLWPronunciations,
2296 }}
2297 ENUM!{enum DISPID_SpeechLexiconProns {
2298     DISPID_SLPsCount = 1,
2299     DISPID_SLPsItem = ::DISPID_VALUE as u32,
2300     DISPID_SLPs_NewEnum = ::DISPID_NEWENUM as u32,
2301 }}
2302 ENUM!{enum DISPID_SpeechLexiconPronunciation {
2303     DISPID_SLPType = 1,
2304     DISPID_SLPLangId,
2305     DISPID_SLPPartOfSpeech,
2306     DISPID_SLPPhoneIds,
2307     DISPID_SLPSymbolic,
2308 }}
2309 ENUM!{enum DISPID_SpeechPhoneConverter {
2310     DISPID_SPCLangId = 1,
2311     DISPID_SPCPhoneToId,
2312     DISPID_SPCIdToPhone,
2313 }}
2314 RIDL!(
2315 interface ISpeechDataKey(ISpeechDataKeyVtbl): IDispatch(IDispatchVtbl) {
2316     fn SetBinaryValue(&mut self, ValueName: ::BSTR, Value: ::VARIANT) -> ::HRESULT,
2317     fn GetBinaryValue(&mut self, ValueName: ::BSTR, Value: *mut ::VARIANT) -> ::HRESULT,
2318     fn SetStringValue(&mut self, ValueName: ::BSTR, Value: ::BSTR) -> ::HRESULT,
2319     fn GetStringValue(&mut self, ValueName: ::BSTR, Value: *mut ::BSTR) -> ::HRESULT,
2320     fn SetLongValue(&mut self, ValueName: ::BSTR, Value: ::c_long) -> ::HRESULT,
2321     fn GetLongValue(&mut self, ValueName: ::BSTR, Value: *mut ::c_long) -> ::HRESULT,
2322     fn OpenKey(&mut self, SubKeyName: ::BSTR, SubKey: *mut *mut ISpeechDataKey) -> ::HRESULT,
2323     fn CreateKey(&mut self, SubKeyName: ::BSTR, SubKey: *mut *mut ISpeechDataKey) -> ::HRESULT,
2324     fn DeleteKey(&mut self, SubKeyName: ::BSTR) -> ::HRESULT,
2325     fn DeleteValue(&mut self, ValueName: ::BSTR) -> ::HRESULT,
2326     fn EnumKeys(&mut self, Index: ::c_long, SubKeyName: *mut ::BSTR) -> ::HRESULT,
2327     fn EnumValues(&mut self, Index: ::c_long, ValueName: *mut ::BSTR) -> ::HRESULT
2328 }
2329 );
2330 RIDL!(
2331 interface ISpeechObjectToken(ISpeechObjectTokenVtbl): IDispatch(IDispatchVtbl) {
2332     fn get_Id(&mut self, ObjectId: *mut ::BSTR) -> ::HRESULT,
2333     fn get_DataKey(&mut self, DataKey: *mut *mut ISpeechDataKey) -> ::HRESULT,
2334     fn get_Category(&mut self, Category: *mut *mut ISpeechObjectTokenCategory) -> ::HRESULT,
2335     fn GetDescription(&mut self, Locale: ::c_long, Description: *mut ::BSTR) -> ::HRESULT,
2336     fn SetId(
2337         &mut self, Id: ::BSTR, CategoryId: ::BSTR, CreateIfNotExist: ::VARIANT_BOOL
2338     ) -> ::HRESULT,
2339     fn GetAttribute(&mut self, AttributeName: ::BSTR, AttributeValue: *mut ::BSTR) -> ::HRESULT,
2340     fn CreateInstance(
2341         &mut self, pUnkOuter: *mut ::IUnknown, ClsContext: SpeechTokenContext,
2342         Object: *mut *mut ::IUnknown
2343     ) -> ::HRESULT,
2344     fn Remove(&mut self, ObjectStorageCLSID: ::BSTR) -> ::HRESULT,
2345     fn GetStorageFileName(
2346         &mut self, ObjectStorageCLSID: ::BSTR, KeyName: ::BSTR, FileName: ::BSTR, Folder: ::BSTR,
2347         FilePath: *mut ::BSTR
2348     ) -> ::HRESULT,
2349     fn RemoveStorageFileName(
2350         &mut self, ObjectStorageCLSID: ::BSTR, KeyName: ::BSTR, DeleteFile: ::VARIANT_BOOL
2351     ) -> ::HRESULT,
2352     fn IsUISupported(
2353         &mut self, TypeOfUI: ::BSTR, ExtraData: *const ::VARIANT, Object: *mut ::IUnknown,
2354         Supported: *mut ::VARIANT_BOOL
2355     ) -> ::HRESULT,
2356     fn DisplayUI(
2357         &mut self, hWnd: ::c_long, Title: ::BSTR, TypeOfUI: ::BSTR, ExtraData: *const ::VARIANT,
2358         Object: *mut ::IUnknown
2359     ) -> ::HRESULT,
2360     fn MatchesAttributes(&mut self, Attributes: ::BSTR, Matches: *mut ::VARIANT_BOOL) -> ::HRESULT
2361 }
2362 );
2363 RIDL!(
2364 interface ISpeechObjectTokens(ISpeechObjectTokensVtbl): IDispatch(IDispatchVtbl) {
2365     fn get_Count(&mut self, Count: *mut ::c_long) -> ::HRESULT,
2366     fn Item(&mut self, Index: ::c_long, Token: *mut *mut ISpeechObjectToken) -> ::HRESULT,
2367     fn get__NewEnum(&mut self, ppEnumVARIANT: *mut *mut ::IUnknown) -> ::HRESULT
2368 }
2369 );
2370 RIDL!(
2371 interface ISpeechObjectTokenCategory(ISpeechObjectTokenCategoryVtbl): IDispatch(IDispatchVtbl) {
2372     fn get_Id(&mut self, Id: *mut ::BSTR) -> ::HRESULT,
2373     fn put_Default(&mut self, TokenId: ::BSTR) -> ::HRESULT,
2374     fn get_Default(&mut self, TokenId: *mut ::BSTR) -> ::HRESULT,
2375     fn SetId(&mut self, Id: ::BSTR, CreateIfNotExist: ::VARIANT_BOOL) -> ::HRESULT,
2376     fn GetDataKey(
2377         &mut self, Location: SpeechDataKeyLocation, DataKey: *mut *mut ISpeechDataKey
2378     ) -> ::HRESULT,
2379     fn EnumerateTokens(
2380         &mut self, RequiredAttributes: ::BSTR, OptionalAttributes: ::BSTR,
2381         Tokens: *mut *mut ISpeechObjectTokens
2382     ) -> ::HRESULT
2383 }
2384 );
2385 RIDL!(
2386 interface ISpeechAudioBufferInfo(ISpeechAudioBufferInfoVtbl): IDispatch(IDispatchVtbl) {
2387     fn get_MinNotification(&mut self, MinNotification: *mut ::c_long) -> ::HRESULT,
2388     fn put_MinNotification(&mut self, MinNotification: ::c_long) -> ::HRESULT,
2389     fn get_BufferSize(&mut self, BufferSize: *mut ::c_long) -> ::HRESULT,
2390     fn put_BufferSize(&mut self, BufferSize: ::c_long) -> ::HRESULT,
2391     fn get_EventBias(&mut self, EventBias: *mut ::c_long) -> ::HRESULT,
2392     fn put_EventBias(&mut self, EventBias: ::c_long) -> ::HRESULT
2393 }
2394 );
2395 RIDL!(
2396 interface ISpeechAudioStatus(ISpeechAudioStatusVtbl): IDispatch(IDispatchVtbl) {
2397     fn get_FreeBufferSpace(&mut self, FreeBufferSpace: *mut ::c_long) -> ::HRESULT,
2398     fn get_NonBlockingIO(&mut self, NonBlockingIO: *mut ::c_long) -> ::HRESULT,
2399     fn get_State(&mut self, State: *mut SpeechAudioState) -> ::HRESULT,
2400     fn get_CurrentSeekPosition(&mut self, CurrentSeekPosition: *mut ::VARIANT) -> ::HRESULT,
2401     fn get_CurrentDevicePosition(&mut self, CurrentDevicePosition: *mut ::VARIANT) -> ::HRESULT
2402 }
2403 );
2404 RIDL!(
2405 interface ISpeechAudioFormat(ISpeechAudioFormatVtbl): IDispatch(IDispatchVtbl) {
2406     fn get_Type(&mut self, AudioFormat: *mut SpeechAudioFormatType) -> ::HRESULT,
2407     fn put_Type(&mut self, AudioFormat: SpeechAudioFormatType) -> ::HRESULT,
2408     fn get_Guid(&mut self, Guid: *mut ::BSTR) -> ::HRESULT,
2409     fn put_Guid(&mut self, Guid: ::BSTR) -> ::HRESULT,
2410     fn GetWaveFormatEx(&mut self, SpeechWaveFormatEx: *mut *mut ISpeechWaveFormatEx) -> ::HRESULT,
2411     fn SetWaveFormatEx(&mut self, SpeechWaveFormatEx: *mut ISpeechWaveFormatEx) -> ::HRESULT
2412 }
2413 );
2414 RIDL!(
2415 interface ISpeechWaveFormatEx(ISpeechWaveFormatExVtbl): IDispatch(IDispatchVtbl) {
2416     fn get_FormatTag(&mut self, FormatTag: *mut ::c_short) -> ::HRESULT,
2417     fn put_FormatTag(&mut self, FormatTag: ::c_short) -> ::HRESULT,
2418     fn get_Channels(&mut self, Channels: *mut ::c_short) -> ::HRESULT,
2419     fn put_Channels(&mut self, Channels: ::c_short) -> ::HRESULT,
2420     fn get_SamplesPerSec(&mut self, SamplesPerSec: *mut ::c_long) -> ::HRESULT,
2421     fn put_SamplesPerSec(&mut self, SamplesPerSec: ::c_long) -> ::HRESULT,
2422     fn get_AvgBytesPerSec(&mut self, AvgBytesPerSec: *mut ::c_long) -> ::HRESULT,
2423     fn put_AvgBytesPerSec(&mut self, AvgBytesPerSec: ::c_long) -> ::HRESULT,
2424     fn get_BlockAlign(&mut self, BlockAlign: *mut ::c_short) -> ::HRESULT,
2425     fn put_BlockAlign(&mut self, BlockAlign: ::c_short) -> ::HRESULT,
2426     fn get_BitsPerSample(&mut self, BitsPerSample: *mut ::c_short) -> ::HRESULT,
2427     fn put_BitsPerSample(&mut self, BitsPerSample: ::c_short) -> ::HRESULT,
2428     fn get_ExtraData(&mut self, ExtraData: *mut ::VARIANT) -> ::HRESULT,
2429     fn put_ExtraData(&mut self, ExtraData: ::VARIANT) -> ::HRESULT
2430 }
2431 );
2432