From 825822561411c4ab2dd6c37f80be0031820a54e0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 5 Jun 2016 19:20:32 +0000 Subject: [PATCH] [IMAADP32.ACM] Sync with Wine Staging 1.9.11. CORE-11368 svn path=/trunk/; revision=71553 --- reactos/dll/win32/imaadp32.acm/imaadp32.c | 85 +++++++++++++++-------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/reactos/dll/win32/imaadp32.acm/imaadp32.c b/reactos/dll/win32/imaadp32.acm/imaadp32.c index 10a11e36a07..5c7fd0aac9f 100644 --- a/reactos/dll/win32/imaadp32.acm/imaadp32.c +++ b/reactos/dll/win32/imaadp32.acm/imaadp32.c @@ -181,6 +181,25 @@ static inline void W16(unsigned char* dst, short s) dst[1] = HIBYTE(s); } +/*********************************************************************** + * W8 + * + * Write a 8 bit sample + */ +static inline void W8(unsigned char* dst, short s) +{ + dst[0] = (unsigned char)((s + 32768) >> 8); +} + + +static inline void W8_16(unsigned char* dst, short s, int bytes) +{ + if(bytes == 1) + W8(dst, s); + else + W16(dst, s); +} + /* IMA (or DVI) APDCM codec routines */ static const unsigned IMA_StepTable[89] = @@ -341,43 +360,43 @@ static void cvtSSima16K(PACMDRVSTREAMINSTANCE adsi, } } -static void cvtMMima16K(PACMDRVSTREAMINSTANCE adsi, - const unsigned char* src, LPDWORD nsrc, - unsigned char* dst, LPDWORD ndst) +static void cvtMMimaK(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) { - int sample; - int stepIndex; - int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; - int nsamp; + int sample; + int stepIndex; + int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; + int nsamp; + int bytesPerSample = adsi->pwfxDst->wBitsPerSample / 8; /* compute the number of entire blocks we can decode... * it's the min of the number of entire blocks in source buffer and the number * of entire blocks in destination buffer */ - DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, - *ndst / (nsamp_blk * 2)); + DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, *ndst / (nsamp_blk * bytesPerSample)); *nsrc = nblock * adsi->pwfxSrc->nBlockAlign; - *ndst = nblock * nsamp_blk * 2; + *ndst = nblock * nsamp_blk * bytesPerSample; nsamp_blk--; /* remove the sample in block header */ for (; nblock > 0; nblock--) { - const unsigned char* in_src = src; + const unsigned char* in_src = src; - /* handle header first */ - sample = R16(src); - stepIndex = (unsigned)*(src + 2); + /* handle header first */ + sample = R16(src); + stepIndex = (unsigned)*(src + 2); clamp_step_index(&stepIndex); - src += 4; - W16(dst, sample); dst += 2; + src += 4; + W8_16(dst, sample, bytesPerSample); dst += bytesPerSample; - for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2) + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2) { process_nibble(*src, &stepIndex, &sample); - W16(dst, sample); dst += 2; + W8_16(dst, sample, bytesPerSample); dst += bytesPerSample; process_nibble(*src++ >> 4, &stepIndex, &sample); - W16(dst, sample); dst += 2; - } + W8_16(dst, sample, bytesPerSample); dst += bytesPerSample; + } /* we have now to realign the source pointer on block */ src = in_src + adsi->pwfxSrc->nBlockAlign; } @@ -735,13 +754,14 @@ static LRESULT ADPCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi) else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { - /* resampling or mono <=> stereo not available + /* resampling or mono <=> stereo not available * ADPCM algo only define 16 bit per sample output + * (The API seems to still allow 8 bit per sample output) */ - if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || - adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || - adsi->pwfxDst->wBitsPerSample != 16) - goto theEnd; + if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || + adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || + (adsi->pwfxDst->wBitsPerSample != 16 && adsi->pwfxDst->wBitsPerSample != 8)) + goto theEnd; nspb = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; TRACE("spb=%u\n", nspb); @@ -754,11 +774,16 @@ static LRESULT ADPCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi) if ((((nspb - 1) / 2) + 4) * adsi->pwfxSrc->nChannels < adsi->pwfxSrc->nBlockAlign) goto theEnd; - /* adpcm decoding... */ - if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 2) - aad->convert = cvtSSima16K; - if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 1) - aad->convert = cvtMMima16K; + /* adpcm decoding... */ + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 2) + aad->convert = cvtSSima16K; + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 1) + aad->convert = cvtMMimaK; + if (adsi->pwfxDst->wBitsPerSample == 8 && adsi->pwfxDst->nChannels == 1) + aad->convert = cvtMMimaK; + /* FIXME: Stereo support for 8bit samples*/ + if (adsi->pwfxDst->wBitsPerSample == 8 && adsi->pwfxDst->nChannels == 2) + goto theEnd; } else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index e707e7606ac..aa7d887fcf0 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -75,7 +75,7 @@ reactos/dll/win32/hnetcfg # Synced to WineStaging-1.9.11 reactos/dll/win32/httpapi # Synced to WineStaging-1.9.4 reactos/dll/win32/iccvid # Synced to WineStaging-1.9.11 reactos/dll/win32/ieframe # Synced to WineStaging-1.9.11 -reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.9.4 +reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.9.11 reactos/dll/win32/imagehlp # Synced to WineStaging-1.9.4 reactos/dll/win32/imm32 # Synced to Wine-1.7.27 reactos/dll/win32/inetcomm # Synced to WineStaging-1.9.4