Commit 21186d5a authored by Stefano Guidoni's avatar Stefano Guidoni Committed by Alexandre Julliard

winemp3: Fixed mpeg3_streamsize.

mpeg3_streamsize must estimate the number of samples of an mp3 chunk. The result must be block aligned (PCM) or frame aligned (MP3).
parent 5396fbf9
...@@ -471,6 +471,8 @@ static LRESULT MPEG3_StreamClose(PACMDRVSTREAMINSTANCE adsi) ...@@ -471,6 +471,8 @@ static LRESULT MPEG3_StreamClose(PACMDRVSTREAMINSTANCE adsi)
*/ */
static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss) static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss)
{ {
DWORD nblocks;
switch (adss->fdwSize) switch (adss->fdwSize)
{ {
case ACM_STREAMSIZEF_DESTINATION: case ACM_STREAMSIZEF_DESTINATION:
...@@ -478,14 +480,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad ...@@ -478,14 +480,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
{ {
/* don't take block overhead into account, doesn't matter too much */ nblocks = (adsi->pwfxDst->nAvgBytesPerSec * 8 * 144 / adsi->pwfxDst->nSamplesPerSec);
adss->cbSrcLength = adss->cbDstLength * 12; nblocks = (adss->cbDstLength - 3002 - nblocks) / nblocks;
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbSrcLength = nblocks * 1152 * adsi->pwfxSrc->nBlockAlign;
} }
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{ {
FIXME("misses the block header overhead\n"); nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * 1152);
adss->cbSrcLength = 256 + adss->cbDstLength / 12; if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbSrcLength = nblocks * (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec * 8 * 144 / adsi->pwfxSrc->nSamplesPerSec);
} }
else else
{ {
...@@ -497,14 +504,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad ...@@ -497,14 +504,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
{ {
FIXME("misses the block header overhead\n"); nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * 1152);
adss->cbDstLength = 256 + adss->cbSrcLength / 12; if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbDstLength = nblocks * (DWORD)(adsi->pwfxDst->nAvgBytesPerSec * 8 * 144 / adsi->pwfxDst->nSamplesPerSec);
} }
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{ {
/* don't take block overhead into account, doesn't matter too much */ nblocks = (adsi->pwfxSrc->nAvgBytesPerSec * 8 * 144 / adsi->pwfxSrc->nSamplesPerSec);
adss->cbDstLength = adss->cbSrcLength * 12; nblocks = (adss->cbSrcLength - 3002 - nblocks) / nblocks;
if (nblocks == 0)
return ACMERR_NOTPOSSIBLE;
adss->cbDstLength = nblocks * 1152 * adsi->pwfxDst->nBlockAlign;
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment