diff options
Diffstat (limited to 'projs')
-rw-r--r-- | projs/CodeBlocks/Win32Extra/speech_dispatcher_win32.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/projs/CodeBlocks/Win32Extra/speech_dispatcher_win32.c b/projs/CodeBlocks/Win32Extra/speech_dispatcher_win32.c new file mode 100644 index 000000000..1542ac852 --- /dev/null +++ b/projs/CodeBlocks/Win32Extra/speech_dispatcher_win32.c @@ -0,0 +1,96 @@ +#include <sys/types.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> +#include <stdarg.h> +#include "config.h" +#include "plugin.h" +#include "speech.h" +#include <windows.h> +#define COBJMACROS +#include <sapi.h> +#include <objbase.h> +#include <glib.h> + +const IID UUID_OF_ISPVOICE; // = {6C44DF74-72B9-4992-A1EC-EF996E0422D4}; + + +struct speech_priv { + ISpVoice* pIspVoice; +}; + +static int +speechd_say(struct speech_priv *this_, const char *text) { + int err = 1; + + if ( this_->pIspVoice ) + { + WCHAR* pWideString = g_utf8_to_utf16( text, -1, NULL, NULL, NULL ); + ISpVoice_Speak( this_->pIspVoice, pWideString, 0, NULL); + g_free( pWideString ); + err = 0; + } + return err; +} + +static void +speechd_destroy(struct speech_priv *this) { + g_free(this); +} + +static struct speech_methods speechd_meth = { + speechd_destroy, + speechd_say, +}; + +static struct speech_priv * +speechd_new(char *data, struct speech_methods *meth) { + struct speech_priv *this_; + + this_=g_new(struct speech_priv,1); + + this_->pIspVoice = NULL; + + + CLSID clsid_sape; + CLSID* pw = &clsid_sape; + + CoInitialize(NULL); + + HRESULT hr = CLSIDFromProgID(L"SAPI.SpVoice", &clsid_sape); + + if ( 0 == hr ) + { + IID UUID_OF_ISPVOICE; // = {6C44DF74-72B9-4992-A1EC-EF996E0422D4}; + UUID_OF_ISPVOICE.Data1 = 0x6C44DF74; + UUID_OF_ISPVOICE.Data2 = 0x72B9; + UUID_OF_ISPVOICE.Data3 = 0x4992; + UUID_OF_ISPVOICE.Data4[0] = 161; + UUID_OF_ISPVOICE.Data4[1] = 236; + UUID_OF_ISPVOICE.Data4[2] = 239; + UUID_OF_ISPVOICE.Data4[3] = 153; + UUID_OF_ISPVOICE.Data4[4] = 110; + UUID_OF_ISPVOICE.Data4[5] = 4; + UUID_OF_ISPVOICE.Data4[6] = 34; + UUID_OF_ISPVOICE.Data4[7] = 212; + + ISpVoice* pIspVoice; + hr = CoCreateInstance( &clsid_sape, NULL, CLSCTX_ALL, &UUID_OF_ISPVOICE, &pIspVoice ); + + if ( ( 0 == hr ) && ( this_ != NULL ) ) + { + this_->pIspVoice = pIspVoice; + } + } + + // ISpVoice_Speak( pIspVoice, L"If you can hear this, SAPI is working", 0, NULL); + *meth=speechd_meth; + return this_; +} + + +void plugin_init(void) +{ + plugin_register_speech_type("speech_dispatcher", speechd_new); +} |