[PATCH 2/2] msacm32: Don't clear DONE flag in Un,PrepareHeader

Andrew Eikum aeikum at codeweavers.com
Mon Nov 4 10:06:02 CST 2013


---
 dlls/msacm32/stream.c      |  7 ++--
 dlls/msacm32/tests/msacm.c | 85 ++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 85 insertions(+), 7 deletions(-)

diff --git a/dlls/msacm32/stream.c b/dlls/msacm32/stream.c
index 0b336dd..bdfc3cc 100644
--- a/dlls/msacm32/stream.c
+++ b/dlls/msacm32/stream.c
@@ -311,9 +311,6 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
     if (fdwPrepare)
 	ret = MMSYSERR_INVALFLAG;
 
-    if (pash->fdwStatus & ACMSTREAMHEADER_STATUSF_DONE)
-	return MMSYSERR_NOERROR;
-
     /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
      * size. some fields are private to msacm internals, and are exposed
      * in ACMSTREAMHEADER in the dwReservedDriver array
@@ -334,7 +331,7 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
     ret = MSACM_Message((HACMDRIVER)was->pDrv, ACMDM_STREAM_PREPARE, (LPARAM)&was->drvInst, (LPARAM)padsh);
     if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
 	ret = MMSYSERR_NOERROR;
-	padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE);
+	padsh->fdwStatus &= ~ACMSTREAMHEADER_STATUSF_INQUEUE;
 	padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED;
 	padsh->fdwPrepared = padsh->fdwStatus;
 	padsh->dwPrepared = 0;
@@ -477,7 +474,7 @@ MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
     ret = MSACM_Message((HACMDRIVER)was->pDrv, ACMDM_STREAM_UNPREPARE, (LPARAM)&was->drvInst, (LPARAM)padsh);
     if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
 	ret = MMSYSERR_NOERROR;
-	padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
+	padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
     }
     TRACE("=> (%d)\n", ret);
     return ret;
diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c
index 95ab578..38dc862 100644
--- a/dlls/msacm32/tests/msacm.c
+++ b/dlls/msacm32/tests/msacm.c
@@ -454,7 +454,7 @@ static void check_count(UINT uMetric)
         trace("%s: %u\n", get_metric(uMetric), dwMetric);
 }
 
-static void msacm_tests(void)
+static void driver_tests(void)
 {
     MMRESULT rc;
     DWORD dwACMVersion = acmGetVersion();
@@ -488,7 +488,88 @@ static void msacm_tests(void)
       rc, MMSYSERR_NOERROR);
 }
 
+static void test_prepareheader(void)
+{
+    HACMSTREAM has;
+    ADPCMWAVEFORMAT *src;
+    WAVEFORMATEX dst;
+    MMRESULT mr;
+    ACMSTREAMHEADER hdr;
+    BYTE buf[sizeof(WAVEFORMATEX) + 32], pcm[512], input[512];
+
+    src = (ADPCMWAVEFORMAT*)buf;
+    src->wfx.cbSize = 32;
+    src->wfx.wFormatTag = WAVE_FORMAT_ADPCM;
+    src->wfx.nSamplesPerSec = 22050;
+    src->wfx.wBitsPerSample = 4;
+    src->wfx.nChannels = 1;
+    src->wfx.nBlockAlign = 512;
+    src->wfx.nAvgBytesPerSec = 11025;
+    src->wSamplesPerBlock = 0x3f4;
+    src->wNumCoef = 7;
+    src->aCoef[0].iCoef1 = 0x0100;
+    src->aCoef[0].iCoef2 = 0x0000;
+    src->aCoef[1].iCoef1 = 0x0200;
+    src->aCoef[1].iCoef2 = 0xff00;
+    src->aCoef[2].iCoef1 = 0x0000;
+    src->aCoef[2].iCoef2 = 0x0000;
+    src->aCoef[3].iCoef1 = 0x00c0;
+    src->aCoef[3].iCoef2 = 0x0040;
+    src->aCoef[4].iCoef1 = 0x00f0;
+    src->aCoef[4].iCoef2 = 0x0000;
+    src->aCoef[5].iCoef1 = 0x01cc;
+    src->aCoef[5].iCoef2 = 0xff30;
+    src->aCoef[6].iCoef1 = 0x0188;
+    src->aCoef[6].iCoef2 = 0xff18;
+
+    dst.cbSize = 0;
+    dst.wFormatTag = WAVE_FORMAT_PCM;
+    dst.nSamplesPerSec = 22050;
+    dst.wBitsPerSample = 8;
+    dst.nChannels = 1;
+    dst.nBlockAlign = dst.wBitsPerSample * dst.nChannels / 8;
+    dst.nAvgBytesPerSec = dst.nSamplesPerSec * dst.nBlockAlign;
+
+    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)src, &dst, NULL, 0, 0, 0);
+    ok(mr == MMSYSERR_NOERROR, "open failed: 0x%x\n", mr);
+
+    memset(&hdr, 0, sizeof(hdr));
+    hdr.cbStruct = sizeof(hdr);
+    hdr.pbSrc = input;
+    hdr.cbSrcLength = sizeof(input);
+    hdr.pbDst = pcm;
+    hdr.cbDstLength = sizeof(pcm);
+
+    mr = acmStreamPrepareHeader(has, &hdr, 0);
+    ok(mr == MMSYSERR_NOERROR, "prepare failed: 0x%x\n", mr);
+    ok(hdr.fdwStatus == ACMSTREAMHEADER_STATUSF_PREPARED, "header wasn't prepared: 0x%x\n", hdr.fdwStatus);
+
+    mr = acmStreamUnprepareHeader(has, &hdr, 0);
+    ok(mr == MMSYSERR_NOERROR, "unprepare failed: 0x%x\n", mr);
+    ok(hdr.fdwStatus == 0, "header wasn't unprepared: 0x%x\n", hdr.fdwStatus);
+
+    memset(&hdr, 0, sizeof(hdr));
+    hdr.cbStruct = sizeof(hdr);
+    hdr.pbSrc = input;
+    hdr.cbSrcLength = sizeof(input);
+    hdr.pbDst = pcm;
+    hdr.cbDstLength = sizeof(pcm);
+    hdr.fdwStatus = ACMSTREAMHEADER_STATUSF_DONE;
+
+    mr = acmStreamPrepareHeader(has, &hdr, 0);
+    ok(mr == MMSYSERR_NOERROR, "prepare failed: 0x%x\n", mr);
+    ok(hdr.fdwStatus == (ACMSTREAMHEADER_STATUSF_PREPARED | ACMSTREAMHEADER_STATUSF_DONE), "header wasn't prepared: 0x%x\n", hdr.fdwStatus);
+
+    mr = acmStreamUnprepareHeader(has, &hdr, 0);
+    ok(mr == MMSYSERR_NOERROR, "unprepare failed: 0x%x\n", mr);
+    ok(hdr.fdwStatus == ACMSTREAMHEADER_STATUSF_DONE, "header wasn't unprepared: 0x%x\n", hdr.fdwStatus);
+
+    mr = acmStreamClose(has, 0);
+    ok(mr == MMSYSERR_NOERROR, "close failed: 0x%x\n", mr);
+}
+
 START_TEST(msacm)
 {
-    msacm_tests();
+    driver_tests();
+    test_prepareheader();
 }
-- 
1.8.4.2




More information about the wine-patches mailing list