// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! SAPI 5.1 definitions
use ctypes::{c_char, c_float, c_long, c_short, c_ushort, c_void};
use shared::guiddef::{CLSID, GUID, IID, REFCLSID, REFGUID, REFIID};
use shared::minwindef::{
    BOOL, BYTE, DWORD, FILETIME, HKEY, HMODULE, LPARAM, UINT, ULONG, USHORT, WORD, WPARAM
};
use shared::mmreg::WAVEFORMATEX;
use shared::rpcndr::byte;
use shared::windef::HWND;
use shared::wtypes::{BSTR, VARIANT_BOOL};
use shared::wtypesbase::{
    CLSCTX_INPROC_HANDLER, CLSCTX_INPROC_SERVER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER
};
use um::oaidl::{DISPID_NEWENUM, DISPID_VALUE, IDispatch, IDispatchVtbl, VARIANT};
use um::objidlbase::{IStream, IStreamVtbl, STREAM_SEEK_CUR, STREAM_SEEK_END, STREAM_SEEK_SET};
use um::servprov::{IServiceProvider, IServiceProviderVtbl};
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::winnt::{HANDLE, HRESULT, LONG, LONGLONG, LPCWSTR, LPWSTR, ULONGLONG, WCHAR};
ENUM!{enum SPDATAKEYLOCATION {
    SPDKL_DefaultLocation = 0,
    SPDKL_CurrentUser = 1,
    SPDKL_LocalMachine = 2,
    SPDKL_CurrentConfig = 5,
}}
pub const SPDUI_EngineProperties: &'static str = "EngineProperties";
pub const SPDUI_AddRemoveWord: &'static str = "AddRemoveWord";
pub const SPDUI_UserTraining: &'static str = "UserTraining";
pub const SPDUI_MicTraining: &'static str = "MicTraining";
pub const SPDUI_RecoProfileProperties: &'static str = "RecoProfileProperties";
pub const SPDUI_AudioProperties: &'static str = "AudioProperties";
pub const SPDUI_AudioVolume: &'static str = "AudioVolume";
pub const SPDUI_UserEnrollment: &'static str = "UserEnrollment";
pub const SPDUI_ShareData: &'static str = "ShareData";
pub const SPDUI_Tutorial: &'static str = "Tutorial";
ENUM!{enum SPSTREAMFORMAT {
    SPSF_Default = -1i32 as u32,
    SPSF_NoAssignedFormat = 0,
    SPSF_Text = 1,
    SPSF_NonStandardFormat = 2,
    SPSF_ExtendedAudioFormat = 3,
    SPSF_8kHz8BitMono = 4,
    SPSF_8kHz8BitStereo = 5,
    SPSF_8kHz16BitMono = 6,
    SPSF_8kHz16BitStereo = 7,
    SPSF_11kHz8BitMono = 8,
    SPSF_11kHz8BitStereo = 9,
    SPSF_11kHz16BitMono = 10,
    SPSF_11kHz16BitStereo = 11,
    SPSF_12kHz8BitMono = 12,
    SPSF_12kHz8BitStereo = 13,
    SPSF_12kHz16BitMono = 14,
    SPSF_12kHz16BitStereo = 15,
    SPSF_16kHz8BitMono = 16,
    SPSF_16kHz8BitStereo = 17,
    SPSF_16kHz16BitMono = 18,
    SPSF_16kHz16BitStereo = 19,
    SPSF_22kHz8BitMono = 20,
    SPSF_22kHz8BitStereo = 21,
    SPSF_22kHz16BitMono = 22,
    SPSF_22kHz16BitStereo = 23,
    SPSF_24kHz8BitMono = 24,
    SPSF_24kHz8BitStereo = 25,
    SPSF_24kHz16BitMono = 26,
    SPSF_24kHz16BitStereo = 27,
    SPSF_32kHz8BitMono = 28,
    SPSF_32kHz8BitStereo = 29,
    SPSF_32kHz16BitMono = 30,
    SPSF_32kHz16BitStereo = 31,
    SPSF_44kHz8BitMono = 32,
    SPSF_44kHz8BitStereo = 33,
    SPSF_44kHz16BitMono = 34,
    SPSF_44kHz16BitStereo = 35,
    SPSF_48kHz8BitMono = 36,
    SPSF_48kHz8BitStereo = 37,
    SPSF_48kHz16BitMono = 38,
    SPSF_48kHz16BitStereo = 39,
    SPSF_TrueSpeech_8kHz1BitMono = 40,
    SPSF_CCITT_ALaw_8kHzMono = 41,
    SPSF_CCITT_ALaw_8kHzStereo = 42,
    SPSF_CCITT_ALaw_11kHzMono = 43,
    SPSF_CCITT_ALaw_11kHzStereo = 44,
    SPSF_CCITT_ALaw_22kHzMono = 45,
    SPSF_CCITT_ALaw_22kHzStereo = 46,
    SPSF_CCITT_ALaw_44kHzMono = 47,
    SPSF_CCITT_ALaw_44kHzStereo = 48,
    SPSF_CCITT_uLaw_8kHzMono = 49,
    SPSF_CCITT_uLaw_8kHzStereo = 50,
    SPSF_CCITT_uLaw_11kHzMono = 51,
    SPSF_CCITT_uLaw_11kHzStereo = 52,
    SPSF_CCITT_uLaw_22kHzMono = 53,
    SPSF_CCITT_uLaw_22kHzStereo = 54,
    SPSF_CCITT_uLaw_44kHzMono = 55,
    SPSF_CCITT_uLaw_44kHzStereo = 56,
    SPSF_ADPCM_8kHzMono = 57,
    SPSF_ADPCM_8kHzStereo = 58,
    SPSF_ADPCM_11kHzMono = 59,
    SPSF_ADPCM_11kHzStereo = 60,
    SPSF_ADPCM_22kHzMono = 61,
    SPSF_ADPCM_22kHzStereo = 62,
    SPSF_ADPCM_44kHzMono = 63,
    SPSF_ADPCM_44kHzStereo = 64,
    SPSF_GSM610_8kHzMono = 65,
    SPSF_GSM610_11kHzMono = 66,
    SPSF_GSM610_22kHzMono = 67,
    SPSF_GSM610_44kHzMono = 68,
    SPSF_NUM_FORMATS = 69,
}}
extern {
    pub static SPDFID_Text: GUID;
    pub static SPDFID_WaveFormatEx: GUID;
}
pub const SPREG_USER_ROOT: &'static str = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech";
pub const SPREG_LOCAL_MACHINE_ROOT: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech";
pub const SPCAT_AUDIOOUT: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioOutput";
pub const SPCAT_AUDIOIN: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioInput";
pub const SPCAT_VOICES: &'static str = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices";
pub const SPCAT_RECOGNIZERS: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Recognizers";
pub const SPCAT_APPLEXICONS: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AppLexicons";
pub const SPCAT_PHONECONVERTERS: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\PhoneConverters";
pub const SPCAT_TEXTNORMALIZERS: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\TextNormalizers";
pub const SPCAT_RECOPROFILES: &'static str
    = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\RecoProfiles";
pub const SPMMSYS_AUDIO_IN_TOKEN_ID: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioInput\\TokenEnums\\MMAudioIn\\";
pub const SPMMSYS_AUDIO_OUT_TOKEN_ID: &'static str
    = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\AudioOutput\\TokenEnums\\MMAudioOut\\";
pub const SPCURRENT_USER_LEXICON_TOKEN_ID: &'static str
    = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\CurrentUserLexicon";
pub const SPCURRENT_USER_SHORTCUT_TOKEN_ID: &'static str
    = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Speech\\CurrentUserShortcut";
pub const SPTOKENVALUE_CLSID: &'static str = "CLSID";
pub const SPTOKENKEY_FILES: &'static str = "Files";
pub const SPTOKENKEY_UI: &'static str = "UI";
pub const SPTOKENKEY_ATTRIBUTES: &'static str = "Attributes";
pub const SPVOICECATEGORY_TTSRATE: &'static str = "DefaultTTSRate";
pub const SPPROP_RESOURCE_USAGE: &'static str = "ResourceUsage";
pub const SPPROP_HIGH_CONFIDENCE_THRESHOLD: &'static str = "HighConfidenceThreshold";
pub const SPPROP_NORMAL_CONFIDENCE_THRESHOLD: &'static str = "NormalConfidenceThreshold";
pub const SPPROP_LOW_CONFIDENCE_THRESHOLD: &'static str = "LowConfidenceThreshold";
pub const SPPROP_RESPONSE_SPEED: &'static str = "ResponseSpeed";
pub const SPPROP_COMPLEX_RESPONSE_SPEED: &'static str = "ComplexResponseSpeed";
pub const SPPROP_ADAPTATION_ON: &'static str = "AdaptationOn";
pub const SPPROP_PERSISTED_BACKGROUND_ADAPTATION: &'static str = "PersistedBackgroundAdaptation";
pub const SPPROP_PERSISTED_LANGUAGE_MODEL_ADAPTATION: &'static str
    = "PersistedLanguageModelAdaptation";
