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