[PATCH v2 2/4] winemp3.acm: Disallow operations encoding to MPEG.

Andrew Eikum aeikum at codeweavers.com
Thu Jun 22 08:18:35 CDT 2017


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Fri, Jun 09, 2017 at 06:08:28PM -0500, Zebediah Figura wrote:
> Since the winemp3 driver is currently decode-only, and most Windows
> versions do not ship by default with a driver capable of encoding
> to mpeg3, we should report the driver's capabilities accordingly.
> 
> v2: remove failing tests
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
>  dlls/winemp3.acm/mpegl3.c | 80 ++++++++++-------------------------------------
>  1 file changed, 17 insertions(+), 63 deletions(-)
> 
> diff --git a/dlls/winemp3.acm/mpegl3.c b/dlls/winemp3.acm/mpegl3.c
> index cc6008da59e..c5d71bba524 100644
> --- a/dlls/winemp3.acm/mpegl3.c
> +++ b/dlls/winemp3.acm/mpegl3.c
> @@ -258,10 +258,13 @@ static	LRESULT	MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
>          mpg123_param(aad->mh, MPG123_ADD_FLAGS, MPG123_IGNORE_INFOFRAME, 0);
>  #endif
>      }
> -    /* no encoding yet
>      else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
> -             adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
> -    */
> +             (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);
>  
> @@ -736,54 +739,19 @@ static	LRESULT	MPEG3_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery)
>      case 1:
>  	aftd->dwFormatTag = WAVE_FORMAT_MPEGLAYER3;
>  	aftd->cbFormatSize = sizeof(MPEGLAYER3WAVEFORMAT);
> -	aftd->cStandardFormats = NUM_MPEG3_FORMATS;
> +        aftd->cStandardFormats = 0;
>          lstrcpyW(aftd->szFormatTag, szMpeg3);
>  	break;
>      case 2:
>  	aftd->dwFormatTag = WAVE_FORMAT_MPEG;
>  	aftd->cbFormatSize = sizeof(MPEG1WAVEFORMAT);
> -	aftd->cStandardFormats = NUM_MPEG3_FORMATS;
> +        aftd->cStandardFormats = 0;
>          lstrcpyW(aftd->szFormatTag, szMpeg);
>  	break;
>      }
>      return MMSYSERR_NOERROR;
>  }
>  
> -static void fill_in_mp3(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate)
> -{
> -    MPEGLAYER3WAVEFORMAT*   mp3wfx = (MPEGLAYER3WAVEFORMAT*)wfx;
> -
> -    wfx->nAvgBytesPerSec = bit_rate / 8;
> -    if (cbwfx >= sizeof(WAVEFORMATEX))
> -        wfx->cbSize = sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX);
> -    if (cbwfx >= sizeof(MPEGLAYER3WAVEFORMAT))
> -    {
> -        mp3wfx->wID = MPEGLAYER3_ID_MPEG;
> -        mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF;
> -        mp3wfx->nBlockSize = (bit_rate * 144) / wfx->nSamplesPerSec;
> -        mp3wfx->nFramesPerBlock = 1;
> -        mp3wfx->nCodecDelay = 0x0571;
> -    }
> -}
> -
> -static void fill_in_mpeg(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate)
> -{
> -    MPEG1WAVEFORMAT*   mp3wfx = (MPEG1WAVEFORMAT*)wfx;
> -
> -    wfx->nAvgBytesPerSec = bit_rate / 8;
> -    if (cbwfx >= sizeof(WAVEFORMATEX))
> -        wfx->cbSize = sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX);
> -    if (cbwfx >= sizeof(MPEG1WAVEFORMAT))
> -    {
> -        mp3wfx->fwHeadLayer = ACM_MPEG_LAYER3;
> -        mp3wfx->dwHeadBitrate = wfx->nAvgBytesPerSec * 8;
> -        mp3wfx->fwHeadMode = ACM_MPEG_JOINTSTEREO;
> -        mp3wfx->fwHeadModeExt = 0xf;
> -        mp3wfx->wHeadEmphasis = 1;
> -        mp3wfx->fwHeadFlags = ACM_MPEG_ID_MPEG1;
> -    }
> -}
> -
>  /***********************************************************************
>   *           MPEG3_FormatDetails
>   *
> @@ -814,16 +782,8 @@ static	LRESULT	MPEG3_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery)
>  	    break;
>  	case WAVE_FORMAT_MPEGLAYER3:
>  	case WAVE_FORMAT_MPEG:
> -	    if (afd->dwFormatIndex >= NUM_MPEG3_FORMATS) return ACMERR_NOTPOSSIBLE;
> -	    afd->pwfx->nChannels = MPEG3_Formats[afd->dwFormatIndex].nChannels;
> -	    afd->pwfx->nSamplesPerSec = MPEG3_Formats[afd->dwFormatIndex].rate;
> -	    afd->pwfx->wBitsPerSample = MPEG3_Formats[afd->dwFormatIndex].nBits;
> -	    afd->pwfx->nBlockAlign = 1;
> -	    if (afd->dwFormatTag == WAVE_FORMAT_MPEGLAYER3)
> -		fill_in_mp3(afd->cbwfx, afd->pwfx, 192000);
> -	    else
> -		fill_in_mpeg(afd->cbwfx, afd->pwfx, 192000);
> -	    break;
> +            WARN("Encoding to MPEG is not supported\n");
> +            return ACMERR_NOTPOSSIBLE;
>  	default:
>              WARN("Unsupported tag %08x\n", afd->dwFormatTag);
>  	    return MMSYSERR_INVALPARAM;
> @@ -856,18 +816,15 @@ static	LRESULT	MPEG3_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
>  	adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels;
>      if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC))
>          adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec;
> -
>      if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE))
> -    {
> -	if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM)
> -            adfs->pwfxDst->wBitsPerSample = 4;
> -        else
> -            adfs->pwfxDst->wBitsPerSample = 16;
> -    }
> +        adfs->pwfxDst->wBitsPerSample = 16;
>      if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG))
>      {
>  	if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM)
> -            adfs->pwfxDst->wFormatTag = WAVE_FORMAT_MPEGLAYER3;
> +        {
> +            WARN("Encoding to MPEG is not supported\n");
> +            return ACMERR_NOTPOSSIBLE;
> +        }
>          else
>              adfs->pwfxDst->wFormatTag = WAVE_FORMAT_PCM;
>      }
> @@ -883,12 +840,9 @@ static	LRESULT	MPEG3_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
>          adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign;
>          break;
>      case WAVE_FORMAT_MPEG:
> -        adfs->pwfxDst->nBlockAlign = 1;
> -        fill_in_mpeg(adfs->cbwfxDst, adfs->pwfxDst, 192000);
> -        break;
>      case WAVE_FORMAT_MPEGLAYER3:
> -        adfs->pwfxDst->nBlockAlign = 1;
> -        fill_in_mp3(adfs->cbwfxDst, adfs->pwfxDst, 192000);
> +        WARN("Encoding to MPEG is not supported\n");
> +        return ACMERR_NOTPOSSIBLE;
>          break;
>      default:
>          FIXME("\n");
> -- 
> 2.13.0
> 
> 
> 



More information about the wine-patches mailing list