[PATCH 3/4] l3codeca.acm: Simplify error handling in MPEG3_StreamOpen().
Andrew Eikum
aeikum at codeweavers.com
Wed Jun 9 14:47:52 CDT 2021
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Fri, Jun 04, 2021 at 04:43:38PM -0500, Zebediah Figura wrote:
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
> dlls/l3codeca.acm/mpegl3.c | 103 +++++++++++++------------------------
> 1 file changed, 35 insertions(+), 68 deletions(-)
>
> diff --git a/dlls/l3codeca.acm/mpegl3.c b/dlls/l3codeca.acm/mpegl3.c
> index 25097d424c4..fb7c9cf386b 100644
> --- a/dlls/l3codeca.acm/mpegl3.c
> +++ b/dlls/l3codeca.acm/mpegl3.c
> @@ -179,94 +179,59 @@ static void mp3_horse(PACMDRVSTREAMINSTANCE adsi,
> *ndst = dpos;
> }
>
> -/***********************************************************************
> - * MPEG3_Reset
> - *
> - */
> -static void MPEG3_Reset(PACMDRVSTREAMINSTANCE adsi, AcmMpeg3Data* aad)
> -{
> - mpg123_feedseek(aad->mh, 0, SEEK_SET, NULL);
> - mpg123_close(aad->mh);
> - mpg123_open_feed(aad->mh);
> -}
> -
> /***********************************************************************
> * MPEG3_StreamOpen
> *
> */
> -static LRESULT MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
> +static LRESULT MPEG3_StreamOpen(ACMDRVSTREAMINSTANCE *instance)
> {
> - LRESULT error = MMSYSERR_NOTSUPPORTED;
> AcmMpeg3Data* aad;
> int err;
>
> - assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC));
> + assert(!(instance->fdwOpen & ACM_STREAMOPENF_ASYNC));
>
> - if (MPEG3_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF ||
> - MPEG3_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF)
> - return ACMERR_NOTPOSSIBLE;
> + if (MPEG3_GetFormatIndex(instance->pwfxSrc) == 0xFFFFFFFF
> + || MPEG3_GetFormatIndex(instance->pwfxDst) == 0xFFFFFFFF)
> + return ACMERR_NOTPOSSIBLE;
>
> - aad = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmMpeg3Data));
> - if (aad == 0) return MMSYSERR_NOMEM;
> + if (instance->pwfxDst->wFormatTag != WAVE_FORMAT_PCM)
> + return MMSYSERR_NOTSUPPORTED;
>
> - adsi->dwDriver = (DWORD_PTR)aad;
> + if (instance->pwfxSrc->wFormatTag != WAVE_FORMAT_MPEGLAYER3
> + && instance->pwfxSrc->wFormatTag != WAVE_FORMAT_MPEG)
> + return MMSYSERR_NOTSUPPORTED;
>
> - if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
> - adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
> + if (instance->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
> {
> - goto theEnd;
> + MPEGLAYER3WAVEFORMAT *mp3_format = (MPEGLAYER3WAVEFORMAT *)instance->pwfxSrc;
> +
> + if (instance->pwfxSrc->cbSize < MPEGLAYER3_WFX_EXTRA_BYTES
> + || mp3_format->wID != MPEGLAYER3_ID_MPEG)
> + return ACMERR_NOTPOSSIBLE;
> }
> - else if ((adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 ||
> - adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) &&
> - adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
> - {
> - if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
> - {
> - MPEGLAYER3WAVEFORMAT *formatmp3 = (MPEGLAYER3WAVEFORMAT *)adsi->pwfxSrc;
>
> - if (adsi->pwfxSrc->cbSize < MPEGLAYER3_WFX_EXTRA_BYTES ||
> - formatmp3->wID != MPEGLAYER3_ID_MPEG)
> - {
> - error = ACMERR_NOTPOSSIBLE;
> - goto theEnd;
> - }
> - }
> + if (instance->pwfxSrc->nSamplesPerSec != instance->pwfxDst->nSamplesPerSec
> + || instance->pwfxSrc->nChannels != instance->pwfxDst->nChannels
> + || instance->pwfxDst->wBitsPerSample != 16)
> + return MMSYSERR_NOTSUPPORTED;
>
> - /* resampling or mono <=> stereo not available
> - * MPEG3 algo only define 16 bit per sample output
> - */
> - if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec ||
> - adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels ||
> - adsi->pwfxDst->wBitsPerSample != 16)
> - goto theEnd;
> - aad->mh = mpg123_new(NULL,&err);
> - mpg123_open_feed(aad->mh);
> + if (!(aad = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmMpeg3Data))))
> + return MMSYSERR_NOMEM;
> + instance->dwDriver = (DWORD_PTR)aad;
> +
> + aad->mh = mpg123_new(NULL, &err);
> + mpg123_open_feed(aad->mh);
>
> #if MPG123_API_VERSION >= 31 /* needed for MPG123_IGNORE_FRAMEINFO enum value */
> - /* mpg123 may find a XING header in the mp3 and use that information
> - * to ask for seeks in order to read specific frames in the file.
> - * We cannot allow that since the caller application is feeding us.
> - * This fixes problems for mp3 files encoded with LAME (bug 42361)
> - */
> - mpg123_param(aad->mh, MPG123_ADD_FLAGS, MPG123_IGNORE_INFOFRAME, 0);
> + /* mpg123 may find a XING header in the mp3 and use that information
> + * to ask for seeks in order to read specific frames in the file.
> + * We cannot allow that since the caller application is feeding us.
> + * This fixes problems for mp3 files encoded with LAME (bug 42361)
> + */
> + mpg123_param(aad->mh, MPG123_ADD_FLAGS, MPG123_IGNORE_INFOFRAME, 0);
> #endif
> - }
> - else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
> - (adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3 ||
> - adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEG))
> - {
> - WARN("Encoding to MPEG is not supported\n");
> - goto theEnd;
> - }
> - else goto theEnd;
> - MPEG3_Reset(adsi, aad);
>
> return MMSYSERR_NOERROR;
> -
> - theEnd:
> - HeapFree(GetProcessHeap(), 0, aad);
> - adsi->dwDriver = 0L;
> - return error;
> }
>
> /***********************************************************************
> @@ -568,7 +533,9 @@ static LRESULT MPEG3_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEAD
> */
> if ((adsh->fdwConvert & ACM_STREAMCONVERTF_START))
> {
> - MPEG3_Reset(adsi, aad);
> + mpg123_feedseek(aad->mh, 0, SEEK_SET, NULL);
> + mpg123_close(aad->mh);
> + mpg123_open_feed(aad->mh);
> }
>
> mp3_horse(adsi, adsh->pbSrc, &nsrc, adsh->pbDst, &ndst);
> --
> 2.30.2
>
>
More information about the wine-devel
mailing list