-- v5: mfmediaengine: Pass volume changes to media session.
From: Bernhard Kölbl besentv@gmail.com
--- dlls/mfmediaengine/main.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index b2ddc376db8..2fdad0b6b06 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1247,6 +1247,30 @@ static void media_engine_start_playback(struct media_engine *engine) IMFMediaSession_Start(engine->session, &GUID_NULL, &var); }
+static HRESULT media_engine_apply_volume(struct media_engine *engine) +{ + IMFSimpleAudioVolume *sa_volume; + IMFGetService *service; + HRESULT hr; + + if (!engine->session) + return E_FAIL; + + if (FAILED(hr = IMFMediaSession_QueryInterface(engine->session, &IID_IMFGetService, (void **)&service))) + return hr; + + if (FAILED(hr = IMFGetService_GetService(service, &MR_POLICY_VOLUME_SERVICE, &IID_IMFSimpleAudioVolume, (void **)&sa_volume))) + goto done; + + hr = IMFSimpleAudioVolume_SetMasterVolume(sa_volume, (float)engine->volume); + + IMFSimpleAudioVolume_Release(sa_volume); +done: + IMFGetService_Release(service); + + return hr; +} + static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface); @@ -1288,6 +1312,8 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, if (SUCCEEDED(hr)) { engine->network_state = MF_MEDIA_ENGINE_NETWORK_IDLE; + media_engine_apply_volume(engine); + if (start_playback) media_engine_start_playback(engine); } @@ -2009,6 +2035,7 @@ static HRESULT WINAPI media_engine_SetVolume(IMFMediaEngineEx *iface, double vol else if (volume != engine->volume) { engine->volume = volume; + media_engine_apply_volume(engine); IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_VOLUMECHANGE, 0, 0); } LeaveCriticalSection(&engine->cs);
Nikolay Sivov (@nsivov) commented about dlls/mfmediaengine/main.c:
- if (!engine->session)
return E_FAIL;
- if (FAILED(hr = IMFMediaSession_QueryInterface(engine->session, &IID_IMFGetService, (void **)&service)))
return hr;
- if (FAILED(hr = IMFGetService_GetService(service, &MR_POLICY_VOLUME_SERVICE, &IID_IMFSimpleAudioVolume, (void **)&sa_volume)))
goto done;
- hr = IMFSimpleAudioVolume_SetMasterVolume(sa_volume, (float)engine->volume);
- IMFSimpleAudioVolume_Release(sa_volume);
+done:
- IMFGetService_Release(service);
- return hr;
This could be even shorter with MFGetService() function.
Nikolay Sivov (@nsivov) commented about dlls/mfmediaengine/main.c:
if (SUCCEEDED(hr)) { engine->network_state = MF_MEDIA_ENGINE_NETWORK_IDLE;
media_engine_apply_volume(engine);
I think it's too early to set the volume here. You'll have to wait until topology-set event.