pub const SPPROP_UX_IS_LISTENING: &'static str = "UXIsListening";
pub const SPTOPIC_SPELLING: &'static str = "Spelling";
pub const SPWILDCARD: &'static str = "...";
pub const SPDICTATION: &'static str = "*";
pub const SPINFDICTATION: &'static str = "*+";
pub const SP_LOW_CONFIDENCE: c_char = -1;
pub const SP_NORMAL_CONFIDENCE: c_char = 0;
pub const SP_HIGH_CONFIDENCE: c_char = 1;
pub const DEFAULT_WEIGHT: c_float = 1.0;
pub const SP_MAX_WORD_LENGTH: ULONG = 128;
pub const SP_MAX_PRON_LENGTH: ULONG = 384;
RIDL!{#[uuid(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)]
interface ISpNotifyCallback(ISpNotifyCallbackVtbl) {
    fn NotifyCallback(
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
}}
FN!{stdcall SPNOTIFYCALLBACK(
    wParam: WPARAM,
    lParam: LPARAM,
) -> ()}
RIDL!{#[uuid(0x5eff4aef, 0x8487, 0x11d2, 0x96, 0x1c, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0x28)]
interface ISpNotifySource(ISpNotifySourceVtbl): IUnknown(IUnknownVtbl) {
    fn SetNotifySink(
        pNotifySink: *mut ISpNotifySink,
    ) -> HRESULT,
    fn SetNotifyWindowMessage(
        hWnd: HWND,
        Msg: UINT,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn SetNotifyCallbackFunction(
        pfnCallback: SPNOTIFYCALLBACK,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn SetNotifyCallbackInterface(
        pSpCallback: *mut ISpNotifyCallback,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn SetNotifyWin32Event() -> HRESULT,
    fn WaitForNotifyEvent(
        dwMilliseconds: DWORD,
    ) -> HRESULT,
    fn GetNotifyEventHandle() -> HANDLE,
}}
RIDL!{#[uuid(0x259684dc, 0x37c3, 0x11d2, 0x96, 0x03, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0x28)]
interface ISpNotifySink(ISpNotifySinkVtbl): IUnknown(IUnknownVtbl) {
    fn Notify() -> HRESULT,
}}
RIDL!{#[uuid(0xaca16614, 0x5d3d, 0x11d2, 0x96, 0x0e, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0x28)]
interface ISpNotifyTranslator(ISpNotifyTranslatorVtbl): ISpNotifySink(ISpNotifySinkVtbl) {
    fn InitWindowMessage(
        hWnd: HWND,
        Msg: UINT,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn InitCallback(
        pfnCallback: SPNOTIFYCALLBACK,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn InitSpNotifyCallback(
        pSpCallback: *mut ISpNotifyCallback,
        wParam: WPARAM,
        lParam: LPARAM,
    ) -> HRESULT,
    fn InitWin32Event(
        hEvent: HANDLE,
        fCloseHandleOnRelease: BOOL,
    ) -> HRESULT,
    fn Wait(
        dwMilliseconds: DWORD,
    ) -> HRESULT,
    fn GetEventHandle() -> HANDLE,
}}
RIDL!{#[uuid(0x14056581, 0xe16c, 0x11d2, 0xbb, 0x90, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
interface ISpDataKey(ISpDataKeyVtbl): IUnknown(IUnknownVtbl) {
    fn SetData(
        pszValueName: LPCWSTR,
        cbData: ULONG,
        pData: *const BYTE,
    ) -> HRESULT,
    fn GetData(
        pszValueName: LPCWSTR,
        pcbData: *mut ULONG,
        pData: *mut BYTE,
    ) -> HRESULT,
    fn SetStringValue(
        pszValueName: LPCWSTR,
        pszValue: LPCWSTR,
    ) -> HRESULT,
    fn GetStringValue(
        pszValueName: LPCWSTR,
        ppszValue: *mut LPWSTR,
    ) -> HRESULT,
    fn SetDWORD(
        pszValueName: LPCWSTR,
        dwValue: DWORD,
    ) -> HRESULT,
    fn GetDWORD(
        pszValueName: LPCWSTR,
        pdwValue: *mut DWORD,
    ) -> HRESULT,
    fn OpenKey(
        pszSubKeyName: LPCWSTR,
        ppSubKey: *mut *mut ISpDataKey,
    ) -> HRESULT,
    fn CreateKey(
        pszSubKey: LPCWSTR,
        ppSubKey: *mut *mut ISpDataKey,
    ) -> HRESULT,
    fn DeleteKey(
        pszSubKey: LPCWSTR,
    ) -> HRESULT,
    fn DeleteValue(
        pszValueName: LPCWSTR,
    ) -> HRESULT,
    fn EnumKeys(
        Index: ULONG,
        ppszSubKeyName: *mut LPWSTR,
    ) -> HRESULT,
    fn EnumValues(
        Index: ULONG,
        ppszValueName: *mut LPWSTR,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x92a66e2b, 0xc830, 0x4149, 0x83, 0xdf, 0x6f, 0xc2, 0xba, 0x1e, 0x7a, 0x5b)]
interface ISpRegDataKey(ISpRegDataKeyVtbl): ISpDataKey(ISpDataKeyVtbl) {
    fn SetKey(
        hkey: HKEY,
        fReadOnly: BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x2d3d3845, 0x39af, 0x4850, 0xbb, 0xf9, 0x40, 0xb4, 0x97, 0x80, 0x01, 0x1d)]
interface ISpObjectTokenCategory(ISpObjectTokenCategoryVtbl): ISpDataKey(ISpDataKeyVtbl) {
    fn SetId(
        pszCategoryId: LPCWSTR,
        fCreateIfNotExist: BOOL,
    ) -> HRESULT,
    fn GetId(
        ppszCoMemCategoryId: *mut LPWSTR,
    ) -> HRESULT,
    fn GetDataKey(
        spdkl: SPDATAKEYLOCATION,
        pppDataKey: *mut *mut ISpDataKey,
    ) -> HRESULT,
    fn EnumTokens(
        pzsReqAttribs: LPCWSTR,
        pszOptAttribs: LPCWSTR,
        ppEnum: *mut *mut IEnumSpObjectTokens,
    ) -> HRESULT,
    fn SetDefaultTokenId(
        pszTokenId: LPCWSTR,
    ) -> HRESULT,
    fn GetDefaultTokenId(
        ppszCoMemTokenId: *mut LPWSTR,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x14056589, 0xe16c, 0x11d2, 0xbb, 0x90, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
interface ISpObjectToken(ISpObjectTokenVtbl): ISpDataKey(ISpDataKeyVtbl) {
    fn SetId(
        pszCategoryId: LPCWSTR,
        pszTokenId: LPCWSTR,
        fCreateIfNotExist: BOOL,
    ) -> HRESULT,
    fn GetId(
        ppszCoMemTokenId: *mut LPWSTR,
    ) -> HRESULT,
    fn GetCategory(
        ppTokenCategory: *mut *mut ISpObjectTokenCategory,
    ) -> HRESULT,
    fn CreateInstance(
        pUnkOuter: *mut IUnknown,
        dwClsContext: DWORD,
        riid: REFIID,
        ppvObject: *mut *mut c_void,
    ) -> HRESULT,
    fn GetStorageFileName(
        clsidCaller: REFCLSID,
        pszValueName: LPCWSTR,
        pszFileNameSpecifier: LPCWSTR,
        nFolder: ULONG,
        ppszFilePath: *mut LPWSTR,
    ) -> HRESULT,
    fn RemoveStorageFileName(
        pszKeyName: LPCWSTR,
        fDeleteFile: BOOL,
    ) -> HRESULT,
    fn Remove(
        pclsidCaller: *const CLSID,
    ) -> HRESULT,
    fn IsUISupported(
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
        punkObject: *mut IUnknown,
        pfSupported: *mut BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hwndParent: HWND,
        pszTitle: LPCWSTR,
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
        punkObject: *mut IUnknown,
    ) -> HRESULT,
    fn MatchesAttributes(
        pszAttributes: LPCWSTR,
        pfMatches: *mut BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xb8aab0cf, 0x346f, 0x49d8, 0x94, 0x99, 0xc8, 0xb0, 0x3f, 0x16, 0x1d, 0x51)]
interface ISpObjectTokenInit(ISpObjectTokenInitVtbl): ISpObjectToken(ISpObjectTokenVtbl) {
    fn InitFromDataKey(
        pszCategoryId: LPCWSTR,
        pszTokenId: LPCWSTR,
        pDataKey: *mut ISpDataKey,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x06b64f9e, 0x7fda, 0x11d2, 0xb4, 0xf2, 0x00, 0xc0, 0x4f, 0x79, 0x73, 0x96)]
interface IEnumSpObjectTokens(IEnumSpObjectTokensVtbl): IUnknown(IUnknownVtbl) {
    fn Next(
        celt: ULONG,
        pelt: *mut *mut ISpObjectToken,
        pceltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        celt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppEnum: *mut *mut IEnumSpObjectTokens,
    ) -> HRESULT,
    fn Item(
        Index: ULONG,
        ppToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetCount(
        pCount: *mut ULONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x5b559f40, 0xe952, 0x11d2, 0xbb, 0x91, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
interface ISpObjectWithToken(ISpObjectWithTokenVtbl): IUnknown(IUnknownVtbl) {
    fn SetObjectToken(
        pToken: *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetObjectToken(
        ppToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x93384e18, 0x5014, 0x43d5, 0xad, 0xbb, 0xa7, 0x8e, 0x05, 0x59, 0x26, 0xbd)]
interface ISpResourceManager(ISpResourceManagerVtbl): IServiceProvider(IServiceProviderVtbl) {
    fn SetObject(
        guidServiceId: REFGUID,
        pUnkObject: *mut IUnknown,
    ) -> HRESULT,
    fn GetObject(
        guidServiceId: REFGUID,
        ObjectCLSID: REFCLSID,
        ObjectIID: REFIID,
        fReleaseWhenLastExternalRefReleased: BOOL,
        ppObject: *mut *mut c_void,
    ) -> HRESULT,
}}
ENUM!{enum SPEVENTLPARAMTYPE {
    SPET_LPARAM_IS_UNDEFINED = 0,
    SPET_LPARAM_IS_TOKEN,
    SPET_LPARAM_IS_OBJECT,
    SPET_LPARAM_IS_POINTER,
    SPET_LPARAM_IS_STRING,
}}
ENUM!{enum SPEVENTENUM {
    SPEI_UNDEFINED = 0,
    SPEI_START_INPUT_STREAM = 1,
    SPEI_END_INPUT_STREAM = 2,
    SPEI_VOICE_CHANGE = 3,
    SPEI_TTS_BOOKMARK = 4,
    SPEI_WORD_BOUNDARY = 5,
    SPEI_PHONEME = 6,
    SPEI_SENTENCE_BOUNDARY = 7,
    SPEI_VISEME = 8,
    SPEI_TTS_AUDIO_LEVEL = 9,
    SPEI_TTS_PRIVATE = 15,
    SPEI_MIN_TTS = 1,
    SPEI_MAX_TTS = 15,
    SPEI_END_SR_STREAM = 34,
    SPEI_SOUND_START = 35,
    SPEI_SOUND_END = 36,
    SPEI_PHRASE_START = 37,
    SPEI_RECOGNITION = 38,
    SPEI_HYPOTHESIS = 39,
    SPEI_SR_BOOKMARK = 40,
    SPEI_PROPERTY_NUM_CHANGE = 41,
    SPEI_PROPERTY_STRING_CHANGE = 42,
    SPEI_FALSE_RECOGNITION = 43,
    SPEI_INTERFERENCE = 44,
    SPEI_REQUEST_UI = 45,
    SPEI_RECO_STATE_CHANGE = 46,
    SPEI_ADAPTATION = 47,
    SPEI_START_SR_STREAM = 48,
    SPEI_RECO_OTHER_CONTEXT = 49,
    SPEI_SR_AUDIO_LEVEL = 50,
    SPEI_SR_PRIVATE = 52,
    SPEI_MIN_SR = 34,
    SPEI_MAX_SR = 52,
    SPEI_RESERVED1 = 30,
    SPEI_RESERVED2 = 33,
    SPEI_RESERVED3 = 63,
}}
pub const SPFEI_FLAGCHECK: ULONGLONG = (1 << SPEI_RESERVED1) | (1 << SPEI_RESERVED2);
pub const SPFEI_ALL_TTS_EVENTS: ULONGLONG = 0x000000000000FFFE | SPFEI_FLAGCHECK;
pub const SPFEI_ALL_SR_EVENTS: ULONGLONG = 0x003FFFFC00000000 | SPFEI_FLAGCHECK;
pub const SPFEI_ALL_EVENTS: ULONGLONG = 0xEFFFFFFFFFFFFFFF;
#[inline]
pub fn SPFEI(
        SPEI_ord: SPEVENTENUM,
    ) -> ULONGLONG {
    (1 << SPEI_ord) | SPFEI_FLAGCHECK
}
STRUCT!{struct SPEVENT {
    bitfields: DWORD,
    ulStreamNum: ULONG,
    ullAudioStreamOffset: ULONGLONG,
    wParam: WPARAM,
    lParam: LPARAM,
}}
BITFIELD!{SPEVENT bitfields: SPEVENTENUM [ eEventId set_eEventId[0..16], ]}
BITFIELD!{SPEVENT bitfields: SPEVENTLPARAMTYPE [ elParamType set_elParamType[16..32], ]}
STRUCT!{struct SPSERIALIZEDEVENT {
    bitfields: DWORD,
    ulStreamNum: ULONG,
    ullAudioStreamOffset: ULONGLONG,
    SerializedwParam: ULONG,
    SerializedlParam: LONG,
}}
BITFIELD!{SPSERIALIZEDEVENT bitfields: SPEVENTENUM [ eEventId set_eEventId[0..16], ]}
BITFIELD!{SPSERIALIZEDEVENT bitfields: SPEVENTLPARAMTYPE [ elParamType set_elParamType[16..32], ]}
STRUCT!{struct SPSERIALIZEDEVENT64 {
    bitfields: DWORD,
    ulStreamNum: ULONG,
    ullAudioStreamOffset: ULONGLONG,
    SerializedwParam: ULONGLONG,
    SerializedlParam: LONGLONG,
}}
BITFIELD!{SPSERIALIZEDEVENT64 bitfields: SPEVENTENUM [
    eEventId set_eEventId[0..16],
]}
BITFIELD!{SPSERIALIZEDEVENT64 bitfields: SPEVENTLPARAMTYPE [
    elParamType set_elParamType[16..32],
]}
ENUM!{enum SPINTERFERENCE {
    SPINTERFERENCE_NONE = 0,
    SPINTERFERENCE_NOISE,
    SPINTERFERENCE_NOSIGNAL,
    SPINTERFERENCE_TOOLOUD,
    SPINTERFERENCE_TOOQUIET,
    SPINTERFERENCE_TOOFAST,
    SPINTERFERENCE_TOOSLOW,
    SPINTERFERENCE_LATENCY_WARNING,
    SPINTERFERENCE_LATENCY_TRUNCATE_BEGIN ,
    SPINTERFERENCE_LATENCY_TRUNCATE_END,
}}
ENUM!{enum SPENDSRSTREAMFLAGS {
    SPESF_NONE = 0,
    SPESF_STREAM_RELEASED = 1 << 0,
    SPESF_EMULATED = 1 << 1,
}}
ENUM!{enum SPVFEATURE {
    SPVFEATURE_STRESSED = 1 << 0,
    SPVFEATURE_EMPHASIS = 1 << 1,
}}
ENUM!{enum SPVISEMES {
    SP_VISEME_0 = 0,
    SP_VISEME_1,
    SP_VISEME_2,
    SP_VISEME_3,
    SP_VISEME_4,
    SP_VISEME_5,
    SP_VISEME_6,
    SP_VISEME_7,
    SP_VISEME_8,
    SP_VISEME_9,
    SP_VISEME_10,
    SP_VISEME_11,
    SP_VISEME_12,
    SP_VISEME_13,
    SP_VISEME_14,
    SP_VISEME_15,
    SP_VISEME_16,
    SP_VISEME_17,
    SP_VISEME_18,
    SP_VISEME_19,
    SP_VISEME_20,
    SP_VISEME_21,
}}
STRUCT!{struct SPEVENTSOURCEINFO {
    ullEventInterest: ULONGLONG,
    ullQueuedInterest: ULONGLONG,
    ulCount: ULONG,
}}
RIDL!{#[uuid(0xbe7a9cce, 0x5f9e, 0x11d2, 0x96, 0x0f, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0x28)]
interface ISpEventSource(ISpEventSourceVtbl): ISpNotifySource(ISpNotifySourceVtbl) {
    fn SetInterest(
        ullEventInterest: ULONGLONG,
        ullQueuedInterest: ULONGLONG,
    ) -> HRESULT,
    fn GetEvents(
        ulCount: ULONG,
        pEventArray: *mut SPEVENT,
        pulFetched: *mut ULONG,
    ) -> HRESULT,
    fn GetInfo(
        pInfo: *mut SPEVENTSOURCEINFO,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xbe7a9cc9, 0x5f9e, 0x11d2, 0x96, 0x0f, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0x28)]
interface ISpEventSink(ISpEventSinkVtbl): IUnknown(IUnknownVtbl) {
    fn AddEvents(
        pEventArray: *const SPEVENT,
        ulCount: ULONG,
    ) -> HRESULT,
    fn GetEventInterest(
        pullEventInterest: *mut ULONGLONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xbed530be, 0x2606, 0x4f4d, 0xa1, 0xc0, 0x54, 0xc5, 0xcd, 0xa5, 0x56, 0x6f)]
interface ISpStreamFormat(ISpStreamFormatVtbl): IStream(IStreamVtbl) {
    fn GetFormat(
        pguidFormatId: *mut GUID,
        ppCoMemWaveFormatEx: *mut *mut WAVEFORMATEX,
    ) -> HRESULT,
}}
ENUM!{enum SPFILEMODE {
    SPFM_OPEN_READONLY,
    SPFM_OPEN_READWRITE,
    SPFM_CREATE,
    SPFM_CREATE_ALWAYS,
    SPFM_NUM_MODES,
}}
RIDL!{#[uuid(0x12e3cca9, 0x7518, 0x44c5, 0xa5, 0xe7, 0xba, 0x5a, 0x79, 0xcb, 0x92, 0x9e)]
interface ISpStream(ISpStreamVtbl): ISpStreamFormat(ISpStreamFormatVtbl) {
    fn SetBaseStream(
        pStream: *mut IStream,
        rguidFormat: REFGUID,
        pWaveFormatEx: *const WAVEFORMATEX,
    ) -> HRESULT,
    fn GetBaseStream(
        ppStream: *mut *mut IStream,
    ) -> HRESULT,
    fn BindToFile(
        pszFileName: LPCWSTR,
        eMode: SPFILEMODE,
        pFormatId: *const GUID,
        pWaveFormatEx: *const WAVEFORMATEX,
        ullEventInterest: ULONGLONG,
    ) -> HRESULT,
    fn Close() -> HRESULT,
}}
RIDL!{#[uuid(0x678a932c, 0xea71, 0x4446, 0x9b, 0x41, 0x78, 0xfd, 0xa6, 0x28, 0x0a, 0x29)]
interface ISpStreamFormatConverter(ISpStreamFormatConverterVtbl):
    ISpStreamFormat(ISpStreamFormatVtbl) {
    fn SetBaseStream(
        pStream: *mut ISpStreamFormat,
        fSetFormatToBaseStreamFormat: BOOL,
        fWriteToBaseStream: BOOL,
    ) -> HRESULT,
    fn GetBaseStream(
        ppStream: *mut *mut ISpStreamFormat,
    ) -> HRESULT,
    fn SetFormat(
        rguidFormatIdOfConvertedStream: REFGUID,
        pWaveFormatExOfConvertedStream: *const WAVEFORMATEX,
    ) -> HRESULT,
    fn ResetSeekPosition() -> HRESULT,
    fn ScaleConvertedToBaseOffset(
        ullOffsetConvertedStream: ULONGLONG,
        pullOffsetBaseStream: *mut ULONGLONG,
    ) -> HRESULT,
    fn ScaleBaseToConvertedOffset(
        ullOffsetBaseStream: ULONGLONG,
        pullOffsetConvertedStream: *mut ULONGLONG,
    ) -> HRESULT,
}}
ENUM!{enum SPAUDIOSTATE {
    SPAS_CLOSED,
    SPAS_STOP,
    SPAS_PAUSE,
    SPAS_RUN,
}}
STRUCT!{struct SPAUDIOSTATUS {
    cbFreeBuffSpace: c_long,
    cbNonBlockingIO: ULONG,
    State: SPAUDIOSTATE,
    CurSeekPos: ULONGLONG,
    CurDevicePos: ULONGLONG,
    dwAudioLevel: DWORD,
    dwReserved2: DWORD,
}}
STRUCT!{struct SPAUDIOBUFFERINFO {
    ulMsMinNotification: ULONG,
    ulMsBufferSize: ULONG,
    ulMsEventBias: ULONG,
}}
RIDL!{#[uuid(0xc05c768f, 0xfae8, 0x4ec2, 0x8e, 0x07, 0x33, 0x83, 0x21, 0xc1, 0x24, 0x52)]
interface ISpAudio(ISpAudioVtbl): ISpStreamFormat(ISpStreamFormatVtbl) {
    fn SetState(
        NewState: SPAUDIOSTATE,
        ullReserved: ULONGLONG,
    ) -> HRESULT,
    fn SetFormat(
        rguidFmtId: REFGUID,
        pWaveFormatEx: *const WAVEFORMATEX,
    ) -> HRESULT,
    fn GetStatus(
        pStatus: *mut SPAUDIOSTATUS,
    ) -> HRESULT,
    fn SetBufferInfo(
        pBuffInfo: *const SPAUDIOBUFFERINFO,
    ) -> HRESULT,
    fn GetBufferInfo(
        pBuffInfo: *mut SPAUDIOBUFFERINFO,
    ) -> HRESULT,
    fn GetDefaultFormat(
        pFormatId: *mut GUID,
        ppCoMemWaveFormatEx: *mut *mut WAVEFORMATEX,
    ) -> HRESULT,
    fn EventHandle() -> HANDLE,
    fn GetVolumeLevel(
        pLevel: *mut ULONG,
    ) -> HRESULT,
    fn SetVolumeLevel(
        Level: ULONG,
    ) -> HRESULT,
    fn GetBufferNotifySize(
        pcbSize: *mut ULONG,
    ) -> HRESULT,
    fn SetBufferNotifySize(
        cbSize: ULONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x15806f6e, 0x1d70, 0x4b48, 0x98, 0xe6, 0x3b, 0x1a, 0x00, 0x75, 0x09, 0xab)]
interface ISpMMSysAudio(ISpMMSysAudioVtbl): ISpAudio(ISpAudioVtbl) {
    fn GetDeviceId(
        puDeviceId: *mut UINT,
    ) -> HRESULT,
    fn SetDeviceId(
        uDeviceId: UINT,
    ) -> HRESULT,
    fn GetMMHandle(
        pHandle: *mut *mut c_void,
    ) -> HRESULT,
    fn GetLineId(
        puLineId: *mut UINT,
    ) -> HRESULT,
    fn SetLineId(
        uLineId: UINT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x10f63bce, 0x201a, 0x11d3, 0xac, 0x70, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
interface ISpTranscript(ISpTranscriptVtbl): IUnknown(IUnknownVtbl) {
    fn GetTranscript(
        ppszTranscript: *mut LPWSTR,
    ) -> HRESULT,
    fn AppendTranscript(
        pszTranscript: LPCWSTR,
    ) -> HRESULT,
}}
ENUM!{enum SPDISPLAYATTRIBUTES {
    SPAF_ONE_TRAILING_SPACE = 0x2,
    SPAF_TWO_TRAILING_SPACES = 0x4,
    SPAF_CONSUME_LEADING_SPACES = 0x8,
    SPAF_ALL = 0xf,
}}
pub type SPPHONEID = WCHAR;
pub type PSPPHONEID = LPWSTR;
pub type PCSPPHONEID = LPCWSTR;
STRUCT!{struct SPPHRASEELEMENT {
    ulAudioTimeOffset: ULONG,
    ulAudioSizeTime: ULONG,
    ulAudioStreamOffset: ULONG,
    ulAudioSizeBytes: ULONG,
    ulRetainedStreamOffset: ULONG,
    ulRetainedSizeBytes: ULONG,
    pszDisplayText: LPCWSTR,
    pszLexicalForm: LPCWSTR,
    pszPronunciation: *const SPPHONEID,
    bDisplayAttributes: BYTE,
    RequiredConfidence: c_char,
    ActualConfidence: c_char,
    Reserved: BYTE,
    SREngineConfidence: c_float,
}}
STRUCT!{struct SPPHRASERULE {
    pszName: LPCWSTR,
    ulId: ULONG,
    ulFirstElement: ULONG,
    ulCountOfElements: ULONG,
    pNextSibling: *const SPPHRASERULE,
    pFirstChild: *const SPPHRASERULE,
    SREngineConfidence: c_float,
    Confidence: c_char,
}}
ENUM!{enum SPPHRASEPROPERTYUNIONTYPE {
    SPPPUT_UNUSED = 0,
    SPPPUT_ARRAY_INDEX,
}}
STRUCT!{struct SPPHRASEPROPERTY_u_s {
    bType: byte,
    bReserved: byte,
    usArrayIndex: c_ushort,
}}
UNION!{union SPPHRASEPROPERTY_u {
    [u32; 1],
    ulId ulId_mut: ULONG,
    s s_mut: SPPHRASEPROPERTY_u_s,
}}
STRUCT!{struct SPPHRASEPROPERTY {
    pszName: LPCWSTR,
    u: SPPHRASEPROPERTY_u_s,
    pszValue: LPCWSTR,
    vValue: VARIANT,
    ulFirstElement: ULONG,
    ulCountOfElements: ULONG,
    pNextSibling: *const SPPHRASEPROPERTY,
    pFirstChild: *const SPPHRASEPROPERTY,
    SREngineConfidence: c_float,
    Confidence: c_char,
}}
STRUCT!{struct SPPHRASEREPLACEMENT {
    bDisplayAttributes: BYTE,
    pszReplacementText: LPCWSTR,
    ulFirstElement: ULONG,
    ulCountOfElements: ULONG,
}}
STRUCT!{struct SPPHRASE {
    cbSize: ULONG,
    LangID: WORD,
    wHomophoneGroupId: WORD,
    ullGrammarID: ULONGLONG,
    ftStartTime: ULONGLONG,
    ullAudioStreamPosition: ULONGLONG,
    ulAudioSizeBytes: ULONG,
    ulRetainedSizeBytes: ULONG,
    ulAudioSizeTime: ULONG,
    Rule: SPPHRASERULE,
    pProperties: *const SPPHRASEPROPERTY,
    pElements: *const SPPHRASEELEMENT,
    cReplacements: ULONG,
    pReplacements: *const SPPHRASEREPLACEMENT,
    SREngineID: GUID,
    ulSREnginePrivateDataSize: ULONG,
    pSREnginePrivateData: *const BYTE,
}}
STRUCT!{struct SPSERIALIZEDPHRASE {
    ulSerializedSize: ULONG,
}}
ENUM!{enum SPVALUETYPE {
    SPDF_PROPERTY = 0x1,
    SPDF_REPLACEMENT = 0x2,
    SPDF_RULE = 0x4,
    SPDF_DISPLAYTEXT = 0x8,
    SPDF_LEXICALFORM = 0x10,
    SPDF_PRONUNCIATION = 0x20,
    SPDF_AUDIO = 0x40,
    SPDF_ALTERNATES = 0x80,
    SPDF_ALL = 0xff,
}}
STRUCT!{struct SPBINARYGRAMMAR {
    ulTotalSerializedSize: ULONG,
}}
ENUM!{enum SPPHRASERNG {
    SPPR_ALL_ELEMENTS = -1i32 as u32,
}}
pub const SP_GETWHOLEPHRASE: SPPHRASERNG = SPPR_ALL_ELEMENTS;
pub const SPRR_ALL_ELEMENTS: SPPHRASERNG = SPPR_ALL_ELEMENTS;
DECLARE_HANDLE!{SPSTATEHANDLE, SPSTATEHANDLE__}
ENUM!{enum SPRECOEVENTFLAGS {
    SPREF_AutoPause = 1 << 0,
    SPREF_Emulated = 1 << 1,
}}
ENUM!{enum SPPARTOFSPEECH {
    SPPS_NotOverriden = -1i32 as u32,
    SPPS_Unknown = 0,
    SPPS_Noun = 0x1000,
    SPPS_Verb = 0x2000,
    SPPS_Modifier = 0x3000,
    SPPS_Function = 0x4000,
    SPPS_Interjection = 0x5000,
}}
ENUM!{enum SPLEXICONTYPE {
    eLEXTYPE_USER = 1 << 0,
    eLEXTYPE_APP = 1 << 1,
    eLEXTYPE_VENDORLEXICON = 1 << 2,
    eLEXTYPE_LETTERTOSOUND = 1 << 3,
    eLEXTYPE_MORPHOLOGY = 1 << 4,
    eLEXTYPE_RESERVED4 = 1 << 5,
    eLEXTYPE_USER_SHORTCUT = 1 << 6,
    eLEXTYPE_RESERVED6 = 1 << 7,
    eLEXTYPE_RESERVED7 = 1 << 8,
    eLEXTYPE_RESERVED8 = 1 << 9,
    eLEXTYPE_RESERVED9 = 1 << 10,
    eLEXTYPE_RESERVED10 = 1 << 11,
    eLEXTYPE_PRIVATE1 = 1 << 12,
    eLEXTYPE_PRIVATE2 = 1 << 13,
    eLEXTYPE_PRIVATE3 = 1 << 14,
    eLEXTYPE_PRIVATE4 = 1 << 15,
    eLEXTYPE_PRIVATE5 = 1 << 16,
    eLEXTYPE_PRIVATE6 = 1 << 17,
    eLEXTYPE_PRIVATE7 = 1 << 18,
    eLEXTYPE_PRIVATE8 = 1 << 19,
    eLEXTYPE_PRIVATE9 = 1 << 20,
    eLEXTYPE_PRIVATE10 = 1 << 21,
    eLEXTYPE_PRIVATE11 = 1 << 22,
    eLEXTYPE_PRIVATE12 = 1 << 23,
    eLEXTYPE_PRIVATE13 = 1 << 24,
    eLEXTYPE_PRIVATE14 = 1 << 25,
    eLEXTYPE_PRIVATE15 = 1 << 26,
    eLEXTYPE_PRIVATE16 = 1 << 27,
    eLEXTYPE_PRIVATE17 = 1 << 28,
    eLEXTYPE_PRIVATE18 = 1 << 29,
    eLEXTYPE_PRIVATE19 = 1 << 30,
    eLEXTYPE_PRIVATE20 = 1 << 31,
}}
ENUM!{enum SPWORDTYPE {
    eWORDTYPE_ADDED = 1 << 0,
    eWORDTYPE_DELETED = 1 << 1,
}}
STRUCT!{struct SPWORDPRONUNCIATION {
    pNextWordPronunciation: *mut SPWORDPRONUNCIATION,
    eLexiconType: SPLEXICONTYPE,
    LangID: WORD,
    wPronunciationFlags: WORD,
    ePartOfSpeech: SPPARTOFSPEECH,
    szPronunciation: [SPPHONEID; 1],
}}
STRUCT!{struct SPWORDPRONUNCIATIONLIST {
    ulSize: ULONG,
    pvBuffer: *mut BYTE,
    pFirstWordPronunciation: *mut SPWORDPRONUNCIATION,
}}
STRUCT!{struct SPWORD {
    pNextWord: *mut SPWORD,
    LangID: WORD,
    wReserved: WORD,
    eWordType: SPWORDTYPE,
    pszWord: LPWSTR,
    pFirstWordPronunciation: *mut SPWORDPRONUNCIATION,
}}
STRUCT!{struct SPWORDLIST {
    ulSize: ULONG,
    pvBuffer: *mut BYTE,
    pFirstWord: *mut SPWORD,
}}
RIDL!{#[uuid(0xda41a7c2, 0x5383, 0x4db2, 0x91, 0x6b, 0x6c, 0x17, 0x19, 0xe3, 0xdb, 0x58)]
interface ISpLexicon(ISpLexiconVtbl): IUnknown(IUnknownVtbl) {
    fn GetPronunciations(
        pszWord: LPCWSTR,
        LangID: WORD,
        dwFlags: DWORD,
        pWordPronunciationList: *mut SPWORDPRONUNCIATIONLIST,
    ) -> HRESULT,
    fn AddPronunciation(
        pszWord: LPCWSTR,
        LangID: WORD,
        ePartOfSpeech: SPPARTOFSPEECH,
        pszPronunciation: PCSPPHONEID,
    ) -> HRESULT,
    fn RemovePronunciation(
        pszWord: LPCWSTR,
        LangID: WORD,
        ePartOfSpeech: SPPARTOFSPEECH,
        pszPronunciation: PCSPPHONEID,
    ) -> HRESULT,
    fn GetGeneration(
        pdwGeneration: *mut DWORD,
    ) -> HRESULT,
    fn GetGenerationChange(
        dwFlags: DWORD,
        pdwGeneration: *mut DWORD,
        pWordList: *mut SPWORDLIST,
    ) -> HRESULT,
    fn GetWords(
        dwFlags: DWORD,
        pdwGeneration: *mut DWORD,
        pdwCookie: *mut DWORD,
        pWordList: *mut SPWORDLIST,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8565572f, 0xc094, 0x41cc, 0xb5, 0x6e, 0x10, 0xbd, 0x9c, 0x3f, 0xf0, 0x44)]
interface ISpContainerLexicon(ISpContainerLexiconVtbl): ISpLexicon(ISpLexiconVtbl) {
    fn AddLexicon(
        pAddLexicon: *mut ISpLexicon,
        dwFlags: DWORD,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8445c581, 0x0cac, 0x4a38, 0xab, 0xfe, 0x9b, 0x2c, 0xe2, 0x82, 0x64, 0x55)]
interface ISpPhoneConverter(ISpPhoneConverterVtbl): ISpObjectWithToken(ISpObjectWithTokenVtbl) {
    fn PhoneToId(
        pszPhone: LPCWSTR,
        pId: *mut SPPHONEID,
    ) -> HRESULT,
    fn IdToPhone(
        pId: PCSPPHONEID,
        pszPhone: *mut WCHAR,
    ) -> HRESULT,
}}
STRUCT!{struct SPVPITCH {
    MiddleAdj: c_long,
    RangeAdj: c_long,
}}
ENUM!{enum SPVACTIONS {
    SPVA_Speak = 0,
    SPVA_Silence,
    SPVA_Pronounce,
    SPVA_Bookmark,
    SPVA_SpellOut,
    SPVA_Section,
    SPVA_ParseUnknownTag,
}}
STRUCT!{struct SPVCONTEXT {
    pCategory: LPCWSTR,
    pBefore: LPCWSTR,
    pAfter: LPCWSTR,
}}
STRUCT!{struct SPVSTATE {
    eAction: SPVACTIONS,
    LangID: WORD,
    wReserved: WORD,
    EmphAdj: c_long,
    RateAdj: c_long,
    Volume: ULONG,
    PitchAdj: SPVPITCH,
    SilenceMSecs: ULONG,
    pPhoneIds: *mut SPPHONEID,
    ePartOfSpeech: SPPARTOFSPEECH,
    Context: SPVCONTEXT,
}}
ENUM!{enum SPRUNSTATE {
    SPRS_DONE = 1 << 0,
    SPRS_IS_SPEAKING = 1 << 1,
}}
ENUM!{enum SPVLIMITS {
    SPMIN_VOLUME = 0,
    SPMAX_VOLUME = 100,
    SPMIN_RATE = -10i32 as u32,
    SPMAX_RATE = 10,
}}
ENUM!{enum SPVPRIORITY {
    SPVPRI_NORMAL = 0,
    SPVPRI_ALERT = 1 << 0,
    SPVPRI_OVER = 1 << 1,
}}
STRUCT!{struct SPVOICESTATUS {
    ulCurrentStream: ULONG,
    ulLastStreamQueued: ULONG,
    hrLastResult: HRESULT,
    dwRunningState: DWORD,
    ulInputWordPos: ULONG,
    ulInputWordLen: ULONG,
    ulInputSentPos: ULONG,
    ulInputSentLen: ULONG,
    lBookmarkId: LONG,
    PhonemeId: SPPHONEID,
    VisemeId: SPVISEMES,
    dwReserved1: DWORD,
    dwReserved2: DWORD,
}}
ENUM!{enum SPEAKFLAGS {
    SPF_DEFAULT = 0,
    SPF_ASYNC = 1 << 0,
    SPF_PURGEBEFORESPEAK = 1 << 1,
    SPF_IS_FILENAME = 1 << 2,
    SPF_IS_XML = 1 << 3,
    SPF_IS_NOT_XML = 1 << 4,
    SPF_PERSIST_XML = 1 << 5,
    SPF_NLP_SPEAK_PUNC = 1 << 6,
    SPF_NLP_MASK = SPF_NLP_SPEAK_PUNC,
    SPF_VOICE_MASK = SPF_ASYNC | SPF_PURGEBEFORESPEAK
        | SPF_IS_FILENAME | SPF_IS_XML | SPF_IS_NOT_XML
        | SPF_NLP_MASK | SPF_PERSIST_XML,
    SPF_UNUSED_FLAGS = !SPF_VOICE_MASK,
}}
RIDL!{#[uuid(0x6c44df74, 0x72b9, 0x4992, 0xa1, 0xec, 0xef, 0x99, 0x6e, 0x04, 0x22, 0xd4)]
interface ISpVoice(ISpVoiceVtbl): ISpEventSource(ISpEventSourceVtbl) {
    fn SetOutput(
        pUnkOutput: *mut IUnknown,
        fAllowFormatChanges: BOOL,
    ) -> HRESULT,
    fn GetOutputObjectToken(
        ppObjectToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetOutputStream(
        ppStream: *mut *mut ISpStreamFormat,
    ) -> HRESULT,
    fn Pause() -> HRESULT,
    fn Resume() -> HRESULT,
    fn SetVoice(
        pToken: *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetVoice(
        ppToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn Speak(
        pwcs: LPCWSTR,
        dwFlags: DWORD,
        pulStreamNumber: *mut ULONG,
    ) -> HRESULT,
    fn SpeakStream(
        pStream: *mut IStream,
        dwFlags: DWORD,
        pulStreamNumber: *mut ULONG,
    ) -> HRESULT,
    fn GetStatus(
        pStatus: *mut SPVOICESTATUS,
        ppszLastBookmark: *mut LPWSTR,
    ) -> HRESULT,
    fn Skip(
        pItemType: LPCWSTR,
        lNumItems: c_long,
        pulNumSkipped: *mut ULONG,
    ) -> HRESULT,
    fn SetPriority(
        ePriority: SPVPRIORITY,
    ) -> HRESULT,
    fn GetPriority(
        pePriority: *mut SPVPRIORITY,
    ) -> HRESULT,
    fn SetAlertBoundary(
        eBoundary: SPEVENTENUM,
    ) -> HRESULT,
    fn GetAlertBoundary(
        peBoundary: *mut SPEVENTENUM,
    ) -> HRESULT,
    fn SetRate(
        RateAdjust: c_long,
    ) -> HRESULT,
    fn GetRate(
        pRateAdjust: *mut c_long,
    ) -> HRESULT,
    fn SetVolume(
        usVolume: USHORT,
    ) -> HRESULT,
    fn GetVolume(
        pusVolume: *mut USHORT,
    ) -> HRESULT,
    fn WaitUntilDone(
        msTimeout: ULONG,
    ) -> HRESULT,
    fn SetSyncSpeakTimeout(
        msTimeout: ULONG,
    ) -> HRESULT,
    fn GetSyncSpeakTimeout(
        pmsTimeout: *mut ULONG,
    ) -> HRESULT,
    fn SpeakCompleteEvent() -> HANDLE,
    fn IsUISupported(
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
        pfSupported: *mut BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hwndParent: HWND,
        pszTitle: LPCWSTR,
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x1a5c0354, 0xb621, 0x4b5a, 0x87, 0x91, 0xd3, 0x06, 0xed, 0x37, 0x9e, 0x53)]
interface ISpPhrase(ISpPhraseVtbl): IUnknown(IUnknownVtbl) {
    fn GetPhrase(
        ppCoMemPhrase: *mut *mut SPPHRASE,
    ) -> HRESULT,
    fn GetSerializedPhrase(
        ppCoMemPhrase: *mut *mut SPSERIALIZEDPHRASE,
    ) -> HRESULT,
    fn GetText(
        ulStart: ULONG,
        ulCount: ULONG,
        fUseTextReplacements: BOOL,
        ppszCoMemText: *mut LPWSTR,
        pbDisplayAttributes: *mut BYTE,
    ) -> HRESULT,
    fn Discard(
        dwValueTypes: DWORD,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8fcebc98, 0x4e49, 0x4067, 0x9c, 0x6c, 0xd8, 0x6a, 0x0e, 0x09, 0x2e, 0x3d)]
interface ISpPhraseAlt(ISpPhraseAltVtbl): ISpPhrase(ISpPhraseVtbl) {
    fn GetAltInfo(
        pParent: *mut *mut ISpPhrase,
        pulStartElementInParent: *mut ULONG,
        pcElementsInParent: *mut ULONG,
        pcElementsInAlt: *mut ULONG,
    ) -> HRESULT,
    fn Commit() -> HRESULT,
}}
STRUCT!{struct SPRECORESULTTIMES {
    ftStreamTime: FILETIME,
    ullLength: ULONGLONG,
    dwTickCount: DWORD,
    ullStart: ULONGLONG,
}}
STRUCT!{struct SPSERIALIZEDRESULT {
    ulSerializedSize: ULONG,
}}
RIDL!{#[uuid(0x20b053be, 0xe235, 0x43cd, 0x9a, 0x2a, 0x8d, 0x17, 0xa4, 0x8b, 0x78, 0x42)]
interface ISpRecoResult(ISpRecoResultVtbl): ISpPhrase(ISpPhraseVtbl) {
    fn GetResultTimes(
        pTimes: *mut SPRECORESULTTIMES,
    ) -> HRESULT,
    fn GetAlternates(
        ulStartElement: ULONG,
        cElements: ULONG,
        ulRequestCount: ULONG,
        ppPhrases: *mut *mut ISpPhraseAlt,
        pcPhrasesReturned: *mut ULONG,
    ) -> HRESULT,
    fn GetAudio(
        ulStartElement: ULONG,
        cElements: ULONG,
        ppStream: *mut *mut ISpStreamFormat,
    ) -> HRESULT,
    fn SpeakAudio(
        ulStartElement: ULONG,
        cElements: ULONG,
        dwFlags: DWORD,
        pulStreamNumber: *mut ULONG,
    ) -> HRESULT,
    fn Serialize(
        ppCoMemSerializedResult: *mut *mut SPSERIALIZEDRESULT,
    ) -> HRESULT,
    fn ScaleAudio(
        pAudioFormatId: *const GUID,
        pWaveFormatEx: *const WAVEFORMATEX,
    ) -> HRESULT,
    fn GetRecoContext(
        ppRecoContext: *mut *mut ISpRecoContext,
    ) -> HRESULT,
}}
STRUCT!{struct SPTEXTSELECTIONINFO {
    ulStartActiveOffset: ULONG,
    cchActiveChars: ULONG,
    ulStartSelection: ULONG,
    cchSelection: ULONG,
}}
ENUM!{enum SPWORDPRONOUNCEABLE {
    SPWP_UNKNOWN_WORD_UNPRONOUNCEABLE = 0,
    SPWP_UNKNOWN_WORD_PRONOUNCEABLE = 1,
    SPWP_KNOWN_WORD_PRONOUNCEABLE = 2,
}}
ENUM!{enum SPGRAMMARSTATE {
    SPGS_DISABLED = 0,
    SPGS_ENABLED = 1,
    SPGS_EXCLUSIVE = 3,
}}
ENUM!{enum SPCONTEXTSTATE {
    SPCS_DISABLED = 0,
    SPCS_ENABLED = 1,
}}
ENUM!{enum SPRULESTATE {
    SPRS_INACTIVE = 0,
    SPRS_ACTIVE = 1,
    SPRS_ACTIVE_WITH_AUTO_PAUSE = 3,
}}
pub const SP_STREAMPOS_ASAP: ULONGLONG = 0;
pub const SP_STREAMPOS_REALTIME: ULONGLONG = -1i64 as u64;
pub const SPRULETRANS_TEXTBUFFER: SPSTATEHANDLE = -1isize as SPSTATEHANDLE;
pub const SPRULETRANS_WILDCARD: SPSTATEHANDLE = -2isize as SPSTATEHANDLE;
pub const SPRULETRANS_DICTATION: SPSTATEHANDLE = -3isize as SPSTATEHANDLE;
ENUM!{enum SPGRAMMARWORDTYPE {
    SPWT_DISPLAY,
    SPWT_LEXICAL,
    SPWT_PRONUNCIATION,
    SPWT_LEXICAL_NO_SPECIAL_CHARS,
}}
STRUCT!{struct SPPROPERTYINFO {
    pszName: LPCWSTR,
    ulId: ULONG,
    pszValue: LPCWSTR,
    vValue: VARIANT,
}}
ENUM!{enum SPCFGRULEATTRIBUTES {
    SPRAF_TopLevel = 1 << 0,
    SPRAF_Active = 1 << 1,
    SPRAF_Export = 1 << 2,
    SPRAF_Import = 1 << 3,
    SPRAF_Interpreter = 1 << 4,
    SPRAF_Dynamic = 1 << 5,
    SPRAF_AutoPause = 1 << 16,
}}
RIDL!{#[uuid(0x8137828f, 0x591a, 0x4a42, 0xbe, 0x58, 0x49, 0xea, 0x7e, 0xba, 0xac, 0x68)]
interface ISpGrammarBuilder(ISpGrammarBuilderVtbl): IUnknown(IUnknownVtbl) {
    fn ResetGrammar(
        NewLanguage: WORD,
    ) -> HRESULT,
    fn GetRule(
        pszRuleName: LPCWSTR,
        dwRuleId: DWORD,
        dwAttributes: DWORD,
        fCreateIfNotExist: BOOL,
        phInitialState: *mut SPSTATEHANDLE,
    ) -> HRESULT,
    fn ClearRule(
        hState: SPSTATEHANDLE,
    ) -> HRESULT,
    fn CreateNewState(
        hState: SPSTATEHANDLE,
        phState: *mut SPSTATEHANDLE,
    ) -> HRESULT,
    fn AddWordTransition(
        hFromState: SPSTATEHANDLE,
        hToState: SPSTATEHANDLE,
        psz: LPCWSTR,
        pszSeparators: LPCWSTR,
        eWordType: SPGRAMMARWORDTYPE,
        Weight: c_float,
        pPropInfo: *const SPPROPERTYINFO,
    ) -> HRESULT,
    fn AddRuleTransition(
        hFromState: SPSTATEHANDLE,
        hToState: SPSTATEHANDLE,
        hRule: SPSTATEHANDLE,
        Weight: c_float,
        pPropInfo: *const SPPROPERTYINFO,
    ) -> HRESULT,
    fn AddResource(
        hRuleState: SPSTATEHANDLE,
        pszResourceName: LPCWSTR,
        pszResourceValue: LPCWSTR,
    ) -> HRESULT,
    fn Commit(
        dwReserved: DWORD,
    ) -> HRESULT,
}}
ENUM!{enum SPLOADOPTIONS {
    SPLO_STATIC = 0,
    SPLO_DYNAMIC = 1,
}}
RIDL!{#[uuid(0x2177db29, 0x7f45, 0x47d0, 0x85, 0x54, 0x06, 0x7e, 0x91, 0xc8, 0x05, 0x02)]
interface ISpRecoGrammar(ISpRecoGrammarVtbl): ISpGrammarBuilder(ISpGrammarBuilderVtbl) {
    fn GetGrammarId(
        pullGrammarId: *mut ULONGLONG,
    ) -> HRESULT,
    fn GetRecoContext(
        ppRecoCtxt: *mut *mut ISpRecoContext,
    ) -> HRESULT,
    fn LoadCmdFromFile(
        pszFileName: LPCWSTR,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn LoadCmdFromObject(
        rcid: REFCLSID,
        pszGrammarName: LPCWSTR,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn LoadCmdFromResource(
        hModule: HMODULE,
        pszResourceName: LPCWSTR,
        pszResourceType: LPCWSTR,
        wLanguage: WORD,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn LoadCmdFromMemory(
        pGrammar: *const SPBINARYGRAMMAR,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn LoadCmdFromProprietaryGrammar(
        rguidParam: REFGUID,
        pszStringParam: LPCWSTR,
        pvDataPrarm: *const c_void,
        cbDataSize: ULONG,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn SetRuleState(
        pszName: LPCWSTR,
        pReserved: *mut c_void,
        NewState: SPRULESTATE,
    ) -> HRESULT,
    fn SetRuleIdState(
        ulRuleId: ULONG,
        NewState: SPRULESTATE,
    ) -> HRESULT,
    fn LoadDictation(
        pszTopicName: LPCWSTR,
        Options: SPLOADOPTIONS,
    ) -> HRESULT,
    fn UnloadDictation() -> HRESULT,
    fn SetDictationState(
        NewState: SPRULESTATE,
    ) -> HRESULT,
    fn SetWordSequenceData(
        pText: *const WCHAR,
        cchText: ULONG,
        pInfo: *const SPTEXTSELECTIONINFO,
    ) -> HRESULT,
    fn SetTextSelection(
        pInfo: *const SPTEXTSELECTIONINFO,
    ) -> HRESULT,
    fn IsPronounceable(
        pszWord: LPCWSTR,
        pWordPronounceable: *mut SPWORDPRONOUNCEABLE,
    ) -> HRESULT,
    fn SetGrammarState(
        eGrammarState: SPGRAMMARSTATE,
    ) -> HRESULT,
    fn SaveCmd(
        pStream: *mut IStream,
        ppszCoMemErrorText: *mut LPWSTR,
    ) -> HRESULT,
    fn GetGrammarState(
        peGrammarState: *mut SPGRAMMARSTATE,
    ) -> HRESULT,
}}
STRUCT!{struct SPRECOCONTEXTSTATUS {
    eInterference: SPINTERFERENCE,
    szRequestTypeOfUI: [WCHAR; 255],
    dwReserved1: DWORD,
    dwReserved2: DWORD,
}}
ENUM!{enum SPBOOKMARKOPTIONS {
    SPBO_NONE = 0,
    SPBO_PAUSE = 1 << 0,
}}
ENUM!{enum SPAUDIOOPTIONS {
    SPAO_NONE = 0,
    SPAO_RETAIN_AUDIO = 1 << 0,
}}
RIDL!{#[uuid(0xf740a62f, 0x7c15, 0x489e, 0x82, 0x34, 0x94, 0x0a, 0x33, 0xd9, 0x27, 0x2d)]
interface ISpRecoContext(ISpRecoContextVtbl): ISpEventSource(ISpEventSourceVtbl) {
    fn GetRecognizer(
        ppRecognizer: *mut *mut ISpRecognizer,
    ) -> HRESULT,
    fn CreateGrammer(
        ullGrammarId: ULONGLONG,
        ppGrammar: *mut *mut ISpRecoGrammar,
    ) -> HRESULT,
    fn GetStatus(
        pState: *mut SPRECOCONTEXTSTATUS,
    ) -> HRESULT,
    fn GetMaxAlternates(
        pcAlternates: *mut ULONG,
    ) -> HRESULT,
    fn SetMaxAlternates(
        cAlternates: ULONG,
    ) -> HRESULT,
    fn SetAudioOptions(
        Options: SPAUDIOOPTIONS,
        pAudioFormatId: *const GUID,
        pWaveFormatEx: *const WAVEFORMATEX,
    ) -> HRESULT,
    fn GetAudioOptions(
        pOptions: *mut SPAUDIOOPTIONS,
        pAudioFormatId: *mut GUID,
        ppCoMemWFEX: *mut *mut WAVEFORMATEX,
    ) -> HRESULT,
    fn DeserializeResult(
        pSerializedResult: *const SPSERIALIZEDRESULT,
        ppResult: *mut *mut ISpRecoResult,
    ) -> HRESULT,
    fn Bookmark(
        Options: SPBOOKMARKOPTIONS,
        ullStreamPosition: ULONGLONG,
        lparamEvent: LPARAM,
    ) -> HRESULT,
    fn SetAdaptionData(
        pAdaptionData: LPCWSTR,
        cch: ULONG,
    ) -> HRESULT,
    fn Pause(
        dwReserved: DWORD,
    ) -> HRESULT,
    fn Resume(
        dwReserved: DWORD,
    ) -> HRESULT,
    fn SetVoice(
        pVoice: *mut ISpVoice,
        fAllowFormatChanges: BOOL,
    ) -> HRESULT,
    fn GetVoice(
        ppVoice: *mut *mut ISpVoice,
    ) -> HRESULT,
    fn SetVoicePurgeEvent(
        ullEventIntereset: ULONGLONG,
    ) -> HRESULT,
    fn GetVoicePurgeEvent(
        pullEventIntereset: *mut ULONGLONG,
    ) -> HRESULT,
    fn SetContextState(
        eContextState: SPCONTEXTSTATE,
    ) -> HRESULT,
    fn GetContextState(
        peContextState: *mut SPCONTEXTSTATE,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x5b4fb971, 0xb115, 0x4de1, 0xad, 0x97, 0xe4, 0x82, 0xe3, 0xbf, 0x6e, 0xe4)]
interface ISpProperties(ISpPropertiesVtbl): IUnknown(IUnknownVtbl) {
    fn SetPropertyNum(
        pName: LPCWSTR,
        lValue: LONG,
    ) -> HRESULT,
    fn GetPropertyNum(
        pName: LPCWSTR,
        plValue: *mut LONG,
    ) -> HRESULT,
    fn SetPropertyString(
        pName: LPCWSTR,
        pValue: LPCWSTR,
    ) -> HRESULT,
    fn GetPropertyString(
        pName: LPCWSTR,
        ppCoMemValue: *mut LPWSTR,
    ) -> HRESULT,
}}
pub const SP_MAX_LANGIDS: usize = 20;
STRUCT!{struct SPRECOGNIZERSTATUS {
    AudioStatus: SPAUDIOSTATUS,
    ullRecognitionStreamPos: ULONGLONG,
    ulStreamNumber: ULONG,
    ulNumActive: ULONG,
    clsidEngine: CLSID,
    cLangIDs: ULONG,
    aLangID: [WORD; SP_MAX_LANGIDS],
    ullRecognitionStreamTime: ULONGLONG,
}}
ENUM!{enum SPWAVEFORMATTYPE {
    SPWF_INPUT,
    SPWF_SRENGINE,
}}
pub type SPSTREAMFORMATTYPE = SPWAVEFORMATTYPE;
ENUM!{enum SPRECOSTATE {
    SPRST_INACTIVE,
    SPRST_ACTIVE,
    SPRST_ACTIVE_ALWAYS,
    SPRST_INACTIVE_WITH_PURGE,
    SPRST_NUM_STATES,
}}
RIDL!{#[uuid(0xc2b5f241, 0xdaa0, 0x4507, 0x9e, 0x16, 0x5a, 0x1e, 0xaa, 0x2b, 0x7a, 0x5c)]
interface ISpRecognizer(ISpRecognizerVtbl): ISpProperties(ISpPropertiesVtbl) {
    fn SetRecognizer(
        pRecognizer: *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetRecognizer(
        ppRecognizer: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn SetInput(
        pUnkInput: *mut IUnknown,
        fAllowFormatChanges: BOOL,
    ) -> HRESULT,
    fn GetInputObjectToken(
        ppToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn GetInputStream(
        ppStream: *mut *mut ISpStreamFormat,
    ) -> HRESULT,
    fn CreateRecoContext(
        ppNewCtxt: *mut *mut ISpRecoContext,
    ) -> HRESULT,
    fn GetRecoProfile(
        ppToken: *mut *mut ISpObjectToken,
    ) -> HRESULT,
    fn SetRecoProfile(
        pToken: *mut ISpObjectToken,
    ) -> HRESULT,
    fn IsSharedInstance() -> HRESULT,
    fn GetRecoState(
        pState: *mut SPRECOSTATE,
    ) -> HRESULT,
    fn SetRecoState(
        NewState: SPRECOSTATE,
    ) -> HRESULT,
    fn GetStatus(
        pStatus: *mut SPRECOGNIZERSTATUS,
    ) -> HRESULT,
    fn GetFormat(
        WaveFormatType: SPSTREAMFORMATTYPE,
        pFormatId: *mut GUID,
        ppCoMemWFEX: *mut WAVEFORMATEX,
    ) -> HRESULT,
    fn IsUISupported(
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
        pfSupported: *mut BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hwndParent: HWND,
        pszTitle: LPCWSTR,
        pszTypeOfUI: LPCWSTR,
        pvExtraData: *mut c_void,
        cbExtraData: ULONG,
    ) -> HRESULT,
    fn EmulateRecognition(
        pPhrase: *mut ISpPhrase,
    ) -> HRESULT,
}}
pub type SpeechLanguageId = c_long;
ENUM!{enum DISPID_SpeechDataKey {
    DISPID_SDKSetBinaryValue = 1,
    DISPID_SDKGetBinaryValue,
    DISPID_SDKSetStringValue,
    DISPID_SDKGetStringValue,
    DISPID_SDKSetLongValue,
    DISPID_SDKGetlongValue,
    DISPID_SDKOpenKey,
    DISPID_SDKCreateKey,
    DISPID_SDKDeleteKey,
    DISPID_SDKDeleteValue,
    DISPID_SDKEnumKeys,
    DISPID_SDKEnumValues,
}}
ENUM!{enum DISPID_SpeechObjectToken {
    DISPID_SOTId = 1,
    DISPID_SOTDataKey,
    DISPID_SOTCategory,
    DISPID_SOTGetDescription,
    DISPID_SOTSetId,
    DISPID_SOTGetAttribute,
    DISPID_SOTCreateInstance,
    DISPID_SOTRemove,
    DISPID_SOTGetStorageFileName,
    DISPID_SOTRemoveStorageFileName,
    DISPID_SOTIsUISupported,
    DISPID_SOTDisplayUI,
    DISPID_SOTMatchesAttributes,
}}
ENUM!{enum SpeechDataKeyLocation {
    SDKLDefaultLocation = SPDKL_DefaultLocation,
    SDKLCurrentUser = SPDKL_CurrentUser,
    SDKLLocalMachine = SPDKL_LocalMachine,
    SDKLCurrentConfig = SPDKL_CurrentConfig,
}}
ENUM!{enum SpeechTokenContext {
    STCInprocServer = CLSCTX_INPROC_SERVER,
    STCInprocHandler = CLSCTX_INPROC_HANDLER,
    STCLocalServer = CLSCTX_LOCAL_SERVER,
    STCRemoteServer = CLSCTX_REMOTE_SERVER,
    STCAll = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER
        | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
}}
ENUM!{enum SpeechTokenShellFolder {
    STSF_AppData = 0x1a,
    STSF_LocalAppData = 0x1c,
    STSF_CommonAppData = 0x23,
    STSF_FlagCreate = 0x8000,
}}
ENUM!{enum DISPID_SpeechObjectTokens {
    DISPID_SOTsCount = 1,
    DISPID_SOTsItem = DISPID_VALUE as u32,
    DISPID_SOTs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechObjectTokenCategory {
    DISPID_SOTCId = 1,
    DISPID_SOTCDefault,
    DISPID_SOTCSetId,
    DISPID_SOTCGetDataKey,
    DISPID_SOTCEnumerateTokens,
}}
ENUM!{enum SpeechAudioFormatType {
    SAFTDefault = -1i32 as u32,
    SAFTNoAssignedFormat = 0,
    SAFTText = 1,
    SAFTNonStandardFormat = 2,
    SAFTExtendedAudioFormat = 3,
    SAFT8kHz8BitMono = 4,
    SAFT8kHz8BitStereo = 5,
    SAFT8kHz16BitMono = 6,
    SAFT8kHz16BitStereo = 7,
    SAFT11kHz8BitMono = 8,
    SAFT11kHz8BitStereo = 9,
    SAFT11kHz16BitMono = 10,
    SAFT11kHz16BitStereo = 11,
    SAFT12kHz8BitMono = 12,
    SAFT12kHz8BitStereo = 13,
    SAFT12kHz16BitMono = 14,
    SAFT12kHz16BitStereo = 15,
    SAFT16kHz8BitMono = 16,
    SAFT16kHz8BitStereo = 17,
    SAFT16kHz16BitMono = 18,
    SAFT16kHz16BitStereo = 19,
    SAFT22kHz8BitMono = 20,
    SAFT22kHz8BitStereo = 21,
    SAFT22kHz16BitMono = 22,
    SAFT22kHz16BitStereo = 23,
    SAFT24kHz8BitMono = 24,
    SAFT24kHz8BitStereo = 25,
    SAFT24kHz16BitMono = 26,
    SAFT24kHz16BitStereo = 27,
    SAFT32kHz8BitMono = 28,
    SAFT32kHz8BitStereo = 29,
    SAFT32kHz16BitMono = 30,
    SAFT32kHz16BitStereo = 31,
    SAFT44kHz8BitMono = 32,
    SAFT44kHz8BitStereo = 33,
    SAFT44kHz16BitMono = 34,
    SAFT44kHz16BitStereo = 35,
    SAFT48kHz8BitMono = 36,
    SAFT48kHz8BitStereo = 37,
    SAFT48kHz16BitMono = 38,
    SAFT48kHz16BitStereo = 39,
    SAFTTrueSpeech_8kHz1BitMono = 40,
    SAFTCCITT_ALaw_8kHzMono = 41,
    SAFTCCITT_ALaw_8kHzStereo = 42,
    SAFTCCITT_ALaw_11kHzMono = 43,
    SAFTCCITT_ALaw_11kHzStereo = 44,
    SAFTCCITT_ALaw_22kHzMono = 45,
    SAFTCCITT_ALaw_22kHzStereo = 46,
    SAFTCCITT_ALaw_44kHzMono = 47,
    SAFTCCITT_ALaw_44kHzStereo = 48,
    SAFTCCITT_uLaw_8kHzMono = 49,
    SAFTCCITT_uLaw_8kHzStereo = 50,
    SAFTCCITT_uLaw_11kHzMono = 51,
    SAFTCCITT_uLaw_11kHzStereo = 52,
    SAFTCCITT_uLaw_22kHzMono = 53,
    SAFTCCITT_uLaw_22kHzStereo = 54,
    SAFTCCITT_uLaw_44kHzMono = 55,
    SAFTCCITT_uLaw_44kHzStereo = 56,
    SAFTADPCM_8kHzMono = 57,
    SAFTADPCM_8kHzStereo = 58,
    SAFTADPCM_11kHzMono = 59,
    SAFTADPCM_11kHzStereo = 60,
    SAFTADPCM_22kHzMono = 61,
    SAFTADPCM_22kHzStereo = 62,
    SAFTADPCM_44kHzMono = 63,
    SAFTADPCM_44kHzStereo = 64,
    SAFTGSM610_8kHzMono = 65,
    SAFTGSM610_11kHzMono = 66,
    SAFTGSM610_22kHzMono = 67,
    SAFTGSM610_44kHzMono = 68,
}}
ENUM!{enum DISPID_SpeechAudioFormat {
    DISPID_SAFType = 1,
    DISPID_SAFGuid,
    DISPID_SAFGetWaveFormatEx,
    DISPID_SAFSetWaveFormatEx,
}}
ENUM!{enum DISPID_SpeechBaseStream {
    DISPID_SBSFormat = 1,
    DISPID_SBSRead,
    DISPID_SBSWrite,
    DISPID_SBSSeek,
}}
ENUM!{enum SpeechStreamSeekPositionType {
    SSSPTRelativeToStart = STREAM_SEEK_SET,
    SSSPTRelativeToCurrentPosition = STREAM_SEEK_CUR,
    SSSPTRelativeToEnd = STREAM_SEEK_END,
}}
ENUM!{enum DISPID_SpeechAudio {
    DISPID_SAStatus = 200,
    DISPID_SABufferInfo,
    DISPID_SADefaultFormat,
    DISPID_SAVolume,
    DISPID_SABufferNotifySize,
    DISPID_SAEventHandle,
    DISPID_SASetState,
}}
ENUM!{enum SpeechAudioState {
    SASClosed = SPAS_CLOSED,
    SASStop = SPAS_STOP,
    SASPause = SPAS_PAUSE,
    SASRun = SPAS_RUN,
}}
ENUM!{enum DISPID_SpeechMMSysAudio {
    DISPID_SMSADeviceId = 300,
    DISPID_SMSALineId,
    DISPID_SMSAMMHandle,
}}
ENUM!{enum DISPID_SpeechFileStream {
    DISPID_SFSOpen = 100,
    DISPID_SFSClose,
}}
ENUM!{enum SpeechStreamFileMode {
    SSFMOpenForRead = SPFM_OPEN_READONLY,
    SSFMOpenReadWrite = SPFM_OPEN_READWRITE,
    SSFMCreate = SPFM_CREATE,
    SSFMCreateForWrite = SPFM_CREATE_ALWAYS,
}}
ENUM!{enum DISPID_SpeechCustomStream {
    DISPID_SCSBaseStream = 100,
}}
ENUM!{enum DISPID_SpeechMemoryStream {
    DISPID_SMSSetData = 100,
    DISPID_SMSGetData,
}}
ENUM!{enum DISPID_SpeechAudioStatus {
    DISPID_SASFreeBufferSpace = 1,
    DISPID_SASNonBlockingIO,
    DISPID_SASState,
    DISPID_SASCurrentSeekPosition,
    DISPID_SASCurrentDevicePosition,
}}
ENUM!{enum DISPID_SpeechAudioBufferInfo {
    DISPID_SABIMinNotification = 1,
    DISPID_SABIBufferSize,
    DISPID_SABIEventBias,
}}
ENUM!{enum DISPID_SpeechWaveFormatEx {
    DISPID_SWFEFormatTag = 1,
    DISPID_SWFEChannels,
    DISPID_SWFESamplesPerSec,
    DISPID_SWFEAvgBytesPerSec,
    DISPID_SWFEBlockAlign,
    DISPID_SWFEBitsPerSample,
    DISPID_SWFEExtraData,
}}
ENUM!{enum DISPID_SpeechVoice {
    DISPID_SVStatus = 1,
    DISPID_SVVoice,
    DISPID_SVAudioOutput,
    DISPID_SVAudioOutputStream,
    DISPID_SVRate,
    DISPID_SVVolume,
    DISPID_SVAllowAudioOuputFormatChangesOnNextSet,
    DISPID_SVEventInterests,
    DISPID_SVPriority,
    DISPID_SVAlertBoundary,
    DISPID_SVSyncronousSpeakTimeout,
    DISPID_SVSpeak,
    DISPID_SVSpeakStream,
    DISPID_SVPause,
    DISPID_SVResume,
    DISPID_SVSkip,
    DISPID_SVGetVoices,
    DISPID_SVGetAudioOutputs,
    DISPID_SVWaitUntilDone,
    DISPID_SVSpeakCompleteEvent,
    DISPID_SVIsUISupported,
    DISPID_SVDisplayUI,
}}
ENUM!{enum SpeechVoicePriority {
    SVPNormal = SPVPRI_NORMAL,
    SVPAlert = SPVPRI_ALERT,
    SVPOver = SPVPRI_OVER,
}}
ENUM!{enum SpeechVoiceSpeakFlags {
    SVSFDefault = SPF_DEFAULT,
    SVSFlagsAsync = SPF_ASYNC,
    SVSFPurgeBeforeSpeak = SPF_PURGEBEFORESPEAK,
    SVSFIsFilename = SPF_IS_FILENAME,
    SVSFIsXML = SPF_IS_XML,
    SVSFIsNotXML = SPF_IS_NOT_XML,
    SVSFPersistXML = SPF_PERSIST_XML,
    SVSFNLPSpeakPunc = SPF_NLP_SPEAK_PUNC,
    SVSFNLPMask = SPF_NLP_MASK,
    SVSFVoiceMask = SPF_VOICE_MASK as u32,
    SVSFUnusedFlags = SPF_UNUSED_FLAGS as u32,
}}
ENUM!{enum SpeechVoiceEvents {
    SVEStartInputStream = 1 << 1,
    SVEEndInputStream = 1 << 2,
    SVEVoiceChange = 1 << 3,
    SVEBookmark = 1 << 4,
    SVEWordBoundary = 1 << 5,
    SVEPhoneme = 1 << 6,
    SVESentenceBoundary = 1 << 7,
    SVEViseme = 1 << 8,
    SVEAudioLevel = 1 << 9,
    SVEPrivate = 1 << 15,
    SVEAllEvents = 0x83fe,
}}
ENUM!{enum DISPID_SpeechVoiceStatus {
    DISPID_SVSCurrentStreamNumber = 1,
    DISPID_SVSLastStreamNumberQueued,
    DISPID_SVSLastResult,
    DISPID_SVSRunningState,
    DISPID_SVSInputWordPosition,
    DISPID_SVSInputWordLength,
    DISPID_SVSInputSentencePosition,
    DISPID_SVSInputSentenceLength,
    DISPID_SVSLastBookmark,
    DISPID_SVSLastBookmarkId,
    DISPID_SVSPhonemeId,
    DISPID_SVSVisemeId,
}}
ENUM!{enum SpeechRunState {
    SRSEDone = SPRS_DONE,
    SRSEIsSpeaking = SPRS_IS_SPEAKING,
}}
ENUM!{enum SpeechVisemeType {
    SVP_0 = 0,
    SVP_1,
    SVP_2,
    SVP_3,
    SVP_4,
    SVP_5,
    SVP_6,
    SVP_7,
    SVP_8,
    SVP_9,
    SVP_10,
    SVP_11,
    SVP_12,
    SVP_13,
    SVP_14,
    SVP_15,
    SVP_16,
    SVP_17,
    SVP_18,
    SVP_19,
    SVP_20,
    SVP_21,
}}
ENUM!{enum SpeechVisemeFeature {
    SVF_None = 0,
    SVF_Stressed = SPVFEATURE_STRESSED,
    SVF_Emphasis = SPVFEATURE_EMPHASIS,
}}
ENUM!{enum DISPID_SpeechVoiceEvent {
    DISPID_SVEStreamStart = 1,
    DISPID_SVEStreamEnd,
    DISPID_SVEVoiceChange,
    DISPID_SVEBookmark,
    DISPID_SVEWord,
    DISPID_SVEPhoneme,
    DISPID_SVESentenceBoundary,
    DISPID_SVEViseme,
    DISPID_SVEAudioLevel,
    DISPID_SVEEnginePrivate,
}}
ENUM!{enum DISPID_SpeechRecognizer {
    DISPID_SRRecognizer = 1,
    DISPID_SRAllowAudioInputFormatChangesOnNextSet,
    DISPID_SRAudioInput,
    DISPID_SRAudioInputStream,
    DISPID_SRIsShared,
    DISPID_SRState,
    DISPID_SRStatus,
    DISPID_SRProfile,
    DISPID_SREmulateRecognition,
    DISPID_SRCreateRecoContext,
    DISPID_SRGetFormat,
    DISPID_SRSetPropertyNumber,
    DISPID_SRGetPropertyNumber,
    DISPID_SRSetPropertyString,
    DISPID_SRGetPropertyString,
    DISPID_SRIsUISupported,
    DISPID_SRDisplayUI,
    DISPID_SRGetRecognizers,
    DISPID_SVGetAudioInputs,
    DISPID_SVGetProfiles,
}}
ENUM!{enum SpeechRecognizerState {
    SRSInactive = SPRST_INACTIVE,
    SRSActive = SPRST_ACTIVE,
    SRSActiveAlways = SPRST_ACTIVE_ALWAYS,
    SRSInactiveWithPurge = SPRST_INACTIVE_WITH_PURGE,
}}
ENUM!{enum SpeechDisplayAttributes {
    SDA_No_Trailing_Space = 0,
    SDA_One_Trailing_Space = SPAF_ONE_TRAILING_SPACE,
    SDA_Two_Trailing_Spaces = SPAF_TWO_TRAILING_SPACES,
    SDA_Consume_Leading_Spaces = SPAF_CONSUME_LEADING_SPACES,
}}
ENUM!{enum SpeechFormatType {
    SFTInput = SPWF_INPUT,
    SFTSREngine = SPWF_SRENGINE,
}}
ENUM!{enum DISPID_SpeechRecognizerStatus {
    DISPID_SRSAudioStatus = 1,
    DISPID_SRSCurrentStreamPosition,
    DISPID_SRSCurrentStreamNumber,
    DISPID_SRSNumberOfActiveRules,
    DISPID_SRSClsidEngine,
    DISPID_SRSSupportedLanguages,
}}
ENUM!{enum DISPID_SpeechRecoContext {
    DISPID_SRCRecognizer = 1,
    DISPID_SRCAudioInInterferenceStatus,
    DISPID_SRCRequestedUIType,
    DISPID_SRCVoice,
    DISPID_SRAllowVoiceFormatMatchingOnNextSet,
    DISPID_SRCVoicePurgeEvent,
    DISPID_SRCEventInterests,
    DISPID_SRCCmdMaxAlternates,
    DISPID_SRCState,
    DISPID_SRCRetainedAudio,
    DISPID_SRCRetainedAudioFormat,
    DISPID_SRCPause,
    DISPID_SRCResume,
    DISPID_SRCCreateGrammar,
    DISPID_SRCCreateResultFromMemory,
    DISPID_SRCBookmark,
    DISPID_SRCSetAdaptationData,
}}
ENUM!{enum SpeechRetainedAudioOptions {
    SRAONone = SPAO_NONE,
    SRAORetainAudio = SPAO_RETAIN_AUDIO,
}}
ENUM!{enum SpeechBookmarkOptions {
    SBONone = SPBO_NONE,
    SBOPause = SPBO_PAUSE,
}}
ENUM!{enum SpeechInterference {
    SINone = SPINTERFERENCE_NONE,
    SINoise = SPINTERFERENCE_NOISE,
    SINoSignal = SPINTERFERENCE_NOSIGNAL,
    SITooLoud = SPINTERFERENCE_TOOLOUD,
    SITooQuiet = SPINTERFERENCE_TOOQUIET,
    SITooFast = SPINTERFERENCE_TOOFAST,
    SITooSlow = SPINTERFERENCE_TOOSLOW,
}}
ENUM!{enum SpeechRecoEvents {
    SREStreamEnd = 1 << 0,
    SRESoundStart = 1 << 1,
    SRESoundEnd = 1 << 2,
    SREPhraseStart = 1 << 3,
    SRERecognition = 1 << 4,
    SREHypothesis = 1 << 5,
    SREBookmark = 1 << 6,
    SREPropertyNumChange = 1 << 7,
    SREPropertyStringChange = 1 << 8,
    SREFalseRecognition = 1 << 9,
    SREInterference = 1 << 10,
    SRERequestUI = 1 << 11,
    SREStateChange = 1 << 12,
    SREAdaptation = 1 << 13,
    SREStreamStart = 1 << 14,
    SRERecoOtherContext = 1 << 15,
    SREAudioLevel = 1 << 16,
    SREPrivate = 1 << 18,
    SREAllEvents = 0x5ffff,
}}
ENUM!{enum SpeechRecoContextState {
    SRCS_Disabled = SPCS_DISABLED,
    SRCS_Enabled = SPCS_ENABLED,
}}
ENUM!{enum DISPIDSPRG {
    DISPID_SRGId = 1,
    DISPID_SRGRecoContext,
    DISPID_SRGState,
    DISPID_SRGRules,
    DISPID_SRGReset,
    DISPID_SRGCommit,
    DISPID_SRGCmdLoadFromFile,
    DISPID_SRGCmdLoadFromObject,
    DISPID_SRGCmdLoadFromResource,
    DISPID_SRGCmdLoadFromMemory,
    DISPID_SRGCmdLoadFromProprietaryGrammar,
    DISPID_SRGCmdSetRuleState,
    DISPID_SRGCmdSetRuleIdState,
    DISPID_SRGDictationLoad,
    DISPID_SRGDictationUnload,
    DISPID_SRGDictationSetState,
    DISPID_SRGSetWordSequenceData,
    DISPID_SRGSetTextSelection,
    DISPID_SRGIsPronounceable,
}}
ENUM!{enum SpeechLoadOption {
    SLOStatic = SPLO_STATIC,
    SLODynamic = SPLO_DYNAMIC,
}}
ENUM!{enum SpeechWordPronounceable {
    SWPUnknownWordUnpronounceable = SPWP_UNKNOWN_WORD_UNPRONOUNCEABLE,
    SWPUnknownWordPronounceable = SPWP_UNKNOWN_WORD_PRONOUNCEABLE,
    SWPKnownWordPronounceable = SPWP_KNOWN_WORD_PRONOUNCEABLE,
}}
ENUM!{enum SpeechGrammarState {
    SGSEnabled = SPGS_ENABLED,
    SGSDisabled = SPGS_DISABLED,
    SGSExclusive = SPGS_EXCLUSIVE,
}}
ENUM!{enum SpeechRuleState {
    SGDSInactive = SPRS_INACTIVE,
    SGDSActive = SPRS_ACTIVE,
    SGDSActiveWithAutoPause = SPRS_ACTIVE_WITH_AUTO_PAUSE,
}}
ENUM!{enum SpeechRuleAttributes {
    SRATopLevel = SPRAF_TopLevel,
    SRADefaultToActive = SPRAF_Active,
    SRAExport = SPRAF_Export,
    SRAImport = SPRAF_Import,
    SRAInterpreter = SPRAF_Interpreter,
    SRADynamic = SPRAF_Dynamic,
}}
ENUM!{enum SpeechGrammarWordType {
    SGDisplay = SPWT_DISPLAY,
    SGLexical = SPWT_LEXICAL,
    SGPronounciation = SPWT_PRONUNCIATION,
}}
ENUM!{enum DISPID_SpeechRecoContextEvents {
    DISPID_SRCEStartStream = 1,
    DISPID_SRCEEndStream,
    DISPID_SRCEBookmark,
    DISPID_SRCESoundStart,
    DISPID_SRCESoundEnd,
    DISPID_SRCEPhraseStart,
    DISPID_SRCERecognition,
    DISPID_SRCEHypothesis,
    DISPID_SRCEPropertyNumberChange,
    DISPID_SRCEPropertyStringChange,
    DISPID_SRCEFalseRecognition,
    DISPID_SRCEInterference,
    DISPID_SRCERequestUI,
    DISPID_SRCERecognizerStateChange,
    DISPID_SRCEAdaptation,
    DISPID_SRCERecognitionForOtherContext,
    DISPID_SRCEAudioLevel,
    DISPID_SRCEEnginePrivate,
}}
ENUM!{enum SpeechRecognitionType {
    SRTStandard = 0,
    SRTAutopause = SPREF_AutoPause,
    SRTEmulated = SPREF_Emulated,
}}
ENUM!{enum DISPID_SpeechGrammarRule {
    DISPID_SGRAttributes = 1,
    DISPID_SGRInitialState,
    DISPID_SGRName,
    DISPID_SGRId,
    DISPID_SGRClear,
    DISPID_SGRAddResource,
    DISPID_SGRAddState,
}}
ENUM!{enum DISPID_SpeechGrammarRules {
    DISPID_SGRsCount = 1,
    DISPID_SGRsDynamic,
    DISPID_SGRsAdd,
    DISPID_SGRsCommit,
    DISPID_SGRsCommitAndSave,
    DISPID_SGRsFindRule,
    DISPID_SGRsItem = DISPID_VALUE as u32,
    DISPID_SGRs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechGrammarRuleState {
    DISPID_SGRSRule = 1,
    DISPID_SGRSTransitions,
    DISPID_SGRSAddWordTransition,
    DISPID_SGRSAddRuleTransition,
    DISPID_SGRSAddSpecialTransition,
}}
ENUM!{enum SpeechSpecialTransitionType {
    SSTTWildcard = 1,
    SSTTDictation,
    SSTTTextBuffer,
}}
ENUM!{enum DISPID_SpeechGrammarRuleStateTransitions {
    DISPID_SGRSTsCount = 1,
    DISPID_SGRSTsItem = DISPID_VALUE as u32,
    DISPID_SGRSTs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechGrammarRuleStateTransition {
    DISPID_SGRSTType = 1,
    DISPID_SGRSTText,
    DISPID_SGRSTRule,
    DISPID_SGRSTWeight,
    DISPID_SGRSTPropertyName,
    DISPID_SGRSTPropertyId,
    DISPID_SGRSTPropertyValue,
    DISPID_SGRSTNextState,
}}
ENUM!{enum SpeechGrammarRuleStateTransitionType {
    SGRSTTEpsilon = 0,
    SGRSTTWord,
    SGRSTTRule,
    SGRSTTDictation,
    SGRSTTWildcard,
    SGRSTTTextBuffer,
}}
ENUM!{enum DISPIDSPTSI {
    DISPIDSPTSI_ActiveOffset = 1,
    DISPIDSPTSI_ActiveLength,
    DISPIDSPTSI_SelectionOffset,
    DISPIDSPTSI_SelectionLength,
}}
ENUM!{enum DISPID_SpeechRecoResult {
    DISPID_SRRRecoContext = 1,
    DISPID_SRRTimes,
    DISPID_SRRAudioFormat,
    DISPID_SRRPhraseInfo,
    DISPID_SRRAlternates,
    DISPID_SRRAudio,
    DISPID_SRRSpeakAudio,
    DISPID_SRRSaveToMemory,
    DISPID_SRRDiscardResultInfo,
}}
ENUM!{enum SpeechDiscardType {
    SDTProperty = SPDF_PROPERTY,
    SDTReplacement = SPDF_REPLACEMENT,
    SDTRule = SPDF_RULE,
    SDTDisplayText = SPDF_DISPLAYTEXT,
    SDTLexicalForm = SPDF_LEXICALFORM,
    SDTPronunciation = SPDF_PRONUNCIATION,
    SDTAudio = SPDF_AUDIO,
    SDTAlternates = SPDF_ALTERNATES,
    SDTAll = SPDF_ALL,
}}
ENUM!{enum DISPID_SpeechPhraseBuilder {
    DISPID_SPPBRestorePhraseFromMemory = 1,
}}
ENUM!{enum DISPID_SpeechRecoResultTimes {
    DISPID_SRRTStreamTime = 1,
    DISPID_SRRTLength,
    DISPID_SRRTTickCount,
    DISPID_SRRTOffsetFromStart,
}}
ENUM!{enum DISPID_SpeechPhraseAlternate {
    DISPID_SPARecoResult = 1,
    DISPID_SPAStartElementInResult,
    DISPID_SPANumberOfElementsInResult,
    DISPID_SPAPhraseInfo,
    DISPID_SPACommit,
}}
ENUM!{enum DISPID_SpeechPhraseAlternates {
    DISPID_SPAsCount = 1,
    DISPID_SPAsItem = DISPID_VALUE as u32,
    DISPID_SPAs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechPhraseInfo {
    DISPID_SPILanguageId = 1,
    DISPID_SPIGrammarId,
    DISPID_SPIStartTime,
    DISPID_SPIAudioStreamPosition,
    DISPID_SPIAudioSizeBytes,
    DISPID_SPIRetainedSizeBytes,
    DISPID_SPIAudioSizeTime,
    DISPID_SPIRule,
    DISPID_SPIProperties,
    DISPID_SPIElements,
    DISPID_SPIReplacements,
    DISPID_SPIEngineId,
    DISPID_SPIEnginePrivateData,
    DISPID_SPISaveToMemory,
    DISPID_SPIGetText,
    DISPID_SPIGetDisplayAttributes,
}}
ENUM!{enum DISPID_SpeechPhraseElement {
    DISPID_SPEAudioTimeOffset = 1,
    DISPID_SPEAudioSizeTime,
    DISPID_SPEAudioStreamOffset,
    DISPID_SPEAudioSizeBytes,
    DISPID_SPERetainedStreamOffset,
    DISPID_SPERetainedSizeBytes,
    DISPID_SPEDisplayText,
    DISPID_SPELexicalForm,
    DISPID_SPEPronunciation,
    DISPID_SPEDisplayAttributes,
    DISPID_SPERequiredConfidence,
    DISPID_SPEActualConfidence,
    DISPID_SPEEngineConfidence,
}}
ENUM!{enum SpeechEngineConfidence {
    SECLowConfidence = -1i32 as u32,
    SECNormalConfidence = 0,
    SECHighConfidence = 1,
}}
ENUM!{enum DISPID_SpeechPhraseElements {
    DISPID_SPEsCount = 1,
    DISPID_SPEsItem = DISPID_VALUE as u32,
    DISPID_SPEs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechPhraseReplacement {
    DISPID_SPRDisplayAttributes = 1,
    DISPID_SPRText,
    DISPID_SPRFirstElement,
    DISPID_SPRNumberOfElements,
}}
ENUM!{enum DISPID_SpeechPhraseReplacements {
    DISPID_SPRsCount = 1,
    DISPID_SPRsItem = DISPID_VALUE as u32,
    DISPID_SPRs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechPhraseProperty {
    DISPID_SPPName = 1,
    DISPID_SPPId,
    DISPID_SPPValue,
    DISPID_SPPFirstElement,
    DISPID_SPPNumberOfElements,
    DISPID_SPPEngineConfidence,
    DISPID_SPPConfidence,
    DISPID_SPPParent,
    DISPID_SPPChildren,
}}
ENUM!{enum DISPID_SpeechPhraseProperties {
    DISPID_SPPsCount = 1,
    DISPID_SPPsItem = DISPID_VALUE as u32,
    DISPID_SPPs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechPhraseRule {
    DISPID_SPRuleName = 1,
    DISPID_SPRuleId,
    DISPID_SPRuleFirstElement,
    DISPID_SPRuleNumberOfElements,
    DISPID_SPRuleParent,
    DISPID_SPRuleChildren,
    DISPID_SPRuleConfidence,
    DISPID_SPRuleEngineConfidence,
}}
ENUM!{enum DISPID_SpeechPhraseRules {
    DISPID_SPRulesCount = 1,
    DISPID_SPRulesItem = DISPID_VALUE as u32,
    DISPID_SPRules_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechLexicon {
    DISPID_SLGenerationId = 1,
    DISPID_SLGetWords,
    DISPID_SLAddPronunciation,
    DISPID_SLAddPronunciationByPhoneIds,
    DISPID_SLRemovePronunciation,
    DISPID_SLRemovePronunciationByPhoneIds,
    DISPID_SLGetPronunciations,
    DISPID_SLGetGenerationChange,
}}
ENUM!{enum SpeechLexiconType {
    SLTUser = eLEXTYPE_USER,
    SLTApp = eLEXTYPE_APP,
}}
ENUM!{enum SpeechPartOfSpeech {
    SPSNotOverriden = SPPS_NotOverriden,
    SPSUnknown = SPPS_Unknown,
    SPSNoun = SPPS_Noun,
    SPSVerb = SPPS_Verb,
    SPSModifier = SPPS_Modifier,
    SPSFunction = SPPS_Function,
    SPSInterjection = SPPS_Interjection,
}}
ENUM!{enum DISPID_SpeechLexiconWords {
    DISPID_SLWsCount = 1,
    DISPID_SLWsItem = DISPID_VALUE as u32,
    DISPID_SLWs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum SpeechWordType {
    SWTAdded = eWORDTYPE_ADDED,
    SWTDeleted = eWORDTYPE_DELETED,
}}
ENUM!{enum DISPID_SpeechLexiconWord {
    DISPID_SLWLangId = 1,
    DISPID_SLWType,
    DISPID_SLWWord,
    DISPID_SLWPronunciations,
}}
ENUM!{enum DISPID_SpeechLexiconProns {
    DISPID_SLPsCount = 1,
    DISPID_SLPsItem = DISPID_VALUE as u32,
    DISPID_SLPs_NewEnum = DISPID_NEWENUM as u32,
}}
ENUM!{enum DISPID_SpeechLexiconPronunciation {
    DISPID_SLPType = 1,
    DISPID_SLPLangId,
    DISPID_SLPPartOfSpeech,
    DISPID_SLPPhoneIds,
    DISPID_SLPSymbolic,
}}
ENUM!{enum DISPID_SpeechPhoneConverter {
    DISPID_SPCLangId = 1,
    DISPID_SPCPhoneToId,
    DISPID_SPCIdToPhone,
}}
extern {
    pub static LIBID_SpeechLib: IID;
}
RIDL!{#[uuid(0xce17c09b, 0x4efa, 0x44d5, 0xa4, 0xc9, 0x59, 0xd9, 0x58, 0x5a, 0xb0, 0xcd)]
interface ISpeechDataKey(ISpeechDataKeyVtbl): IDispatch(IDispatchVtbl) {
    fn SetBinaryValue(
        ValueName: BSTR,
        Value: VARIANT,
    ) -> HRESULT,
    fn GetBinaryValue(
        ValueName: BSTR,
        Value: *mut VARIANT,
    ) -> HRESULT,
    fn SetStringValue(
        ValueName: BSTR,
        Value: BSTR,
    ) -> HRESULT,
    fn GetStringValue(
        ValueName: BSTR,
        Value: *mut BSTR,
    ) -> HRESULT,
    fn SetLongValue(
        ValueName: BSTR,
        Value: c_long,
    ) -> HRESULT,
    fn GetLongValue(
        ValueName: BSTR,
        Value: *mut c_long,
    ) -> HRESULT,
    fn OpenKey(
        SubKeyName: BSTR,
        SubKey: *mut *mut ISpeechDataKey,
    ) -> HRESULT,
    fn CreateKey(
        SubKeyName: BSTR,
        SubKey: *mut *mut ISpeechDataKey,
    ) -> HRESULT,
    fn DeleteKey(
        SubKeyName: BSTR,
    ) -> HRESULT,
    fn DeleteValue(
        ValueName: BSTR,
    ) -> HRESULT,
    fn EnumKeys(
        Index: c_long,
        SubKeyName: *mut BSTR,
    ) -> HRESULT,
    fn EnumValues(
        Index: c_long,
        ValueName: *mut BSTR,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xc74a3adc, 0xb727, 0x4500, 0xa8, 0x4a, 0xb5, 0x26, 0x72, 0x1c, 0x8b, 0x8c)]
interface ISpeechObjectToken(ISpeechObjectTokenVtbl): IDispatch(IDispatchVtbl) {
    fn get_Id(
        ObjectId: *mut BSTR,
    ) -> HRESULT,
    fn get_DataKey(
        DataKey: *mut *mut ISpeechDataKey,
    ) -> HRESULT,
    fn get_Category(
        Category: *mut *mut ISpeechObjectTokenCategory,
    ) -> HRESULT,
    fn GetDescription(
        Locale: c_long,
        Description: *mut BSTR,
    ) -> HRESULT,
    fn SetId(
        Id: BSTR,
        CategoryId: BSTR,
        CreateIfNotExist: VARIANT_BOOL,
    ) -> HRESULT,
    fn GetAttribute(
        AttributeName: BSTR,
        AttributeValue: *mut BSTR,
    ) -> HRESULT,
    fn CreateInstance(
        pUnkOuter: *mut IUnknown,
        ClsContext: SpeechTokenContext,
        Object: *mut *mut IUnknown,
    ) -> HRESULT,
    fn Remove(
        ObjectStorageCLSID: BSTR,
    ) -> HRESULT,
    fn GetStorageFileName(
        ObjectStorageCLSID: BSTR,
        KeyName: BSTR,
        FileName: BSTR,
        Folder: BSTR,
        FilePath: *mut BSTR,
    ) -> HRESULT,
    fn RemoveStorageFileName(
        ObjectStorageCLSID: BSTR,
        KeyName: BSTR,
        DeleteFile: VARIANT_BOOL,
    ) -> HRESULT,
    fn IsUISupported(
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
        Object: *mut IUnknown,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hWnd: c_long,
        Title: BSTR,
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
        Object: *mut IUnknown,
    ) -> HRESULT,
    fn MatchesAttributes(
        Attributes: BSTR,
        Matches: *mut VARIANT_BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x9285b776, 0x2e7b, 0x4bc0, 0xb5, 0x3e, 0x58, 0x0e, 0xb6, 0xfa, 0x96, 0x7f)]
interface ISpeechObjectTokens(ISpeechObjectTokensVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Token: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get__NewEnum(
        ppEnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xca7eac50, 0x2d01, 0x4145, 0x86, 0xd4, 0x5a, 0xe7, 0xd7, 0x0f, 0x44, 0x69)]
interface ISpeechObjectTokenCategory(ISpeechObjectTokenCategoryVtbl): IDispatch(IDispatchVtbl) {
    fn get_Id(
        Id: *mut BSTR,
    ) -> HRESULT,
    fn put_Default(
        TokenId: BSTR,
    ) -> HRESULT,
    fn get_Default(
        TokenId: *mut BSTR,
    ) -> HRESULT,
    fn SetId(
        Id: BSTR,
        CreateIfNotExist: VARIANT_BOOL,
    ) -> HRESULT,
    fn GetDataKey(
        Location: SpeechDataKeyLocation,
        DataKey: *mut *mut ISpeechDataKey,
    ) -> HRESULT,
    fn EnumerateTokens(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        Tokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x11b103d8, 0x1142, 0x4edf, 0xa0, 0x93, 0x82, 0xfb, 0x39, 0x15, 0xf8, 0xcc)]
interface ISpeechAudioBufferInfo(ISpeechAudioBufferInfoVtbl): IDispatch(IDispatchVtbl) {
    fn get_MinNotification(
        MinNotification: *mut c_long,
    ) -> HRESULT,
    fn put_MinNotification(
        MinNotification: c_long,
    ) -> HRESULT,
    fn get_BufferSize(
        BufferSize: *mut c_long,
    ) -> HRESULT,
    fn put_BufferSize(
        BufferSize: c_long,
    ) -> HRESULT,
    fn get_EventBias(
        EventBias: *mut c_long,
    ) -> HRESULT,
    fn put_EventBias(
        EventBias: c_long,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xc62d9c91, 0x7458, 0x47f6, 0x86, 0x2d, 0x1e, 0xf8, 0x6f, 0xb0, 0xb2, 0x78)]
interface ISpeechAudioStatus(ISpeechAudioStatusVtbl): IDispatch(IDispatchVtbl) {
    fn get_FreeBufferSpace(
        FreeBufferSpace: *mut c_long,
    ) -> HRESULT,
    fn get_NonBlockingIO(
        NonBlockingIO: *mut c_long,
    ) -> HRESULT,
    fn get_State(
        State: *mut SpeechAudioState,
    ) -> HRESULT,
    fn get_CurrentSeekPosition(
        CurrentSeekPosition: *mut VARIANT,
    ) -> HRESULT,
    fn get_CurrentDevicePosition(
        CurrentDevicePosition: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xe6e9c590, 0x3e18, 0x40e3, 0x82, 0x99, 0x06, 0x1f, 0x98, 0xbd, 0xe7, 0xc7)]
interface ISpeechAudioFormat(ISpeechAudioFormatVtbl): IDispatch(IDispatchVtbl) {
    fn get_Type(
        AudioFormat: *mut SpeechAudioFormatType,
    ) -> HRESULT,
    fn put_Type(
        AudioFormat: SpeechAudioFormatType,
    ) -> HRESULT,
    fn get_Guid(
        Guid: *mut BSTR,
    ) -> HRESULT,
    fn put_Guid(
        Guid: BSTR,
    ) -> HRESULT,
    fn GetWaveFormatEx(
        SpeechWaveFormatEx: *mut *mut ISpeechWaveFormatEx,
    ) -> HRESULT,
    fn SetWaveFormatEx(
        SpeechWaveFormatEx: *mut ISpeechWaveFormatEx,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x7a1ef0d5, 0x1581, 0x4741, 0x88, 0xe4, 0x20, 0x9a, 0x49, 0xf1, 0x1a, 0x10)]
interface ISpeechWaveFormatEx(ISpeechWaveFormatExVtbl): IDispatch(IDispatchVtbl) {
    fn get_FormatTag(
        FormatTag: *mut c_short,
    ) -> HRESULT,
    fn put_FormatTag(
        FormatTag: c_short,
    ) -> HRESULT,
    fn get_Channels(
        Channels: *mut c_short,
    ) -> HRESULT,
    fn put_Channels(
        Channels: c_short,
    ) -> HRESULT,
    fn get_SamplesPerSec(
        SamplesPerSec: *mut c_long,
    ) -> HRESULT,
    fn put_SamplesPerSec(
        SamplesPerSec: c_long,
    ) -> HRESULT,
    fn get_AvgBytesPerSec(
        AvgBytesPerSec: *mut c_long,
    ) -> HRESULT,
    fn put_AvgBytesPerSec(
        AvgBytesPerSec: c_long,
    ) -> HRESULT,
    fn get_BlockAlign(
        BlockAlign: *mut c_short,
    ) -> HRESULT,
    fn put_BlockAlign(
        BlockAlign: c_short,
    ) -> HRESULT,
    fn get_BitsPerSample(
        BitsPerSample: *mut c_short,
    ) -> HRESULT,
    fn put_BitsPerSample(
        BitsPerSample: c_short,
    ) -> HRESULT,
    fn get_ExtraData(
        ExtraData: *mut VARIANT,
    ) -> HRESULT,
    fn put_ExtraData(
        ExtraData: VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x6450336f, 0x7d49, 0x4ced, 0x80, 0x97, 0x49, 0xd6, 0xde, 0xe3, 0x72, 0x94)]
interface ISpeechBaseStream(ISpeechBaseStreamVtbl): IDispatch(IDispatchVtbl) {
    fn get_Format(
        AudioFormat: *mut *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn putref_Format(
        AudioFormat: *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn Read(
        Buffer: *mut VARIANT,
        NumberOfBytes: c_long,
        BytesRead: *mut c_long,
    ) -> HRESULT,
    fn Write(
        Buffer: VARIANT,
        BytesWritten: *mut c_long,
    ) -> HRESULT,
    fn Seek(
        Position: VARIANT,
        Origin: SpeechStreamSeekPositionType,
        NewPosition: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xaf67f125, 0xab39, 0x4e93, 0xb4, 0xa2, 0xcc, 0x2e, 0x66, 0xe1, 0x82, 0xa7)]
interface ISpeechFileStream(ISpeechFileStreamVtbl): ISpeechBaseStream(ISpeechBaseStreamVtbl) {
    fn Open(
        FileName: BSTR,
        FileMode: SpeechStreamFileMode,
        DoEvents: VARIANT_BOOL,
    ) -> HRESULT,
    fn Close() -> HRESULT,
}}
RIDL!{#[uuid(0xeeb14b68, 0x808b, 0x4abe, 0xa5, 0xea, 0xb5, 0x1d, 0xa7, 0x58, 0x80, 0x08)]
interface ISpeechMemoryStream(ISpeechMemoryStreamVtbl): ISpeechBaseStream(ISpeechBaseStreamVtbl) {
    fn SetData(
        Data: VARIANT,
    ) -> HRESULT,
    fn GetData(
        pData: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x1a9e9f4f, 0x104f, 0x4db8, 0xa1, 0x15, 0xef, 0xd7, 0xfd, 0x0c, 0x97, 0xae)]
interface ISpeechCustomStream(ISpeechCustomStreamVtbl): ISpeechBaseStream(ISpeechBaseStreamVtbl) {
    fn get_BaseStream(
        ppUnkStream: *mut *mut IUnknown,
    ) -> HRESULT,
    fn putref_BaseStream(
        pUnkStream: *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xcff8e175, 0x019e, 0x11d3, 0xa0, 0x8e, 0x00, 0xc0, 0x4f, 0x8e, 0xf9, 0xb5)]
interface ISpeechAudio(ISpeechAudioVtbl): ISpeechBaseStream(ISpeechBaseStreamVtbl) {
    fn get_Status(
        Status: *mut *mut ISpeechAudioStatus,
    ) -> HRESULT,
    fn get_BufferInfo(
        BufferInfo: *mut *mut ISpeechAudioBufferInfo,
    ) -> HRESULT,
    fn get_DefaultFormat(
        StreamFormat: *mut *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn get_Volume(
        Volume: *mut c_long,
    ) -> HRESULT,
    fn put_Volume(
        Volume: c_long,
    ) -> HRESULT,
    fn get_BufferNotifySize(
        BufferNotifySize: *mut c_long,
    ) -> HRESULT,
    fn put_BufferNotifySize(
        BufferNotifySize: c_long,
    ) -> HRESULT,
    fn get_EventHandle(
        EventHandle: *mut c_long,
    ) -> HRESULT,
    fn SetState(
        State: SpeechAudioState,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x3c76af6d, 0x1fd7, 0x4831, 0x81, 0xd1, 0x3b, 0x71, 0xd5, 0xa1, 0x3c, 0x44)]
interface ISpeechMMSysAudio(ISpeechMMSysAudioVtbl): ISpeechAudio(ISpeechAudioVtbl) {
    fn get_DeviceId(
        DeviceId: *mut c_long,
    ) -> HRESULT,
    fn put_DeviceId(
        DeviceId: c_long,
    ) -> HRESULT,
    fn get_LineId(
        LineId: *mut c_long,
    ) -> HRESULT,
    fn put_LineId(
        LineId: c_long,
    ) -> HRESULT,
    fn get_MMHandle(
        Handle: *mut c_long,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x269316d8, 0x57bd, 0x11d2, 0x9e, 0xee, 0x00, 0xc0, 0x4f, 0x79, 0x73, 0x96)]
interface ISpeechVoice(ISpeechVoiceVtbl): IDispatch(IDispatchVtbl) {
    fn get_Status(
        Status: *mut *mut ISpeechVoiceStatus,
    ) -> HRESULT,
    fn get_Voice(
        Voice: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn putref_Voice(
        Voice: *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get_AudioOutput(
        AudioOutput: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn putref_AudioOutput(
        AudioOutput: *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get_AudioOutputStream(
        AudioOutputStream: *mut *mut ISpeechBaseStream,
    ) -> HRESULT,
    fn putref_AudioOutputStream(
        AudioOutputStream: *mut ISpeechBaseStream,
    ) -> HRESULT,
    fn get_Rate(
        Rate: *mut c_long,
    ) -> HRESULT,
    fn put_Rate(
        Rate: c_long,
    ) -> HRESULT,
    fn get_Volume(
        Volume: *mut c_long,
    ) -> HRESULT,
    fn put_Volume(
        Volume: c_long,
    ) -> HRESULT,
    fn put_AllowAudioOutputFormatChangesOnNextSet(
        Allow: VARIANT_BOOL,
    ) -> HRESULT,
    fn get_AllowAudioOutputFormatChangesOnNextSet(
        Allow: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn get_EventInterests(
        EventInterestFlags: *mut SpeechVoiceEvents,
    ) -> HRESULT,
    fn put_EventInterests(
        EventInterestFlags: SpeechVoiceEvents,
    ) -> HRESULT,
    fn put_Priority(
        Priority: SpeechVoicePriority,
    ) -> HRESULT,
    fn get_Priority(
        Priority: *mut SpeechVoicePriority,
    ) -> HRESULT,
    fn put_AlertBoundary(
        Boundary: SpeechVoiceEvents,
    ) -> HRESULT,
    fn get_AlertBoundary(
        Boundary: *mut SpeechVoiceEvents,
    ) -> HRESULT,
    fn put_SynchronousSpeakTimeout(
        msTimeout: c_long,
    ) -> HRESULT,
    fn get_SynchronousSpeakTimeout(
        msTimeOut: *mut c_long,
    ) -> HRESULT,
    fn Speak(
        Text: BSTR,
        Flags: SpeechVoiceSpeakFlags,
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn SpeakStream(
        Stream: *mut ISpeechBaseStream,
        Flags: SpeechVoiceSpeakFlags,
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn Pause() -> HRESULT,
    fn Resume() -> HRESULT,
    fn Skip(
        Type: BSTR,
        NumItems: c_long,
        NumSkipped: c_long,
    ) -> HRESULT,
    fn GetVoices(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        ObjectTokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
    fn GetAudioOutputs(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        ObjectTokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
    fn WaitUntilDone(
        msTimeout: c_long,
        Done: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn SpeakCompleteEvent(
        Handle: *mut c_long,
    ) -> HRESULT,
    fn IsUISupported(
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hWndParent: c_long,
        Title: BSTR,
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8be47b07, 0x57f6, 0x11d2, 0x9e, 0xee, 0x00, 0xc0, 0x4f, 0x79, 0x73, 0x96)]
interface ISpeechVoiceStatus(ISpeechVoiceStatusVtbl): IDispatch(IDispatchVtbl) {
    fn get_CurrentStreamNumber(
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn get_LastStreamNumberQueued(
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn get_LastHResult(
        HResult: *mut c_long,
    ) -> HRESULT,
    fn get_RunningState(
        State: *mut SpeechRunState,
    ) -> HRESULT,
    fn get_InputWordPosition(
        Position: *mut c_long,
    ) -> HRESULT,
    fn get_InputWordLength(
        Length: *mut c_long,
    ) -> HRESULT,
    fn get_InputSentencePosition(
        Position: *mut c_long,
    ) -> HRESULT,
    fn get_InputSentenceLength(
        Length: *mut c_long,
    ) -> HRESULT,
    fn get_LastBookmark(
        Bookmark: *mut BSTR,
    ) -> HRESULT,
    fn get_LastBookmarkId(
        BookmarkId: *mut c_long,
    ) -> HRESULT,
    fn get_PhonemeId(
        PhoneId: *mut c_short,
    ) -> HRESULT,
    fn get_VisemeId(
        VisemeId: *mut c_short,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xa372acd1, 0x3bef, 0x4bbd, 0x8f, 0xfb, 0xcb, 0x3e, 0x2b, 0x41, 0x6a, 0xf8)]
interface _ISpeechVoiceEvents(_ISpeechVoiceEventsVtbl): IDispatch(IDispatchVtbl) {}}
RIDL!{#[uuid(0x2d5f1c0c, 0xbd75, 0x4b08, 0x94, 0x78, 0x3b, 0x11, 0xfe, 0xa2, 0x58, 0x6c)]
interface ISpeechRecognizer(ISpeechRecognizerVtbl): IDispatch(IDispatchVtbl) {
    fn putref_Recognizer(
        Recognizer: *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get_Recognizer(
        Recognizer: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn put_AllowAudioInputFormatChangesOnNextSet(
        Allow: VARIANT_BOOL,
    ) -> HRESULT,
    fn get_AllowAudioInputFormatChangesOnNextSet(
        Allow: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn putref_AudioInput(
        AudioInput: *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get_AudioInput(
        AudioInput: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn putref_AudioInputStream(
        AudioInputStream: *mut ISpeechBaseStream,
    ) -> HRESULT,
    fn get_AudioInputStream(
        AudioInputStream: *mut *mut ISpeechBaseStream,
    ) -> HRESULT,
    fn get_IsShared(
        Shared: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn put_State(
        State: SpeechRecognizerState,
    ) -> HRESULT,
    fn get_State(
        State: *mut SpeechRecognizerState,
    ) -> HRESULT,
    fn get_Status(
        Status: *mut *mut ISpeechRecognizerStatus,
    ) -> HRESULT,
    fn putref_Profile(
        Profile: *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn get_Profile(
        Profile: *mut *mut ISpeechObjectToken,
    ) -> HRESULT,
    fn EmulateRecognition(
        TextElements: VARIANT,
        ElementDisplayAttributes: *mut VARIANT,
        LanguageId: c_long,
    ) -> HRESULT,
    fn CreateRecoContext(
        NewContext: *mut *mut ISpeechRecoContext,
    ) -> HRESULT,
    fn GetFormat(
        Type: SpeechFormatType,
        Format: *mut *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn SetPropertyNumber(
        Name: BSTR,
        Value: c_long,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn GetPropertyNumber(
        Name: BSTR,
        Value: *mut c_long,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn SetPropertyString(
        Name: BSTR,
        Value: BSTR,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn GetPropertyString(
        Name: BSTR,
        Value: *mut BSTR,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn IsUISupported(
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
        Supported: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn DisplayUI(
        hWndParent: c_long,
        Title: BSTR,
        TypeOfUI: BSTR,
        ExtraData: *const VARIANT,
    ) -> HRESULT,
    fn GetRecognizers(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        ObjectTokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
    fn GetAudioInputs(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        ObjectTokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
    fn GetProfiles(
        RequiredAttributes: BSTR,
        OptionalAttributes: BSTR,
        ObjectTokens: *mut *mut ISpeechObjectTokens,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xbff9e781, 0x53ec, 0x484e, 0xbb, 0x8a, 0x0e, 0x1b, 0x55, 0x51, 0xe3, 0x5c)]
interface ISpeechRecognizerStatus(ISpeechRecognizerStatusVtbl): IDispatch(IDispatchVtbl) {
    fn get_AudioStatus(
        AudioStatus: *mut *mut ISpeechAudioStatus,
    ) -> HRESULT,
    fn get_CurrentStreamPosition(
        pCurrentStreamPos: *mut VARIANT,
    ) -> HRESULT,
    fn get_CurrentStreamNumber(
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn get_NumberOfActiveRules(
        NumberOfActiveRules: *mut c_long,
    ) -> HRESULT,
    fn get_ClsidEngine(
        ClsidEngine: *mut BSTR,
    ) -> HRESULT,
    fn get_SupportedLanguages(
        SupportedLanguages: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x580aa49d, 0x7e1e, 0x4809, 0xb8, 0xe2, 0x57, 0xda, 0x80, 0x61, 0x04, 0xb8)]
interface ISpeechRecoContext(ISpeechRecoContextVtbl): IDispatch(IDispatchVtbl) {
    fn get_Recognizer(
        Recognizer: *mut *mut ISpeechRecognizer,
    ) -> HRESULT,
    fn get_AudioInputInterferenceStatus(
        Interference: *mut SpeechInterference,
    ) -> HRESULT,
    fn get_RequestedUIType(
        UIType: *mut BSTR,
    ) -> HRESULT,
    fn putref_Voice(
        Voice: *mut ISpeechVoice,
    ) -> HRESULT,
    fn get_Voice(
        Voice: *mut *mut ISpeechVoice,
    ) -> HRESULT,
    fn put_AllowVoiceFormatMatchingOnNextSet(
        Allow: VARIANT_BOOL,
    ) -> HRESULT,
    fn get_AllowVoiceFormatMatchingOnNextSet(
        Allow: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn put_VoicePurgeEvent(
        EventInterest: SpeechRecoEvents,
    ) -> HRESULT,
    fn get_VoicePurgeEvent(
        EventInterest: *mut SpeechRecoEvents,
    ) -> HRESULT,
    fn put_EventInterests(
        EventInterest: SpeechRecoEvents,
    ) -> HRESULT,
    fn get_EventInterests(
        EventInterest: *mut SpeechRecoEvents,
    ) -> HRESULT,
    fn put_CmdMaxAlternates(
        MaxAlternates: c_long,
    ) -> HRESULT,
    fn get_CmdMaxAlternates(
        MaxAlternates: *mut c_long,
    ) -> HRESULT,
    fn put_State(
        State: SpeechRecoContextState,
    ) -> HRESULT,
    fn get_State(
        State: *mut SpeechRecoContextState,
    ) -> HRESULT,
    fn put_RetainedAudio(
        Option: SpeechRetainedAudioOptions,
    ) -> HRESULT,
    fn get_RetainedAudio(
        Option: *mut SpeechRetainedAudioOptions,
    ) -> HRESULT,
    fn putref_RetainedAudioFormat(
        Format: *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn get_RetainedAudioFormat(
        Format: *mut *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn Pause() -> HRESULT,
    fn Resume() -> HRESULT,
    fn CreateGrammar(
        GrammarId: VARIANT,
        Grammar: *mut *mut ISpeechRecoGrammar,
    ) -> HRESULT,
    fn CreateResultFromMemory(
        ResultBlock: *mut VARIANT,
        Result: *mut *mut ISpeechRecoResult,
    ) -> HRESULT,
    fn Bookmark(
        Options: SpeechBookmarkOptions,
        StreamPos: VARIANT,
        BookmarkId: VARIANT,
    ) -> HRESULT,
    fn SetAdaptationData(
        AdaptationString: BSTR,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xb6d6f79f, 0x2158, 0x4e50, 0xb5, 0xbc, 0x9a, 0x9c, 0xcd, 0x85, 0x2a, 0x09)]
interface ISpeechRecoGrammar(ISpeechRecoGrammarVtbl): IDispatch(IDispatchVtbl) {
    fn get_Id(
        Id: *mut VARIANT,
    ) -> HRESULT,
    fn get_RecoContext(
        RecoContext: *mut *mut ISpeechRecoContext,
    ) -> HRESULT,
    fn put_State(
        State: SpeechGrammarState,
    ) -> HRESULT,
    fn get_State(
        State: *mut SpeechGrammarState,
    ) -> HRESULT,
    fn get_Rules(
        Rules: *mut *mut ISpeechGrammarRules,
    ) -> HRESULT,
    fn Reset(
        NewLanguage: SpeechLanguageId,
    ) -> HRESULT,
    fn CmdLoadFromFile(
        FileName: BSTR,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn CmdLoadFromObject(
        ClassId: BSTR,
        GrammarName: BSTR,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn CmdLoadFromResource(
        hModule: c_long,
        ResourceName: VARIANT,
        ResourceType: VARIANT,
        LanguageId: SpeechLanguageId,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn CmdLoadFromMemory(
        GrammarData: VARIANT,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn CmdLoadFromProprietaryGrammar(
        ProprietaryGuid: BSTR,
        PriorietaryString: BSTR,
        ProprietaryData: VARIANT,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn CmdSetRuleState(
        Name: BSTR,
        State: SpeechRuleState,
    ) -> HRESULT,
    fn CmdSetRuleIdState(
        RuleId: c_long,
        State: SpeechRuleState,
    ) -> HRESULT,
    fn DictationLoad(
        TopicName: BSTR,
        LoadOption: SpeechLoadOption,
    ) -> HRESULT,
    fn DictationUnload() -> HRESULT,
    fn DictationSetState(
        State: SpeechRuleState,
    ) -> HRESULT,
    fn SetWordSequenceData(
        Text: BSTR,
        TextLength: c_long,
        Info: *mut ISpeechTextSelectionInformation,
    ) -> HRESULT,
    fn SetTextSelection(
        Info: *mut ISpeechTextSelectionInformation,
    ) -> HRESULT,
    fn IsPronounceable(
        Word: BSTR,
        WordPronounceable: *mut SpeechWordPronounceable,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x7b8fcb42, 0x0e9d, 0x4f00, 0xa0, 0x48, 0x7b, 0x04, 0xd6, 0x17, 0x9d, 0x3d)]
interface _ISpeechRecoContextEvents(_ISpeechRecoContextEventsVtbl): IDispatch(IDispatchVtbl) {}}
RIDL!{#[uuid(0xafe719cf, 0x5dd1, 0x44f2, 0x99, 0x9c, 0x7a, 0x39, 0x9f, 0x1c, 0xfc, 0xcc)]
interface ISpeechGrammarRule(ISpeechGrammarRuleVtbl): IDispatch(IDispatchVtbl) {
    fn get_Attributes(
        Attributes: *mut SpeechRuleAttributes,
    ) -> HRESULT,
    fn get_InitialState(
        State: *mut *mut ISpeechGrammarRuleState,
    ) -> HRESULT,
    fn get_Name(
        Name: *mut BSTR,
    ) -> HRESULT,
    fn get_Id(
        Id: *mut c_long,
    ) -> HRESULT,
    fn Clear() -> HRESULT,
    fn AddResource(
        ResourceName: BSTR,
        ResourceValue: BSTR,
    ) -> HRESULT,
    fn AddState(
        State: *mut *mut ISpeechGrammarRuleState,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x6ffa3b44, 0xfc2d, 0x40d1, 0x8a, 0xfc, 0x32, 0x91, 0x1c, 0x7f, 0x1a, 0xd1)]
interface ISpeechGrammarRules(ISpeechGrammarRulesVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn FindRule(
        RuleNameOrId: VARIANT,
        Rule: *mut *mut ISpeechGrammarRule,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Rule: *mut *mut ISpeechGrammarRule,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
    fn get_Dynamic(
        Dynamic: *mut VARIANT_BOOL,
    ) -> HRESULT,
    fn Add(
        RuleName: BSTR,
        Attributes: SpeechRuleAttributes,
        RuleId: c_long,
        Rule: *mut *mut ISpeechGrammarRule,
    ) -> HRESULT,
    fn Commit() -> HRESULT,
    fn CommitAndSave(
        ErrorText: *mut BSTR,
        SaveStream: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xd4286f2c, 0xee67, 0x45ae, 0xb9, 0x28, 0x28, 0xd6, 0x95, 0x36, 0x2e, 0xda)]
interface ISpeechGrammarRuleState(ISpeechGrammarRuleStateVtbl): IDispatch(IDispatchVtbl) {
    fn get_Rule(
        Rule: *mut *mut ISpeechGrammarRule,
    ) -> HRESULT,
    fn get_Transitions(
        Transitions: *mut *mut ISpeechGrammarRuleStateTransitions,
    ) -> HRESULT,
    fn AddWordTransition(
        DestState: *mut ISpeechGrammarRuleState,
        Words: BSTR,
        Separators: BSTR,
        Type: SpeechGrammarWordType,
        PropertyName: BSTR,
        PropertyId: c_long,
        PropertyValue: *mut VARIANT,
        Weight: c_float,
    ) -> HRESULT,
    fn AddRuleTransition(
        DestinationState: *mut ISpeechGrammarRuleState,
        Rule: *mut ISpeechGrammarRule,
        PropertyName: BSTR,
        PropertyId: c_long,
        PropertyValue: *mut VARIANT,
        Weight: c_float,
    ) -> HRESULT,
    fn AddSpecialTransition(
        DestinationState: *mut ISpeechGrammarRuleState,
        Type: SpeechSpecialTransitionType,
        PropertyName: BSTR,
        PropertyId: c_long,
        PropertyValue: *mut VARIANT,
        Weight: c_float,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xcafd1db1, 0x41d1, 0x4a06, 0x98, 0x63, 0xe2, 0xe8, 0x1d, 0xa1, 0x7a, 0x9a)]
interface ISpeechGrammarRuleStateTransition(ISpeechGrammarRuleStateTransitionVtbl):
    IDispatch(IDispatchVtbl) {
    fn get_Type(
        Type: *mut SpeechGrammarRuleStateTransitionType,
    ) -> HRESULT,
    fn get_Text(
        Text: *mut BSTR,
    ) -> HRESULT,
    fn get_Rule(
        Rule: *mut *mut ISpeechGrammarRule,
    ) -> HRESULT,
    fn get_Weight(
        Weight: *mut VARIANT,
    ) -> HRESULT,
    fn get_PropertyName(
        PropertyName: *mut BSTR,
    ) -> HRESULT,
    fn get_PropertyId(
        PropertyId: *mut c_long,
    ) -> HRESULT,
    fn get_PropertyValue(
        PropertyValue: *mut VARIANT,
    ) -> HRESULT,
    fn get_NextState(
        NextState: *mut *mut ISpeechGrammarRuleState,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xeabce657, 0x75bc, 0x44a2, 0xaa, 0x7f, 0xc5, 0x64, 0x76, 0x74, 0x29, 0x63)]
interface ISpeechGrammarRuleStateTransitions(ISpeechGrammarRuleStateTransitionsVtbl):
    IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Transition: *mut *mut ISpeechGrammarRuleStateTransition,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x3b9c7e7a, 0x6eee, 0x4ded, 0x90, 0x92, 0x11, 0x65, 0x72, 0x79, 0xad, 0xbe)]
interface ISpeechTextSelectionInformation(ISpeechTextSelectionInformationVtbl):
    IDispatch(IDispatchVtbl) {
    fn put_ActiveOffset(
        ActiveOffset: c_long,
    ) -> HRESULT,
    fn get_ActiveOffset(
        ActiveOffset: *mut c_long,
    ) -> HRESULT,
    fn put_ActiveLength(
        ActiveLength: c_long,
    ) -> HRESULT,
    fn get_ActiveLength(
        ActiveLength: *mut c_long,
    ) -> HRESULT,
    fn put_SelectionOffset(
        SelectionOffset: c_long,
    ) -> HRESULT,
    fn get_SelectionOffset(
        SelectionOffset: *mut c_long,
    ) -> HRESULT,
    fn put_SelectionLength(
        SelectionLength: c_long,
    ) -> HRESULT,
    fn get_SelectionLength(
        SelectionLength: *mut c_long,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xed2879cf, 0xced9, 0x4ee6, 0xa5, 0x34, 0xde, 0x01, 0x91, 0xd5, 0x46, 0x8d)]
interface ISpeechRecoResult(ISpeechRecoResultVtbl): IDispatch(IDispatchVtbl) {
    fn get_RecoContext(
        RecoContext: *mut *mut ISpeechRecoContext,
    ) -> HRESULT,
    fn get_Times(
        Times: *mut *mut ISpeechRecoResultTimes,
    ) -> HRESULT,
    fn putref_AudioFormat(
        Format: *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn get_AudioFormat(
        Format: *mut *mut ISpeechAudioFormat,
    ) -> HRESULT,
    fn get_PhraseInfo(
        PhraseInfo: *mut *mut ISpeechPhraseInfo,
    ) -> HRESULT,
    fn Alternates(
        RequestCount: c_long,
        StartElement: c_long,
        Elements: c_long,
        Alternates: *mut *mut ISpeechPhraseAlternates,
    ) -> HRESULT,
    fn Audio(
        StartElement: c_long,
        Elements: c_long,
        Stream: *mut *mut ISpeechMemoryStream,
    ) -> HRESULT,
    fn SpeakAudio(
        StartElement: c_long,
        Elements: c_long,
        Flags: SpeechVoiceSpeakFlags,
        StreamNumber: *mut c_long,
    ) -> HRESULT,
    fn SaveToMemory(
        ResultBlock: *mut VARIANT,
    ) -> HRESULT,
    fn DiscardResultInfo(
        ValueTypes: SpeechDiscardType,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x62b3b8fb, 0xf6e7, 0x41be, 0xbd, 0xcb, 0x05, 0x6b, 0x1c, 0x29, 0xef, 0xc0)]
interface ISpeechRecoResultTimes(ISpeechRecoResultTimesVtbl): IDispatch(IDispatchVtbl) {
    fn get_StreamTime(
        Time: *mut VARIANT,
    ) -> HRESULT,
    fn get_Length(
        Length: *mut VARIANT,
    ) -> HRESULT,
    fn get_TickCount(
        TickCount: *mut c_long,
    ) -> HRESULT,
    fn get_OffsetFromStart(
        OffsetFromStart: *mut VARIANT,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x27864a2a, 0x2b9f, 0x4cb8, 0x92, 0xd3, 0x0d, 0x27, 0x22, 0xfd, 0x1e, 0x73)]
interface ISpeechPhraseAlternate(ISpeechPhraseAlternateVtbl): IDispatch(IDispatchVtbl) {
    fn get_RecoResult(
        RecoResult: *mut *mut ISpeechRecoResult,
    ) -> HRESULT,
    fn get_StartElementInResult(
        StartElement: *mut c_long,
    ) -> HRESULT,
    fn get_NumberOfElementsInResult(
        NumberOfElements: *mut c_long,
    ) -> HRESULT,
    fn get_PhraseInfo(
        PhraseInfo: *mut *mut ISpeechPhraseInfo,
    ) -> HRESULT,
    fn Commit() -> HRESULT,
}}
RIDL!{#[uuid(0xb238b6d5, 0xf276, 0x4c3d, 0xa6, 0xc1, 0x29, 0x74, 0x80, 0x1c, 0x3c, 0xc2)]
interface ISpeechPhraseAlternates(ISpeechPhraseAlternatesVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        PhraseAlternate: *mut *mut ISpeechPhraseAlternate,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x961559cf, 0x4e67, 0x4662, 0x8b, 0xf0, 0xd9, 0x3f, 0x1f, 0xcd, 0x61, 0xb3)]
interface ISpeechPhraseInfo(ISpeechPhraseInfoVtbl): IDispatch(IDispatchVtbl) {
    fn get_LanguageId(
        LanguageId: *mut c_long,
    ) -> HRESULT,
    fn get_GrammarId(
        GrammarId: *mut VARIANT,
    ) -> HRESULT,
    fn get_StartTime(
        StartTime: *mut VARIANT,
    ) -> HRESULT,
    fn get_AudioStreamPosition(
        AudioStreamPosition: *mut VARIANT,
    ) -> HRESULT,
    fn get_AudioSizeBytes(
        pAudioSizeBytes: *mut c_long,
    ) -> HRESULT,
    fn get_RetainedSizeBytes(
        RetainedSizeBytes: *mut c_long,
    ) -> HRESULT,
    fn get_AudioSizeTime(
        AudioSizeTime: *mut c_long,
    ) -> HRESULT,
    fn get_Rule(
        Rule: *mut *mut ISpeechPhraseRule,
    ) -> HRESULT,
    fn get_Properties(
        Properties: *mut *mut ISpeechPhraseProperties,
    ) -> HRESULT,
    fn get_Elements(
        Elements: *mut *mut ISpeechPhraseElements,
    ) -> HRESULT,
    fn get_Replacements(
        Replacements: *mut *mut ISpeechPhraseReplacements,
    ) -> HRESULT,
    fn get_EngineId(
        EngineIdGuid: *mut BSTR,
    ) -> HRESULT,
    fn get_EnginePrivateData(
        PrivateData: *mut VARIANT,
    ) -> HRESULT,
    fn SaveToMemory(
        PhraseBlock: *mut VARIANT,
    ) -> HRESULT,
    fn GetText(
        StartElement: c_long,
        Elements: c_long,
        UseReplacements: VARIANT_BOOL,
        Text: *mut BSTR,
    ) -> HRESULT,
    fn GetDisplayAttributes(
        StartElement: c_long,
        Elements: c_long,
        UseReplacements: VARIANT_BOOL,
        DisplayAttributes: *mut SpeechDisplayAttributes,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xe6176f96, 0xe373, 0x4801, 0xb2, 0x23, 0x3b, 0x62, 0xc0, 0x68, 0xc0, 0xb4)]
interface ISpeechPhraseElement(ISpeechPhraseElementVtbl): IDispatch(IDispatchVtbl) {
    fn get_AudioTimeOffset(
        AudioTimeOffset: *mut c_long,
    ) -> HRESULT,
    fn get_AudioSizeTime(
        AudioSizeTime: *mut c_long,
    ) -> HRESULT,
    fn get_AudioStreamOffset(
        AudioStreamOffset: *mut c_long,
    ) -> HRESULT,
    fn get_AudioSizeBytes(
        AudioSizeBytes: *mut c_long,
    ) -> HRESULT,
    fn get_RetainedStreamOffset(
        RetainedStreamOffset: *mut c_long,
    ) -> HRESULT,
    fn get_RetainedSizeBytes(
        RetainedSizeBytes: *mut c_long,
    ) -> HRESULT,
    fn get_DisplayText(
        DisplayText: *mut BSTR,
    ) -> HRESULT,
    fn get_LexicalForm(
        LexicalForm: *mut BSTR,
    ) -> HRESULT,
    fn get_Pronunciation(
        Pronunciation: *mut VARIANT,
    ) -> HRESULT,
    fn get_DisplayAttributes(
        DisplayAttributes: *mut SpeechDisplayAttributes,
    ) -> HRESULT,
    fn get_RequiredConfidence(
        RequiredConfidence: *mut SpeechEngineConfidence,
    ) -> HRESULT,
    fn get_ActualConfidence(
        ActualConfidence: *mut SpeechEngineConfidence,
    ) -> HRESULT,
    fn get_EngineConfidence(
        EngineConfident: *mut c_float,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x0626b328, 0x3478, 0x467d, 0xa0, 0xb3, 0xd0, 0x85, 0x3b, 0x93, 0xdd, 0xa3)]
interface ISpeechPhraseElements(ISpeechPhraseElementsVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Element: *mut *mut ISpeechPhraseElement,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x2890a410, 0x53a7, 0x4fb5, 0x94, 0xec, 0x06, 0xd4, 0x99, 0x8e, 0x3d, 0x02)]
interface ISpeechPhraseReplacement(ISpeechPhraseReplacementVtbl): IDispatch(IDispatchVtbl) {
    fn get_DisplayAttributes(
        DisplayAttributes: *mut SpeechDisplayAttributes,
    ) -> HRESULT,
    fn get_Text(
        Text: *mut BSTR,
    ) -> HRESULT,
    fn get_FirstElement(
        FirstElement: *mut c_long,
    ) -> HRESULT,
    fn get_NumberOfElements(
        NumberOfElements: *mut c_long,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x38bc662f, 0x2257, 0x4525, 0x95, 0x9e, 0x20, 0x69, 0xd2, 0x59, 0x6c, 0x05)]
interface ISpeechPhraseReplacements(ISpeechPhraseReplacementsVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Reps: *mut *mut ISpeechPhraseReplacement,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xce563d48, 0x961e, 0x4732, 0xa2, 0xe1, 0x37, 0x8a, 0x42, 0xb4, 0x30, 0xbe)]
interface ISpeechPhraseProperty(ISpeechPhrasePropertyVtbl): IDispatch(IDispatchVtbl) {
    fn get_Name(
        Name: *mut BSTR,
    ) -> HRESULT,
    fn get_Id(
        Id: *mut c_long,
    ) -> HRESULT,
    fn get_Value(
        Value: *mut VARIANT,
    ) -> HRESULT,
    fn get_FirstElement(
        FirstElement: *mut c_long,
    ) -> HRESULT,
    fn get_NumberOfElements(
        NumberOfElements: *mut c_long,
    ) -> HRESULT,
    fn get_EngineConfidence(
        Confidence: *mut c_float,
    ) -> HRESULT,
    fn get_Confidence(
        Confidence: *mut SpeechEngineConfidence,
    ) -> HRESULT,
    fn get_Parent(
        ParentProperty: *mut *mut ISpeechPhraseProperty,
    ) -> HRESULT,
    fn get_Children(
        Children: *mut *mut ISpeechPhraseProperties,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x08166b47, 0x102e, 0x4b23, 0xa5, 0x99, 0xbd, 0xb9, 0x8d, 0xbf, 0xd1, 0xf4)]
interface ISpeechPhraseProperties(ISpeechPhrasePropertiesVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Property: *mut *mut ISpeechPhraseProperty,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xa7bfe112, 0xa4a0, 0x48d9, 0xb6, 0x02, 0xc3, 0x13, 0x84, 0x3f, 0x69, 0x64)]
interface ISpeechPhraseRule(ISpeechPhraseRuleVtbl): IDispatch(IDispatchVtbl) {
    fn get_Name(
        Name: *mut BSTR,
    ) -> HRESULT,
    fn get_Id(
        Id: *mut c_long,
    ) -> HRESULT,
    fn get_FirstElement(
        FirstElement: *mut c_long,
    ) -> HRESULT,
    fn get_NumberOfElements(
        NumberOfElements: *mut c_long,
    ) -> HRESULT,
    fn get_Parent(
        Parent: *mut *mut ISpeechPhraseRule,
    ) -> HRESULT,
    fn get_Children(
        Children: *mut *mut ISpeechPhraseRules,
    ) -> HRESULT,
    fn get_Confidence(
        ActualConfidence: *mut SpeechEngineConfidence,
    ) -> HRESULT,
    fn get_EngineConfidence(
        Confidence: *mut c_float,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x9047d593, 0x01dd, 0x4b72, 0x81, 0xa3, 0xe4, 0xa0, 0xca, 0x69, 0xf4, 0x07)]
interface ISpeechPhraseRules(ISpeechPhraseRulesVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Rule: *mut *mut ISpeechPhraseRule,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x3da7627a, 0xc7ae, 0x4b23, 0x87, 0x08, 0x63, 0x8c, 0x50, 0x36, 0x2c, 0x25)]
interface ISpeechLexicon(ISpeechLexiconVtbl): IDispatch(IDispatchVtbl) {
    fn get_GenerationId(
        GenerationId: *mut c_long,
    ) -> HRESULT,
    fn GetWords(
        Flags: SpeechLexiconType,
        GenerationID: *mut c_long,
        Words: *mut *mut ISpeechLexiconWords,
    ) -> HRESULT,
    fn AddPronunciation(
        bstrWord: BSTR,
        LangId: SpeechLanguageId,
        PartOfSpeech: SpeechPartOfSpeech,
        bstrPronunciation: BSTR,
    ) -> HRESULT,
    fn AddPronunciationByPhoneIds(
        bstrWord: BSTR,
        LangId: SpeechLanguageId,
        PartOfSpeech: SpeechPartOfSpeech,
        PhoneIds: *mut VARIANT,
    ) -> HRESULT,
    fn RemovePronunciation(
        bstrWord: BSTR,
        LangId: SpeechLanguageId,
        PartOfSpeech: SpeechPartOfSpeech,
        bstrPronunciation: BSTR,
    ) -> HRESULT,
    fn RemovePronunciationByPhoneIds(
        bstrWord: BSTR,
        LangId: SpeechLanguageId,
        PartOfSpeech: SpeechPartOfSpeech,
        PhoneIds: *mut VARIANT,
    ) -> HRESULT,
    fn GetPronunciations(
        bstrWord: BSTR,
        LangId: SpeechLanguageId,
        TypeFlags: SpeechLexiconType,
        ppPronunciations: *mut *mut ISpeechLexiconPronunciations,
    ) -> HRESULT,
    fn GetGenerationChange(
        GenerationID: *mut c_long,
        ppWords: *mut *mut ISpeechLexiconWords,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x8d199862, 0x415e, 0x47d5, 0xac, 0x4f, 0xfa, 0xa6, 0x08, 0xb4, 0x24, 0xe6)]
interface ISpeechLexiconWords(ISpeechLexiconWordsVtbl): IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Word: *mut *mut ISpeechLexiconWord,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x4e5b933c, 0xc9be, 0x48ed, 0x88, 0x42, 0x1e, 0xe5, 0x1b, 0xb1, 0xd4, 0xff)]
interface ISpeechLexiconWord(ISpeechLexiconWordVtbl): IDispatch(IDispatchVtbl) {
    fn get_LangId(
        LangId: *mut SpeechLanguageId,
    ) -> HRESULT,
    fn get_Type(
        WordType: *mut SpeechWordType,
    ) -> HRESULT,
    fn get_Word(
        Word: *mut BSTR,
    ) -> HRESULT,
    fn get_Pronunciations(
        Pronunciations: *mut *mut ISpeechLexiconPronunciations,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x72829128, 0x5682, 0x4704, 0xa0, 0xd4, 0x3e, 0x2b, 0xb6, 0xf2, 0xea, 0xd3)]
interface ISpeechLexiconPronunciations(ISpeechLexiconPronunciationsVtbl):
    IDispatch(IDispatchVtbl) {
    fn get_Count(
        Count: *mut c_long,
    ) -> HRESULT,
    fn Item(
        Index: c_long,
        Pronunciation: *mut *mut ISpeechLexiconPronunciation,
    ) -> HRESULT,
    fn get__NewEnum(
        EnumVARIANT: *mut *mut IUnknown,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x95252c5d, 0x9e43, 0x4f4a, 0x98, 0x99, 0x48, 0xee, 0x73, 0x35, 0x2f, 0x9f)]
interface ISpeechLexiconPronunciation(ISpeechLexiconPronunciationVtbl): IDispatch(IDispatchVtbl) {
    fn get_Type(
        LexiconType: *mut SpeechLexiconType,
    ) -> HRESULT,
    fn get_LangId(
        LangId: *mut SpeechLanguageId,
    ) -> HRESULT,
    fn get_PartOfSpeech(
        PartOfSpeech: *mut SpeechPartOfSpeech,
    ) -> HRESULT,
    fn get_PhoneIds(
        PhoneIds: *mut VARIANT,
    ) -> HRESULT,
    fn get_Symbolic(
        Symbolic: *mut BSTR,
    ) -> HRESULT,
}}
pub const Speech_Default_Weight: c_float = DEFAULT_WEIGHT;
pub const Speech_Max_Word_Length: LONG = SP_MAX_WORD_LENGTH as i32;
pub const Speech_Max_Pron_Length: LONG = SP_MAX_PRON_LENGTH as i32;
pub const Speech_StreamPos_Asap: LONG = SP_STREAMPOS_ASAP as i32;
pub const Speech_StreamPos_RealTime: LONG = SP_STREAMPOS_REALTIME as i32;
pub const SpeechAllElements: LONG = SPPR_ALL_ELEMENTS as i32;
RIDL!{#[uuid(0x3b151836, 0xdf3a, 0x4e0a, 0x84, 0x6c, 0xd2, 0xad, 0xc9, 0x33, 0x43, 0x33)]
interface ISpeechPhraseInfoBuilder(ISpeechPhraseInfoBuilderVtbl): IDispatch(IDispatchVtbl) {
    fn RestorePhraseFromMemory(
        PhraseInMemory: *mut VARIANT,
        PhraseInfo: *mut *mut ISpeechPhraseInfo,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xc3e4f353, 0x433f, 0x43d6, 0x89, 0xa1, 0x6a, 0x62, 0xa7, 0x05, 0x4c, 0x3d)]
interface ISpeechPhoneConverter(ISpeechPhoneConverterVtbl): IDispatch(IDispatchVtbl) {
    fn get_LanguageId(
        LanguageId: *mut SpeechLanguageId,
    ) -> HRESULT,
    fn put_LanguageId(
        LanguageId: SpeechLanguageId,
    ) -> HRESULT,
    fn PhoneToId(
        Phonemes: BSTR,
        IdArray: *mut VARIANT,
    ) -> HRESULT,
    fn IdToPhone(
        IdArray: VARIANT,
        Phonemes: *mut BSTR,
    ) -> HRESULT,
}}
extern {
    pub static CLSID_SpNotifyTranslator: CLSID;
    pub static CLSID_SpObjectTokenCategory: CLSID;
    pub static CLSID_SpObjectToken: CLSID;
    pub static CLSID_SpResourceManager: CLSID;
    pub static CLSID_SpStreamFormatConverter: CLSID;
    pub static CLSID_SpMMAudioEnum: CLSID;
    pub static CLSID_SpMMAudioIn: CLSID;
    pub static CLSID_SpMMAudioOut: CLSID;
    pub static CLSID_SpStream: CLSID;
    pub static CLSID_SpVoice: CLSID;
    pub static CLSID_SpSharedRecoContext: CLSID;
    pub static CLSID_SpInprocRecognizer: CLSID;
    pub static CLSID_SpSharedRecognizer: CLSID;
    pub static CLSID_SpLexicon: CLSID;
    pub static CLSID_SpUnCompressedLexicon: CLSID;
    pub static CLSID_SpCompressedLexicon: CLSID;
    pub static CLSID_SpPhoneConverter: CLSID;
    pub static CLSID_SpNullPhoneConverter: CLSID;
    pub static CLSID_SpTextSelectionInformation: CLSID;
    pub static CLSID_SpPhraseInfoBuilder: CLSID;
    pub static CLSID_SpAudioFormat: CLSID;
    pub static CLSID_SpWaveFormatEx: CLSID;
    pub static CLSID_SpInProcRecoContext: CLSID;
    pub static CLSID_SpCustomStream: CLSID;
    pub static CLSID_SpFileStream: CLSID;
    pub static CLSID_SpMemoryStream: CLSID;
}