/*
 * Copyright 2020 Rémi Bernon for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "windows.foundation.idl";
import "windows.media.idl";
import "windows.storage.streams.idl";

namespace Windows.Media.SpeechSynthesis
{
    typedef enum SpeechAppendedSilence SpeechAppendedSilence;
    typedef enum SpeechPunctuationSilence SpeechPunctuationSilence;
    typedef enum VoiceGender VoiceGender;
    interface IInstalledVoicesStatic;
    interface IInstalledVoicesStatic2;
    interface ISpeechSynthesizer;
    interface ISpeechSynthesizer2;
    interface ISpeechSynthesizerOptions;
    interface ISpeechSynthesizerOptions2;
    interface ISpeechSynthesizerOptions3;
    interface IVoiceInformation;
    interface ISpeechSynthesisStream;
    runtimeclass SpeechSynthesizer;
    runtimeclass VoiceInformation;
    runtimeclass SpeechSynthesizerOptions;
    runtimeclass SpeechSynthesisStream;

    declare
    {
        interface Windows.Foundation.Collections.IIterable<Windows.Media.SpeechSynthesis.VoiceInformation*>;
        interface Windows.Foundation.Collections.IIterator<Windows.Media.SpeechSynthesis.VoiceInformation*>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Media.SpeechSynthesis.VoiceInformation*>;
        interface Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0)
    ]
    enum SpeechAppendedSilence
    {
        Default = 0,
        Min     = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0)
    ]
    enum SpeechPunctuationSilence
    {
        Default = 0,
        Min     = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum VoiceGender
    {
        Male   = 0,
        Female = 1
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesisStream),
        uuid(83e46e93-244c-4622-ba0b-6229c4d0d65d)
    ]
    interface ISpeechSynthesisStream : IInspectable
        requires
            Windows.Storage.Streams.IRandomAccessStreamWithContentType,
            Windows.Storage.Streams.IRandomAccessStream,
            Windows.Foundation.IClosable,
            Windows.Storage.Streams.IInputStream,
            Windows.Storage.Streams.IOutputStream,
            Windows.Storage.Streams.IContentTypeProvider
    {
        [propget] HRESULT Markers([out, retval] Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer),
        uuid(ce9f7c76-97f4-4ced-ad68-d51c458e45c6)
    ]
    interface ISpeechSynthesizer : IInspectable
    {
        HRESULT SynthesizeTextToStreamAsync([in] HSTRING text, [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation);
        HRESULT SynthesizeSsmlToStreamAsync([in] HSTRING Ssml, [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.SpeechSynthesis.SpeechSynthesisStream*> **operation);
        [propput] HRESULT Voice([in] VoiceInformation *value);
        [propget] HRESULT Voice([out, retval] VoiceInformation **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer),
        uuid(a7c5ecb2-4339-4d6a-bbf8-c7a4f1544c2e)
    ]
    interface ISpeechSynthesizer2 : IInspectable
    {
        [propget] HRESULT Options([out, retval] SpeechSynthesizerOptions **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Media.SpeechSynthesis.VoiceInformation),
        uuid(b127d6a4-1291-4604-aa9c-83134083352c)
    ]
    interface IVoiceInformation : IInspectable
    {
        [propget] HRESULT DisplayName([out, retval] HSTRING *value);
        [propget] HRESULT Id([out, retval] HSTRING *value);
        [propget] HRESULT Language([out, retval] HSTRING *value);
        [propget] HRESULT Description([out, retval] HSTRING *value);
        [propget] HRESULT Gender([out, retval] VoiceGender *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizerOptions),
        uuid(a0e23871-cc3d-43c9-91b1-ee185324d83d)
    ]
    interface ISpeechSynthesizerOptions : IInspectable
    {
        [propget] HRESULT IncludeWordBoundaryMetadata([out, retval] boolean *value);
        [propput] HRESULT IncludeWordBoundaryMetadata([in] boolean value);
        [propget] HRESULT IncludeSentenceBoundaryMetadata([out, retval] boolean *value);
        [propput] HRESULT IncludeSentenceBoundaryMetadata([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 5.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizerOptions),
        uuid(1cbef60e-119c-4bed-b118-d250c3a25793),
    ]
    interface ISpeechSynthesizerOptions2 : IInspectable
    {
        [propget] HRESULT AudioVolume([out, retval] DOUBLE *value);
        [propput] HRESULT AudioVolume([in] DOUBLE value);
        [propget] HRESULT SpeakingRate([out, retval] DOUBLE *value);
        [propput] HRESULT SpeakingRate([in] DOUBLE value);
        [propget] HRESULT AudioPitch([out, retval] DOUBLE *value);
        [propput] HRESULT AudioPitch([in] DOUBLE value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 6.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizerOptions),
        uuid(401ed877-902c-4814-a582-a5d0c0769fa8)
    ]
    interface ISpeechSynthesizerOptions3 : IInspectable
    {
        [propget] HRESULT AppendedSilence([out, retval] Windows.Media.SpeechSynthesis.SpeechAppendedSilence *value);
        [propput] HRESULT AppendedSilence([in] Windows.Media.SpeechSynthesis.SpeechAppendedSilence value);
        [propget] HRESULT PunctuationSilence([out, retval] Windows.Media.SpeechSynthesis.SpeechPunctuationSilence *value);
        [propput] HRESULT PunctuationSilence([in] Windows.Media.SpeechSynthesis.SpeechPunctuationSilence value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Media.SpeechSynthesis.SpeechSynthesizer),
        uuid(7d526ecc-7533-4c3f-85be-888c2baeebdc)
    ]
    interface IInstalledVoicesStatic : IInspectable
    {
        [propget] HRESULT AllVoices([out, retval] Windows.Foundation.Collections.IVectorView<VoiceInformation*> **value);
        [propget] HRESULT DefaultVoice([out, retval] VoiceInformation **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass VoiceInformation
    {
        [default] interface Windows.Media.SpeechSynthesis.IVoiceInformation;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        marshaling_behavior(agile)
    ]
    runtimeclass SpeechSynthesizerOptions
    {
        [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizerOptions;
        [contract(Windows.Foundation.UniversalApiContract, 5.0)] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizerOptions2;
        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizerOptions3;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass SpeechSynthesisStream
    {
        [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesisStream;
        interface Windows.Storage.Streams.IRandomAccessStreamWithContentType;
        interface Windows.Storage.Streams.IContentTypeProvider;
        interface Windows.Storage.Streams.IRandomAccessStream;
        interface Windows.Storage.Streams.IOutputStream;
        interface Windows.Foundation.IClosable;
        interface Windows.Storage.Streams.IInputStream;
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic2, Windows.Foundation.UniversalApiContract, 5.0)
    ]
    runtimeclass SpeechSynthesizer
    {
        [default] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer;
        interface Windows.Foundation.IClosable;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Media.SpeechSynthesis.ISpeechSynthesizer2;
    }
}
