imaadp32: block align the adpcm extra data.
This commit is contained in:
parent
5c130c813a
commit
c7fb665a92
|
@ -775,6 +775,8 @@ static LRESULT ADPCM_StreamClose(PACMDRVSTREAMINSTANCE adsi)
|
|||
*/
|
||||
static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMSIZE adss)
|
||||
{
|
||||
DWORD nblocks;
|
||||
|
||||
switch (adss->fdwSize)
|
||||
{
|
||||
case ACM_STREAMSIZEF_DESTINATION:
|
||||
|
@ -782,14 +784,18 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS
|
|||
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
|
||||
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM)
|
||||
{
|
||||
/* don't take block overhead into account, doesn't matter too much */
|
||||
adss->cbSrcLength = adss->cbDstLength * 4;
|
||||
nblocks = adss->cbDstLength / adsi->pwfxDst->nBlockAlign;
|
||||
if (nblocks == 0)
|
||||
return ACMERR_NOTPOSSIBLE;
|
||||
adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign * ((IMAADPCMWAVEFORMAT*)adsi->pwfxDst)->wSamplesPerBlock;
|
||||
}
|
||||
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM &&
|
||||
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
|
||||
{
|
||||
FIXME("misses the block header overhead\n");
|
||||
adss->cbSrcLength = 256 + adss->cbDstLength / 4;
|
||||
nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * ((IMAADPCMWAVEFORMAT*)adsi->pwfxSrc)->wSamplesPerBlock);
|
||||
if (nblocks == 0)
|
||||
return ACMERR_NOTPOSSIBLE;
|
||||
adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -801,14 +807,24 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS
|
|||
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
|
||||
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM)
|
||||
{
|
||||
FIXME("misses the block header overhead\n");
|
||||
adss->cbDstLength = 256 + adss->cbSrcLength / 4;
|
||||
nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * ((IMAADPCMWAVEFORMAT*)adsi->pwfxDst)->wSamplesPerBlock);
|
||||
if (nblocks == 0)
|
||||
return ACMERR_NOTPOSSIBLE;
|
||||
if (adss->cbSrcLength % (adsi->pwfxSrc->nBlockAlign * ((IMAADPCMWAVEFORMAT*)adsi->pwfxDst)->wSamplesPerBlock))
|
||||
/* Round block count up. */
|
||||
nblocks++;
|
||||
adss->cbDstLength = nblocks * adsi->pwfxDst->nBlockAlign;
|
||||
}
|
||||
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM &&
|
||||
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
|
||||
{
|
||||
/* don't take block overhead into account, doesn't matter too much */
|
||||
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->pwfxDst->nBlockAlign * ((IMAADPCMWAVEFORMAT*)adsi->pwfxSrc)->wSamplesPerBlock;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue