From: Shaun Ren <sren(a)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 */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4364