Bruno Jesus : msacm32/tests: Beginnings of a custom driver test.

Alexandre Julliard julliard at winehq.org
Tue Nov 29 16:01:38 CST 2016


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

Author: Bruno Jesus <00cpxxx at gmail.com>
Date:   Tue Nov 29 04:10:37 2016 -0200

msacm32/tests: Beginnings of a custom driver test.

Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msacm32/tests/Makefile.in |   2 +-
 dlls/msacm32/tests/msacm.c     | 166 +++++++++++++++++++++++++++++++++++++++++
 include/msacmdrv.h             |   1 +
 3 files changed, 168 insertions(+), 1 deletion(-)

diff --git a/dlls/msacm32/tests/Makefile.in b/dlls/msacm32/tests/Makefile.in
index 1b8a2f2..dba7cfe 100644
--- a/dlls/msacm32/tests/Makefile.in
+++ b/dlls/msacm32/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = msacm32.dll
-IMPORTS   = msacm32
+IMPORTS   = msacm32 winmm
 
 C_SRCS = \
 	msacm.c
diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c
index 5ec4717..0816cb0 100644
--- a/dlls/msacm32/tests/msacm.c
+++ b/dlls/msacm32/tests/msacm.c
@@ -31,6 +31,7 @@
 #define NOBITMAP
 #include "mmreg.h"
 #include "msacm.h"
+#include "msacmdrv.h"
 
 static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid,
                                        PACMFORMATTAGDETAILSA paftd,
@@ -829,9 +830,174 @@ todo_wine
     ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc);
 }
 
