[MSACM32_WINETEST] Sync with Wine Staging 2.2. CORE-12823
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 26 Feb 2017 18:23:11 +0000 (18:23 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 26 Feb 2017 18:23:11 +0000 (18:23 +0000)
svn path=/trunk/; revision=73961

rostests/winetests/msacm32/CMakeLists.txt
rostests/winetests/msacm32/msacm.c

index b8135ac..18ca20b 100644 (file)
@@ -1,5 +1,5 @@
 
 add_executable(msacm32_winetest msacm.c testlist.c)
 set_module_type(msacm32_winetest win32cui)
-add_importlibs(msacm32_winetest msacm32 msvcrt kernel32)
+add_importlibs(msacm32_winetest msacm32 winmm msvcrt kernel32)
 add_rostests_file(TARGET msacm32_winetest)
index 4c94b1d..fa1da4e 100644 (file)
@@ -31,6 +31,7 @@
 #define NOBITMAP
 #include "mmreg.h"
 #include "msacm.h"
+#include "wine/msacmdrv.h"
 
 static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid,
                                        PACMFORMATTAGDETAILSA paftd,
@@ -829,6 +830,7 @@ todo_wine
     ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc);
 }
 
+
 void test_mp3(void)
 {
     MPEGLAYER3WAVEFORMAT src;
@@ -899,10 +901,175 @@ void test_mp3(void)
     ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
 }
 
+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;
+
+static 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_mp3();
+    /* Test acmDriverAdd in the end as it may conflict
+     * with other tests due to codec lookup order */
+    test_acmDriverAdd();
 }