View Issue Details

IDProjectCategoryView StatusLast Update
0001186OpenMPTGeneralpublic2019-09-05 16:20
Reportermanx Assigned Tomanx  
PrioritynormalSeverityminorReproducibilityhave not tried
Status resolvedResolutionfixed 
Product VersionOpenMPT 1.29.00.* (old testing) 
Target VersionOpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first)Fixed in VersionOpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) 
Summary0001186: Remove Windows XP support
Description

Remove Windows XP support.

TagsNo tags attached.
Attached Files
remove-winxp-v1.patch (17,886 bytes)   
Index: common/BuildSettings.h
===================================================================
--- common/BuildSettings.h	(revision 11181)
+++ common/BuildSettings.h	(working copy)
@@ -20,36 +20,10 @@
 
 #if MPT_OS_WINDOWS
 
-#if defined(MPT_BUILD_MSVC)
-
-#if defined(MPT_BUILD_TARGET_XP)
-
-#if defined(_M_X64)
 #ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0502 // _WIN32_WINNT_WS03
-#endif
-#else // !_M_X64
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-#endif // _M_X64
-
-#else // MPT_BUILD_TARGET
-
-#ifndef _WIN32_WINNT
 #define _WIN32_WINNT 0x0601 // _WIN32_WINNT_WIN7
 #endif
 
-#endif // MPT_BUILD_TARGET
-
-#else // !MPT_BUILD_MSVC
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-
-#endif // MPT_BUILD_MSVC
-
 #ifndef WINVER
 #define WINVER       _WIN32_WINNT
 #endif
@@ -121,10 +95,8 @@
 //#define MPT_WITH_ICONV
 //#define MPT_WITH_LTDL
 #if MPT_OS_WINDOWS
-#if (_WIN32_WINNT >= 0x0601)
 #define MPT_WITH_MEDIAFOUNDATION
 #endif
-#endif
 //#define MPT_WITH_MINIMP3
 //#define MPT_WITH_MINIZ
 #define MPT_WITH_MPG123
Index: common/mptLibrary.cpp
===================================================================
--- common/mptLibrary.cpp	(revision 11181)
+++ common/mptLibrary.cpp	(working copy)
@@ -100,7 +100,7 @@
 		if(WindowsVersion.IsAtLeast(mpt::Windows::Version::Win8))
 		{
 			hasKB2533623 = true;
-		} else if(WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		} else
 		{
 			HMODULE hKernel32DLL = LoadLibraryW(L"kernel32.dll");
 			if(hKernel32DLL)
Index: mptrack/AdvancedConfigDlg.cpp
===================================================================
--- mptrack/AdvancedConfigDlg.cpp	(revision 11181)
+++ mptrack/AdvancedConfigDlg.cpp	(working copy)
@@ -170,11 +170,7 @@
 			if(gi == m_groups.end())
 			{
 				LVGROUP group;
-	#if _WIN32_WINNT >= 0x0600
 				group.cbSize = LVGROUP_V5_SIZE;
-	#else
-				group.cbSize = sizeof(group);
-	#endif
 				group.mask = LVGF_HEADER | LVGF_GROUPID;
 #if MPT_USTRING_MODE_WIDE
 				group.pszHeader = const_cast<wchar_t *>(section.c_str());
Index: mptrack/BuildVariants.cpp
===================================================================
--- mptrack/BuildVariants.cpp	(revision 11181)
+++ mptrack/BuildVariants.cpp	(working copy)
@@ -61,17 +61,17 @@
 {
 	std::vector<BuildVariant> result
 	{
-		// VS2015
+		// VS2017
 #ifdef ENABLE_ASM
-		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_i586    , 0, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::WinXP  , mpt::Wine::Version(1,8,0) },
-		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::WinXP64, mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
+		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
 #else
-		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , 0                   , 0, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::WinXP  , mpt::Wine::Version(1,8,0) },
-		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, 0                   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::WinXP64, mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , 0                   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, 0                   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , 0                   , 0, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, 0                   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , 0                   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
+		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, 0                   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
 #endif
 	};
 	std::stable_sort(result.begin(), result.end(), CompareBuildVariantsByScore);
Index: mptrack/ExceptionHandler.cpp
===================================================================
--- mptrack/ExceptionHandler.cpp	(revision 11181)
+++ mptrack/ExceptionHandler.cpp	(working copy)
@@ -672,7 +672,6 @@
 
 void ExceptionHandler::ConfigureSystemHandler()
 {
-#if (_WIN32_WINNT >= 0x0600)
 	if(delegateToWindowsHandler)
 	{
 		//SetErrorMode(0);
@@ -681,15 +680,6 @@
 	{
 		g_OriginalErrorMode = ::SetErrorMode(::GetErrorMode() | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
 	}
-#else // _WIN32_WINNT < 0x0600
-	if(delegateToWindowsHandler)
-	{
-		g_OriginalErrorMode = ::SetErrorMode(0);
-	} else
-	{
-		g_OriginalErrorMode = ::SetErrorMode(::SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
-	}
-#endif // _WIN32_WINNT
 }
 
 
Index: mptrack/HTTP.cpp
===================================================================
--- mptrack/HTTP.cpp	(revision 11181)
+++ mptrack/HTTP.cpp	(working copy)
@@ -447,25 +447,6 @@
 }
 
 
-Request &Request::InsecureTLSDowngradeWindowsXP()
-{
-	if(mpt::Windows::IsOriginal() && mpt::Windows::Version::Current().IsBefore(mpt::Windows::Version::WinVista))
-	{
-		// TLS 1.0 is not enabled by default until IE7. Since WinInet won't let us override this setting, we cannot assume that HTTPS
-		// is going to work on older systems. Besides... Windows XP is already enough of a security risk by itself. :P
-		if(protocol == Protocol::HTTPS)
-		{
-			protocol = Protocol::HTTP;
-		}
-		if(port == PortHTTPS)
-		{
-			port = PortHTTP;
-		}
-	}
-	return *this;
-}
-
-
 Result SimpleGet(InternetSession &internet, Protocol protocol, const mpt::ustring &host, const mpt::ustring &path)
 {
 	HTTP::Request request;
Index: mptrack/HTTP.h
===================================================================
--- mptrack/HTTP.h	(revision 11181)
+++ mptrack/HTTP.h	(working copy)
@@ -175,7 +175,6 @@
 	mpt::const_byte_span data;
 
 	Request &SetURI(const URI &uri);
-	Request &InsecureTLSDowngradeWindowsXP();
 
 	Result operator()(InternetSession &internet) const;
 };
Index: mptrack/Image.cpp
===================================================================
--- mptrack/Image.cpp	(revision 11181)
+++ mptrack/Image.cpp	(working copy)
@@ -61,29 +61,7 @@
 static CComPtr<IStream> GetStream(mpt::const_byte_span data)
 {
 	CComPtr<IStream> stream;
-#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 	stream.Attach(SHCreateMemStream(mpt::byte_cast<const unsigned char*>(data.data()), mpt::saturate_cast<UINT>(data.size())));
-#else
-	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, data.size());
-	if(hGlobal == NULL)
-	{
-		throw bad_image();
-	}
-	void * mem = GlobalLock(hGlobal);
-	if(!mem)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	std::memcpy(mem, data.data(), data.size());
-	GlobalUnlock(hGlobal);
-	if(CreateStreamOnHGlobal(hGlobal, TRUE, &stream) != S_OK)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	hGlobal = NULL;
-#endif
 	if(!stream)
 	{
 		throw bad_image();
Index: mptrack/MPTrackLink.cpp
===================================================================
--- mptrack/MPTrackLink.cpp	(revision 11181)
+++ mptrack/MPTrackLink.cpp	(working copy)
@@ -29,6 +29,7 @@
 #pragma comment(lib, "dmoguids.lib")
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: mptrack/UpdateCheck.cpp
===================================================================
--- mptrack/UpdateCheck.cpp	(revision 11181)
+++ mptrack/UpdateCheck.cpp	(working copy)
@@ -357,7 +357,7 @@
 	request.method = HTTP::Method::Get;
 	request.flags = HTTP::NoCache;
 
-	HTTP::Result resultHTTP = internet(request.InsecureTLSDowngradeWindowsXP());
+	HTTP::Result resultHTTP = internet(request);
 
 	if(settings.sendStatistics)
 	{
@@ -376,7 +376,7 @@
 		std::string jsondata = GetStatisticsDataV3(settings);
 		MPT_LOG(LogInformation, "Update", mpt::ToUnicode(mpt::CharsetUTF8, jsondata));
 		requestStatistics.data = mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(jsondata));
-		internet(requestStatistics.InsecureTLSDowngradeWindowsXP());
+		internet(requestStatistics);
 	}
 
 	// Retrieve HTTP status code.
Index: mptrack/wine/Native.cpp
===================================================================
--- mptrack/wine/Native.cpp	(revision 11181)
+++ mptrack/wine/Native.cpp	(working copy)
@@ -16,6 +16,7 @@
 
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: sounddev/SoundDeviceDirectSound.cpp
===================================================================
--- sounddev/SoundDeviceDirectSound.cpp	(revision 11181)
+++ sounddev/SoundDeviceDirectSound.cpp	(working copy)
@@ -332,7 +332,7 @@
 	}
 	m_dwWritePos = 0xFFFFFFFF;
 	SetWakeupInterval(std::min(m_Settings.UpdateInterval, m_nDSoundBufferSize / (2.0 * m_Settings.GetBytesPerSecond())));
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
Index: sounddev/SoundDeviceManager.cpp
===================================================================
--- sounddev/SoundDeviceManager.cpp	(revision 11181)
+++ sounddev/SoundDeviceManager.cpp	(working copy)
@@ -198,16 +198,6 @@
 		typePriorities[SoundDevice::TypePORTAUDIO_DS] = 16;
 		typePriorities[U_("Wine-Native-PortAudio-8")] = 9; // ALSA
 		typePriorities[SoundDevice::TypePORTAUDIO_WDMKS] = -1;
-	} else if(GetSysInfo().WindowsVersion.IsBefore(mpt::Windows::Version::WinVista))
-	{ // WinXP
-		typePriorities[SoundDevice::TypeWAVEOUT] = 29;
-		typePriorities[SoundDevice::TypeASIO] = 28;
-		typePriorities[U_("RtAudio-WINDOWS_DS")] = 27;
-		typePriorities[SoundDevice::TypePORTAUDIO_WDMKS] = 26;
-		typePriorities[SoundDevice::TypePORTAUDIO_WMME] = 19;
-		typePriorities[SoundDevice::TypeDSOUND] = 17;
-		typePriorities[SoundDevice::TypePORTAUDIO_DS] = 7;
-		typePriorities[SoundDevice::TypePORTAUDIO_WASAPI] = -1;
 	} else if(GetSysInfo().WindowsVersion.IsBefore(mpt::Windows::Version::Win7))
 	{ // Vista
 		typePriorities[SoundDevice::TypeWAVEOUT] = 29;
Index: sounddev/SoundDevicePortAudio.cpp
===================================================================
--- sounddev/SoundDevicePortAudio.cpp	(revision 11181)
+++ sounddev/SoundDevicePortAudio.cpp	(working copy)
@@ -127,10 +127,10 @@
 		framesPerBuffer = paFramesPerBufferUnspecified; // let portaudio choose
 	} else if(m_HostApiType == paMME)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else if(m_HostApiType == paDirectSound)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else
 	{
 		m_Flags.NeedsClippedFloat = false;
Index: sounddev/SoundDeviceUtilities.cpp
===================================================================
--- sounddev/SoundDeviceUtilities.cpp	(revision 11181)
+++ sounddev/SoundDeviceUtilities.cpp	(working copy)
@@ -19,6 +19,7 @@
 #include <algorithm>
 
 #if MPT_OS_WINDOWS
+#include <avrt.h>
 #include <mmsystem.h>
 #endif // MPT_OS_WINDOWS
 
@@ -131,41 +132,8 @@
 }
 
 
-MPT_REGISTERED_COMPONENT(ComponentAvRt, "AvRt")
-
-ComponentAvRt::ComponentAvRt()
-	: ComponentLibrary(ComponentTypeSystem)
-	, AvSetMmThreadCharacteristics(nullptr)
-	, AvRevertMmThreadCharacteristics(nullptr)
-{
-	return;
-}
-
-bool ComponentAvRt::DoInitialize()
-{
-	if(!mpt::Windows::Version::Current().IsAtLeast(mpt::Windows::Version::WinVista))
-	{
-		return false;
-	}
-	AddLibrary("avrt", mpt::LibraryPath::System(P_("avrt")));
-	MPT_COMPONENT_BINDWIN("avrt", AvSetMmThreadCharacteristics);
-	MPT_COMPONENT_BIND("avrt", AvRevertMmThreadCharacteristics);
-	if(HasBindFailed())
-	{
-		return false;
-	}
-	return true;
-}
-
-ComponentAvRt::~ComponentAvRt()
-{
-	return;
-}
-
-
-CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority)
+CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority)
 	: m_SysInfo(sysInfo)
