diff --git a/CMakeLists.txt b/CMakeLists.txt index e88f165f..d2e0c8b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,29 +35,33 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -list(APPEND COMPILE_OPTIONS - $<$:-std=c99> - $<$:-std=c++17> - -Wall - -Wextra - -Wpedantic - -Wunused - -Wshadow - -Wundef - -Wuninitialized - -Wredundant-decls - -Wcast-align - -Winit-self - -Wmissing-include-dirs - -Wmissing-declarations - -Wstrict-overflow=2 - -Wunused-parameter - -Wformat=2 - -Wdisabled-optimization - $<$:-Woverloaded-virtual> - $<$:-Wno-old-style-cast> - $<$:-fpermissive> -) +if(MSVC) + list(APPEND COMPILE_OPTIONS /std:c++17 /MP) +else() + list(APPEND COMPILE_OPTIONS + $<$:-std=c99> + $<$:-std=c++17> + -Wall + -Wextra + -Wpedantic + -Wunused + -Wshadow + -Wundef + -Wuninitialized + -Wredundant-decls + -Wcast-align + -Winit-self + -Wmissing-include-dirs + -Wmissing-declarations + -Wstrict-overflow=2 + -Wunused-parameter + -Wformat=2 + -Wdisabled-optimization + $<$:-Woverloaded-virtual> + $<$:-Wno-old-style-cast> + $<$:-fpermissive> + ) +endif() option(BUILD_WERROR "Build with -Werror" OFF) if(BUILD_WERROR) @@ -307,7 +311,7 @@ if(NOT SPARKLE AND (APPLE OR WIN32)) endif() endif() -if(WIN32) +if(WIN32 AND NOT MSVC) # RC compiler string(REPLACE "gcc" "windres" CMAKE_RC_COMPILER_INIT ${CMAKE_C_COMPILER}) enable_language(RC) @@ -487,6 +491,9 @@ add_definitions(-DQT_NO_CAST_TO_ASCII) if(WIN32) add_definitions(-DUNICODE) + if(MSVC) + add_definitions(-DPROTOBUF_USE_DLLS) + endif() endif() # Subdirectories diff --git a/ext/libstrawberry-common/core/logging.cpp b/ext/libstrawberry-common/core/logging.cpp index 0e4e03a5..3911b5dd 100644 --- a/ext/libstrawberry-common/core/logging.cpp +++ b/ext/libstrawberry-common/core/logging.cpp @@ -24,7 +24,9 @@ #include #include #include -#include +#ifndef _MSC_VER +# include +#endif #include #ifdef HAVE_BACKTRACE @@ -275,8 +277,8 @@ static T CreateLogger(Level level, const QString &class_name, int line, const ch return ret.space(); } +#ifdef Q_OS_UNIX QString CXXDemangle(const QString &mangled_function); - QString CXXDemangle(const QString &mangled_function) { int status = 0; @@ -289,9 +291,24 @@ QString CXXDemangle(const QString &mangled_function) { return mangled_function; // Probably not a C++ function. } +#endif // Q_OS_UNIX +#ifdef Q_OS_LINUX +QString LinuxDemangle(const QString &symbol); +QString LinuxDemangle(const QString &symbol) { + + QRegularExpression regex("\\(([^+]+)"); + QRegularExpressionMatch match = regex.match(symbol); + if (!match.hasMatch()) { + return symbol; + } + QString mangled_function = match.captured(1); + return CXXDemangle(mangled_function); +} +#endif // Q_OS_LINUX + +#ifdef Q_OS_MACOS QString DarwinDemangle(const QString &symbol); - QString DarwinDemangle(const QString &symbol) { #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) @@ -303,23 +320,9 @@ QString DarwinDemangle(const QString &symbol) { return CXXDemangle(mangled_function); } - -QString LinuxDemangle(const QString &symbol); - -QString LinuxDemangle(const QString &symbol) { - - QRegularExpression regex("\\(([^+]+)"); - QRegularExpressionMatch match = regex.match(symbol); - if (!match.hasMatch()) { - return symbol; - } - QString mangled_function = match.captured(1); - return CXXDemangle(mangled_function); - -} +#endif // Q_OS_MACOS QString DemangleSymbol(const QString &symbol); - QString DemangleSymbol(const QString &symbol) { #ifdef Q_OS_MACOS return DarwinDemangle(symbol); diff --git a/ext/libstrawberry-common/core/logging.h b/ext/libstrawberry-common/core/logging.h index b122f0e7..8bfecd74 100644 --- a/ext/libstrawberry-common/core/logging.h +++ b/ext/libstrawberry-common/core/logging.h @@ -29,12 +29,20 @@ # define qLog(level) while (false) QNoDebug() # define qLogCat(level, category) while (false) QNoDebug() #else -# define qLog(level) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, nullptr) +# ifdef _MSC_VER +# define qLog(level) logging::CreateLogger##level(__LINE__, __FUNCSIG__, nullptr) +# else +# define qLog(level) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, nullptr) +# endif // _MSC_VER // This macro specifies a separate category for message filtering. // The default qLog will use the class name extracted from the function name for this purpose. // The category is also printed in the message along with the class name. -# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, category) +# ifdef _MSC_VER +# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __FUNCSIG__, category) +# else +# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, category) +# endif // _MSC_VER #endif // QT_NO_DEBUG_STREAM diff --git a/ext/strawberry-tagreader/main.cpp b/ext/strawberry-tagreader/main.cpp index e28767a9..82f760fb 100644 --- a/ext/strawberry-tagreader/main.cpp +++ b/ext/strawberry-tagreader/main.cpp @@ -18,10 +18,13 @@ #include "config.h" +#include + +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) #include +#endif #include -#include #include #include #include diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 77a79217..ee0ad98a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1179,6 +1179,9 @@ endif() if(WIN32) target_link_libraries(strawberry_lib PRIVATE dsound dwmapi) + if(MSVC) + target_link_libraries(strawberry_lib PRIVATE sqlite3) + endif() endif() diff --git a/src/analyzer/fht.cpp b/src/analyzer/fht.cpp index ab321a7b..05274a93 100644 --- a/src/analyzer/fht.cpp +++ b/src/analyzer/fht.cpp @@ -26,6 +26,7 @@ #include #include +#include FHT::FHT(int n) : num_((n < 3) ? 0 : 1 << n), exp2_((n < 3) ? -1 : n) { diff --git a/src/core/commandlineoptions.cpp b/src/core/commandlineoptions.cpp index 1039a2ef..a9535f9c 100644 --- a/src/core/commandlineoptions.cpp +++ b/src/core/commandlineoptions.cpp @@ -22,7 +22,9 @@ #include "version.h" #include -#include +#ifndef _MSC_VER +# include +#endif #include #include @@ -119,6 +121,7 @@ void CommandlineOptions::RemoveArg(const QString &starts_with, int count) { bool CommandlineOptions::Parse() { +#ifndef _MSC_VER // TODO: Consider QCommandLineOption. static const struct option kOptions[] = { {"help", no_argument, nullptr, 'h'}, {"play", no_argument, nullptr, 'p'}, @@ -319,6 +322,8 @@ bool CommandlineOptions::Parse() { } } + #endif // _MSC_VER + return true; } diff --git a/src/core/songloader.cpp b/src/core/songloader.cpp index 7512e8f6..2cb9fd83 100644 --- a/src/core/songloader.cpp +++ b/src/core/songloader.cpp @@ -613,8 +613,8 @@ void SongLoader::ErrorMessageReceived(GstMessage *msg) { gchar *debugs = nullptr; gst_message_parse_error(msg, &error, &debugs); - qLog(Error) << __PRETTY_FUNCTION__ << error->message; - qLog(Error) << __PRETTY_FUNCTION__ << debugs; + qLog(Error) << error->message; + qLog(Error) << debugs; QString message_str = error->message; diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index d2f2a0a9..e6736ecf 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -697,7 +697,7 @@ QString GetEnv(const QString &key) { void SetEnv(const char *key, const QString &value) { #ifdef Q_OS_WIN32 - putenv(QString("%1=%2").arg(key, value).toLocal8Bit().constData()); + _putenv(QString("%1=%2").arg(key, value).toLocal8Bit().constData()); #else setenv(key, value.toLocal8Bit().constData(), 1); #endif @@ -785,7 +785,19 @@ QString DesktopEnvironment() { } -QString UnicodeToAscii(const QString &unicode) { +QString UnicodeToAscii(QString unicode) { + +#ifdef _MSC_VER + + return unicode + .replace(QChar(229), "a") + .replace(QChar(197), 'A') + .replace(QChar(230), "ae") + .replace(QChar(198), "AE") + .replace(QChar(248), 'o') + .replace(QChar(216), 'O'); + +#else #ifdef LC_ALL setlocale(LC_ALL, ""); @@ -816,6 +828,8 @@ QString UnicodeToAscii(const QString &unicode) { return ret; +#endif // _MSC_VER + } QString MacAddress() { diff --git a/src/core/utilities.h b/src/core/utilities.h index a057fff4..e8451366 100644 --- a/src/core/utilities.h +++ b/src/core/utilities.h @@ -132,7 +132,7 @@ QString GetRandomString(const int len, const QString &UseCharacters); QString DesktopEnvironment(); -QString UnicodeToAscii(const QString &unicode); +QString UnicodeToAscii(QString unicode); QString MacAddress(); diff --git a/src/engine/directsounddevicefinder.h b/src/engine/directsounddevicefinder.h index 7417c977..baf8a6ee 100644 --- a/src/engine/directsounddevicefinder.h +++ b/src/engine/directsounddevicefinder.h @@ -40,10 +40,12 @@ class DirectSoundDeviceFinder : public DeviceFinder { QList devices; }; - static BOOL EnumerateCallback(LPGUID guid, - LPCSTR description, - LPCSTR module, - LPVOID state_voidptr) __attribute__((stdcall)); + static BOOL EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr) +#ifdef _MSC_VER + ; +#else + __attribute__((stdcall)); +#endif }; #endif // DIRECTSOUNDDEVICEFINDER_H diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index c1822c13..9e99fa53 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -875,7 +875,7 @@ void GstEngine::UpdateScope(const int chunk_length) { sample_type *dest = scope_.data(); source += (chunk_size / sizeof(sample_type)) * scope_chunk_; - int bytes = 0; + size_t bytes = 0; // Make sure we don't go beyond the end of the buffer if (scope_chunk_ == scope_chunks_ - 1) { diff --git a/src/engine/mmdevicefinder.cpp b/src/engine/mmdevicefinder.cpp index ba2e517b..afd744c2 100644 --- a/src/engine/mmdevicefinder.cpp +++ b/src/engine/mmdevicefinder.cpp @@ -22,7 +22,11 @@ #include #include #include -#include +#ifdef _MSC_VER +# include +#else +# include +#endif #include #include @@ -32,6 +36,11 @@ #include "mmdevicefinder.h" #include "core/logging.h" +#ifdef _MSC_VER + DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6); + DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e, 0x3d, 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e); +#endif + MMDeviceFinder::MMDeviceFinder() : DeviceFinder("mmdevice", { "wasapisink" }) {} QList MMDeviceFinder::ListDevices() { diff --git a/src/playlist/playlist.cpp b/src/playlist/playlist.cpp index f45a6f47..39bf8ace 100644 --- a/src/playlist/playlist.cpp +++ b/src/playlist/playlist.cpp @@ -2164,13 +2164,13 @@ void Playlist::RemoveDeletedSongs() { namespace { struct SongSimilarHash { - long operator() (const Song &song) const { + size_t operator() (const Song &song) const { return HashSimilar(song); } }; struct SongSimilarEqual { - long operator()(const Song &song1, const Song &song2) const { + size_t operator()(const Song &song1, const Song &song2) const { return song1.IsSimilar(song2); } };