Anton Romanov : wmp: IWMPSettings implement put/get volume.

Alexandre Julliard julliard at winehq.org
Fri Apr 20 17:55:42 CDT 2018


Module: wine
Branch: master
Commit: 5d26d0b2c84b987ced9f55cfb0daa51bab8c5974
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5d26d0b2c84b987ced9f55cfb0daa51bab8c5974

Author: Anton Romanov <theli.ua at gmail.com>
Date:   Thu Apr 19 22:45:32 2018 -0700

wmp: IWMPSettings implement put/get volume.

Signed-off-by: Anton Romanov <theli.ua at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wmp/player.c      | 29 +++++++++++++++++++++++++----
 dlls/wmp/tests/media.c | 17 ++++++++++++++++-
 dlls/wmp/wmp_private.h |  2 ++
 3 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c
index df395cb..97fd66b 100644
--- a/dlls/wmp/player.c
+++ b/dlls/wmp/player.c
@@ -958,15 +958,27 @@ static HRESULT WINAPI WMPSettings_put_balance(IWMPSettings *iface, LONG v)
 static HRESULT WINAPI WMPSettings_get_volume(IWMPSettings *iface, LONG *p)
 {
     WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, p);
+    if (!p)
+        return E_POINTER;
+    *p = This->volume;
+    return S_OK;
 }
 
 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);
+    This->volume = v;
+    if (!This->filter_graph) {
+        hres = S_OK;
+    } else {
+        /* IBasicAudio -   [-10000, 0], wmp - [0, 100] */
+        v = 10000 * v / 100 - 10000;
+        hres = IBasicAudio_put_Volume(This->basic_audio, v);
+    }
+    return hres;
 }
 
 static HRESULT WINAPI WMPSettings_getMode(IWMPSettings *iface, BSTR mode, VARIANT_BOOL *p)
@@ -1484,6 +1496,10 @@ static HRESULT WINAPI WMPControls_play(IWMPControls *iface)
                 IMediaEventEx_Release(media_event_ex);
             }
         }
+        if (SUCCEEDED(hres))
+            hres = IGraphBuilder_QueryInterface(This->filter_graph, &IID_IBasicAudio, (void**)&This->basic_audio);
+        if (SUCCEEDED(hres))
+            hres = IWMPSettings_put_volume(&This->IWMPSettings_iface, This->volume);
     }
 
     update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, wmppsTransitioning);
@@ -1525,11 +1541,15 @@ static HRESULT WINAPI WMPControls_stop(IWMPControls *iface)
     if (This->media_seeking) {
         IMediaSeeking_Release(This->media_seeking);
     }
+    if (This->basic_audio) {
+        IBasicAudio_Release(This->basic_audio);
+    }
     IGraphBuilder_Release(This->filter_graph);
     This->filter_graph = NULL;
     This->media_control = NULL;
     This->media_event = NULL;
     This->media_seeking = NULL;
+    This->basic_audio = NULL;
 
     update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, wmposPlaylistOpenNoMedia);
     update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, wmppsStopped);
@@ -1983,6 +2003,7 @@ BOOL init_player(WindowsMediaPlayer *wmp)
 
     wmp->invoke_urls = VARIANT_TRUE;
     wmp->auto_start = VARIANT_TRUE;
+    wmp->volume = 100;
     return TRUE;
 }
 
diff --git a/dlls/wmp/tests/media.c b/dlls/wmp/tests/media.c
index fbbd329..3fd74ad 100644
--- a/dlls/wmp/tests/media.c
+++ b/dlls/wmp/tests/media.c
@@ -338,7 +338,6 @@ static BOOL 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);
@@ -352,6 +351,12 @@ static BOOL test_wmp(void)
     hres = IWMPControls_play(controls);
     ok(hres == NS_S_WMPCORE_COMMAND_NOT_AVAILABLE, "IWMPControls_play is available: %08x\n", hres);
 
+    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);
+
     filename = SysAllocString(load_resource(mp3file));
 
     SET_EXPECT(OPENSTATE, wmposPlaylistChanging);
@@ -460,7 +465,17 @@ playback_skip:
     hres = IConnectionPoint_Unadvise(point, dw);
     ok(hres == S_OK, "Unadvise 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 = IWMPSettings_put_volume(settings, 99);
+    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 == 99, "unexpected value: %d\n", progress);
+
     IConnectionPoint_Release(point);
+    IWMPSettings_Release(settings);
     IWMPControls_Release(controls);
     IWMPPlayer4_Release(player4);
     IOleObject_Release(oleobj);
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index e8d5348..b0861dd 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -69,6 +69,7 @@ struct WindowsMediaPlayer {
     VARIANT_BOOL auto_start;
     VARIANT_BOOL invoke_urls;
     VARIANT_BOOL enable_error_dialogs;
+    LONG volume;
 
     ConnectionPoint *wmpocx;
 
@@ -79,6 +80,7 @@ struct WindowsMediaPlayer {
     IMediaControl* media_control;
     IMediaEvent* media_event;
     IMediaSeeking* media_seeking;
+    IBasicAudio* basic_audio;
 
     /* Async event notification */
     HWND msg_window;




More information about the wine-cvs mailing list