Signed-off-by: Anton Romanov theli.ua@gmail.com --- dlls/wmp/player.c | 29 +++++++++++++++++++++++++---- dlls/wmp/tests/media.c | 8 +++++++- dlls/wmp/wmp_private.h | 1 + 3 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c index ddee6667f4..1e63c44b38 100644 --- a/dlls/wmp/player.c +++ b/dlls/wmp/player.c @@ -937,16 +937,32 @@ static HRESULT WINAPI WMPSettings_put_balance(IWMPSettings *iface, LONG v)
static HRESULT WINAPI WMPSettings_get_volume(IWMPSettings *iface, LONG *p) { + HRESULT hres; WindowsMediaPlayer *This = impl_from_IWMPSettings(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + if (!This->pFilterGraph) { + return S_FALSE; + } + hres = IBasicAudio_get_Volume(This->basic_audio, p); + /* IBasicAudio - [-10000, 0], wmp - [0, 100] */ + if (SUCCEEDED(hres)) + *p = (*p + 10000) * 100 / 10000; + return hres; }
static HRESULT WINAPI WMPSettings_put_volume(IWMPSettings *iface, LONG v) { + HRESULT hres; WindowsMediaPlayer *This = impl_from_IWMPSettings(iface); - FIXME("(%p)->(%d)\n", This, v); - return E_NOTIMPL; + TRACE("(%p)->(%d)\n", This, v); + if (!This->pFilterGraph) { + return S_FALSE; + } + /* IBasicAudio - [-10000, 0], wmp - [0, 100] */ + v = 10000 * v / 100 - 10000; + hres = IBasicAudio_put_Volume(This->basic_audio, v); + TRACE("ret: %d", hres); + return hres; }
static HRESULT WINAPI WMPSettings_getMode(IWMPSettings *iface, BSTR mode, VARIANT_BOOL *p) @@ -1440,6 +1456,9 @@ static HRESULT WINAPI WMPControls_play(IWMPControls *iface) if (SUCCEEDED(hres)) hres = IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IMediaEvent, (void**)&This->media_event); + if (SUCCEEDED(hres)) + hres = IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IBasicAudio, (void**)&This->basic_audio); + This->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL); This->event_thread = CreateThread(NULL, 0, WMP_event_thread, This, 0, NULL); } @@ -1483,6 +1502,8 @@ static HRESULT WINAPI WMPControls_stop(IWMPControls *iface) IMediaEvent_Release(This->media_event); if (This->media_seeking) IMediaSeeking_Release(This->media_seeking); + if (This->basic_audio) + IBasicAudio_Release(This->basic_audio); This->pFilterGraph = NULL; This->media_control = NULL; This->media_event = NULL; diff --git a/dlls/wmp/tests/media.c b/dlls/wmp/tests/media.c index 9e1853ecfe..e72e78a20b 100644 --- a/dlls/wmp/tests/media.c +++ b/dlls/wmp/tests/media.c @@ -202,7 +202,6 @@ static void test_wmp(void)
hres = IWMPSettings_put_autoStart(settings, VARIANT_FALSE); ok(hres == S_OK, "Could not put autoStart in IWMPSettings: %08x\n", hres); - IWMPSettings_Release(settings);
controls = NULL; hres = IWMPPlayer4_get_controls(player4, &controls); @@ -232,6 +231,12 @@ static void test_wmp(void) CHECK_CALLED(OPENSTATE_CHANGE); CHECK_CALLED(PLAYSTATE_CHANGE);
+ hres = IWMPSettings_put_volume(settings, 36); + ok(hres == S_OK, "IWMPSettings_put_volume failed: %08x\n", hres); + hres = IWMPSettings_get_volume(settings, &progress); + ok(hres == S_OK, "IWMPSettings_get_volume failed: %08x\n", hres); + ok(progress == 36, "unexpected value: %d\n", progress); + hres = IWMPControls_get_isAvailable(controls, bstrcurrentPosition, &vbool); ok(hres == S_OK, "IWMPControls_get_isAvailable failed: %08x\n", hres); ok(vbool == VARIANT_TRUE, "unexpected value\n"); @@ -274,6 +279,7 @@ static void test_wmp(void) hres = IConnectionPoint_Unadvise(point, dw); ok(hres == S_OK, "Unadvise failed: %08x\n", hres);
+ IWMPSettings_Release(settings); IConnectionPoint_Release(point); IWMPControls_Release(controls); IWMPPlayer4_Release(player4); diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h index 07fc0e1d9f..8b95c534a8 100644 --- a/dlls/wmp/wmp_private.h +++ b/dlls/wmp/wmp_private.h @@ -79,6 +79,7 @@ struct WindowsMediaPlayer { IMediaControl* media_control; IMediaEvent* media_event; IMediaSeeking* media_seeking; + IBasicAudio* basic_audio;
/* Async event notification */ HANDLE event_thread;