winmm: Implement CALLBACK_WINDOW, try 2

Maarten Lankhorst lankhorst at astro.rug.nl
Thu Apr 12 01:42:30 CDT 2007


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

The callback function follows LPDRVCALLBACK this time, second
parameter is unused, Code is 64 bits safe now.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iQIVAwUBRh3U1rLrn561i2BXAQJBtw//fPaKgWFUeZ0qFCL2Pad4vJxEVwgqnAMz
Ezxt4EEAnWxlfH/0gwTeiQIaDolGDpNil3KNvNtGA4fEwIKYTNb8rdUjYj+JKlj4
En5RBbZ003O7Z+chXuhkt6zPr5tO+sp1EMhJEkgNaoW27ijfWfP+FTHPx0AqU7C8
qzUHoPLjmp806npMbunHjLULKqK/Whsq6PUwScvTQHhsiNEAz+DsH6UVzsxJ5nqx
6rBRzGri9XN0g8QpKnyJ6fLKs5VIId3TFbTVax9snjwM8U8sCxjtYh8L79nD95K+
znrcAKWfJDB4y1TULsFfNfWaEaDyon0gq7pwL9Sqhkdaovc+XCLtVAQlfR85EILP
qqD+zLRC0NB9Zw/AmXZXjrGQW4ApCG7icWYYYlOp4UMGhpJLSgbfjC4WiZ1Z0lmU
k5PENA/NzKE+7f27qcd1Ggy2MQECa2YwQbGAj36nW8ePOBbd0y3qlDG3ThbKO+Jk
L0B8qmZUG8JBGVDRehvb4eURr+nB+D11vtI0+Tg5NBuGnJOgBCW1gONdX3hpYDrM
ksQBK15Jksjf6XmISsyBgA6jixgTeq1bNA+OhG/yhNY7IZboCsFzLRDF/ttlxZ9T
GhXXjMI2gR7mYj6crm74Ls9Ra7r80ym+y31daKd1ghC1SD4EDQ4IZ9YE+kTvXbCt
jnL0x5RZhm0=
=O/hL
-----END PGP SIGNATURE-----

-------------- next part --------------
>From a3a017cfd9c1e33a2c7fdfe38496d81f2876f258 Mon Sep 17 00:00:00 2001
From: maarten lankhorst <m.b.lankhorst at gmail.com>
Date: Thu, 12 Apr 2007 08:19:29 +0200
Subject: [PATCH] winmm: Implement CALLBACK_WINDOW, try 2

---
 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..f17ad7c 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_PTR dwInstance, DWORD_PTR dwParam, DWORD_PTR param2)
+{
+    HWND hWnd = (HWND)dwInstance;
+
+    if (!dwInstance)
+        return;
+
+    PostMessageW(hWnd, MM_MIXM_CONTROL_CHANGE, (WPARAM)hmx, (LPARAM)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