+static struct
+{
+    struct
+    {
+        int load, free, open, close, enable, disable, install,
+            remove, details, notify, querycfg, about;
+    } driver;
+    struct
+    {
+        int tag_details, details, suggest;
+    } format;
+    struct
+    {
+        int open, close, size, convert, prepare, unprepare, reset;
+    } stream;
+    int other;
+} driver_calls;
+
+LRESULT CALLBACK acm_driver_func(DWORD_PTR id, HDRVR handle, UINT msg, LPARAM param1, LPARAM param2)
+{
+    switch (msg)
+    {
+        /* Driver messages */
+        case DRV_LOAD:
+            driver_calls.driver.load++;
+            return 1;
+        case DRV_FREE:
+            driver_calls.driver.free++;
+            return 1;
+        case DRV_OPEN:
+            driver_calls.driver.open++;
+            return 1;
+        case DRV_CLOSE:
+            driver_calls.driver.close++;
+            return 1;
+        case DRV_ENABLE:
+            driver_calls.driver.enable++;
+            return 1;
+        case DRV_DISABLE:
+            driver_calls.driver.disable++;
+            return 1;
+        case DRV_QUERYCONFIGURE:
+            driver_calls.driver.querycfg++;
+            return 1;
+        case DRV_INSTALL:
+            driver_calls.driver.install++;
+            return DRVCNF_RESTART;
+        case DRV_REMOVE:
+            driver_calls.driver.remove++;
+            return DRVCNF_RESTART;
+        case ACMDM_DRIVER_ABOUT:
+            driver_calls.driver.about++;
+            return MMSYSERR_NOTSUPPORTED;
+        case ACMDM_DRIVER_DETAILS:
+        {
+            ACMDRIVERDETAILSA *ptr = (ACMDRIVERDETAILSA *)param1;
+
+            /* copied from pcmconverter.c */
+            ptr->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
+            ptr->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+            ptr->wMid = MM_MICROSOFT;
+            ptr->wPid = MM_MSFT_ACM_PCM;
+            ptr->vdwACM = 0x01000000;
+            ptr->vdwDriver = 0x01000000;
+            ptr->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CONVERTER;
+            ptr->cFormatTags = 1;
+            ptr->cFilterTags = 0;
+            ptr->hicon = NULL;
+            strcpy(ptr->szShortName, "TEST-CODEC");
+            strcpy(ptr->szLongName, "Wine Test Codec");
+            strcpy(ptr->szCopyright, "Brought to you by the Wine team...");
+            strcpy(ptr->szLicensing, "Refer to LICENSE file");
+            ptr->szFeatures[0] = 0;
+
+            driver_calls.driver.details++;
+            break;
+        }
+        case ACMDM_DRIVER_NOTIFY:
+            driver_calls.driver.notify++;
+            return MMSYSERR_NOTSUPPORTED;
+
+        /* Format messages */
+        case ACMDM_FORMATTAG_DETAILS:
+            driver_calls.format.tag_details++;
+            break;
+        case ACMDM_FORMAT_DETAILS:
+            driver_calls.format.details++;
+            break;
+        case ACMDM_FORMAT_SUGGEST:
+            driver_calls.format.suggest++;
+            break;
+
+        /* Stream messages */
+        case ACMDM_STREAM_OPEN:
+            driver_calls.stream.open++;
+            break;
+        case ACMDM_STREAM_CLOSE:
+            driver_calls.stream.close++;
+            break;
+        case ACMDM_STREAM_SIZE:
+            driver_calls.stream.size++;
+            break;
+        case ACMDM_STREAM_CONVERT:
+            driver_calls.stream.convert++;
+            break;
+        case ACMDM_STREAM_RESET:
+            driver_calls.stream.reset++;
+            return MMSYSERR_NOTSUPPORTED;
+        case ACMDM_STREAM_PREPARE:
+            driver_calls.stream.prepare++;
+            break;
+        case ACMDM_STREAM_UNPREPARE:
+            driver_calls.stream.unprepare++;
+            break;
+
+        default:
+            driver_calls.other++;
+            return DefDriverProc(id, handle, msg, param1, param2);
+    }
+    return MMSYSERR_NOERROR;
+}
+
+static void test_acmDriverAdd(void)
+{
+    MMRESULT res;
+    HACMDRIVERID drvid;
+    union
+    {
+      ACMDRIVERDETAILSA drv_details;
+    } acm;
+
+    /* Driver load steps:
+     * - acmDriverAdd checks the passed parameters
+     * - DRV_LOAD message is sent - required
+     * - DRV_ENABLE message is sent - required
+     * - DRV_OPEN message is sent - required
+     * - DRV_DETAILS message is sent - required
+     * - ACMDM_FORMATTAG_DETAILS message is sent - optional
+     * - DRV_QUERYCONFIGURE message is sent - optional
+     * - ACMDM_DRIVER_ABOUT message is sent - optional
+     */
+
+    res = acmDriverAddA(&drvid, GetModuleHandleA(NULL), (LPARAM)acm_driver_func, 0, ACM_DRIVERADDF_FUNCTION);
+    ok(res == MMSYSERR_NOERROR, "Expected 0, got %d\n", res);
+todo_wine
+    ok(driver_calls.driver.open == 1, "Expected 1, got %d\n", driver_calls.driver.open);
+    ok(driver_calls.driver.details == 1, "Expected 1, got %d\n", driver_calls.driver.details);
+
+    memset(&acm, 0, sizeof(acm));
+    res = acmDriverDetailsA(drvid, &acm.drv_details, 0);
+    ok(res == MMSYSERR_INVALPARAM, "Expected 11, got %d\n", res);
+
+    acm.drv_details.cbStruct = sizeof(acm.drv_details);
+    res = acmDriverDetailsA(drvid, &acm.drv_details, 0);
+    ok(res == MMSYSERR_NOERROR, "Expected 0, got %d\n", res);
+todo_wine
+    ok(driver_calls.driver.open == 1, "Expected 1, got %d\n", driver_calls.driver.open);
+    ok(driver_calls.driver.details == 2, "Expected 2, got %d\n", driver_calls.driver.details);
+todo_wine
+    ok(driver_calls.driver.close == 0, "Expected 0, got %d\n", driver_calls.driver.close);
+}
+
 START_TEST(msacm)
 {
     driver_tests();
     test_prepareheader();
     test_acmFormatSuggest();
+    /* Test acmDriverAdd in the end as it may conflict
+     * with other tests due to codec lookup order */
+    test_acmDriverAdd();
 }
diff --git a/include/msacmdrv.h b/include/msacmdrv.h
index 3933ea1..09249fc 100644
--- a/include/msacmdrv.h
+++ b/include/msacmdrv.h
@@ -44,6 +44,7 @@
 
 #define ACMDM_DRIVER_NOTIFY             (ACMDM_BASE + 1)
 #define ACMDM_DRIVER_DETAILS            (ACMDM_BASE + 10)
+#define ACMDM_DRIVER_ABOUT              (ACMDM_BASE + 11)
 
 #define ACMDM_HARDWARE_WAVE_CAPS_INPUT  (ACMDM_BASE + 20)
 #define ACMDM_HARDWARE_WAVE_CAPS_OUTPUT (ACMDM_BASE + 21)




More information about the wine-cvs mailing list