-	, m_AvRt(avrt)
 	, m_BoostPriority(boostPriority)
 	, m_Priority(priority)
 	, task_idx(0)
@@ -178,16 +146,9 @@
 	#endif
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(!priorityClass.empty())
 		{
-			if(!priorityClass.empty())
-			{
-				hTask = m_AvRt->AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
-			}
-		} else
-		{
-			oldPriority = GetThreadPriority(GetCurrentThread());
-			SetThreadPriority(GetCurrentThread(), priority);
+			hTask = AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
 		}
 	}
 }
@@ -198,18 +159,12 @@
 	MPT_TRACE_SCOPE();
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(hTask)
 		{
-			if(hTask)
-			{
-				m_AvRt->AvRevertMmThreadCharacteristics(hTask);
-			}
-			hTask = NULL;
-			task_idx = 0;
-		} else
-		{
-			SetThreadPriority(GetCurrentThread(), oldPriority);
+			AvRevertMmThreadCharacteristics(hTask);
 		}
+		hTask = NULL;
+		task_idx = 0;
 	}
 }
 
@@ -324,7 +279,7 @@
 		if(!terminate)
 		{
 
-			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_AvRt, m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
+			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
 			CPeriodicWaker periodicWaker(*this, m_WakeupInterval);
 
 			m_SoundDevice.StartFromSoundThread();
Index: sounddev/SoundDeviceUtilities.h
===================================================================
--- sounddev/SoundDeviceUtilities.h	(revision 11181)
+++ sounddev/SoundDeviceUtilities.h	(working copy)
@@ -16,7 +16,6 @@
 #include "SoundDeviceBase.h"
 
 #include "../common/misc_util.h"
-#include "../common/ComponentManager.h"
 
 #if MPT_OS_WINDOWS
 #include <mmreg.h>
@@ -48,27 +47,10 @@
 class CSoundDeviceWithThread;
 
 
-class ComponentAvRt
-	: public ComponentLibrary
-{
-	MPT_DECLARE_COMPONENT_MEMBERS
-public:
-	typedef HANDLE (WINAPI *pAvSetMmThreadCharacteristics)(LPCTSTR, LPDWORD);
-	typedef BOOL (WINAPI *pAvRevertMmThreadCharacteristics)(HANDLE);
-	pAvSetMmThreadCharacteristics AvSetMmThreadCharacteristics;
-	pAvRevertMmThreadCharacteristics AvRevertMmThreadCharacteristics;
-public:
-	ComponentAvRt();
-	virtual ~ComponentAvRt();
-	bool DoInitialize() override;
-};
-
-
 class CPriorityBooster
 {
 private:
 	SoundDevice::SysInfo m_SysInfo;
-	ComponentHandle<ComponentAvRt> & m_AvRt;
 	bool m_BoostPriority;
 	int m_Priority;
 	DWORD task_idx;
@@ -75,7 +57,7 @@
 	HANDLE hTask;
 	int oldPriority;
 public:
-	CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority);
+	CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority);
 	~CPriorityBooster();
 };
 
@@ -85,7 +67,6 @@
 	friend class CPeriodicWaker;
 private:
 	CSoundDeviceWithThread & m_SoundDevice;
-	ComponentHandle<ComponentAvRt> m_AvRt;
 	mpt::winstring m_MMCSSClass;
 	double m_WakeupInterval;
 	HANDLE m_hAudioWakeUp;
Index: sounddev/SoundDeviceWaveout.cpp
===================================================================
--- sounddev/SoundDeviceWaveout.cpp	(revision 11181)
+++ sounddev/SoundDeviceWaveout.cpp	(working copy)
@@ -207,7 +207,7 @@
 	}
 	SetWakeupEvent(m_ThreadWakeupEvent);
 	SetWakeupInterval(m_nWaveBufferSize * 1.0 / m_Settings.GetBytesPerSecond());
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
remove-winxp-v1.patch (17,886 bytes)   
remove-winxp-v3.patch (24,389 bytes)   
Index: common/BuildSettings.h
===================================================================
--- common/BuildSettings.h	(revision 11772)
+++ common/BuildSettings.h	(working copy)
@@ -20,36 +20,10 @@
 
 #if MPT_OS_WINDOWS
 
-#if defined(MPT_BUILD_MSVC)
-
-#if defined(MPT_BUILD_TARGET_XP)
-
-#if defined(_M_X64)
 #ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0502 // _WIN32_WINNT_WS03
-#endif
-#else // !_M_X64
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-#endif // _M_X64
-
-#else // MPT_BUILD_TARGET
-
-#ifndef _WIN32_WINNT
 #define _WIN32_WINNT 0x0601 // _WIN32_WINNT_WIN7
 #endif
 
-#endif // MPT_BUILD_TARGET
-
-#else // !MPT_BUILD_MSVC
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-
-#endif // MPT_BUILD_MSVC
-
 #ifndef WINVER
 #define WINVER       _WIN32_WINNT
 #endif
@@ -121,10 +95,8 @@
 //#define MPT_WITH_ICONV
 //#define MPT_WITH_LTDL
 #if MPT_OS_WINDOWS
-#if (_WIN32_WINNT >= 0x0601)
 #define MPT_WITH_MEDIAFOUNDATION
 #endif
-#endif
 //#define MPT_WITH_MINIMP3
 //#define MPT_WITH_MINIZ
 #define MPT_WITH_MPG123
