diff --git a/dll/win32/wdmaud.drv/CMakeLists.txt b/dll/win32/wdmaud.drv/CMakeLists.txt index 16703b0d0f..89aa34968e 100644 --- a/dll/win32/wdmaud.drv/CMakeLists.txt +++ b/dll/win32/wdmaud.drv/CMakeLists.txt @@ -3,7 +3,8 @@ include_directories( ${REACTOS_SOURCE_DIR}/sdk/include/reactos/libs/sound ${REACTOS_SOURCE_DIR}/drivers/wdm/audio/legacy/wdmaud ${REACTOS_SOURCE_DIR}/sdk/lib/drivers/sound/mmixer - ${REACTOS_SOURCE_DIR}/sdk/lib/3rdparty/libsamplerate) + ${REACTOS_SOURCE_DIR}/sdk/lib/3rdparty/libsamplerate + ${REACTOS_SOURCE_DIR}/sdk/lib/pseh/include/pseh) spec2def(wdmaud.drv wdmaud.spec) @@ -21,7 +22,7 @@ add_library(wdmaud.drv MODULE set_module_type(wdmaud.drv win32dll UNICODE) set_target_properties(wdmaud.drv PROPERTIES SUFFIX "") -target_link_libraries(wdmaud.drv mmebuddy libsamplerate mmixer) +target_link_libraries(wdmaud.drv mmebuddy libsamplerate mmixer ${PSEH_LIB}) add_importlibs(wdmaud.drv user32 winmm advapi32 msvcrt setupapi ksuser kernel32 ntdll) add_pch(wdmaud.drv wdmaud.h SOURCE) add_cd_file(TARGET wdmaud.drv DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/wdmaud.drv/legacy.c b/dll/win32/wdmaud.drv/legacy.c index 00c9507341..2a70707f43 100644 --- a/dll/win32/wdmaud.drv/legacy.c +++ b/dll/win32/wdmaud.drv/legacy.c @@ -13,6 +13,7 @@ * */ +#include #include "wdmaud.h" #define NDEBUG @@ -519,7 +520,34 @@ WdmAudSetWaveDeviceFormatByLegacy( DeviceInfo.u.WaveFormatEx.nSamplesPerSec = WaveFormat->nSamplesPerSec; DeviceInfo.u.WaveFormatEx.nBlockAlign = WaveFormat->nBlockAlign; DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = WaveFormat->nAvgBytesPerSec; - DeviceInfo.u.WaveFormatEx.wBitsPerSample = (DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec * 8) / (DeviceInfo.u.WaveFormatEx.nSamplesPerSec * DeviceInfo.u.WaveFormatEx.nChannels); + + if (DeviceInfo.u.WaveFormatEx.nSamplesPerSec == 0) + { + DPRINT1("DeviceInfo.u.WaveFormatEx.nSamplesPerSec is zero. Using 44100 instead.\n"); + DeviceInfo.u.WaveFormatEx.nSamplesPerSec = 44100; + } + + if (DeviceInfo.u.WaveFormatEx.nChannels == 0) + { + DPRINT1("DeviceInfo.u.WaveFormatEx.nChannels is zero. Using 2 instead.\n"); + DeviceInfo.u.WaveFormatEx.nChannels = 2; + } + + _SEH2_TRY + { + DeviceInfo.u.WaveFormatEx.wBitsPerSample = (DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec * 8) / + (DeviceInfo.u.WaveFormatEx.nSamplesPerSec * DeviceInfo.u.WaveFormatEx.nChannels); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + DPRINT1("DeviceInfo.u.WaveFormatEx.wBitsPerSample calc is wrong. Using alternate calculation.\n"); + DeviceInfo.u.WaveFormatEx.nSamplesPerSec = 44100; + DeviceInfo.u.WaveFormatEx.nChannels == 2; + DeviceInfo.u.WaveFormatEx.wBitsPerSample = (DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec * 8) / + (44100 * 2); + } + _SEH2_END; + #endif Result = SyncOverlappedDeviceIoControl(KernelHandle,