From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mfmediaengine/tests/mfmediaengine.c | 111 +++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 79b0edf8da3..148cf29d223 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,91 @@ static void test_playback_rate(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } +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; + HRESULT hr; + 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_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 +858,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 +1410,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 +1486,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