Index: common/mptLibrary.cpp
===================================================================
--- common/mptLibrary.cpp	(revision 11772)
+++ common/mptLibrary.cpp	(working copy)
@@ -100,7 +100,7 @@
 		if(WindowsVersion.IsAtLeast(mpt::Windows::Version::Win8))
 		{
 			hasKB2533623 = true;
-		} else if(WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		} else
 		{
 			HMODULE hKernel32DLL = LoadLibraryW(L"kernel32.dll");
 			if(hKernel32DLL)
Index: mptrack/AdvancedConfigDlg.cpp
===================================================================
--- mptrack/AdvancedConfigDlg.cpp	(revision 11772)
+++ mptrack/AdvancedConfigDlg.cpp	(working copy)
@@ -170,11 +170,7 @@
 			if(gi == m_groups.end())
 			{
 				LVGROUP group;
-	#if _WIN32_WINNT >= 0x0600
 				group.cbSize = LVGROUP_V5_SIZE;
-	#else
-				group.cbSize = sizeof(group);
-	#endif
 				group.mask = LVGF_HEADER | LVGF_GROUPID;
 #if MPT_USTRING_MODE_WIDE
 				group.pszHeader = const_cast<wchar_t *>(section.c_str());
Index: mptrack/BuildVariants.cpp
===================================================================
--- mptrack/BuildVariants.cpp	(revision 11772)
+++ mptrack/BuildVariants.cpp	(working copy)
@@ -62,10 +62,10 @@
 	std::vector<BuildVariant> result
 	{
 		// VS2017
-		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_i586    , 0, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::WinXP  , mpt::Wine::Version(1,8,0) },
-		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::WinXP64, mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
+		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
 	};
 	std::stable_sort(result.begin(), result.end(), CompareBuildVariantsByScore);
 	return result;
Index: mptrack/ExceptionHandler.cpp
===================================================================
--- mptrack/ExceptionHandler.cpp	(revision 11772)
+++ mptrack/ExceptionHandler.cpp	(working copy)
@@ -669,7 +669,6 @@
 
 void ExceptionHandler::ConfigureSystemHandler()
 {
-#if (_WIN32_WINNT >= 0x0600)
 	if(delegateToWindowsHandler)
 	{
 		//SetErrorMode(0);
@@ -678,15 +677,6 @@
 	{
 		g_OriginalErrorMode = ::SetErrorMode(::GetErrorMode() | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
 	}
-#else // _WIN32_WINNT < 0x0600
-	if(delegateToWindowsHandler)
-	{
-		g_OriginalErrorMode = ::SetErrorMode(0);
-	} else
-	{
-		g_OriginalErrorMode = ::SetErrorMode(::SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
-	}
-#endif // _WIN32_WINNT
 }
 
 
Index: mptrack/HTTP.cpp
===================================================================
--- mptrack/HTTP.cpp	(revision 11772)
+++ mptrack/HTTP.cpp	(working copy)
@@ -447,25 +447,6 @@
 }
 
 
-Request &Request::InsecureTLSDowngradeWindowsXP()
-{
-	if(mpt::Windows::IsOriginal() && mpt::Windows::Version::Current().IsBefore(mpt::Windows::Version::WinVista))
-	{
-		// TLS 1.0 is not enabled by default until IE7. Since WinInet won't let us override this setting, we cannot assume that HTTPS
-		// is going to work on older systems. Besides... Windows XP is already enough of a security risk by itself. :P
-		if(protocol == Protocol::HTTPS)
-		{
-			protocol = Protocol::HTTP;
-		}
-		if(port == Port::HTTPS)
-		{
-			port = Port::HTTP;
-		}
-	}
-	return *this;
-}
-
-
 Result SimpleGet(InternetSession &internet, Protocol protocol, const mpt::ustring &host, const mpt::ustring &path)
 {
 	HTTP::Request request;
Index: mptrack/HTTP.h
===================================================================
--- mptrack/HTTP.h	(revision 11772)
+++ mptrack/HTTP.h	(working copy)
@@ -177,7 +177,6 @@
 	mpt::const_byte_span data;
 
 	Request &SetURI(const URI &uri);
-	Request &InsecureTLSDowngradeWindowsXP();
 
 	Result operator()(InternetSession &internet) const;
 };
Index: mptrack/Image.cpp
===================================================================
--- mptrack/Image.cpp	(revision 11772)
+++ mptrack/Image.cpp	(working copy)
@@ -61,29 +61,7 @@
 static CComPtr<IStream> GetStream(mpt::const_byte_span data)
 {
 	CComPtr<IStream> stream;
-#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 	stream.Attach(SHCreateMemStream(mpt::byte_cast<const unsigned char*>(data.data()), mpt::saturate_cast<UINT>(data.size())));
-#else
-	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, data.size());
-	if(hGlobal == NULL)
-	{
-		throw bad_image();
-	}
-	void * mem = GlobalLock(hGlobal);
-	if(!mem)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	std::memcpy(mem, data.data(), data.size());
-	GlobalUnlock(hGlobal);
-	if(CreateStreamOnHGlobal(hGlobal, TRUE, &stream) != S_OK)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	hGlobal = NULL;
-#endif
 	if(!stream)
 	{
 		throw bad_image();
Index: mptrack/MPTrackLink.cpp
===================================================================
--- mptrack/MPTrackLink.cpp	(revision 11772)
+++ mptrack/MPTrackLink.cpp	(working copy)
@@ -16,9 +16,7 @@
 #if defined(MPT_BUILD_MSVC)
 #if MPT_COMPILER_MSVC || MPT_COMPILER_CLANG
 
-#if !defined(MPT_BUILD_TARGET_XP)
 #pragma comment(lib, "delayimp.lib")
-#endif // !MPT_BUILD_TARGET_XP
 
 #pragma comment(lib, "version.lib")
 #pragma comment(lib, "rpcrt4.lib")
@@ -32,6 +30,7 @@
 #pragma comment(lib, "dmoguids.lib")
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: mptrack/UpdateCheck.cpp
===================================================================
--- mptrack/UpdateCheck.cpp	(revision 11772)
+++ mptrack/UpdateCheck.cpp	(working copy)
@@ -358,7 +358,7 @@
 	request.method = HTTP::Method::Get;
 	request.flags = HTTP::NoCache;
 
-	HTTP::Result resultHTTP = internet(request.InsecureTLSDowngradeWindowsXP());
+	HTTP::Result resultHTTP = internet(request);
 
 	if(settings.sendStatistics)
 	{
@@ -377,7 +377,7 @@
 		std::string jsondata = GetStatisticsDataV3(settings);
 		MPT_LOG(LogInformation, "Update", mpt::ToUnicode(mpt::CharsetUTF8, jsondata));
 		requestStatistics.data = mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(jsondata));
-		internet(requestStatistics.InsecureTLSDowngradeWindowsXP());
+		internet(requestStatistics);
 	}
 
 	// Retrieve HTTP status code.
Index: mptrack/wine/Native.cpp
===================================================================
--- mptrack/wine/Native.cpp	(revision 11772)
+++ mptrack/wine/Native.cpp	(working copy)
@@ -16,6 +16,7 @@
 
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: sounddev/SoundDeviceDirectSound.cpp
===================================================================
--- sounddev/SoundDeviceDirectSound.cpp	(revision 11772)
+++ sounddev/SoundDeviceDirectSound.cpp	(working copy)
@@ -144,7 +144,7 @@
 	caps.HasNamedInputSources = false;
 	caps.CanDriverPanel = false;
 	caps.ExclusiveModeDescription = U_("Use primary buffer");
-	caps.DefaultSettings.sampleFormat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista)) ? SampleFormatFloat32 : SampleFormatInt16;
+	caps.DefaultSettings.sampleFormat = GetSysInfo().IsOriginal() ? SampleFormatFloat32 : SampleFormatInt16;
 	IDirectSound *dummy = nullptr;
 	IDirectSound *ds = nullptr;
 	if(m_piDS)
@@ -223,9 +223,8 @@
 				}
 			}
 		}
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
-			// Vista
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 			caps.supportedExclusiveModeSampleFormats = { SampleFormatFloat32 };
 		} else if(!(dscaps.dwFlags & DSCAPS_EMULDRIVER))
@@ -357,7 +356,7 @@
 	}
 	m_dwWritePos = 0xFFFFFFFF;
 	SetWakeupInterval(std::min(m_Settings.UpdateInterval, m_nDSoundBufferSize / (2.0 * m_Settings.GetBytesPerSecond())));
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
Index: sounddev/SoundDeviceManager.cpp
===================================================================
--- sounddev/SoundDeviceManager.cpp	(revision 11772)
+++ sounddev/SoundDeviceManager.cpp	(working copy)
@@ -244,26 +244,6 @@
 		typePriorities[SoundDevice::TypePORTAUDIO_DS] = 16;
 		typePriorities[U_("Wine-Native-PortAudio-8")] = 9; // ALSA
 		typePriorities[SoundDevice::TypePORTAUDIO_WDMKS] = -1;
-	} else if(GetSysInfo().WindowsVersion.IsBefore(mpt::Windows::Version::WinVista))
-	{ // WinXP
-		typePriorities[SoundDevice::TypeWAVEOUT] = 29;
-		typePriorities[SoundDevice::TypeASIO] = 28;
-		typePriorities[U_("RtAudio-WINDOWS_DS")] = 27;
-		typePriorities[SoundDevice::TypePORTAUDIO_WDMKS] = 26;
-		typePriorities[SoundDevice::TypePORTAUDIO_WMME] = 19;
-		typePriorities[SoundDevice::TypeDSOUND] = 17;
-		typePriorities[SoundDevice::TypePORTAUDIO_DS] = 7;
-		typePriorities[SoundDevice::TypePORTAUDIO_WASAPI] = -1;
-	} else if(GetSysInfo().WindowsVersion.IsBefore(mpt::Windows::Version::Win7))
-	{ // Vista
-		typePriorities[SoundDevice::TypeWAVEOUT] = 29;
-		typePriorities[SoundDevice::TypePORTAUDIO_WASAPI] = 28;
-		typePriorities[SoundDevice::TypeASIO] = 27;
-		typePriorities[SoundDevice::TypePORTAUDIO_WDMKS] = 26;
-		typePriorities[SoundDevice::TypePORTAUDIO_WMME] = 19;
-		typePriorities[U_("RtAudio-WINDOWS_DS")] = -1;
-		typePriorities[SoundDevice::TypeDSOUND] = -2;
-		typePriorities[SoundDevice::TypePORTAUDIO_DS] = -3;
 	} else
 	{ // >=Win7
 		typePriorities[SoundDevice::TypePORTAUDIO_WASAPI] = 29;
Index: sounddev/SoundDevicePortAudio.cpp
===================================================================
--- sounddev/SoundDevicePortAudio.cpp	(revision 11772)
+++ sounddev/SoundDevicePortAudio.cpp	(working copy)
@@ -127,10 +127,10 @@
 		framesPerBuffer = paFramesPerBufferUnspecified; // let portaudio choose
 	} else if(m_HostApiType == paMME)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else if(m_HostApiType == paDirectSound)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else
 	{
 		m_Flags.NeedsClippedFloat = false;
@@ -370,7 +370,7 @@
 		caps.DefaultSettings.sampleFormat = SampleFormatInt32;
 	} else if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 		} else
