diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 426089610c..95ab613c0a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1267,7 +1267,11 @@ endif() if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) # Need to enable intrinsics for this file. if( SSE_MATTERS ) - set_source_files_properties( x86.cpp PROPERTIES COMPILE_FLAGS "-msse2 -mmmx" ) + set_source_files_properties( + x86.cpp + swrenderer/r_all.cpp + polyrenderer/poly_all.cpp + PROPERTIES COMPILE_FLAGS "-msse2 -mmmx" ) endif() endif() diff --git a/src/g_level.cpp b/src/g_level.cpp index 3367a348bd..d9d28b72f1 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -256,7 +256,7 @@ CCMD(recordmap) G_DeferedInitNew(mapname); gameaction = ga_recordgame; newdemoname = argv[1]; - newdemomap = argv[2]; + newdemomap = mapname; } } catch (CRecoverableError &error) diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 7f1d9dfb96..d2a830fef1 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -1488,9 +1488,11 @@ static void S_LoadSound3D(sfxinfo_t *sfx, FSoundLoadBuffer *pBuffer) DPrintf(DMSG_NOTIFY, "Loading monoized sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]); + std::pair snd; + if (pBuffer->mBuffer.Size() > 0) { - GSnd->LoadSoundBuffered(pBuffer, true); + snd = GSnd->LoadSoundBuffered(pBuffer, true); } else { @@ -1501,7 +1503,6 @@ static void S_LoadSound3D(sfxinfo_t *sfx, FSoundLoadBuffer *pBuffer) uint8_t *sfxdata = new uint8_t[size]; wlump.Read(sfxdata, size); int32_t dmxlen = LittleLong(((int32_t *)sfxdata)[1]); - std::pair snd; // If the sound is voc, use the custom loader. if (strncmp((const char *)sfxdata, "Creative Voice File", 19) == 0) @@ -1526,9 +1527,9 @@ static void S_LoadSound3D(sfxinfo_t *sfx, FSoundLoadBuffer *pBuffer) snd = GSnd->LoadSound(sfxdata, size, true, pBuffer); } delete[] sfxdata; - - sfx->data3d = snd.first; } + + sfx->data3d = snd.first; } //========================================================================== diff --git a/src/sound/i_sound.cpp b/src/sound/i_sound.cpp index 939734e2f8..f80ec68654 100644 --- a/src/sound/i_sound.cpp +++ b/src/sound/i_sound.cpp @@ -66,6 +66,7 @@ EXTERN_CVAR (Float, snd_sfxvolume) CVAR (Int, snd_samplerate, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Int, snd_buffersize, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (String, snd_output, "default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR (Int, snd_hrtf, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) #if !defined(NO_OPENAL) #define DEF_BACKEND "openal" diff --git a/src/sound/oalsound.cpp b/src/sound/oalsound.cpp index 30aa8b3e12..b1235dfdd8 100644 --- a/src/sound/oalsound.cpp +++ b/src/sound/oalsound.cpp @@ -132,6 +132,7 @@ EXTERN_CVAR (Int, snd_channels) EXTERN_CVAR (Int, snd_samplerate) EXTERN_CVAR (Bool, snd_waterreverb) EXTERN_CVAR (Bool, snd_pitched) +EXTERN_CVAR (Int, snd_hrtf) #define MAKE_PTRID(x) ((void*)(uintptr_t)(x)) @@ -722,6 +723,11 @@ OpenALSoundRenderer::OpenALSoundRenderer() Device = InitDevice(); if (Device == NULL) return; + ALC.EXT_EFX = !!alcIsExtensionPresent(Device, "ALC_EXT_EFX"); + ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect"); + ALC.SOFT_HRTF = !!alcIsExtensionPresent(Device, "ALC_SOFT_HRTF"); + ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); + const ALCchar *current = NULL; if(alcIsExtensionPresent(Device, "ALC_ENUMERATE_ALL_EXT")) current = alcGetString(Device, ALC_ALL_DEVICES_SPECIFIER); @@ -747,6 +753,16 @@ OpenALSoundRenderer::OpenALSoundRenderer() attribs.Push(MAX(*snd_channels, 2) - 1); attribs.Push(ALC_STEREO_SOURCES); attribs.Push(1); + if(ALC.SOFT_HRTF) + { + attribs.Push(ALC_HRTF_SOFT); + if(*snd_hrtf < 0) + attribs.Push(ALC_FALSE); + else if(*snd_hrtf > 0) + attribs.Push(ALC_TRUE); + else + attribs.Push(ALC_DONT_CARE_SOFT); + } // Other attribs..? attribs.Push(0); @@ -768,9 +784,6 @@ OpenALSoundRenderer::OpenALSoundRenderer() DPrintf(DMSG_SPAMMY, " Version: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_VERSION)); DPrintf(DMSG_SPAMMY, " Extensions: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_EXTENSIONS)); - ALC.EXT_EFX = !!alcIsExtensionPresent(Device, "ALC_EXT_EFX"); - ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect"); - ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); AL.EXT_source_distance_model = !!alIsExtensionPresent("AL_EXT_source_distance_model"); AL.EXT_SOURCE_RADIUS = !!alIsExtensionPresent("AL_EXT_SOURCE_RADIUS"); AL.SOFT_deferred_updates = !!alIsExtensionPresent("AL_SOFT_deferred_updates"); diff --git a/src/sound/oalsound.h b/src/sound/oalsound.h index 212ba5c46e..4a69028dc8 100644 --- a/src/sound/oalsound.h +++ b/src/sound/oalsound.h @@ -35,6 +35,28 @@ #define ALC_CONNECTED 0x313 #endif +#ifndef ALC_SOFT_HRTF +#define ALC_SOFT_HRTF 1 +#define ALC_HRTF_SOFT 0x1992 +#define ALC_DONT_CARE_SOFT 0x0002 +#define ALC_HRTF_STATUS_SOFT 0x1993 +#define ALC_HRTF_DISABLED_SOFT 0x0000 +#define ALC_HRTF_ENABLED_SOFT 0x0001 +#define ALC_HRTF_DENIED_SOFT 0x0002 +#define ALC_HRTF_REQUIRED_SOFT 0x0003 +#define ALC_HRTF_HEADPHONES_DETECTED_SOFT 0x0004 +#define ALC_HRTF_UNSUPPORTED_FORMAT_SOFT 0x0005 +#define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994 +#define ALC_HRTF_SPECIFIER_SOFT 0x1995 +#define ALC_HRTF_ID_SOFT 0x1996 +typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index); +typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index); +ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs); +#endif +#endif + #ifndef AL_EXT_source_distance_model #define AL_EXT_source_distance_model 1 #define AL_SOURCE_DISTANCE_MODEL 0x200 @@ -142,6 +164,7 @@ private: struct { bool EXT_EFX; bool EXT_disconnect; + bool SOFT_HRTF; bool SOFT_pause_device; } ALC; struct { diff --git a/src/sound/sndfile_decoder.cpp b/src/sound/sndfile_decoder.cpp index a46f0146b3..fd89aa2bcf 100644 --- a/src/sound/sndfile_decoder.cpp +++ b/src/sound/sndfile_decoder.cpp @@ -163,7 +163,10 @@ size_t SndFileDecoder::read(char *buffer, size_t bytes) while(total < frames) { size_t todo = MIN(frames-total, 64/SndInfo.channels); - float tmp[64]; + + // libsndfile uses SSE optimization on Intel platform + // This requires proper read buffer alignment + alignas(16) float tmp[64]; size_t got = (size_t)sf_readf_float(SndFile, tmp, todo); if(got < todo) frames = total + got; diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index fa5e82e528..d97a94dac4 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -417,10 +417,13 @@ CUSTOM_CVAR(Bool, swtruecolor, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITC { // Strictly speaking this doesn't require a mode switch, but it is the easiest // way to force a CreateFramebuffer call without a lot of refactoring. - NewWidth = screen->GetWidth(); - NewHeight = screen->GetHeight(); - NewBits = DisplayBits; - setmodeneeded = true; + if (currentrenderer == 0) + { + NewWidth = screen->GetWidth(); + NewHeight = screen->GetHeight(); + NewBits = DisplayBits; + setmodeneeded = true; + } } CUSTOM_CVAR (Bool, fullscreen, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index d42131e594..68a384c4b3 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2141,6 +2141,7 @@ OPENALMNU_ENABLEEFX = "Enable EFX"; // Advanced Sound Options ADVSNDMNU_TITLE = "ADVANCED SOUND OPTIONS"; ADVSNDMNU_SAMPLERATE = "Sample rate"; +ADVSNDMNU_HRTF = "HRTF"; ADVSNDMNU_OPLSYNTHESIS = "OPL Synthesis"; ADVSNDMNU_OPLNUMCHIPS = "Number of emulated OPL chips"; ADVSNDMNU_OPLFULLPAN = "Full MIDI stereo panning"; @@ -2220,6 +2221,7 @@ JOYMNU_NOAXES = "No configurable axes"; // Option Values OPTVAL_OFF = "Off"; OPTVAL_ON = "On"; +OPTVAL_AUTO = "Auto"; OPTVAL_MALE = "Male"; OPTVAL_FEMALE = "Female"; OPTVAL_OTHER = "Other"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 8438836372..8af1100998 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -309,6 +309,13 @@ OptionValue "OffOn" 1, "$OPTVAL_OFF" } +OptionValue OffAutoOn +{ + -1, "$OPTVAL_OFF" + 0, "$OPTVAL_AUTO" + 1, "$OPTVAL_ON" +} + OptionMenuSettings { // These can be overridden if a different menu fonts requires it. @@ -1629,6 +1636,7 @@ OptionMenu AdvSoundOptions { Title "$ADVSNDMNU_TITLE" Option "$ADVSNDMNU_SAMPLERATE", "snd_samplerate", "SampleRates" + Option "$ADVSNDMNU_HRTF", "snd_hrtf", "OffAutoOn" StaticText " " StaticText "$ADVSNDMNU_OPLSYNTHESIS", 1 Slider "$ADVSNDMNU_OPLNUMCHIPS", "opl_numchips", 1, 8, 1, 0 @@ -1724,11 +1732,11 @@ OptionMenu ModReplayerOptions { Title "$MODMNU_TITLE" Slider "$MODMNU_MASTERVOLUME", "mod_dumb_mastervolume", 1, 16, 0.5, 1 - Option "$ADVSNDMNU_SAMPLERATE", "mod_samplerate", "SampleRates", "mod_dumb" - Option "$MODMNU_QUALITY", "mod_interp", "ModQuality", "mod_dumb" - Option "$MODMNU_VOLUMERAMPING", "mod_volramp", "ModVolumeRamps", "mod_dumb" + Option "$ADVSNDMNU_SAMPLERATE", "mod_samplerate", "SampleRates" + Option "$MODMNU_QUALITY", "mod_interp", "ModQuality" + Option "$MODMNU_VOLUMERAMPING", "mod_volramp", "ModVolumeRamps" StaticText " " - Option "$MODMNU_CHIPOMATIC", "mod_autochip", "OnOff", "mod_dumb" + Option "$MODMNU_CHIPOMATIC", "mod_autochip", "OnOff" // TODO if the menu system is ever rewritten: Provide a decent // mechanism to edit the chip-o-matic settings like you can with // the foo_dumb preferences in foobar2000.