Andrew Eikum : msacm32: Don't clear DONE flag in Un,PrepareHeader.
Alexandre Julliard
julliard at winehq.org
Mon Nov 4 13:59:21 CST 2013
Module: wine
Branch: master
Commit: 3cb2ddfd09d5986614e028aa413e71e7624d2470
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3cb2ddfd09d5986614e028aa413e71e7624d2470
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Mon Nov 4 10:06:02 2013 -0600
msacm32: Don't clear DONE flag in Un,PrepareHeader.
---
dlls/msacm32/stream.c | 7 +---
dlls/msacm32/tests/msacm.c | 87 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 87 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..c36bdbf 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,90 @@ 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];
+ ADPCMCOEFSET *coef;
+
+ src = (ADPCMWAVEFORMAT*)buf;
+ coef = src->aCoef;
+ 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;
+ coef[0].iCoef1 = 0x0100;
+ coef[0].iCoef2 = 0x0000;
+ coef[1].iCoef1 = 0x0200;
+ coef[1].iCoef2 = 0xff00;
+ coef[2].iCoef1 = 0x0000;
+ coef[2].iCoef2 = 0x0000;
+ coef[3].iCoef1 = 0x00c0;
+ coef[3].iCoef2 = 0x0040;
+ coef[4].iCoef1 = 0x00f0;
+ coef[4].iCoef2 = 0x0000;
+ coef[5].iCoef1 = 0x01cc;
+ coef[5].iCoef2 = 0xff30;
+ coef[6].iCoef1 = 0x0188;
+ coef[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();
}
More information about the wine-cvs
mailing list