@@ -379,11 +379,8 @@
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsWine)
+		if(GetSysInfo().IsOriginal())
 		{
-			caps.DefaultSettings.sampleFormat = SampleFormatInt16;
-		} else if(GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
-		{
 			caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 		} else
 		{
@@ -395,13 +392,13 @@
 	}
 	if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.HasInternalDither = false;
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.HasInternalDither = false;
 		}
@@ -445,13 +442,13 @@
 	}
 	if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 		}
@@ -567,7 +564,6 @@
 	{
 		return false;
 	}
-	bool hasVista = GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista);
 	mpt::PathString controlEXE;
 	TCHAR systemDir[MAX_PATH];
 	MemsetZero(systemDir);
@@ -577,7 +573,7 @@
 		controlEXE += P_("\\");
 	}
 	controlEXE += P_("control.exe");
-	return (reinterpret_cast<INT_PTR>(ShellExecute(NULL, TEXT("open"), controlEXE.AsNative().c_str(), (hasVista ? TEXT("/name Microsoft.Sound") : TEXT("mmsys.cpl")), NULL, SW_SHOW)) >= 32);
+	return (reinterpret_cast<INT_PTR>(ShellExecute(NULL, TEXT("open"), controlEXE.AsNative().c_str(), TEXT("/name Microsoft.Sound"), NULL, SW_SHOW)) >= 32);
 #else // !MPT_OS_WINDOWS
 	return false;
 #endif // MPT_OS_WINDOWS
@@ -650,6 +646,7 @@
 
 std::vector<SoundDevice::Info> CPortaudioDevice::EnumerateDevices(SoundDevice::SysInfo sysInfo)
 {
+	MPT_UNREFERENCED_PARAMETER(sysInfo);
 	std::vector<SoundDevice::Info> devices;
 	for(PaDeviceIndex dev = 0; dev < Pa_GetDeviceCount(); ++dev)
 	{
@@ -704,13 +701,7 @@
 				result.apiName = U_("WASAPI");
 				break;
 			case paWDMKS:
-				if(sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
-				{
-					result.apiName = U_("WaveRT");
-				} else
-				{
-					result.apiName = U_("WDM-KS");
-				}
+				result.apiName = U_("WaveRT");
 				break;
 			default:
 				result.apiName = mpt::ToUnicode(mpt::CharsetUTF8, Pa_GetHostApiInfo(Pa_GetDeviceInfo(dev)->hostApi)->name);
Index: sounddev/SoundDeviceRtAudio.cpp
===================================================================
--- sounddev/SoundDeviceRtAudio.cpp	(revision 11772)
+++ sounddev/SoundDeviceRtAudio.cpp	(working copy)
@@ -177,7 +177,7 @@
 			m_Flags.NeedsClippedFloat = true;
 		} else if(m_RtAudio->getCurrentApi() == RtAudio::Api::WINDOWS_DS)
 		{
-			m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+			m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 		}
 		m_RtAudio->openStream((m_OutputStreamParameters.nChannels > 0) ? &m_OutputStreamParameters : nullptr, (m_InputStreamParameters.nChannels > 0) ? &m_InputStreamParameters : nullptr, SampleFormatToRtAudioFormat(m_Settings.sampleFormat), m_Settings.Samplerate, &m_FramesPerChunk, &RtAudioCallback, this, &m_StreamOptions, nullptr);
 	} catch (const RtAudioError &e)
Index: sounddev/SoundDeviceUtilities.cpp
===================================================================
--- sounddev/SoundDeviceUtilities.cpp	(revision 11772)
+++ sounddev/SoundDeviceUtilities.cpp	(working copy)
@@ -19,6 +19,7 @@
 #include <algorithm>
 
 #if MPT_OS_WINDOWS
+#include <avrt.h>
 #include <mmsystem.h>
 #endif // MPT_OS_WINDOWS
 
@@ -131,41 +132,8 @@
 }
 
 
-MPT_REGISTERED_COMPONENT(ComponentAvRt, "AvRt")
-
-ComponentAvRt::ComponentAvRt()
-	: ComponentLibrary(ComponentTypeSystem)
-	, AvSetMmThreadCharacteristics(nullptr)
-	, AvRevertMmThreadCharacteristics(nullptr)
-{
-	return;
-}
-
-bool ComponentAvRt::DoInitialize()
-{
-	if(!mpt::Windows::Version::Current().IsAtLeast(mpt::Windows::Version::WinVista))
-	{
-		return false;
-	}
-	AddLibrary("avrt", mpt::LibraryPath::System(P_("avrt")));
-	MPT_COMPONENT_BINDWIN("avrt", AvSetMmThreadCharacteristics);
-	MPT_COMPONENT_BIND("avrt", AvRevertMmThreadCharacteristics);
-	if(HasBindFailed())
-	{
-		return false;
-	}
-	return true;
-}
-
-ComponentAvRt::~ComponentAvRt()
-{
-	return;
-}
-
-
-CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority)
+CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority)
 	: m_SysInfo(sysInfo)
-	, m_AvRt(avrt)
 	, m_BoostPriority(boostPriority)
 	, m_Priority(priority)
 	, task_idx(0)
@@ -178,16 +146,9 @@
 	#endif
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(!priorityClass.empty())
 		{
-			if(!priorityClass.empty())
-			{
-				hTask = m_AvRt->AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
-			}
-		} else
-		{
-			oldPriority = GetThreadPriority(GetCurrentThread());
-			SetThreadPriority(GetCurrentThread(), m_Priority);
+			hTask = AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
 		}
 	}
 }
@@ -198,18 +159,12 @@
 	MPT_TRACE_SCOPE();
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(hTask)
 		{
-			if(hTask)
-			{
-				m_AvRt->AvRevertMmThreadCharacteristics(hTask);
-			}
-			hTask = NULL;
-			task_idx = 0;
-		} else
-		{
-			SetThreadPriority(GetCurrentThread(), oldPriority);
+			AvRevertMmThreadCharacteristics(hTask);
 		}
+		hTask = NULL;
+		task_idx = 0;
 	}
 }
 
@@ -322,7 +277,7 @@
 		if(!terminate)
 		{
 
-			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_AvRt, m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
+			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
 			CPeriodicWaker periodicWaker(m_WakeupInterval);
 
 			m_SoundDevice.StartFromSoundThread();
Index: sounddev/SoundDeviceUtilities.h
===================================================================
--- sounddev/SoundDeviceUtilities.h	(revision 11772)
+++ sounddev/SoundDeviceUtilities.h	(working copy)
@@ -16,7 +16,6 @@
 #include "SoundDeviceBase.h"
 
 #include "../common/misc_util.h"
-#include "../common/ComponentManager.h"
 
 #if MPT_OS_WINDOWS
 #include <mmreg.h>
@@ -48,27 +47,10 @@
 class CSoundDeviceWithThread;
 
 
-class ComponentAvRt
-	: public ComponentLibrary
-{
-	MPT_DECLARE_COMPONENT_MEMBERS
-public:
-	typedef HANDLE (WINAPI *pAvSetMmThreadCharacteristics)(LPCTSTR, LPDWORD);
-	typedef BOOL (WINAPI *pAvRevertMmThreadCharacteristics)(HANDLE);
-	pAvSetMmThreadCharacteristics AvSetMmThreadCharacteristics;
-	pAvRevertMmThreadCharacteristics AvRevertMmThreadCharacteristics;
-public:
-	ComponentAvRt();
-	virtual ~ComponentAvRt();
-	bool DoInitialize() override;
-};
-
-
 class CPriorityBooster
 {
 private:
 	SoundDevice::SysInfo m_SysInfo;
-	ComponentHandle<ComponentAvRt> & m_AvRt;
 	bool m_BoostPriority;
 	int m_Priority;
 	DWORD task_idx;
@@ -75,7 +57,7 @@
 	HANDLE hTask;
 	int oldPriority;
 public:
-	CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority);
+	CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority);
 	~CPriorityBooster();
 };
 
@@ -85,7 +67,6 @@
 	friend class CPeriodicWaker;
 private:
 	CSoundDeviceWithThread & m_SoundDevice;
-	ComponentHandle<ComponentAvRt> m_AvRt;
 	mpt::winstring m_MMCSSClass;
 	double m_WakeupInterval;
 	HANDLE m_hAudioWakeUp;
Index: sounddev/SoundDeviceWaveout.cpp
===================================================================
--- sounddev/SoundDeviceWaveout.cpp	(revision 11772)
+++ sounddev/SoundDeviceWaveout.cpp	(working copy)
@@ -93,11 +93,8 @@
 	caps.CanDriverPanel = false;
 	caps.HasInternalDither = false;
 	caps.ExclusiveModeDescription = U_("Use direct mode");
