From: Nello De Gregoris <bluechxindv@gmail.com> --- libs/faudio/src/FAudio_platform_win32_wmadec.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libs/faudio/src/FAudio_platform_win32_wmadec.c b/libs/faudio/src/FAudio_platform_win32_wmadec.c index 8d7b9185a94..c5485fcd5c6 100644 --- a/libs/faudio/src/FAudio_platform_win32_wmadec.c +++ b/libs/faudio/src/FAudio_platform_win32_wmadec.c @@ -22,6 +22,7 @@ struct FAudioWMADEC { IMFTransform *decoder; IMFSample *output_sample; + BOOL co_init; char *output_buf; size_t output_pos; @@ -266,6 +267,10 @@ uint32_t FAudio_WMADEC_init(FAudioSourceVoice *voice, uint32_t type) if (!(impl = voice->audio->pMalloc(sizeof(*impl)))) return -1; FAudio_memset(impl, 0, sizeof(*impl)); + /* the app's thread might not have initialised COM, and CoCreateInstance + * below fails if it has not, leaving the voice to decode to silence */ + impl->co_init = SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED)); + hr = CoCreateInstance( &CLSID_CWMADecMediaObject, 0, @@ -275,6 +280,7 @@ uint32_t FAudio_WMADEC_init(FAudioSourceVoice *voice, uint32_t type) ); if (FAILED(hr)) { + if (impl->co_init) CoUninitialize(); voice->audio->pFree(impl->output_buf); return -2; } @@ -578,6 +584,7 @@ void FAudio_WMADEC_free(FAudioSourceVoice *voice) if (impl->output_sample) IMFSample_Release(impl->output_sample); IMFTransform_Release(impl->decoder); voice->audio->pFree(impl->output_buf); + if (impl->co_init) CoUninitialize(); voice->audio->pFree(voice->src.wmadec); voice->src.wmadec = NULL; voice->src.decode = NULL; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11717