From 3cb2ddfd09d5986614e028aa413e71e7624d2470 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Mon, 4 Nov 2013 10:06:02 -0600 Subject: [PATCH] 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 0b336dd522a..bdfc3ccf2aa 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 95ab578f788..c36bdbf6898 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(); }