-	if(GetSysInfo().IsWine)
+	if(GetSysInfo().IsOriginal())
 	{
-		caps.DefaultSettings.sampleFormat = SampleFormatInt16;
-	} else if(GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
-	{
 		caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 	} else
 	{
@@ -111,7 +108,7 @@
 {
 	MPT_TRACE_SCOPE();
 	SoundDevice::DynamicCaps caps;
-	if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+	if(GetSysInfo().IsOriginal())
 	{
 		caps.supportedSampleFormats = { SampleFormatFloat32 };
 	}
@@ -230,7 +227,7 @@
 	}
 	SetWakeupEvent(m_ThreadWakeupEvent);
 	SetWakeupInterval(m_nWaveBufferSize * 1.0 / m_Settings.GetBytesPerSecond());
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
@@ -368,11 +365,7 @@
 	ULONG nBytesWritten = 0;
 	while((oldBuffersPending < m_nPreparedHeaders) && !m_Failed)
 	{
-#if (_WIN32_WINNT >= 0x0600)
 		DWORD oldFlags = InterlockedOr(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), 0);
-#else
-		DWORD oldFlags = _InterlockedOr(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), 0);
-#endif
 		uint32 driverBugs = 0;
 		if(oldFlags & WHDR_INQUEUE)
 		{
@@ -407,11 +400,7 @@
 		SourceLockedAudioReadPrepare(m_nWaveBufferSize / bytesPerFrame, nLatency / bytesPerFrame);
 		SourceLockedAudioRead(m_WaveBuffers[m_nWriteBuffer].lpData, nullptr, m_nWaveBufferSize / bytesPerFrame);
 		nBytesWritten += m_nWaveBufferSize;
-#if (_WIN32_WINNT >= 0x0600)
 		InterlockedAnd(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), ~static_cast<DWORD>(WHDR_INQUEUE|WHDR_DONE));
-#else
-		_InterlockedAnd(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), ~static_cast<DWORD>(WHDR_INQUEUE|WHDR_DONE));
-#endif
 		InterlockedExchange(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwBufferLength), m_nWaveBufferSize);
 		InterlockedIncrement(&m_nBuffersPending);
 		oldBuffersPending++; // increment separately to avoid looping without leaving at all when rendering takes more than 100% CPU
@@ -518,11 +507,7 @@
 void CWaveDevice::HandleWaveoutDone(WAVEHDR *hdr)
 {
 	MPT_TRACE_SCOPE();
-#if (_WIN32_WINNT >= 0x0600)
 	DWORD flags = InterlockedOr(interlocked_access(&hdr->dwFlags), 0);
-#else
-	DWORD flags = _InterlockedOr(interlocked_access(&hdr->dwFlags), 0);
-#endif
 	std::size_t hdrIndex = hdr - &(m_WaveBuffers[0]);
 	uint32 driverBugs = 0;
 	if(hdrIndex != m_nDoneBuffer)
remove-winxp-v3.patch (24,389 bytes)   
remove-winxp-v4.patch (30,860 bytes)   
Index: common/BuildSettings.h
===================================================================
--- common/BuildSettings.h	(revision 11890)
+++ common/BuildSettings.h	(working copy)
@@ -20,36 +20,10 @@
 
 #if MPT_OS_WINDOWS
 
-#if defined(MPT_BUILD_MSVC)
-
-#if defined(MPT_BUILD_TARGET_XP)
-
-#if defined(_M_X64)
 #ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0502 // _WIN32_WINNT_WS03
-#endif
-#else // !_M_X64
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-#endif // _M_X64
-
-#else // MPT_BUILD_TARGET
-
-#ifndef _WIN32_WINNT
 #define _WIN32_WINNT 0x0601 // _WIN32_WINNT_WIN7
 #endif
 
-#endif // MPT_BUILD_TARGET
-
-#else // !MPT_BUILD_MSVC
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
-#endif
-
-#endif // MPT_BUILD_MSVC
-
 #ifndef WINVER
 #define WINVER       _WIN32_WINNT
 #endif
@@ -121,10 +95,8 @@
 //#define MPT_WITH_ICONV
 //#define MPT_WITH_LTDL
 #if MPT_OS_WINDOWS
-#if (_WIN32_WINNT >= 0x0601)
 #define MPT_WITH_MEDIAFOUNDATION
 #endif
-#endif
 //#define MPT_WITH_MINIMP3
 //#define MPT_WITH_MINIZ
 #define MPT_WITH_MPG123
Index: common/mptLibrary.cpp
===================================================================
--- common/mptLibrary.cpp	(revision 11890)
+++ common/mptLibrary.cpp	(working copy)
@@ -100,7 +100,7 @@
 		if(WindowsVersion.IsAtLeast(mpt::Windows::Version::Win8))
 		{
 			hasKB2533623 = true;
-		} else if(WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		} else
 		{
 			HMODULE hKernel32DLL = LoadLibraryW(L"kernel32.dll");
 			if(hKernel32DLL)
Index: mptrack/AdvancedConfigDlg.cpp
===================================================================
--- mptrack/AdvancedConfigDlg.cpp	(revision 11890)
+++ mptrack/AdvancedConfigDlg.cpp	(working copy)
@@ -170,11 +170,7 @@
 			if(gi == m_groups.end())
 			{
 				LVGROUP group;
-	#if _WIN32_WINNT >= 0x0600
 				group.cbSize = LVGROUP_V5_SIZE;
-	#else
-				group.cbSize = sizeof(group);
-	#endif
 				group.mask = LVGF_HEADER | LVGF_GROUPID;
 #if MPT_USTRING_MODE_WIDE
 				group.pszHeader = const_cast<wchar_t *>(section.c_str());
Index: mptrack/BuildVariants.cpp
===================================================================
--- mptrack/BuildVariants.cpp	(revision 11890)
+++ mptrack/BuildVariants.cpp	(working copy)
@@ -62,10 +62,10 @@
 	std::vector<BuildVariant> result
 	{
 		// VS2017
-		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_i586    , 0, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::WinXP  , mpt::Wine::Version(1,8,0) },
-		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::WinXP64, mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
-		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win7   , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win32old"), false, mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinXP   , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 1, U_("win64old"), false, mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinXP64 , mpt::Windows::Version::Win7 , mpt::Wine::Version(1,8,0) },
+		{ 2, U_("win32"   ), true , mpt::Windows::Architecture::x86  , PROCSUPPORT_x86_SSE2, 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
+		{ 2, U_("win64"   ), true , mpt::Windows::Architecture::amd64, PROCSUPPORT_AMD64   , 2, 0, mpt::Windows::Version::WinVista, mpt::Windows::Version::Win10, mpt::Wine::Version(3,0,0) },
 	};
 	std::stable_sort(result.begin(), result.end(), CompareBuildVariantsByScore);
 	return result;
Index: mptrack/ExceptionHandler.cpp
===================================================================
--- mptrack/ExceptionHandler.cpp	(revision 11890)
+++ mptrack/ExceptionHandler.cpp	(working copy)
@@ -669,7 +669,6 @@
 
 void ExceptionHandler::ConfigureSystemHandler()
 {
-#if (_WIN32_WINNT >= 0x0600)
 	if(delegateToWindowsHandler)
 	{
 		//SetErrorMode(0);
@@ -678,15 +677,6 @@
 	{
 		g_OriginalErrorMode = ::SetErrorMode(::GetErrorMode() | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
 	}
-#else // _WIN32_WINNT < 0x0600
-	if(delegateToWindowsHandler)
-	{
-		g_OriginalErrorMode = ::SetErrorMode(0);
-	} else
-	{
-		g_OriginalErrorMode = ::SetErrorMode(::SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
-	}
-#endif // _WIN32_WINNT
 }
 
 
Index: mptrack/HTTP.cpp
===================================================================
--- mptrack/HTTP.cpp	(revision 11890)
+++ mptrack/HTTP.cpp	(working copy)
@@ -447,25 +447,6 @@
 }
 
 
-Request &Request::InsecureTLSDowngradeWindowsXP()
-{
-	if(mpt::Windows::IsOriginal() && mpt::Windows::Version::Current().IsBefore(mpt::Windows::Version::WinVista))
-	{
-		// TLS 1.0 is not enabled by default until IE7. Since WinInet won't let us override this setting, we cannot assume that HTTPS
-		// is going to work on older systems. Besides... Windows XP is already enough of a security risk by itself. :P
-		if(protocol == Protocol::HTTPS)
-		{
-			protocol = Protocol::HTTP;
-		}
-		if(port == Port::HTTPS)
-		{
-			port = Port::HTTP;
-		}
-	}
-	return *this;
-}
-
-
 Result SimpleGet(InternetSession &internet, Protocol protocol, const mpt::ustring &host, const mpt::ustring &path)
 {
 	HTTP::Request request;
Index: mptrack/HTTP.h
===================================================================
--- mptrack/HTTP.h	(revision 11890)
+++ mptrack/HTTP.h	(working copy)
@@ -177,7 +177,6 @@
 	mpt::const_byte_span data;
 
 	Request &SetURI(const URI &uri);
-	Request &InsecureTLSDowngradeWindowsXP();
 
 	Result operator()(InternetSession &internet) const;
 };
Index: mptrack/Image.cpp
===================================================================
--- mptrack/Image.cpp	(revision 11890)
+++ mptrack/Image.cpp	(working copy)
@@ -61,29 +61,7 @@
 static CComPtr<IStream> GetStream(mpt::const_byte_span data)
 {
 	CComPtr<IStream> stream;
-#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 	stream.Attach(SHCreateMemStream(mpt::byte_cast<const unsigned char*>(data.data()), mpt::saturate_cast<UINT>(data.size())));
-#else
-	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, data.size());
-	if(hGlobal == NULL)
-	{
-		throw bad_image();
-	}
-	void * mem = GlobalLock(hGlobal);
-	if(!mem)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	std::memcpy(mem, data.data(), data.size());
-	GlobalUnlock(hGlobal);
-	if(CreateStreamOnHGlobal(hGlobal, TRUE, &stream) != S_OK)
-	{
-		hGlobal = GlobalFree(hGlobal);
-		throw bad_image();
-	}
-	hGlobal = NULL;
-#endif
 	if(!stream)
 	{
 		throw bad_image();
Index: mptrack/MPTrackLink.cpp
===================================================================
--- mptrack/MPTrackLink.cpp	(revision 11890)
+++ mptrack/MPTrackLink.cpp	(working copy)
@@ -16,9 +16,7 @@
 #if defined(MPT_BUILD_MSVC)
 #if MPT_COMPILER_MSVC || MPT_COMPILER_CLANG
 
-#if !defined(MPT_BUILD_TARGET_XP)
 #pragma comment(lib, "delayimp.lib")
-#endif // !MPT_BUILD_TARGET_XP
 
 #pragma comment(lib, "version.lib")
 #pragma comment(lib, "rpcrt4.lib")
@@ -32,6 +30,7 @@
 #pragma comment(lib, "dmoguids.lib")
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: mptrack/UpdateCheck.cpp
===================================================================
--- mptrack/UpdateCheck.cpp	(revision 11890)
+++ mptrack/UpdateCheck.cpp	(working copy)
@@ -358,7 +358,7 @@
 	request.method = HTTP::Method::Get;
 	request.flags = HTTP::NoCache;
 
-	HTTP::Result resultHTTP = internet(request.InsecureTLSDowngradeWindowsXP());
+	HTTP::Result resultHTTP = internet(request);
 
 	if(settings.sendStatistics)
 	{
@@ -377,7 +377,7 @@
 		std::string jsondata = GetStatisticsDataV3(settings);
 		MPT_LOG(LogInformation, "Update", mpt::ToUnicode(mpt::CharsetUTF8, jsondata));
 		requestStatistics.data = mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(jsondata));
-		internet(requestStatistics.InsecureTLSDowngradeWindowsXP());
+		internet(requestStatistics);
 	}
 
 	// Retrieve HTTP status code.
Index: mptrack/wine/Native.cpp
===================================================================
--- mptrack/wine/Native.cpp	(revision 11890)
+++ mptrack/wine/Native.cpp	(working copy)
@@ -16,6 +16,7 @@
 
 #pragma comment(lib, "strmiids.lib")
 
+#pragma comment(lib, "avrt.lib")
 #pragma comment(lib, "dsound.lib")
 #pragma comment(lib, "winmm.lib")
 
Index: sounddev/SoundDeviceDirectSound.cpp
===================================================================
--- sounddev/SoundDeviceDirectSound.cpp	(revision 11890)
+++ sounddev/SoundDeviceDirectSound.cpp	(working copy)
@@ -109,10 +109,10 @@
 	info.apiName = U_("DirectSound");
 	info.useNameAsIdentifier = false;
 	info.flags = {
-		sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::Win7) ? Info::Usability::Usable : Info::Usability::Deprecated : Info::Usability::NotAvailable,
+		sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Deprecated : Info::Usability::NotAvailable,
 		Info::Level::Primary,
 		sysInfo.SystemClass == mpt::OS::Class::Windows && sysInfo.IsWindowsWine() ? Info::Compatible::Yes : Info::Compatible::No,
-		sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsWine() ? Info::Api::Emulated : sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? Info::Api::Emulated : Info::Api::Native : Info::Api::Emulated,
+		Info::Api::Emulated,
 		Info::Io::OutputOnly,
 		Info::Mixing::Software,
 		Info::Implementor::OpenMPT
@@ -165,7 +165,7 @@
 	caps.HasNamedInputSources = false;
 	caps.CanDriverPanel = false;
 	caps.ExclusiveModeDescription = U_("Use primary buffer");
-	caps.DefaultSettings.sampleFormat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista)) ? SampleFormatFloat32 : SampleFormatInt16;
+	caps.DefaultSettings.sampleFormat = GetSysInfo().IsOriginal() ? SampleFormatFloat32 : SampleFormatInt16;
 	IDirectSound *dummy = nullptr;
 	IDirectSound *ds = nullptr;
 	if(m_piDS)
@@ -244,14 +244,13 @@
 				}
 			}
 		}
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
-			// Vista
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 			caps.supportedExclusiveModeSampleFormats = { SampleFormatFloat32 };
 		} else if(!(dscaps.dwFlags & DSCAPS_EMULDRIVER))
 		{
-			// XP wdm
+			// Wine wdm-style
 			caps.supportedSampleFormats = { SampleFormatFloat32, SampleFormatInt32, SampleFormatInt24, SampleFormatInt16, SampleFormatUnsigned8 };
 			caps.supportedExclusiveModeSampleFormats.clear();
 			if(dscaps.dwFlags & DSCAPS_PRIMARY8BIT)
@@ -268,7 +267,7 @@
 			}
 		} else
 		{
-			// XP vdx
+			// Wine vdx-style
 			// nothing, announce all, fail later
 			caps.supportedSampleFormats = { SampleFormatFloat32, SampleFormatInt32, SampleFormatInt24, SampleFormatInt16, SampleFormatUnsigned8 };
 			caps.supportedExclusiveModeSampleFormats = { SampleFormatFloat32, SampleFormatInt32, SampleFormatInt24, SampleFormatInt16, SampleFormatUnsigned8 };
@@ -386,7 +385,7 @@
 	}
 	m_dwWritePos = 0xFFFFFFFF;
 	SetWakeupInterval(std::min(m_Settings.UpdateInterval, m_nDSoundBufferSize / (2.0 * m_Settings.GetBytesPerSecond())));
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
Index: sounddev/SoundDevicePortAudio.cpp
===================================================================
--- sounddev/SoundDevicePortAudio.cpp	(revision 11890)
+++ sounddev/SoundDevicePortAudio.cpp	(working copy)
@@ -160,10 +160,10 @@
 		framesPerBuffer = paFramesPerBufferUnspecified; // let portaudio choose
 	} else if(m_HostApiType == paMME)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else if(m_HostApiType == paDirectSound)
 	{
-		m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+		m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	} else
 	{
 		m_Flags.NeedsClippedFloat = false;
@@ -406,7 +406,7 @@
 		caps.DefaultSettings.sampleFormat = SampleFormatInt32;
 	} else if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 		} else
