[PATCH v4 0/3] MR9755: mfmediaengine fixes
Fixes for regression bug 59047 -- v4: mfmediaengine/tests: Test WASAPI audio session interaction. https://gitlab.winehq.org/wine/wine/-/merge_requests/9755
From: Matteo Bruni <mbruni@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59047 --- dlls/mfmediaengine/main.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 23acc7331b3..081b6dfe735 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -867,19 +867,26 @@ static void media_engine_get_frame_size(struct media_engine *engine, IMFTopology static void media_engine_apply_volume(const struct media_engine *engine) { - IMFSimpleAudioVolume *sa_volume; + IMFAudioStreamVolume *as_volume; + unsigned int i; + UINT32 count; HRESULT hr; if (!engine->session) return; - if (FAILED(MFGetService((IUnknown *)engine->session, &MR_POLICY_VOLUME_SERVICE, &IID_IMFSimpleAudioVolume, (void **)&sa_volume))) + if (FAILED(MFGetService((IUnknown *)engine->session, &MR_STREAM_VOLUME_SERVICE, &IID_IMFAudioStreamVolume, (void **)&as_volume))) return; - if (FAILED(hr = IMFSimpleAudioVolume_SetMasterVolume(sa_volume, engine->volume))) - WARN("Failed to set master volume, hr %#lx.\n", hr); + if (FAILED(hr = IMFAudioStreamVolume_GetChannelCount(as_volume, &count))) + WARN("Failed to get channel count, hr %#lx.\n", hr); + for (i = 0; i < count; i++) + { + if (FAILED(hr = IMFAudioStreamVolume_SetChannelVolume(as_volume, i, engine->volume))) + WARN("Failed to set volume, hr %#lx.\n", hr); + } - IMFSimpleAudioVolume_Release(sa_volume); + IMFAudioStreamVolume_Release(as_volume); } static HRESULT WINAPI media_engine_callback_QueryInterface(IMFAsyncCallback *iface, REFIID riid, void **obj) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9755
From: Matteo Bruni <mbruni@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59047 --- dlls/mfmediaengine/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 081b6dfe735..6e82a59053f 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1159,12 +1159,15 @@ static HRESULT media_engine_create_audio_renderer(struct media_engine *engine, I unsigned int category, role; IMFActivate *sar_activate; HRESULT hr; + GUID guid; *node = NULL; if (FAILED(hr = MFCreateAudioRendererActivate(&sar_activate))) return hr; + CoCreateGuid(&guid); + IMFActivate_SetGUID(sar_activate, &MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID, &guid); /* Configuration attributes keys differ between Engine and SAR. */ if (SUCCEEDED(IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, &category))) IMFActivate_SetUINT32(sar_activate, &MF_AUDIO_RENDERER_ATTRIBUTE_STREAM_CATEGORY, category); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9755
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mfmediaengine/tests/mfmediaengine.c | 127 +++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 79b0edf8da3..1dcdf4d1d46 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -33,6 +33,8 @@ #include "initguid.h" #include "mmdeviceapi.h" #include "audiosessiontypes.h" +#include "audioclient.h" +#include "audiopolicy.h" #include "wincodec.h" #include "wine/test.h" @@ -753,10 +755,107 @@ static void test_playback_rate(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } +static void parse_guid(WCHAR *id, GUID *guid) +{ + WCHAR *str; + + str = wcsstr(id, L"%b"); + str += 2; + IIDFromString(str, guid); +} + +static void test_audio_session(void) +{ + IAudioSessionEnumerator *ase; + IAudioSessionManager2 *asm2; + IAudioSessionControl2 *asc2; + IAudioSessionControl *asc; + IMMDeviceEnumerator *mme; + IChannelAudioVolume *cav; + ISimpleAudioVolume *sav; + UINT32 channel_count; + int i, j, count; + IMMDevice *dev; + WCHAR *name; + HRESULT hr; + GUID guid; + DWORD pid; + float vol; + + hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme); + if (FAILED(hr)) + { + skip("mmdevapi not available: %#lx.\n", hr); + return; + } + + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, eRender, eMultimedia, &dev); + ok(hr == S_OK || hr == E_NOTFOUND, "Unexpected hr %#lx.\n", hr); + if (hr != S_OK || !dev) + { + if (hr == E_NOTFOUND) + skip("No sound card available.\n"); + else + skip("GetDefaultAudioEndpoint returned %#lx.\n", hr); + goto cleanup; + } + hr = IMMDevice_Activate(dev, &IID_IAudioSessionManager2, CLSCTX_INPROC_SERVER, + NULL, (void**)&asm2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IAudioSessionManager2_GetSessionEnumerator(asm2, &ase); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IAudioSessionEnumerator_GetCount(ase, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + for (i = 0; i < count; i++) + { + hr = IAudioSessionEnumerator_GetSession(ase, i, &asc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IAudioSessionControl_QueryInterface(asc, &IID_IAudioSessionControl2, (void **)&asc2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IAudioSessionControl2_GetProcessId(asc2, &pid); + if (pid != GetCurrentProcessId()) + continue; + hr = IAudioSessionControl2_GetSessionIdentifier(asc2, &name); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + parse_guid(name, &guid); + ok(!IsEqualGUID(&guid, &GUID_NULL), "unexpected session GUID %s.\n", wine_dbgstr_guid(&guid)); + CoTaskMemFree(name); + hr = IAudioSessionControl2_QueryInterface(asc2, &IID_ISimpleAudioVolume, (void **)&sav); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + hr = ISimpleAudioVolume_GetMasterVolume(sav, &vol); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(vol == 1.0f, "Unexpected volume %.8e.\n", vol); + ISimpleAudioVolume_Release(sav); + hr = IAudioSessionControl2_QueryInterface(asc2, &IID_IChannelAudioVolume, (void **)&cav); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IChannelAudioVolume_GetChannelCount(cav, &channel_count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + for (j = 0; j < channel_count; j++) + { + hr = IChannelAudioVolume_GetChannelVolume(cav, j, &vol); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(vol == 1.0f, "Unexpected channel %u volume %.8e.\n", j, vol); + } + IChannelAudioVolume_Release(cav); + } + IAudioSessionControl2_Release(asc2); + IAudioSessionControl_Release(asc); + } + + IAudioSessionEnumerator_Release(ase); + IAudioSessionManager2_Release(asm2); + IMMDevice_Release(dev); +cleanup: + IMMDeviceEnumerator_Release(mme); +} + static void test_mute(void) { struct media_engine_notify *notify; IMFMediaEngine *media_engine; + double volume; HRESULT hr; BOOL ret; @@ -775,6 +874,26 @@ static void test_mute(void) ret = IMFMediaEngine_GetMuted(media_engine); ok(ret, "Unexpected state.\n"); + hr = IMFMediaEngine_SetMuted(media_engine, FALSE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + ret = IMFMediaEngine_GetMuted(media_engine); + ok(!ret, "Unexpected state.\n"); + + hr = IMFMediaEngine_SetVolume(media_engine, 0.0); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + volume = IMFMediaEngine_GetVolume(media_engine); + ok(volume == 0.0, "Unexpected volume %.16e.\n", volume); + + ret = IMFMediaEngine_GetMuted(media_engine); + ok(!ret, "Unexpected state.\n"); + + hr = IMFMediaEngine_SetMuted(media_engine, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + test_audio_session(); + hr = IMFMediaEngine_Shutdown(media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -1307,6 +1426,9 @@ static void test_TransferVideoFrame(void) IMFDXGIDeviceManager_Release(manager); + hr = IMFMediaEngineEx_SetVolume(media_engine, 0.5); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (!(notify->media_engine = media_engine)) goto done; @@ -1380,6 +1502,11 @@ static void test_TransferVideoFrame(void) ok(res == 0, "Unexpected %lu%% diff\n", res); ID3D11DeviceContext_Unmap(context, (ID3D11Resource *)rb_texture, 0); + hr = IMFMediaEngineEx_SetVolume(media_engine, 0.5); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + test_audio_session(); + ID3D11DeviceContext_Release(context); ID3D11Texture2D_Release(rb_texture); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9755
participants (2)
-
Matteo Bruni -
Matteo Bruni (@Mystral)