Skip to content

Commit

Permalink
[MMIXER] Fix additional data size initialization for different audio …
Browse files Browse the repository at this point in the history
…formats

Calculate a size of the additinal data based on the format tag specified by the caller.
For PCM wave format, it should be zero, and for all others, it should be taken from cbSize member of WAVEFORMATEX structure.
- Initialize data size for each format appropriately.
- Append it to the total pin connect allocation size, to allocate enough memory for it.
- Use it as additional data size for requested wave format.
- Append it to the total size of data format.
- Add SAL2 annotations for MMixerInitializeDataFormat function.
Fixes two crashes in winmm:capture and winmm:wave winetests, which have been introduced by 12b3272.
So this is an addendum to that commit.
CORE-19514
  • Loading branch information
oleg-dubinskiy committed Apr 16, 2024
1 parent 1b85a5f commit 7c7fb10
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions sdk/lib/drivers/sound/mmixer/wave.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,17 +113,18 @@ MMixerGetWaveInfoByIndexAndType(

VOID
MMixerInitializeDataFormat(
IN PKSDATAFORMAT_WAVEFORMATEX DataFormat,
LPWAVEFORMATEX WaveFormatEx)
_Inout_ PKSDATAFORMAT_WAVEFORMATEX DataFormat,
_In_ LPWAVEFORMATEX WaveFormatEx,
_In_ DWORD cbSize)
{
DataFormat->WaveFormatEx.wFormatTag = WaveFormatEx->wFormatTag;
DataFormat->WaveFormatEx.nChannels = WaveFormatEx->nChannels;
DataFormat->WaveFormatEx.nSamplesPerSec = WaveFormatEx->nSamplesPerSec;
DataFormat->WaveFormatEx.nBlockAlign = WaveFormatEx->nBlockAlign;
DataFormat->WaveFormatEx.nAvgBytesPerSec = WaveFormatEx->nAvgBytesPerSec;
DataFormat->WaveFormatEx.wBitsPerSample = WaveFormatEx->wBitsPerSample;
DataFormat->WaveFormatEx.cbSize = WaveFormatEx->cbSize;
DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX) + WaveFormatEx->cbSize;
DataFormat->WaveFormatEx.cbSize = cbSize;
DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX) + cbSize;
DataFormat->DataFormat.Flags = 0;
DataFormat->DataFormat.Reserved = 0;
DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
Expand Down Expand Up @@ -244,13 +245,17 @@ MMixerOpenWavePin(
LPMIXER_DATA MixerData;
NTSTATUS Status;
MIXER_STATUS MixerStatus;
DWORD cbSize;

MixerData = MMixerGetDataByDeviceId(MixerList, DeviceId);
if (!MixerData)
return MM_STATUS_INVALID_PARAMETER;

/* Enforce 0 for WAVE_FORMAT_PCM, which ignores extra information size */
cbSize = WaveFormatEx->wFormatTag == WAVE_FORMAT_PCM ? 0 : WaveFormatEx->cbSize;

/* allocate pin connect */
PinConnect = MMixerAllocatePinConnect(MixerContext, sizeof(KSDATAFORMAT_WAVEFORMATEX) + WaveFormatEx->cbSize);
PinConnect = MMixerAllocatePinConnect(MixerContext, sizeof(KSDATAFORMAT_WAVEFORMATEX) + cbSize);
if (!PinConnect)
{
/* no memory */
Expand All @@ -263,7 +268,7 @@ MMixerOpenWavePin(
/* get offset to dataformat */
DataFormat = (PKSDATAFORMAT_WAVEFORMATEX) (PinConnect + 1);
/* initialize with requested wave format */
MMixerInitializeDataFormat(DataFormat, WaveFormatEx);
MMixerInitializeDataFormat(DataFormat, WaveFormatEx, cbSize);

if (CreateCallback)
{
Expand Down

0 comments on commit 7c7fb10

Please sign in to comment.