From: Giovanni Mascellani giovanni@mascellani.eu
This fixes the voice chat in Farming Simulator 22. --- dlls/mmdevapi/client.c | 34 +++++++++++++++++++++++++++++++++- dlls/mmdevapi/tests/capture.c | 1 - dlls/mmdevapi/tests/render.c | 1 - 3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 39cbae27b34..61b9167f3c6 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -398,6 +398,22 @@ static HRESULT stream_init(struct audio_client *client, const BOOLEAN force_def_ return E_INVALIDARG; }
+ if (mode == AUDCLNT_SHAREMODE_SHARED) { + WAVEFORMATEX *mix_fmt; + HRESULT hr; + + if (FAILED(hr = IAudioClient3_GetMixFormat(&client->IAudioClient3_iface, &mix_fmt))) + return hr; + + if (fmt->nChannels != mix_fmt->nChannels || fmt->nSamplesPerSec != mix_fmt->nSamplesPerSec) + { + CoTaskMemFree(mix_fmt); + return AUDCLNT_E_UNSUPPORTED_FORMAT; + } + + CoTaskMemFree(mix_fmt); + } + sessions_lock();
if (client->stream) { @@ -760,9 +776,25 @@ static HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, AUDCLNT_SHA
TRACE("(%p)->(%x, %p, %p)\n", This, mode, fmt, out);
- if (fmt) + if (fmt) { dump_fmt(fmt);
+ if (mode == AUDCLNT_SHAREMODE_SHARED) { + WAVEFORMATEX *mix_fmt; + HRESULT hr; + + if (FAILED(hr = IAudioClient3_GetMixFormat(iface, &mix_fmt))) + return hr; + + if (fmt->nChannels != mix_fmt->nChannels || fmt->nSamplesPerSec != mix_fmt->nSamplesPerSec) { + *out = mix_fmt; + return S_FALSE; + } + + CoTaskMemFree(mix_fmt); + } + } + params.device = This->device_name; params.flow = This->dataflow; params.share = mode; diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index 17281bf3108..678fda5baca 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -629,7 +629,6 @@ static void test_formats(AUDCLNT_SHAREMODE mode) { BOOL compatible = fmt.nSamplesPerSec == pwfx->nSamplesPerSec && fmt.nChannels == pwfx->nChannels; HRESULT expected = compatible ? S_OK : S_FALSE; - todo_wine_if(expected == S_FALSE) ok(hr == expected, "Got %lx expected %lx\n", hr, expected); }
diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c index 8772d6e3828..f674935de00 100644 --- a/dlls/mmdevapi/tests/render.c +++ b/dlls/mmdevapi/tests/render.c @@ -576,7 +576,6 @@ static void test_formats(AUDCLNT_SHAREMODE mode) { BOOL compatible = fmt.nSamplesPerSec == pwfx->nSamplesPerSec && fmt.nChannels == pwfx->nChannels; HRESULT expected = compatible ? S_OK : S_FALSE; - todo_wine_if(expected == S_FALSE) ok(hr == expected, "Got %lx expected %lx\n", hr, expected); }