reactos/sdk/lib/drivers/sound/mmebuddy/wave/widMessage.c
Joachim Henze 81f8bcea8c [DSOUND][WAVE] Workaround crash when recording sound in Scratch 1.4 CORE-13202
It regressed by SVN r44721 == git 356d4bab16092de335705e02b0e87698ec35c393
when #define USE_MMIXER_LIB was removed.

Thanks to the patches author Doug Lyons.

VBox https://reactos.org/testman/compare.php?ids=77914,77919 LGTM
 KVM https://reactos.org/testman/compare.php?ids=77913,77918 LGTM
2021-06-27 23:04:36 +02:00

134 lines
3.6 KiB
C

/*
* PROJECT: ReactOS Sound System "MME Buddy" Library
* LICENSE: GPL - See COPYING in the top level directory
* FILE: lib/sound/mmebuddy/wave/widMessage.c
*
* PURPOSE: Provides the widMessage exported function, as required by
* the MME API, for wave input device support.
*
* PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
*/
#include "precomp.h"
/*
Standard MME driver entry-point for messages relating to wave audio
input.
*/
DWORD
APIENTRY
widMessage(
UINT DeviceId,
UINT Message,
DWORD_PTR PrivateHandle,
DWORD_PTR Parameter1,
DWORD_PTR Parameter2)
{
MMRESULT Result = MMSYSERR_NOTSUPPORTED;
AcquireEntrypointMutex(WAVE_IN_DEVICE_TYPE);
SND_TRACE(L"widMessage - Message type %d\n", Message);
switch ( Message )
{
case WIDM_GETNUMDEVS :
{
Result = GetSoundDeviceCount(WAVE_IN_DEVICE_TYPE);
break;
}
case WIDM_START :
{
Result = MmeSetState(PrivateHandle, TRUE);
break;
}
case WIDM_STOP :
{
Result = MmeSetState(PrivateHandle, FALSE);
break;
}
case WIDM_GETDEVCAPS :
{
Result = MmeGetSoundDeviceCapabilities(WAVE_IN_DEVICE_TYPE,
DeviceId,
(PVOID) Parameter1,
Parameter2);
break;
}
case WIDM_OPEN :
{
/* Do sanity checks for 'recording' SamplesPerSec value */
LPWAVEOPENDESC OpenParameters = (LPWAVEOPENDESC)Parameter1;
if (OpenParameters->lpFormat->nSamplesPerSec > 100000)
OpenParameters->lpFormat->nSamplesPerSec = 100000;
if (OpenParameters->lpFormat->nSamplesPerSec < 5000)
OpenParameters->lpFormat->nSamplesPerSec = 5000;
Result = MmeOpenDevice(WAVE_IN_DEVICE_TYPE,
DeviceId,
(LPWAVEOPENDESC) Parameter1,
Parameter2,
(DWORD_PTR*) PrivateHandle);
break;
}
case WIDM_CLOSE :
{
Result = MmeCloseDevice(PrivateHandle);
break;
}
case WIDM_PREPARE :
{
/* TODO: Do we need to pass 2nd parameter? */
Result = MmePrepareWaveHeader(PrivateHandle, Parameter1);
break;
}
case WIDM_UNPREPARE :
{
Result = MmeUnprepareWaveHeader(PrivateHandle, Parameter1);
break;
}
case WIDM_RESET :
{
/* Stop playback, reset position to zero */
Result = MmeResetWavePlayback(PrivateHandle);
break;
}
case WIDM_ADDBUFFER :
{
Result = MmeWriteWaveHeader(PrivateHandle, Parameter1);
break;
}
case DRV_QUERYDEVICEINTERFACESIZE :
{
Result = MmeGetDeviceInterfaceString(WAVE_IN_DEVICE_TYPE, DeviceId, NULL, 0, (DWORD*)Parameter1); //FIXME DWORD_PTR
break;
}
case DRV_QUERYDEVICEINTERFACE :
{
Result = MmeGetDeviceInterfaceString(WAVE_IN_DEVICE_TYPE, DeviceId, (LPWSTR)Parameter1, Parameter2, NULL); //FIXME DWORD_PTR
break;
}
}
SND_TRACE(L"widMessage returning MMRESULT %d\n", Result);
ReleaseEntrypointMutex(WAVE_IN_DEVICE_TYPE);
return Result;
}