@@ -415,11 +415,8 @@
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsWine)
+		if(GetSysInfo().IsOriginal())
 		{
-			caps.DefaultSettings.sampleFormat = SampleFormatInt16;
-		} else if(GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
-		{
 			caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 		} else
 		{
@@ -431,13 +428,13 @@
 	}
 	if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.HasInternalDither = false;
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.HasInternalDither = false;
 		}
@@ -481,13 +478,13 @@
 	}
 	if(m_HostApiType == paDirectSound)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 		}
 	} else if(m_HostApiType == paMME)
 	{
-		if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+		if(GetSysInfo().IsOriginal())
 		{
 			caps.supportedSampleFormats = { SampleFormatFloat32 };
 		}
@@ -615,7 +612,6 @@
 	{
 		return false;
 	}
-	bool hasVista = GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista);
 	mpt::PathString controlEXE;
 	TCHAR systemDir[MAX_PATH];
 	MemsetZero(systemDir);
@@ -625,7 +621,7 @@
 		controlEXE += P_("\\");
 	}
 	controlEXE += P_("control.exe");
-	return (reinterpret_cast<INT_PTR>(ShellExecute(NULL, TEXT("open"), controlEXE.AsNative().c_str(), (hasVista ? TEXT("/name Microsoft.Sound") : TEXT("mmsys.cpl")), NULL, SW_SHOW)) >= 32);
+	return (reinterpret_cast<INT_PTR>(ShellExecute(NULL, TEXT("open"), controlEXE.AsNative().c_str(), TEXT("/name Microsoft.Sound"), NULL, SW_SHOW)) >= 32);
 #else // !MPT_OS_WINDOWS
 	return false;
 #endif // MPT_OS_WINDOWS
@@ -774,10 +770,10 @@
 		case paDirectSound:
 			result.apiName = U_("DirectSound");
 			result.flags = {
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::Win7) ? Info::Usability::Usable : Info::Usability::Deprecated : Info::Usability::NotAvailable,
+				sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Deprecated : Info::Usability::NotAvailable,
 				Info::Level::Secondary,
 				Info::Compatible::No,
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsWine() ? Info::Api::Emulated : sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? Info::Api::Emulated : Info::Api::Native : Info::Api::Emulated,
+				Info::Api::Emulated,
 				Info::Io::FullDuplex,
 				Info::Mixing::Software,
 				Info::Implementor::External
@@ -786,10 +782,10 @@
 		case paMME:
 			result.apiName = U_("MME");
 			result.flags = {
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::Win7) ? Info::Usability::Usable : Info::Usability::Deprecated : Info::Usability::NotAvailable,
+				sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Deprecated : Info::Usability::NotAvailable,
 				Info::Level::Secondary,
 				Info::Compatible::No,
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsWine() ? Info::Api::Emulated : sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? Info::Api::Emulated : Info::Api::Native : Info::Api::Emulated,
+				Info::Api::Emulated,
 				Info::Io::FullDuplex,
 				Info::Mixing::Software,
 				Info::Implementor::External
@@ -849,19 +845,19 @@
 				Info::Usability::Usable,
 				Info::Level::Primary,
 				Info::Compatible::No,
-				sysInfo.SystemClass == mpt::OS::Class::Windows && sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::WinVista) ? Info::Api::Native : Info::Api::Emulated,
+				Info::Api::Emulated,
 				Info::Io::FullDuplex,
-				sysInfo.SystemClass == mpt::OS::Class::Windows && sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::WinVista) ? Info::Mixing::Hardware : Info::Mixing::Software,
+				Info::Mixing::Software,
 				Info::Implementor::External
 			};
 			break;
 		case paWDMKS:
-			result.apiName = sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? U_("WaveRT") : U_("WDM-KS");
+			result.apiName = U_("WaveRT");
 			result.flags = {
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() ? sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::WinVista) ? Info::Usability::Usable : Info::Usability::Usable : Info::Usability::Broken : Info::Usability::NotAvailable,
+				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() ? Info::Usability::Usable : Info::Usability::Broken : Info::Usability::NotAvailable,
 				Info::Level::Primary,
 				Info::Compatible::No,
