mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 10:39:07 +00:00
[WDMAUD.DRV]
- Implement support for resetting a stream (not yet used) - Don't translate the error again in QueryMixerInfo as SyncOverlappedDeviceIoControl has already translated the error - Don't touch the cbSize member when opening a wave device, as the caller might have passed a WAVEFORMAT struct instead a WAVEFORMATEX struct. Fixes winmm_winetest wave / mixer crashs - Query all available events when an mixer event is fired svn path=/trunk/; revision=44326
This commit is contained in:
parent
647f63f881
commit
7759e8983b
1 changed files with 52 additions and 19 deletions
|
@ -321,24 +321,27 @@ MixerEventThreadRoutine(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = SyncOverlappedDeviceIoControl(KernelHandle,
|
do
|
||||||
IOCTL_GET_MIXER_EVENT,
|
|
||||||
(LPVOID) &DeviceInfo,
|
|
||||||
sizeof(WDMAUD_DEVICE_INFO),
|
|
||||||
(LPVOID) &DeviceInfo,
|
|
||||||
sizeof(WDMAUD_DEVICE_INFO),
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (Result == MMSYSERR_NOERROR)
|
|
||||||
{
|
{
|
||||||
DriverCallback(Instance->WinMM.ClientCallback,
|
Result = SyncOverlappedDeviceIoControl(KernelHandle,
|
||||||
HIWORD(Instance->WinMM.Flags),
|
IOCTL_GET_MIXER_EVENT,
|
||||||
Instance->WinMM.Handle,
|
(LPVOID) &DeviceInfo,
|
||||||
DeviceInfo.u.MixerEvent.NotificationType,
|
sizeof(WDMAUD_DEVICE_INFO),
|
||||||
Instance->WinMM.ClientCallbackInstanceData,
|
(LPVOID) &DeviceInfo,
|
||||||
(DWORD_PTR)DeviceInfo.u.MixerEvent.Value,
|
sizeof(WDMAUD_DEVICE_INFO),
|
||||||
0);
|
NULL);
|
||||||
}
|
|
||||||
|
if (Result == MMSYSERR_NOERROR)
|
||||||
|
{
|
||||||
|
DriverCallback(Instance->WinMM.ClientCallback,
|
||||||
|
HIWORD(Instance->WinMM.Flags),
|
||||||
|
Instance->WinMM.Handle,
|
||||||
|
DeviceInfo.u.MixerEvent.NotificationType,
|
||||||
|
Instance->WinMM.ClientCallbackInstanceData,
|
||||||
|
(DWORD_PTR)DeviceInfo.u.MixerEvent.Value,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
}while(Result == MMSYSERR_NOERROR);
|
||||||
}while(TRUE);
|
}while(TRUE);
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
|
@ -443,7 +446,7 @@ SetWdmWaveDeviceFormat(
|
||||||
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
DeviceInfo.DeviceType = DeviceType;
|
DeviceInfo.DeviceType = DeviceType;
|
||||||
DeviceInfo.DeviceIndex = DeviceId;
|
DeviceInfo.DeviceIndex = DeviceId;
|
||||||
DeviceInfo.u.WaveFormatEx.cbSize = WaveFormat->cbSize;
|
DeviceInfo.u.WaveFormatEx.cbSize = sizeof(WAVEFORMATEX); //WaveFormat->cbSize;
|
||||||
DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
|
DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
|
||||||
#ifdef USERMODE_MIXER
|
#ifdef USERMODE_MIXER
|
||||||
DeviceInfo.u.WaveFormatEx.nChannels = 2;
|
DeviceInfo.u.WaveFormatEx.nChannels = 2;
|
||||||
|
@ -746,6 +749,35 @@ GetWdmPosition(
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MMRESULT
|
||||||
|
ResetStream(
|
||||||
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN MMDEVICE_TYPE DeviceType,
|
||||||
|
IN BOOLEAN bStartReset)
|
||||||
|
{
|
||||||
|
MMRESULT Result;
|
||||||
|
HANDLE Handle;
|
||||||
|
WDMAUD_DEVICE_INFO DeviceInfo;
|
||||||
|
|
||||||
|
Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
|
||||||
|
SND_ASSERT( Result == MMSYSERR_NOERROR );
|
||||||
|
|
||||||
|
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
|
DeviceInfo.hDevice = Handle;
|
||||||
|
DeviceInfo.DeviceType = DeviceType;
|
||||||
|
DeviceInfo.u.ResetStream = (bStartReset ? KSRESET_BEGIN : KSRESET_END);
|
||||||
|
|
||||||
|
Result = SyncOverlappedDeviceIoControl(KernelHandle,
|
||||||
|
IOCTL_RESET_STREAM,
|
||||||
|
(LPVOID) &DeviceInfo,
|
||||||
|
sizeof(WDMAUD_DEVICE_INFO),
|
||||||
|
(LPVOID) &DeviceInfo,
|
||||||
|
sizeof(WDMAUD_DEVICE_INFO),
|
||||||
|
NULL);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
QueryMixerInfo(
|
QueryMixerInfo(
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
@ -808,7 +840,7 @@ QueryMixerInfo(
|
||||||
|
|
||||||
if ( ! MMSUCCESS(Result) )
|
if ( ! MMSUCCESS(Result) )
|
||||||
{
|
{
|
||||||
return TranslateInternalMmResult(Result);
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
|
@ -876,6 +908,7 @@ PopulateWdmDeviceList(
|
||||||
if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
|
if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||||
{
|
{
|
||||||
FuncTable.SetState = SetWdmWaveState;
|
FuncTable.SetState = SetWdmWaveState;
|
||||||
|
FuncTable.ResetStream = ResetStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
FuncTable.Open = OpenWdmSoundDevice;
|
FuncTable.Open = OpenWdmSoundDevice;
|
||||||
|
|
Loading…
Reference in a new issue