File: Synthesis\TTSEngine\SAPIEngineTypes.cs
Web Access
Project: src\src\runtime\src\libraries\System.Speech\src\System.Speech.csproj (System.Speech)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Runtime.InteropServices;

namespace System.Speech.Synthesis.TtsEngine
{
    #region Public Enums

    [ComImport, Guid("A74D7C8E-4CC5-4F2F-A6EB-804DEE18500E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface ITtsEngine
    {
        [PreserveSig]
        void Speak(SPEAKFLAGS dwSpeakFlags, ref Guid rguidFormatId, IntPtr pWaveFormatEx, IntPtr pTextFragList, IntPtr pOutputSite);
        [PreserveSig]
        void GetOutputFormat(ref Guid pTargetFmtId, IntPtr pTargetWaveFormatEx, out Guid pOutputFormatId, out IntPtr ppCoMemOutputWaveFormatEx);
    }

    [StructLayout(LayoutKind.Sequential)]
    internal class SPVTEXTFRAG
    {
        public IntPtr pNext;
        public SPVSTATE State;
        public IntPtr pTextStart;
        public int ulTextLen;
        public int ulTextSrcOffset;

        // must be the last element, it is passed to the TTS engine that
        // does not see these fields
        public GCHandle gcText;
        public GCHandle gcNext;
        public GCHandle gcPhoneme;
        public GCHandle gcSayAsCategory;
    }

    [ComConversionLossAttribute]
    [TypeLibTypeAttribute(16)]
    internal struct SPVSTATE
    {
        //--- Action
        public SPVACTIONS eAction;

        //--- Running state values
        public short LangID;
        public short wReserved;
        public int EmphAdj;
        public int RateAdj;
        public int Volume;
        public SPVPITCH PitchAdj;
        public int SilenceMSecs;
        public IntPtr pPhoneIds;
        public SPPARTOFSPEECH ePartOfSpeech;
        public SPVCONTEXT Context;
    }

    [System.Runtime.InteropServices.TypeLibTypeAttribute(16)]
    internal struct SPVCONTEXT
    {
        public IntPtr pCategory;
        public IntPtr pBefore;
        public IntPtr pAfter;
    }

    [System.Runtime.InteropServices.TypeLibTypeAttribute(16)]
    internal struct SPVPITCH
    {
        public int MiddleAdj;
        public int RangeAdj;
    }

    internal static class SAPIGuids
    {
        internal static readonly Guid SPDFID_WaveFormatEx = new("C31ADBAE-527F-4ff5-A230-F62BB61FF70C");
    }

    [Flags]
    internal enum SPEAKFLAGS : int
    {
        SPF_DEFAULT = 0x0000,   // Synchronous, no purge, xml auto detect
        SPF_ASYNC = 0x0001,   // Asynchronous call
        SPF_PURGEBEFORESPEAK = 0x0002,   // Purge current data prior to speaking this
        SPF_IS_FILENAME = 0x0004,   // The string passed to Speak() is a file name
        SPF_IS_XML = 0x0008,   // The input text will be parsed for XML markup
        SPF_IS_NOT_XML = 0x0010,   // The input text will not be parsed for XML markup
        SPF_PERSIST_XML = 0x0020,   // Persists XML global state changes
        SPF_NLP_SPEAK_PUNC = 0x0040,   // The normalization processor should speak the punctuation
        SPF_PARSE_SAPI = 0x0080,   // Force XML parsing as MS SAPI
        SPF_PARSE_SSML = 0x0100    // Force XML parsing as W3C SSML
    }

    [Flags]
    internal enum SPVESACTIONS
    {
        SPVES_CONTINUE = 0,
        SPVES_ABORT = 1,
        SPVES_SKIP = 2,
        SPVES_RATE = 4,
        SPVES_VOLUME = 8
    }

    [System.Runtime.InteropServices.TypeLibTypeAttribute(16)]
    internal enum SPVACTIONS
    {
        SPVA_Speak = 0,
        SPVA_Silence = 1,
        SPVA_Pronounce = 2,
        SPVA_Bookmark = 3,
        SPVA_SpellOut = 4,
        SPVA_Section = 5,
        SPVA_ParseUnknownTag = 6,
    }

    [System.Runtime.InteropServices.TypeLibTypeAttribute(16)]
    internal enum SPPARTOFSPEECH
    {
        //--- SAPI5 public POS category values (bits 28-31)
        SPPS_NotOverridden = -1,
        SPPS_Unknown = 0,
        SPPS_Noun = 0x1000,
        SPPS_Verb = 0x2000,
        SPPS_Modifier = 0x3000,
        SPPS_Function = 0x4000,
        SPPS_Interjection = 0x5000,
        SPPS_SuppressWord = 0xF000,    // Special flag to indicate this word should not be recognized
    }

    #endregion
}