-				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() ? sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::WinVista) ? Info::Api::Native : Info::Api::Native : Info::Api::Emulated : Info::Api::Emulated,
+				sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() ? Info::Api::Native : Info::Api::Emulated : Info::Api::Emulated,
 				Info::Io::FullDuplex,
 				Info::Mixing::Hardware,
 				Info::Implementor::External
@@ -882,19 +878,7 @@
 		case paWASAPI:
 			result.apiName = U_("WASAPI");
 			result.flags = {
-				sysInfo.SystemClass == mpt::OS::Class::Windows ?
-					sysInfo.IsWindowsOriginal() ?
-						sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::Win7) ?
-							Info::Usability::Usable
-						:
-							sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ?
-								Info::Usability::Experimental
-							:
-								Info::Usability::NotAvailable
-					:
-						Info::Usability::Usable
-				:
-					Info::Usability::NotAvailable,
+				sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Usable : Info::Usability::NotAvailable,
 				Info::Level::Primary,
 				Info::Compatible::No,
 				sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Api::Native : Info::Api::Emulated,
Index: sounddev/SoundDeviceRtAudio.cpp
===================================================================
--- sounddev/SoundDeviceRtAudio.cpp	(revision 11890)
+++ sounddev/SoundDeviceRtAudio.cpp	(working copy)
@@ -116,7 +116,7 @@
 			m_Flags.NeedsClippedFloat = true;
 		} else if(m_RtAudio->getCurrentApi() == RtAudio::Api::WINDOWS_DS)
 		{
-			m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+			m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 		}
 		m_RtAudio->openStream((m_OutputStreamParameters.nChannels > 0) ? &m_OutputStreamParameters : nullptr, (m_InputStreamParameters.nChannels > 0) ? &m_InputStreamParameters : nullptr, SampleFormatToRtAudioFormat(m_Settings.sampleFormat), m_Settings.Samplerate, &m_FramesPerChunk, &RtAudioCallback, this, &m_StreamOptions, nullptr);
 	} catch (const RtAudioError &e)
@@ -526,19 +526,7 @@
 				case RtAudio::WINDOWS_WASAPI:
 					info.apiName = U_("WASAPI");
 					info.flags = {
-						sysInfo.SystemClass == mpt::OS::Class::Windows ?
-							sysInfo.IsWindowsOriginal() ?
-								sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::Win7) ?
-									Info::Usability::Usable
-								:
-									sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ?
-										Info::Usability::Experimental
-									:
-										Info::Usability::NotAvailable
-							:
-								Info::Usability::Usable
-						:
-							Info::Usability::NotAvailable,
+						sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Usable : Info::Usability::NotAvailable,
 						Info::Level::Secondary,
 						Info::Compatible::No,
 						sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Api::Native : Info::Api::Emulated,
@@ -562,10 +550,10 @@
 				case RtAudio::WINDOWS_DS:
 					info.apiName = U_("DirectSound");
 					info.flags = {
-						Info::Usability::Broken, // sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::Win7) ? Info::Usability:Usable : Info::Usability::Deprecated : Info::Usability::NotAvailable,
+						Info::Usability::Broken, // sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Deprecated : Info::Usability::NotAvailable,
 						Info::Level::Secondary,
 						Info::Compatible::No,
-						sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsWine() ? Info::Api::Emulated : sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? Info::Api::Emulated : Info::Api::Native : Info::Api::Emulated,
+						Info::Api::Emulated,
 						Info::Io::FullDuplex,
 						Info::Mixing::Software,
 						Info::Implementor::External
Index: sounddev/SoundDeviceUtilities.cpp
===================================================================
--- sounddev/SoundDeviceUtilities.cpp	(revision 11890)
+++ sounddev/SoundDeviceUtilities.cpp	(working copy)
@@ -19,6 +19,7 @@
 #include <algorithm>
 
 #if MPT_OS_WINDOWS
+#include <avrt.h>
 #include <mmsystem.h>
 #endif // MPT_OS_WINDOWS
 
@@ -131,41 +132,8 @@
 }
 
 
-MPT_REGISTERED_COMPONENT(ComponentAvRt, "AvRt")
-
-ComponentAvRt::ComponentAvRt()
-	: ComponentLibrary(ComponentTypeSystem)
-	, AvSetMmThreadCharacteristics(nullptr)
-	, AvRevertMmThreadCharacteristics(nullptr)
-{
-	return;
-}
-
-bool ComponentAvRt::DoInitialize()
-{
-	if(!mpt::Windows::Version::Current().IsAtLeast(mpt::Windows::Version::WinVista))
-	{
-		return false;
-	}
-	AddLibrary("avrt", mpt::LibraryPath::System(P_("avrt")));
-	MPT_COMPONENT_BINDWIN("avrt", AvSetMmThreadCharacteristics);
-	MPT_COMPONENT_BIND("avrt", AvRevertMmThreadCharacteristics);
-	if(HasBindFailed())
-	{
-		return false;
-	}
-	return true;
-}
-
-ComponentAvRt::~ComponentAvRt()
-{
-	return;
-}
-
-
-CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority)
+CPriorityBooster::CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority)
 	: m_SysInfo(sysInfo)
-	, m_AvRt(avrt)
 	, m_BoostPriority(boostPriority)
 	, m_Priority(priority)
 	, task_idx(0)
@@ -178,16 +146,9 @@
 	#endif
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(!priorityClass.empty())
 		{
-			if(!priorityClass.empty())
-			{
-				hTask = m_AvRt->AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
-			}
-		} else
-		{
-			oldPriority = GetThreadPriority(GetCurrentThread());
-			SetThreadPriority(GetCurrentThread(), m_Priority);
+			hTask = AvSetMmThreadCharacteristics(priorityClass.c_str(), &task_idx);
 		}
 	}
 }
@@ -198,18 +159,12 @@
 	MPT_TRACE_SCOPE();
 	if(m_BoostPriority)
 	{
-		if(m_SysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) && IsComponentAvailable(m_AvRt))
+		if(hTask)
 		{
-			if(hTask)
-			{
-				m_AvRt->AvRevertMmThreadCharacteristics(hTask);
-			}
-			hTask = NULL;
-			task_idx = 0;
-		} else
-		{
-			SetThreadPriority(GetCurrentThread(), oldPriority);
+			AvRevertMmThreadCharacteristics(hTask);
 		}
+		hTask = NULL;
+		task_idx = 0;
 	}
 }
 
@@ -322,7 +277,7 @@
 		if(!terminate)
 		{
 
-			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_AvRt, m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
+			CPriorityBooster priorityBooster(m_SoundDevice.GetSysInfo(), m_SoundDevice.m_Settings.BoostThreadPriority, m_MMCSSClass, m_SoundDevice.m_AppInfo.BoostedThreadPriorityXP);
 			CPeriodicWaker periodicWaker(m_WakeupInterval);
 
 			m_SoundDevice.StartFromSoundThread();
Index: sounddev/SoundDeviceUtilities.h
===================================================================
--- sounddev/SoundDeviceUtilities.h	(revision 11890)
+++ sounddev/SoundDeviceUtilities.h	(working copy)
@@ -16,7 +16,6 @@
 #include "SoundDeviceBase.h"
 
 #include "../common/misc_util.h"
-#include "../common/ComponentManager.h"
 
 #if MPT_OS_WINDOWS
 #include <mmreg.h>
@@ -48,27 +47,10 @@
 class CSoundDeviceWithThread;
 
 
-class ComponentAvRt
-	: public ComponentLibrary
-{
-	MPT_DECLARE_COMPONENT_MEMBERS
-public:
-	typedef HANDLE (WINAPI *pAvSetMmThreadCharacteristics)(LPCTSTR, LPDWORD);
-	typedef BOOL (WINAPI *pAvRevertMmThreadCharacteristics)(HANDLE);
-	pAvSetMmThreadCharacteristics AvSetMmThreadCharacteristics;
-	pAvRevertMmThreadCharacteristics AvRevertMmThreadCharacteristics;
-public:
-	ComponentAvRt();
-	virtual ~ComponentAvRt();
-	bool DoInitialize() override;
-};
-
-
 class CPriorityBooster
 {
 private:
 	SoundDevice::SysInfo m_SysInfo;
-	ComponentHandle<ComponentAvRt> & m_AvRt;
 	bool m_BoostPriority;
 	int m_Priority;
 	DWORD task_idx;
@@ -75,7 +57,7 @@
 	HANDLE hTask;
 	int oldPriority;
 public:
-	CPriorityBooster(SoundDevice::SysInfo sysInfo, ComponentHandle<ComponentAvRt> & avrt, bool boostPriority, const mpt::winstring & priorityClass, int priority);
+	CPriorityBooster(SoundDevice::SysInfo sysInfo, bool boostPriority, const mpt::winstring & priorityClass, int priority);
 	~CPriorityBooster();
 };
 
@@ -85,7 +67,6 @@
 	friend class CPeriodicWaker;
 private:
 	CSoundDeviceWithThread & m_SoundDevice;
-	ComponentHandle<ComponentAvRt> m_AvRt;
 	mpt::winstring m_MMCSSClass;
 	double m_WakeupInterval;
 	HANDLE m_hAudioWakeUp;
Index: sounddev/SoundDeviceWaveout.cpp
===================================================================
--- sounddev/SoundDeviceWaveout.cpp	(revision 11890)
+++ sounddev/SoundDeviceWaveout.cpp	(working copy)
@@ -93,11 +93,8 @@
 	caps.CanDriverPanel = false;
 	caps.HasInternalDither = false;
 	caps.ExclusiveModeDescription = U_("Use direct mode");
-	if(GetSysInfo().IsWine)
+	if(GetSysInfo().IsOriginal())
 	{
-		caps.DefaultSettings.sampleFormat = SampleFormatInt16;
-	} else if(GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
-	{
 		caps.DefaultSettings.sampleFormat = SampleFormatFloat32;
 	} else
 	{
@@ -111,7 +108,7 @@
 {
 	MPT_TRACE_SCOPE();
 	SoundDevice::DynamicCaps caps;
-	if(GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista))
+	if(GetSysInfo().IsOriginal())
 	{
 		caps.supportedSampleFormats = { SampleFormatFloat32 };
 		caps.supportedExclusiveModeSampleFormats = { SampleFormatFloat32 };
@@ -236,7 +233,7 @@
 	}
 	SetWakeupEvent(m_ThreadWakeupEvent);
 	SetWakeupInterval(m_nWaveBufferSize * 1.0 / m_Settings.GetBytesPerSecond());
-	m_Flags.NeedsClippedFloat = (GetSysInfo().IsOriginal() && GetSysInfo().WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista));
+	m_Flags.NeedsClippedFloat = GetSysInfo().IsOriginal();
 	return true;
 }
 
@@ -374,11 +371,7 @@
 	ULONG nBytesWritten = 0;
 	while((oldBuffersPending < m_nPreparedHeaders) && !m_Failed)
 	{
-#if (_WIN32_WINNT >= 0x0600)
 		DWORD oldFlags = InterlockedOr(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), 0);
-#else
-		DWORD oldFlags = _InterlockedOr(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), 0);
-#endif
 		uint32 driverBugs = 0;
 		if(oldFlags & WHDR_INQUEUE)
 		{
@@ -413,11 +406,7 @@
 		SourceLockedAudioReadPrepare(m_nWaveBufferSize / bytesPerFrame, nLatency / bytesPerFrame);
 		SourceLockedAudioRead(m_WaveBuffers[m_nWriteBuffer].lpData, nullptr, m_nWaveBufferSize / bytesPerFrame);
 		nBytesWritten += m_nWaveBufferSize;
-#if (_WIN32_WINNT >= 0x0600)
 		InterlockedAnd(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), ~static_cast<DWORD>(WHDR_INQUEUE|WHDR_DONE));
