mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 00:20:34 +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;
|
||||
}
|
||||
|
||||
Result = SyncOverlappedDeviceIoControl(KernelHandle,
|
||||
IOCTL_GET_MIXER_EVENT,
|
||||
(LPVOID) &DeviceInfo,
|
||||
sizeof(WDMAUD_DEVICE_INFO),
|
||||
(LPVOID) &DeviceInfo,
|
||||
sizeof(WDMAUD_DEVICE_INFO),
|
||||
NULL);
|
||||
|
||||
if (Result == MMSYSERR_NOERROR)
|
||||
do
|
||||
{
|
||||
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);
|
||||
}
|
||||
Result = SyncOverlappedDeviceIoControl(KernelHandle,
|
||||
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,
|
||||
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);
|
||||
|
||||
/* done */
|
||||
|
@ -443,7 +446,7 @@ SetWdmWaveDeviceFormat(
|
|||
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
||||
DeviceInfo.DeviceType = DeviceType;
|
||||
DeviceInfo.DeviceIndex = DeviceId;
|
||||
DeviceInfo.u.WaveFormatEx.cbSize = WaveFormat->cbSize;
|
||||
DeviceInfo.u.WaveFormatEx.cbSize = sizeof(WAVEFORMATEX); //WaveFormat->cbSize;
|
||||
DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
|
||||
#ifdef USERMODE_MIXER
|
||||
DeviceInfo.u.WaveFormatEx.nChannels = 2;
|
||||
|
@ -746,6 +749,35 @@ GetWdmPosition(
|
|||
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
|
||||
QueryMixerInfo(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
|
@ -808,7 +840,7 @@ QueryMixerInfo(
|
|||
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
{
|
||||
return TranslateInternalMmResult(Result);
|
||||
return Result;
|
||||
}
|
||||
|
||||
switch(uMsg)
|
||||
|
@ -876,6 +908,7 @@ PopulateWdmDeviceList(
|
|||
if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||
{
|
||||
FuncTable.SetState = SetWdmWaveState;
|
||||
FuncTable.ResetStream = ResetStream;
|
||||
}
|
||||
|
||||
FuncTable.Open = OpenWdmSoundDevice;
|
||||
|
|
Loading…
Reference in a new issue