From: Shaun Ren sren@codeweavers.com
--- dlls/msttsengine/tts.c | 27 +++++++++++++++++++++++++-- dlls/msttsengine/ttseng_private.h | 10 ++++++++++ dlls/msttsengine/unixlib.c | 18 ++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/msttsengine/tts.c b/dlls/msttsengine/tts.c index 9b65416a981..8e60119ce68 100644 --- a/dlls/msttsengine/tts.c +++ b/dlls/msttsengine/tts.c @@ -148,9 +148,32 @@ static HRESULT WINAPI ttsengine_GetOutputFormat(ISpTTSEngine *iface, const GUID const WAVEFORMATEX *wfx, GUID *out_fmtid, WAVEFORMATEX **out_wfx) { - FIXME("(%p, %s, %p, %p, %p): stub.\n", iface, debugstr_guid(fmtid), wfx, out_fmtid, out_wfx); + struct ttsengine *This = impl_from_ISpTTSEngine(iface); + struct tts_voice_get_config_params params = + { + .voice = This->voice, + };
- return E_NOTIMPL; + TRACE("(%p, %s, %p, %p, %p).\n", iface, debugstr_guid(fmtid), wfx, out_fmtid, out_wfx); + + if (!This->voice) + return SPERR_UNINITIALIZED; + + *out_fmtid = SPDFID_WaveFormatEx; + if (!(*out_wfx = CoTaskMemAlloc(sizeof(WAVEFORMATEX)))) + return E_OUTOFMEMORY; + + WINE_UNIX_CALL(unix_tts_voice_get_config, ¶ms); + + (*out_wfx)->wFormatTag = WAVE_FORMAT_PCM; + (*out_wfx)->nChannels = params.channels; + (*out_wfx)->nSamplesPerSec = params.sample_rate; + (*out_wfx)->wBitsPerSample = params.sample_width * 8; + (*out_wfx)->nBlockAlign = params.sample_width * params.channels; + (*out_wfx)->nAvgBytesPerSec = params.sample_rate * params.sample_width * params.channels; + (*out_wfx)->cbSize = 0; + + return S_OK; }
static ISpTTSEngineVtbl ttsengine_vtbl = diff --git a/dlls/msttsengine/ttseng_private.h b/dlls/msttsengine/ttseng_private.h index 62bb89f431a..1bbd1500e33 100644 --- a/dlls/msttsengine/ttseng_private.h +++ b/dlls/msttsengine/ttseng_private.h @@ -42,6 +42,15 @@ struct tts_voice_load_params tts_voice_t voice; };
+struct tts_voice_get_config_params +{ + tts_voice_t voice; + float length_scale; + INT32 sample_rate; + INT32 sample_width; + INT32 channels; +}; + enum unix_funcs { unix_tts_create, @@ -49,6 +58,7 @@ enum unix_funcs
unix_tts_voice_load, unix_tts_voice_destroy, + unix_tts_voice_get_config, };
#endif /* __WINE_TTSENG_PRIVATE_H */ diff --git a/dlls/msttsengine/unixlib.c b/dlls/msttsengine/unixlib.c index e45b870d066..b544872b5c2 100644 --- a/dlls/msttsengine/unixlib.c +++ b/dlls/msttsengine/unixlib.c @@ -97,6 +97,22 @@ static NTSTATUS tts_voice_destroy(void *args) return STATUS_SUCCESS; }
+static NTSTATUS tts_voice_get_config(void *args) +{ + struct tts_voice_get_config_params *params = args; + struct tts_voice *voice = get_voice(params->voice); + PiperSynthesisConfig config; + + piperGetVoiceSynthesisConfig(voice->voice, &config); + + params->length_scale = config.lengthScale; + params->sample_rate = config.sampleRate; + params->sample_width = config.sampleWidth; + params->channels = config.channels; + + return STATUS_SUCCESS; +} + const unixlib_entry_t __wine_unix_call_funcs[] = { tts_create, @@ -104,6 +120,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
tts_voice_load, tts_voice_destroy, + tts_voice_get_config, };
#ifdef _WIN64 @@ -139,6 +156,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
wow64_tts_voice_load, tts_voice_destroy, + tts_voice_get_config, };
#endif /* _WIN64 */