| const WAVEFORMATEX *targetFormat, | const WAVEFORMATEX *targetFormat, | ||||
| GUID *formatId, | GUID *formatId, | ||||
| WAVEFORMATEX **format); | WAVEFORMATEX **format); | ||||
| int OnEvent(short *data, int samples, espeak_EVENT *events); | |||||
| private: | private: | ||||
| HRESULT GetStringValue(LPCWSTR key, char *&value); | HRESULT GetStringValue(LPCWSTR key, char *&value); | ||||
| ULONG refCount; | ULONG refCount; | ||||
| ISpObjectToken *objectToken; | ISpObjectToken *objectToken; | ||||
| ISpTTSEngineSite *site; | |||||
| }; | }; | ||||
| static int | |||||
| espeak_callback(short *data, int samples, espeak_EVENT *events) | |||||
| { | |||||
| TtsEngine *engine = (TtsEngine *)events->user_data; | |||||
| return engine->OnEvent(data, samples, events); | |||||
| } | |||||
| TtsEngine::TtsEngine() | TtsEngine::TtsEngine() | ||||
| : refCount(1) | : refCount(1) | ||||
| , objectToken(NULL) | , objectToken(NULL) | ||||
| , site(NULL) | |||||
| { | { | ||||
| InterlockedIncrement(&ObjectCount); | InterlockedIncrement(&ObjectCount); | ||||
| } | } | ||||
| free(path); | free(path); | ||||
| } | } | ||||
| espeak_SetSynthCallback(espeak_callback); | |||||
| char *voiceName = NULL; | char *voiceName = NULL; | ||||
| if (SUCCEEDED(GetStringValue(L"VoiceName", voiceName))) { | if (SUCCEEDED(GetStringValue(L"VoiceName", voiceName))) { | ||||
| if (status == ENS_OK) | if (status == ENS_OK) | ||||
| const SPVTEXTFRAG *textFragList, | const SPVTEXTFRAG *textFragList, | ||||
| ISpTTSEngineSite *site) | ISpTTSEngineSite *site) | ||||
| { | { | ||||
| if (!site || !textFragList) | |||||
| return E_INVALIDARG; | |||||
| this->site = site; | |||||
| while (textFragList != NULL) | |||||
| { | |||||
| DWORD actions = site->GetActions(); | |||||
| if (actions & SPVES_ABORT) | |||||
| return S_OK; | |||||
| switch (textFragList->State.eAction) | |||||
| { | |||||
| case SPVA_Speak: | |||||
| espeak_ng_Synthesize(textFragList->pTextStart, 0, 0, POS_CHARACTER, 0, espeakCHARS_WCHAR, NULL, this); | |||||
| break; | |||||
| } | |||||
| textFragList = textFragList->pNext; | |||||
| } | |||||
| return E_NOTIMPL; | return E_NOTIMPL; | ||||
| } | } | ||||
| return S_OK; | return S_OK; | ||||
| } | } | ||||
| int | |||||
| TtsEngine::OnEvent(short *data, int samples, espeak_EVENT *events) | |||||
| { | |||||
| DWORD actions = site->GetActions(); | |||||
| if (actions & SPVES_ABORT) | |||||
| return 1; | |||||
| if (data) | |||||
| site->Write(data, samples * 2, NULL); | |||||
| return 0; | |||||
| } | |||||
| HRESULT TtsEngine::GetStringValue(LPCWSTR key, char *&value) | HRESULT TtsEngine::GetStringValue(LPCWSTR key, char *&value) | ||||
| { | { | ||||
| if (!objectToken) | if (!objectToken) |