From: Nikolay Sivov Subject: [PATCH 2/2] mfmediaengine: Implement audio renderer configuration methods. Message-Id: <20220127134641.1494089-2-nsivov@codeweavers.com> Date: Thu, 27 Jan 2022 16:46:41 +0300 In-Reply-To: <20220127134641.1494089-1-nsivov@codeweavers.com> References: <20220127134641.1494089-1-nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov --- dlls/mfmediaengine/main.c | 72 +++++++++++++++++++++--- dlls/mfmediaengine/tests/mfmediaengine.c | 44 +++++++++++++++ 2 files changed, 108 insertions(+), 8 deletions(-) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index ae844c60e54..5c00c10f718 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -29,6 +29,8 @@ #include "mferror.h" #include "dxgi.h" #include "d3d11.h" +#include "mmdeviceapi.h" +#include "audiosessiontypes.h" #include "wine/debug.h" @@ -2495,30 +2497,78 @@ static HRESULT WINAPI media_engine_EnableHorizontalMirrorMode(IMFMediaEngineEx * static HRESULT WINAPI media_engine_GetAudioStreamCategory(IMFMediaEngineEx *iface, UINT32 *category) { - FIXME("%p, %p stub.\n", iface, category); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr; - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, category); + + EnterCriticalSection(&engine->cs); + + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + hr = IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, category); + + LeaveCriticalSection(&engine->cs); + + return hr; } static HRESULT WINAPI media_engine_SetAudioStreamCategory(IMFMediaEngineEx *iface, UINT32 category) { - FIXME("%p, %u stub.\n", iface, category); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr; - return E_NOTIMPL; + TRACE("%p, %u.\n", iface, category); + + EnterCriticalSection(&engine->cs); + + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + hr = IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, category); + + LeaveCriticalSection(&engine->cs); + + return hr; } static HRESULT WINAPI media_engine_GetAudioEndpointRole(IMFMediaEngineEx *iface, UINT32 *role) { - FIXME("%p, %p stub.\n", iface, role); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr; - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, role); + + EnterCriticalSection(&engine->cs); + + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + hr = IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, role); + + LeaveCriticalSection(&engine->cs); + + return hr; } static HRESULT WINAPI media_engine_SetAudioEndpointRole(IMFMediaEngineEx *iface, UINT32 role) { - FIXME("%p, %u stub.\n", iface, role); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr; - return E_NOTIMPL; + TRACE("%p, %u.\n", iface, role); + + EnterCriticalSection(&engine->cs); + + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + hr = IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, role); + + LeaveCriticalSection(&engine->cs); + + return hr; } static HRESULT WINAPI media_engine_GetRealTimeMode(IMFMediaEngineEx *iface, BOOL *enabled) @@ -2867,6 +2917,12 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct if (FAILED(hr = IMFAttributes_CopyAllItems(attributes, engine->attributes))) return hr; + /* Set default audio configuration */ + if (FAILED(IMFAttributes_GetItem(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, NULL))) + IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_Other); + if (FAILED(IMFAttributes_GetItem(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, NULL))) + IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, eMultimedia); + IMFAttributes_GetUINT64(attributes, &MF_MEDIA_ENGINE_PLAYBACK_HWND, &playback_hwnd); hr = IMFAttributes_GetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, &output_format); if (playback_hwnd) /* FIXME: handle MF_MEDIA_ENGINE_PLAYBACK_VISUAL */ diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 3368484f58e..8584554a2b6 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -29,6 +29,8 @@ #include "mferror.h" #include "dxgi.h" #include "initguid.h" +#include "mmdeviceapi.h" +#include "audiosessiontypes.h" #include "wine/heap.h" #include "wine/test.h" @@ -297,6 +299,7 @@ static void test_Shutdown(void) IMFMediaTimeRange *time_range; IMFMediaEngine *media_engine; unsigned int state; + UINT32 value; DWORD cx, cy; double val; HRESULT hr; @@ -448,6 +451,18 @@ todo_wine hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine_ex, NULL, NULL); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + hr = IMFMediaEngineEx_GetAudioStreamCategory(media_engine_ex, &value); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaEngineEx_GetAudioEndpointRole(media_engine_ex, &value); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaEngineEx_SetAudioStreamCategory(media_engine_ex, AudioCategory_ForegroundOnlyMedia); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaEngineEx_SetAudioEndpointRole(media_engine_ex, eConsole); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); + IMFMediaEngineEx_Release(media_engine_ex); } @@ -800,6 +815,34 @@ static void test_SetSourceFromByteStream(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } +static void test_audio_configuration(void) +{ + struct media_engine_notify *notify; + IMFMediaEngineEx *media_engine; + UINT32 value; + HRESULT hr; + + notify = create_callback(); + + media_engine = create_media_engine_ex(¬ify->IMFMediaEngineNotify_iface); + if (!media_engine) + { + IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); + return; + } + + hr = IMFMediaEngineEx_GetAudioStreamCategory(media_engine, &value); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(value == AudioCategory_Other, "Unexpected value %u.\n", value); + + hr = IMFMediaEngineEx_GetAudioEndpointRole(media_engine, &value); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(value == eMultimedia, "Unexpected value %u.\n", value); + + IMFMediaEngineEx_Release(media_engine); + IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); +} + START_TEST(mfmediaengine) { HRESULT hr; @@ -829,6 +872,7 @@ START_TEST(mfmediaengine) test_error(); test_time_range(); test_SetSourceFromByteStream(); + test_audio_configuration(); IMFMediaEngineClassFactory_Release(factory); -- 2.34.1