[winmm] support CALLBACK_WINDOW in mixerOpen and add tests for it
Maarten Lankhorst
m.b.lankhorst at gmail.com
Wed Apr 11 12:51:11 CDT 2007
-------------- next part --------------
>From 24be0f4e740ddba931c5bf2d7649e3b7b6ec6814 Mon Sep 17 00:00:00 2001
From: maarten lankhorst <m.b.lankhorst at gmail.com>
Date: Wed, 11 Apr 2007 19:48:45 +0200
Subject: [PATCH] [winmm] support CALLBACK_WINDOW in mixerOpen
---
dlls/winmm/tests/mixer.c | 25 +++++++++++++++++++++++--
dlls/winmm/winmm.c | 39 +++++++++++++++++++++++++++++++++++----
2 files changed, 58 insertions(+), 6 deletions(-)
diff --git a/dlls/winmm/tests/mixer.c b/dlls/winmm/tests/mixer.c
index bf27c77..e4eb4ea 100644
--- a/dlls/winmm/tests/mixer.c
+++ b/dlls/winmm/tests/mixer.c
@@ -378,8 +378,18 @@ static void mixer_test_deviceA(int device)
rc=mixerOpen(&mix, device, 0, 0, 0);
ok(rc==MMSYSERR_NOERROR,
- "mixerOpen: MMSYSERR_BADDEVICEID expected, got %s\n",mmsys_error(rc));
+ "mixerOpen: MMSYSERR_NOERROR expected, got %s\n",mmsys_error(rc));
if (rc==MMSYSERR_NOERROR) {
+ rc=mixerOpen(&mix, device, 0, 0, CALLBACK_FUNCTION);
+ ok(rc==MMSYSERR_INVALFLAG,
+ "mixerOpen: MMSYSERR_INVALFLAG expected, got %s\n", mmsys_error(rc));
+
+ /* Shouldn't open without a valid HWND */
+ rc=mixerOpen(&mix, device, 0, 0, CALLBACK_WINDOW);
+ ok(rc==MMSYSERR_INVALPARAM,
+ "mixerOpen: MMSYSERR_INVALPARAM expected, got %s\n", mmsys_error(rc));
+
+
for (d=0;d<capsA.cDestinations;d++) {
MIXERLINEA mixerlineA;
mixerlineA.cbStruct = 0;
@@ -757,10 +767,21 @@ static void mixer_test_deviceW(int device)
szPname, capsW.vDriverVersion >> 8,
capsW.vDriverVersion & 0xff,capsW.wMid,capsW.wPid);
}
+
+
rc=mixerOpen(&mix, device, 0, 0, 0);
ok(rc==MMSYSERR_NOERROR,
"mixerOpen: MMSYSERR_BADDEVICEID expected, got %s\n",mmsys_error(rc));
if (rc==MMSYSERR_NOERROR) {
+ rc=mixerOpen(&mix, device, 0, 0, CALLBACK_FUNCTION);
+ ok(rc==MMSYSERR_INVALFLAG,
+ "mixerOpen: MMSYSERR_INVALFLAG expected, got %s\n", mmsys_error(rc));
+
+ /* Shouldn't open without a valid HWND */
+ rc=mixerOpen(&mix, device, 0, 0, CALLBACK_WINDOW);
+ ok(rc==MMSYSERR_INVALPARAM,
+ "mixerOpen: MMSYSERR_INVALPARAM expected, got %s\n", mmsys_error(rc));
+
for (d=0;d<capsW.cDestinations;d++) {
MIXERLINEW mixerlineW;
mixerlineW.cbStruct = 0;
@@ -935,7 +956,7 @@ static void mixer_test_deviceW(int device)
S1(array[nc].Bounds).dwMaximum,
array[nc].Metrics.cSteps);
}
- mixer_test_controlW(mix, &array[nc]);
+ mixer_test_controlW(mix, &array[nc], mixerlineW.cChannels);
}
}
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 7613277..c9cae26 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -306,6 +306,16 @@ UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize
return MMDRV_Message(wmld, MXDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
}
+static void CALLBACK MIXER_WCallback(HMIXEROBJ hmx, UINT uMsg, DWORD dwInstance, DWORD dwParam)
+{
+ HWND hWnd = (HWND)dwInstance;
+
+ if (!dwInstance)
+ return;
+
+ PostMessageW(hWnd, MM_MIXM_CONTROL_CHANGE, (WPARAM)hmx, dwParam);
+}
+
UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback,
DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32)
{
@@ -317,15 +327,36 @@ UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback,
TRACE("(%p, %d, %08lx, %08lx, %08x)\n",
lphMix, uDeviceID, dwCallback, dwInstance, fdwOpen);
+ mod.dwCallback = (DWORD_PTR)MIXER_WCallback;
+ mod.dwInstance = 0;
+
+/* If callback is a function,
+ * dwCallback contains function pointer
+ * dwInstance private data
+ *
+ * if callback is a window
+ * dwCallback contains a window handle
+ */
+ switch (fdwOpen & CALLBACK_TYPEMASK) {
+ default:
+ return MMSYSERR_INVALFLAG;
+
+ case CALLBACK_NULL:
+ break;
+
+ case CALLBACK_WINDOW:
+ mod.dwInstance = dwCallback;
+ if (!IsWindow((HWND)dwCallback))
+ return MMSYSERR_INVALPARAM;
+ break;
+ }
+
wmld = MMDRV_Alloc(sizeof(WINE_MIXER), MMDRV_MIXER, &hMix, &fdwOpen,
&dwCallback, &dwInstance, bFrom32);
-
wmld->uDeviceID = uDeviceID;
mod.hmx = (HMIXEROBJ)hMix;
- mod.dwCallback = dwCallback;
- mod.dwInstance = dwInstance;
- dwRet = MMDRV_Open(wmld, MXDM_OPEN, (DWORD)&mod, fdwOpen);
+ dwRet = MMDRV_Open(wmld, MXDM_OPEN, (DWORD)&mod, CALLBACK_FUNCTION);
if (dwRet != MMSYSERR_NOERROR) {
MMDRV_Free(hMix, wmld);
--
1.4.4.2
More information about the wine-patches
mailing list