[PATCH v2 2/4] winemp3.acm: Disallow operations encoding to MPEG.
Zebediah Figura
z.figura12 at gmail.com
Mon Jun 12 14:10:28 CDT 2017
On both of the Windows boxes I tested, the driver didn't list any MPEG
formats from acmFormatEnum(), acmFormatDetails(), or acmFormatSuggest(),
and listed a count of 0 for acmFormatTag() and acmFormatTagEnum().
sndrec32.exe therefore disallows converting or recording to mp3, and
doesn't even show it in the list of options brought up by
acmFormatChoose, hence the third patch in this series.
I had written some tests to corroborate this, but these tests didn't
give consistent output [1], since presumably the drivers that exist on
Windows vary, so I removed them. A better course of action would be to
check if the format is decode-only, presumably via
ACM_STREAMOPENF_QUERY, and then test if the above functions corroborate
this.
Since I'd like to put some more tests on the PCM converter, and adding
tests here would depend on those there, I'll hold off on resending this
patch.
[1] https://source.winehq.org/patches/data/134748.testfail
On 06/12/2017 10:06 AM, Andrew Eikum wrote:
> I'd like this more with tests, showing what the application was doing
> and how Wine failed its expectations but now meets them.
>
> Andrew
>
> 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-devel
mailing list