diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c index d7a2cc9229a..f3c515587a0 100644 --- a/dlls/msacm32/format.c +++ b/dlls/msacm32/format.c @@ -733,6 +733,22 @@ MMRESULT WINAPI acmFormatSuggest(HACMDRIVER had, PWAVEFORMATEX pwfxSrc, ACM_FORMATSUGGESTF_WBITSPERSAMPLE|ACM_FORMATSUGGESTF_WFORMATTAG)) return MMSYSERR_INVALFLAG; + /* if we were given PCM, try to convert to PCM */ + if (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && !had && + !(fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) + { + ACMFORMATDETAILSW afd = {0}; + afd.cbStruct = sizeof(afd); + afd.dwFormatTag = WAVE_FORMAT_PCM; + afd.pwfx = pwfxSrc; + afd.cbwfx = sizeof(PCMWAVEFORMAT); + if (!acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_FORMAT)) + { + memcpy(pwfxDst, pwfxSrc, sizeof(PCMWAVEFORMAT)); + return MMSYSERR_NOERROR; + } + } + aftd.cbStruct = sizeof(aftd); if (fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG) aftd.dwFormatTag = pwfxDst->wFormatTag; diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index 31262a39a19..13494a6e96b 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -1062,7 +1062,6 @@ static void test_acmFormatSuggest(void) suggest = 0; memset(&dst, 0, sizeof(dst)); rc = acmFormatSuggest(NULL, &src, &dst, sizeof(PCMWAVEFORMAT), suggest); - todo_wine { ok(rc == MMSYSERR_NOERROR, "failed with error 0x%x\n", rc); ok(src.wFormatTag == dst.wFormatTag, "expected %d, got %d\n", src.wFormatTag, dst.wFormatTag); ok(src.nChannels == dst.nChannels, "expected %d, got %d\n", src.nChannels, dst.nChannels); @@ -1070,7 +1069,6 @@ static void test_acmFormatSuggest(void) ok(src.nAvgBytesPerSec == dst.nAvgBytesPerSec, "expected %d, got %d\n", src.nAvgBytesPerSec, dst.nAvgBytesPerSec); ok(src.nBlockAlign == dst.nBlockAlign, "expected %d, got %d\n", src.nBlockAlign, dst.nBlockAlign); ok(src.wBitsPerSample == dst.wBitsPerSample, "expected %d, got %d\n", src.wBitsPerSample, dst.wBitsPerSample); - } /* All parameters from destination are valid */ suggest = ACM_FORMATSUGGESTF_NCHANNELS