Akihiro Sagawa : mciqtz: Implement MCI_DGV_SETAUDIO_VOLUME.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 5 09:53:25 CST 2015


Module: wine
Branch: master
Commit: 7561375eded9d6c1675f47bb1ae569d95253e0ea
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7561375eded9d6c1675f47bb1ae569d95253e0ea

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Thu Mar  5 23:34:42 2015 +0900

mciqtz: Implement MCI_DGV_SETAUDIO_VOLUME.

---

 dlls/mciqtz32/mciqtz.c         | 46 +++++++++++++++++++++++++++++++++++++++---
 dlls/mciqtz32/mciqtz_private.h |  1 +
 dlls/winmm/tests/mci.c         |  6 +++---
 3 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index c13746d..a72f1af 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -198,6 +198,12 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
         goto err;
     }
 
+    hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IBasicAudio, (void**)&wma->audio);
+    if (FAILED(hr)) {
+        TRACE("Cannot get IBasicAudio interface (hr = %x)\n", hr);
+        goto err;
+    }
+
     if (!(dwFlags & MCI_OPEN_ELEMENT) || (dwFlags & MCI_OPEN_ELEMENT_ID)) {
         TRACE("Wrong dwFlags %x\n", dwFlags);
         goto err;
@@ -240,6 +246,9 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
     return 0;
 
 err:
+    if (wma->audio)
+        IBasicAudio_Release(wma->audio);
+    wma->audio = NULL;
     if (wma->vidbasic)
         IBasicVideo_Release(wma->vidbasic);
     wma->vidbasic = NULL;
@@ -284,6 +293,7 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
     if (wma->opened) {
         IVideoWindow_Release(wma->vidwin);
         IBasicVideo_Release(wma->vidbasic);
+        IBasicAudio_Release(wma->audio);
         IMediaSeeking_Release(wma->seek);
         IMediaEvent_Release(wma->mevent);
         IGraphBuilder_Release(wma->pgraph);
@@ -892,8 +902,9 @@ out:
 static DWORD MCIQTZ_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSW lpParms)
 {
     WINE_MCIQTZ *wma;
+    DWORD ret = 0;
 
-    FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
+    TRACE("(%04x, %08x, %p)\n", wDevID, dwFlags, lpParms);
 
     if (!lpParms)
         return MCIERR_NULL_PARAMETER_BLOCK;
@@ -902,9 +913,38 @@ static DWORD MCIQTZ_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P
     if (!wma)
         return MCIERR_INVALID_DEVICE_ID;
 
-    MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
+    if (!(dwFlags & MCI_DGV_SETAUDIO_ITEM)) {
+        FIXME("Unknown flags (%08x)\n", dwFlags);
+        return 0;
+    }
 
-    return 0;
+    if (dwFlags & MCI_DGV_SETAUDIO_ITEM) {
+        switch (lpParms->dwItem) {
+        case MCI_DGV_SETAUDIO_VOLUME:
+            if (dwFlags & MCI_DGV_SETAUDIO_VALUE) {
+                long vol = -10000;
+                HRESULT hr;
+                if (lpParms->dwValue > 1000) {
+                    ret = MCIERR_OUTOFRANGE;
+                    break;
+                }
+                if (dwFlags & MCI_TEST)
+                    break;
+                vol += (long)lpParms->dwValue * 10;
+                hr = IBasicAudio_put_Volume(wma->audio, vol);
+                if (FAILED(hr)) {
+                    WARN("Cannot set volume (hr = %x)\n", hr);
+                    ret = MCIERR_INTERNAL;
+                }
+            }
+            break;
+        default:
+            FIXME("Unknown item %08x\n", lpParms->dwItem);
+            break;
+        }
+    }
+
+    return ret;
 }
 
 /*======================================================================*
diff --git a/dlls/mciqtz32/mciqtz_private.h b/dlls/mciqtz32/mciqtz_private.h
index 35adc42..7263a26 100644
--- a/dlls/mciqtz32/mciqtz_private.h
+++ b/dlls/mciqtz32/mciqtz_private.h
@@ -35,6 +35,7 @@ typedef struct {
     IMediaEvent*   mevent;
     IVideoWindow*  vidwin;
     IBasicVideo*   vidbasic;
+    IBasicAudio*   audio;
     DWORD          time_format;
     UINT           command_table;
     HWND parent;
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c
index 5438d12..ab0c611 100644
--- a/dlls/winmm/tests/mci.c
+++ b/dlls/winmm/tests/mci.c
@@ -1334,14 +1334,14 @@ static void test_playWaveTypeMpegvideo(void)
 
     err = mciSendStringA("status mysound mode", buf, sizeof(buf), NULL);
     ok(!err,"mci status mode returned %s\n", dbg_mcierr(err));
-    todo_wine ok(!strcmp(buf,"playing"), "mci status mode: %s\n", buf);
+    ok(!strcmp(buf,"playing"), "mci status mode: %s\n", buf);
 
     err = mciSendStringA("setaudio mysound volume to 1001", NULL, 0, NULL);
-    todo_wine ok(err==MCIERR_OUTOFRANGE,"mci setaudio volume to 1001 returned %s\n", dbg_mcierr(err));
+    ok(err==MCIERR_OUTOFRANGE,"mci setaudio volume to 1001 returned %s\n", dbg_mcierr(err));
 
     err = mciSendStringA("status mysound mode", buf, sizeof(buf), NULL);
     ok(!err,"mci status mode returned %s\n", dbg_mcierr(err));
-    todo_wine ok(!strcmp(buf,"playing"), "mci status mode: %s\n", buf);
+    ok(!strcmp(buf,"playing"), "mci status mode: %s\n", buf);
 
     err = mciSendStringA("close mysound", NULL, 0, NULL);
     ok(!err,"mci close returned %s\n", dbg_mcierr(err));




More information about the wine-cvs mailing list