diff --git a/CMakeLists.txt b/CMakeLists.txt index eba688b7d738..db8c6ab3576e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,6 +111,7 @@ set(BUILD_COLORS "auto" CACHE STRING "Try to use colors auto/always/no") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") include(CMakeDependentOption) include(CheckSymbolExists) +include(CheckIncludeFileCXX) include(ExternalProject) include(GNUInstallDirs) include(DefaultOption) @@ -2778,6 +2779,18 @@ if(MODPLUG) target_link_libraries(mixxx-lib PRIVATE Modplug::Modplug) endif() +find_package(Microsoft.GSL CONFIG) +if(Microsoft.GSL_FOUND) + target_link_libraries(mixxx-lib PRIVATE Microsoft.GSL::GSL) +else() + # check if the headers have been installed without cmake config (< 3.1.0) + check_include_file_cxx(gsl/gsl HAVE_GSL_GSL) + if(NOT HAVE_GSL_GSL) + message(FATAL_ERROR "ms-gsl deveopment headers (libmsgsl-dev) not found") + endif() +endif() + + # QtKeychain option(QTKEYCHAIN "Secure credentials storage support for Live Broadcasting profiles" ON) if(QTKEYCHAIN) diff --git a/packaging/debian/control.in b/packaging/debian/control.in index 329cc1792871..4f41fcb4078f 100644 --- a/packaging/debian/control.in +++ b/packaging/debian/control.in @@ -59,6 +59,7 @@ Build-Depends: debhelper (>= 11), libudev-dev, # Note: libdjinterop is available within the Mixxx PPA libdjinterop-dev, + libmsgsl-dev, # for running mixxx-test xvfb Rules-Requires-Root: no diff --git a/src/engine/controls/cuecontrol.cpp b/src/engine/controls/cuecontrol.cpp index 8b3203ac4aa6..a2fa4b61cd25 100644 --- a/src/engine/controls/cuecontrol.cpp +++ b/src/engine/controls/cuecontrol.cpp @@ -70,11 +70,9 @@ inline int hotcueNumberToHotcueIndex(int hotcueNumber) { } } -void appendCueHint(HintVector* pHintList, const mixxx::audio::FramePos& frame, Hint::Type type) { - VERIFY_OR_DEBUG_ASSERT(pHintList) { - return; - } - +void appendCueHint(gsl::not_null pHintList, + const mixxx::audio::FramePos& frame, + Hint::Type type) { if (frame.isValid()) { const Hint cueHint = { /*.frame =*/static_cast(frame.toLowerFrameBoundary().value()), @@ -1178,7 +1176,7 @@ void CueControl::hotcueEndPositionChanged( } } -void CueControl::hintReader(HintVector* pHintList) { +void CueControl::hintReader(gsl::not_null pHintList) { appendCueHint(pHintList, m_pCuePoint->get(), Hint::Type::MainCue); // this is called from the engine thread diff --git a/src/engine/controls/cuecontrol.h b/src/engine/controls/cuecontrol.h index 1b674935b1fb..09c2ce637f60 100644 --- a/src/engine/controls/cuecontrol.h +++ b/src/engine/controls/cuecontrol.h @@ -194,7 +194,7 @@ class CueControl : public EngineControl { UserSettingsPointer pConfig); ~CueControl() override; - void hintReader(HintVector* pHintList) override; + void hintReader(gsl::not_null pHintList) override; bool updateIndicatorsAndModifyPlay(bool newPlay, bool oldPlay, bool playPossible); void updateIndicators(); bool isTrackAtIntroCue(); diff --git a/src/engine/controls/enginecontrol.cpp b/src/engine/controls/enginecontrol.cpp index 21c8635f25a3..f1eae53c9808 100644 --- a/src/engine/controls/enginecontrol.cpp +++ b/src/engine/controls/enginecontrol.cpp @@ -36,7 +36,7 @@ void EngineControl::trackBeatsUpdated(mixxx::BeatsPointer pBeats) { Q_UNUSED(pBeats); } -void EngineControl::hintReader(HintVector*) { +void EngineControl::hintReader(gsl::not_null) { } void EngineControl::setEngineMaster(EngineMaster* pEngineMaster) { diff --git a/src/engine/controls/enginecontrol.h b/src/engine/controls/enginecontrol.h index d155568a61b6..afc6617f8559 100644 --- a/src/engine/controls/enginecontrol.h +++ b/src/engine/controls/enginecontrol.h @@ -4,6 +4,7 @@ #include #include +#include #include "audio/frame.h" #include "control/controlvalue.h" @@ -53,7 +54,7 @@ class EngineControl : public QObject { // hintReader allows the EngineControl to provide hints to the reader to // indicate that the given portion of a song is a potential imminent seek // target. - virtual void hintReader(HintVector* pHintList); + virtual void hintReader(gsl::not_null pHintList); virtual void setEngineMaster(EngineMaster* pEngineMaster); void setEngineBuffer(EngineBuffer* pEngineBuffer); diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index 7e2507ed8ce7..3728c7880403 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -474,7 +474,7 @@ mixxx::audio::FramePos LoopingControl::nextTrigger(bool reverse, return mixxx::audio::kInvalidFramePos; } -void LoopingControl::hintReader(HintVector* pHintList) { +void LoopingControl::hintReader(gsl::not_null pHintList) { LoopInfo loopInfo = m_loopInfo.getValue(); Hint loop_hint; // If the loop is enabled, then this is high priority because we will loop diff --git a/src/engine/controls/loopingcontrol.h b/src/engine/controls/loopingcontrol.h index 37cde375882b..887634a1f371 100644 --- a/src/engine/controls/loopingcontrol.h +++ b/src/engine/controls/loopingcontrol.h @@ -41,7 +41,7 @@ class LoopingControl : public EngineControl { // hintReader will add to hintList hints both the loop in and loop out // sample, if set. - void hintReader(HintVector* pHintList) override; + void hintReader(gsl::not_null pHintList) override; mixxx::audio::FramePos getSyncPositionInsideLoop( mixxx::audio::FramePos requestedPlayPosition, mixxx::audio::FramePos syncedPlayPosition); diff --git a/src/engine/readaheadmanager.cpp b/src/engine/readaheadmanager.cpp index b0be7cd2d368..fb1908c66d2a 100644 --- a/src/engine/readaheadmanager.cpp +++ b/src/engine/readaheadmanager.cpp @@ -188,7 +188,7 @@ void ReadAheadManager::notifySeek(double seekPosition) { // } } -void ReadAheadManager::hintReader(double dRate, HintVector* pHintList) { +void ReadAheadManager::hintReader(double dRate, gsl::not_null pHintList) { bool in_reverse = dRate < 0; Hint current_position; diff --git a/src/engine/readaheadmanager.h b/src/engine/readaheadmanager.h index fa673dcca852..9bc9e796bdb0 100644 --- a/src/engine/readaheadmanager.h +++ b/src/engine/readaheadmanager.h @@ -2,6 +2,7 @@ #include #include +#include #include #include "audio/frame.h" @@ -53,7 +54,7 @@ class ReadAheadManager { /// hintReader allows the ReadAheadManager to provide hints to the reader to /// indicate that the given portion of a song is about to be read. - virtual void hintReader(double dRate, HintVector* hintList); + virtual void hintReader(double dRate, gsl::not_null pHintList); virtual double getFilePlaypositionFromLog( double currentFilePlayposition, diff --git a/tools/debian_buildenv.sh b/tools/debian_buildenv.sh index d478cb0bd730..a3d18f9fc800 100755 --- a/tools/debian_buildenv.sh +++ b/tools/debian_buildenv.sh @@ -60,6 +60,7 @@ case "$1" in libmad0-dev \ libmodplug-dev \ libmp3lame-dev \ + libmsgsl-dev \ libopus-dev \ libopusfile-dev \ libportmidi-dev \