Module: wine Branch: master Commit: 21186d5a69a4d1f787edfe92ad26d4a7a964651a URL: http://source.winehq.org/git/wine.git/?a=commit;h=21186d5a69a4d1f787edfe92ad...
Author: Stefano Guidoni s.guidoni@tin.it Date: Tue Mar 24 20:52:54 2009 +0100
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).
---
dlls/winemp3.acm/mpegl3.c | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/dlls/winemp3.acm/mpegl3.c b/dlls/winemp3.acm/mpegl3.c index 6d476e4..e0f0ebd 100644 --- a/dlls/winemp3.acm/mpegl3.c +++ b/dlls/winemp3.acm/mpegl3.c @@ -471,6 +471,8 @@ static LRESULT MPEG3_StreamClose(PACMDRVSTREAMINSTANCE adsi) */ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss) { + DWORD nblocks; + switch (adss->fdwSize) { case ACM_STREAMSIZEF_DESTINATION: @@ -478,14 +480,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) { - /* don't take block overhead into account, doesn't matter too much */ - adss->cbSrcLength = adss->cbDstLength * 12; + nblocks = (adsi->pwfxDst->nAvgBytesPerSec * 8 * 144 / adsi->pwfxDst->nSamplesPerSec); + 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 && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { - FIXME("misses the block header overhead\n"); - adss->cbSrcLength = 256 + adss->cbDstLength / 12; + nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * 1152); + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + adss->cbSrcLength = nblocks * (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec * 8 * 144 / adsi->pwfxSrc->nSamplesPerSec); } else { @@ -497,14 +504,19 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) { - FIXME("misses the block header overhead\n"); - adss->cbDstLength = 256 + adss->cbSrcLength / 12; + nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * 1152); + 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 && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { - /* don't take block overhead into account, doesn't matter too much */ - adss->cbDstLength = adss->cbSrcLength * 12; + nblocks = (adsi->pwfxSrc->nAvgBytesPerSec * 8 * 144 / adsi->pwfxSrc->nSamplesPerSec); + nblocks = (adss->cbSrcLength - 3002 - nblocks) / nblocks; + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + adss->cbDstLength = nblocks * 1152 * adsi->pwfxDst->nBlockAlign; } else {