-#else
-		_InterlockedAnd(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwFlags), ~static_cast<DWORD>(WHDR_INQUEUE|WHDR_DONE));
-#endif
 		InterlockedExchange(interlocked_access(&m_WaveBuffers[m_nWriteBuffer].dwBufferLength), m_nWaveBufferSize);
 		InterlockedIncrement(&m_nBuffersPending);
 		oldBuffersPending++; // increment separately to avoid looping without leaving at all when rendering takes more than 100% CPU
@@ -524,11 +513,7 @@
 void CWaveDevice::HandleWaveoutDone(WAVEHDR *hdr)
 {
 	MPT_TRACE_SCOPE();
-#if (_WIN32_WINNT >= 0x0600)
 	DWORD flags = InterlockedOr(interlocked_access(&hdr->dwFlags), 0);
-#else
-	DWORD flags = _InterlockedOr(interlocked_access(&hdr->dwFlags), 0);
-#endif
 	std::size_t hdrIndex = hdr - &(m_WaveBuffers[0]);
 	uint32 driverBugs = 0;
 	if(hdrIndex != m_nDoneBuffer)
@@ -621,10 +606,10 @@
 		}
 		info.isDefault = (index == 0);
 		info.flags = {
-			sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsOriginal() && sysInfo.WindowsVersion.IsBefore(mpt::Windows::Version::Win7) ? Info::Usability::Usable : Info::Usability::Deprecated : Info::Usability::NotAvailable,
+			sysInfo.SystemClass == mpt::OS::Class::Windows ? Info::Usability::Deprecated : Info::Usability::NotAvailable,
 			Info::Level::Primary,
 			sysInfo.SystemClass == mpt::OS::Class::Windows && sysInfo.IsWindowsOriginal() ? Info::Compatible::Yes : Info::Compatible::No,
-			sysInfo.SystemClass == mpt::OS::Class::Windows ? sysInfo.IsWindowsWine() ? Info::Api::Emulated : sysInfo.WindowsVersion.IsAtLeast(mpt::Windows::Version::WinVista) ? Info::Api::Emulated : Info::Api::Native : Info::Api::Emulated,
+			Info::Api::Emulated,
 			Info::Io::OutputOnly,
 			Info::Mixing::Software,
 			Info::Implementor::OpenMPT
remove-winxp-v4.patch (30,860 bytes)   
Has the bug occurred in previous versions?
Tested code revision (in case you know it)

Relationships

related to 0001185 resolvedmanx Restructure MSVC bin directory layout 
related to 0001120 resolvedmanx Rethink PluginBridge naming 
related to 0001011 resolvedmanx Automatic update 
related to 0001123 resolvedmanx Provide unified multi-arch installer 

Activities

manx

manx

2019-01-11 19:25

administrator   ~0003807

We can probably also remove 3dnow support at the same time.

manx

manx

2019-01-11 19:26

administrator   ~0003808

Support for pre-SSE2 CPUs is also basically gone (i.e. broken) in MSVC as of current VS2017. Current Windows 7 updates also do not work on non-SSE2 CPUs.

Yuzu

Yuzu

2019-01-27 18:29

reporter   ~0003830

Windows XP Support is already ended in 2014. But I still using in 2019.
Also Windows Vista ended in 2018. So please remove Windows Vista Support.

These features will be refocused to Newer PC's.
A few requirements.

  • Windows 7 or Newer now with x64_86 only
  • 1.80Ghz or Better CPU
  • 2GB of Ram or better
  • DirectX 11+ or OpenGL 3+
  • Support for VST3.
  • VS2017 or maybe VS2022

For now I have to wait to MPT 2.0 release. But I want to get my Newer PC's soon :( but I will try to wait for a serval years.

Sorry Saga

Yuzu

Yuzu

2019-01-27 18:34

reporter   ~0003831

Additional notes.
When I'm using Windows XP or Vista.
When I clicked to OpenMPT 2.0 setup executable to be appear this message.

  • Sorry. This program is only available for Windows 7 or Newer (64-Bit).
  • Installation aborted.
Saga Musix

Saga Musix

2019-02-10 21:45

administrator   ~0003841

InnoSetup 6 removes Windows XP support. For OpenMPT 1.28 we will have to continue using InnoSetup 5.

Yuzu

Yuzu

2019-02-10 22:24

reporter   ~0003843

InnoSetup 5 up to MPT 1.29.00
Then InnoSetup6 gets removed for XP Devices and 2.0 pre alpha release

Saga Musix

Saga Musix

2019-02-10 22:38

administrator   ~0003844

I have no idea what you are trying to say but we will certainly not wait for OpenMPT 2.0 to drop Windows XP support. By the time OpenMPT 1.29 gets released, Windows XP will be most likely 19 years old, making it the longest-supported Windows version in OpenMPT ever (second-longest would be Windows 98 SE with about 18 years). You need to realize that if you refuse to use a newer operating system, you will at some point also have to give up on using newer software. You will be able to continue using OpenMPT 1.28 on Windows XP if you absolutely must, but there will be no updates for the software. At least two tools that are required for building OpenMPT (Visual Studio and InnoSetup) will drop support for Windows XP in their next update, and we cannot stay on outdated tools forever just to support an absolute minority of OpenMPT users with fresh updates - at this point, there are even more Wine users than XP users.

manx

manx

2019-02-11 05:10

administrator   ~0003845

I think it probably makes sense to drop Windows XP already in 1.29, given the InnoSetup change.

We may still continue to provide test builds for Windows XP (however I somehow question whether it is worth the (ever increasing) maintenance overhead) as test builds and .zip releases, however dropping it from the installer sounds like a good idea to not stay behind on the tools front (which always just defers migration overhead until later).

manx

manx

2019-03-06 16:32

administrator   ~0003890

r11430 removes AMD MMXEXT and AMD 3DNow! optimized functions.

manx

manx

2019-03-11 17:27

administrator   ~0003896

r11458 remove x86, MMX, SSE for the cases where we also have SSE2 optimized functions available.

manx

manx

2019-09-05 16:20

administrator   ~0004041

r11988

Issue History

Date Modified Username Field Change
2019-01-05 18:24 manx New Issue
2019-01-05 18:24 manx Status new => assigned
2019-01-05 18:24 manx Assigned To => manx
2019-01-05 18:26 manx File Added: remove-winxp-v1.patch
2019-01-07 15:13 manx Relationship added related to 0001185
2019-01-07 15:14 manx Relationship added related to 0001120
2019-01-07 15:14 manx Relationship added related to 0001011
2019-01-07 15:14 manx Relationship added related to 0001123
2019-01-11 19:25 manx Note Added: 0003807
2019-01-11 19:26 manx Note Added: 0003808
2019-01-27 18:29 Yuzu Note Added: 0003830
2019-01-27 18:34 Yuzu Note Added: 0003831
2019-02-10 21:45 Saga Musix Note Added: 0003841
2019-02-10 22:24 Yuzu Note Added: 0003843
2019-02-10 22:38 Saga Musix Note Added: 0003844
2019-02-11 05:10 manx Note Added: 0003845
2019-02-11 05:49 manx Target Version OpenMPT 2.0 (very long term goals) => OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first)
2019-03-06 16:32 manx Note Added: 0003890
2019-03-11 17:27 manx Note Added: 0003896
2019-07-14 19:57 manx File Added: remove-winxp-v3.patch
2019-08-08 09:21 manx File Added: remove-winxp-v4.patch
2019-09-05 16:20 manx Status assigned => resolved
2019-09-05 16:20 manx Resolution open => fixed
2019-09-05 16:20 manx Fixed in Version => OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first)
2019-09-05 16:20 manx Note Added: 0004041