Turns out I was completely wrong (again): xaudio2 holds no reference of its own and the WMA path doesn't depend on COM at all. Looking at a +ole log again, the game actually calls CoUninitialize() before it gets to creating the WMA voice: it initializes COM on its audio thread, sets up audio, drops COM again which destroys the apartment, and only about three seconds later creates the xWMA voice on that same thread, which is where we fail, while on Windows CreateSourceVoice() with a WMA format works fine from a thread that never initialized COM. The simplest solution here seemed like replacing the CoInitialize(NULL) FAudio already had in FAudio_PlatformAddRef() with CoIncrementMTAUsage(), so an MTA is around for as long as the platform device is, without changing the apartment of any application thread. I also found afterwards that dlls/dsound does the same thing in DirectSoundDevice_Initialize. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11717#note_149547