Andrew Eikum : winecoreaudio.drv: Ensure divide-by-zero SSE exceptions are masked before calling AudioConverterNew.
Module: wine Branch: master Commit: 8efa49375a92913be3db11c7028c8f7eabccfce7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8efa49375a92913be3db11c702... Author: Andrew Eikum <aeikum(a)codeweavers.com> Date: Fri Mar 25 08:26:11 2016 -0500 winecoreaudio.drv: Ensure divide-by-zero SSE exceptions are masked before calling AudioConverterNew. AudioConverterNew can trigger a divide-by-zero exception. Normally this is masked by the default SSE mask flags. However, iRacing disables this mask, leading to a crash when it tries to initialize a recording device. Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winecoreaudio.drv/mmdevdrv.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 9f9fd0d..8316d65 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -36,6 +36,7 @@ #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> +#include <fenv.h> #include <unistd.h> #include <libkern/OSAtomic.h> @@ -1233,6 +1234,8 @@ static HRESULT ca_setup_audiounit(EDataFlow dataflow, AudioComponentInstance uni AudioStreamBasicDescription desc; UInt32 size; Float64 rate; + fenv_t fenv; + BOOL fenv_stored = TRUE; hr = ca_get_audiodesc(&desc, fmt); if(FAILED(hr)) @@ -1262,7 +1265,17 @@ static HRESULT ca_setup_audiounit(EDataFlow dataflow, AudioComponentInstance uni return osstatus_to_hresult(sc); } + /* AudioConverterNew requires divide-by-zero SSE exceptions to be masked */ + if(feholdexcept(&fenv)){ + WARN("Failed to store fenv state\n"); + fenv_stored = FALSE; + } + sc = AudioConverterNew(dev_desc, &desc, converter); + + if(fenv_stored && fesetenv(&fenv)) + WARN("Failed to restore fenv state\n"); + if(sc != noErr){ WARN("Couldn't create audio converter: %x\n", (int)sc); return osstatus_to_hresult(sc);
participants (1)
-
Alexandre Julliard