msadp32.acm: Block align the adpcm extra data.

Based heavily on Stefano Guidoni's patch.
This commit is contained in:
Vincent Pelletier 2009-02-01 09:51:31 +01:00 committed by Alexandre Julliard
parent 8ee698c29e
commit 0924ddd2ba
1 changed files with 29 additions and 8 deletions

View File

@ -618,6 +618,9 @@ static LRESULT ADPCM_StreamClose(PACMDRVSTREAMINSTANCE adsi)
*/ */
static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMSIZE adss) static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMSIZE adss)
{ {
DWORD nblocks;
WORD wSamplesPerBlock;
/* wSamplesPerBlock formula comes from MSDN ADPCMWAVEFORMAT page.*/
switch (adss->fdwSize) switch (adss->fdwSize)
{ {
case ACM_STREAMSIZEF_DESTINATION: case ACM_STREAMSIZEF_DESTINATION:
@ -625,14 +628,20 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM)
{ {
/* don't take block overhead into account, doesn't matter too much */ wSamplesPerBlock = adsi->pwfxDst->nBlockAlign * 2 / adsi->pwfxDst->nChannels - 12;
adss->cbSrcLength = adss->cbDstLength * 4; nblocks = adss->cbDstLength / adsi->pwfxDst->nBlockAlign;
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock;
} }
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{ {
FIXME("misses the block header overhead\n"); wSamplesPerBlock = adsi->pwfxSrc->nBlockAlign * 2 / adsi->pwfxSrc->nChannels - 12;
adss->cbSrcLength = 256 + adss->cbDstLength / 4; nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * wSamplesPerBlock);
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign;
} }
else else
{ {
@ -644,14 +653,26 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM)
{ {
FIXME("misses the block header overhead\n"); wSamplesPerBlock = adsi->pwfxDst->nBlockAlign * 2 / adsi->pwfxDst->nChannels - 12;
adss->cbDstLength = 256 + adss->cbSrcLength / 4; nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock);
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
if (adss->cbSrcLength % (adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock))
/* Round block count up. */
nblocks++;
adss->cbDstLength = nblocks * adsi->pwfxSrc->nBlockAlign;
} }
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{ {
/* don't take block overhead into account, doesn't matter too much */ wSamplesPerBlock = adsi->pwfxSrc->nBlockAlign * 2 / adsi->pwfxSrc->nChannels - 12;
adss->cbDstLength = adss->cbSrcLength * 4; nblocks = adss->cbSrcLength / adsi->pwfxSrc->nBlockAlign;
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
if (adss->cbSrcLength % adsi->pwfxSrc->nBlockAlign)
/* Round block count up. */
nblocks++;
adss->cbDstLength = nblocks * adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock;
} }
else else
{ {