Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ jobs:
with:
# This should always match the minimum required version in
# our CMakeLists.txt
cmake-version: "3.21.x"
cmake-version: "3.22.x"

- name: "[Windows] Set up cmake"
uses: jwlawson/actions-setup-cmake@v2.2
Expand All @@ -137,7 +137,7 @@ jobs:
# This is a workaround for a SSL false positive in cmake 3.26.4
# When downloading the manual. 3.21 is required for installing the
# ANGLE Dlls via IMPORTED_RUNTIME_ARTIFACTS
cmake-version: "3.21.x"
cmake-version: "3.22.x"

- name: "[Windows] Set up MSVC Developer Command Prompt"
if: runner.os == 'Windows'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ jobs:
with:
# This should always match the minimum required version in
# our CMakeLists.txt
cmake-version: "3.21.x"
cmake-version: "3.22.x"

- name: "[Windows] Set up cmake"
uses: jwlawson/actions-setup-cmake@v2.2
Expand Down
118 changes: 113 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.21)
cmake_minimum_required(VERSION 3.22)
# lint_cmake: -readability/wonkycase

message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
Expand Down Expand Up @@ -53,6 +53,11 @@ if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
endif()

# Normalized DESTINATION paths in install()
if(POLICY CMP0177)
cmake_policy(SET CMP0177 NEW)
endif()

if(CMAKE_SYSTEM_NAME STREQUAL Android)
if(NOT DEFINED ENV{JAVA_HOME})
message(FATAL_ERROR "JAVA_HOME is not set. Did you source the setup file?")
Expand Down Expand Up @@ -3275,6 +3280,10 @@ if(ENGINEPRIME)
# statically. This situation should be reviewed once libdjinterop hits version 1.x.
set(LIBDJINTEROP_VERSION 0.27.1)
# Look whether an existing installation of libdjinterop matches the required version.
if(DEFINED ENV{MIXXX_VCPKG_ROOT} OR DEFINED MIXXX_VCPKG_ROOT)
# On the VCPKG version, DjInterop has devendored dependencies, see https://github.com/microsoft/vcpkg/pull/50062
find_package(date CONFIG REQUIRED)
endif()
find_package(DjInterop ${LIBDJINTEROP_VERSION} EXACT CONFIG)
if(NOT DjInterop_FOUND)
find_package(DjInterop ${LIBDJINTEROP_VERSION} EXACT MODULE)
Expand Down Expand Up @@ -3806,6 +3815,10 @@ if(QML)
list(APPEND QT_EXTRA_COMPONENTS "QmlWorkerScript")
endif()
endif()
# Move custom module path at the end, so system and VCPKG ones take precedence (particularly findFFmpeg)
list(POP_FRONT CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")

find_package(
Qt${QT_VERSION_MAJOR}
COMPONENTS ${QT_COMPONENTS} ${QT_EXTRA_COMPONENTS}
Expand Down Expand Up @@ -4695,10 +4708,105 @@ find_package(SoundTouch 2.1.2 REQUIRED)
target_link_libraries(mixxx-lib PRIVATE SoundTouch::SoundTouch)

# TagLib
find_package(TagLib 1.11 REQUIRED)
target_link_libraries(mixxx-lib PUBLIC TagLib::TagLib)
if(QML)
target_link_libraries(mixxx-qml-lib PUBLIC TagLib::TagLib)
if(STEM)
set(TAGLIB_VERSION 2.2)
else()
set(TAGLIB_VERSION 1.11)
endif()
find_package(TagLib ${TAGLIB_VERSION} EXACT)
if(NOT TagLib_FOUND)
set(TAGLIB_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/lib/taglib-install")
set(
TAGLIB_LIBRARY
"lib/${CMAKE_STATIC_LIBRARY_PREFIX}tag${CMAKE_STATIC_LIBRARY_SUFFIX}"
)

# CMake does not pass lists of paths properly to external projects.
# This is worked around by changing the list separator.
string(
REPLACE
";"
"|"
PIPE_DELIMITED_CMAKE_PREFIX_PATH
"${CMAKE_PREFIX_PATH}"
)

include(ProcessorCount)
processorcount(n)
ExternalProject_Add(
taglib
GIT_REPOSITORY "https://github.com/taglib/taglib"
GIT_TAG v2.2
DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR}/downloads"
DOWNLOAD_NAME "taglib-${TAGLIB_VERSION}.tar.gz"
PREFIX "taglib-${TAGLIB_VERSION}"
INSTALL_DIR ${TAGLIB_INSTALL_DIR}
LIST_SEPARATOR "|"
GIT_SUBMODULES "3rdparty/utfcpp"
GIT_SUBMODULES_RECURSE ON
CMAKE_ARGS
-DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON
-DCMAKE_SKIP_INSTALL_ALL_DEPENDENCY=ON
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCMAKE_PREFIX_PATH=${PIPE_DELIMITED_CMAKE_PREFIX_PATH}
-DCMAKE_INSTALL_LIBDIR:PATH=lib
-DCMAKE_MODULE_PATH:PATH=${CMAKE_MODULE_PATH}
-$<IF:$<BOOL:${CMAKE_TOOLCHAIN_FILE}>,D,U>CMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}
-$<IF:$<BOOL:${CMAKE_OSX_DEPLOYMENT_TARGET}>,D,U>CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}
-$<IF:$<BOOL:${CMAKE_OSX_ARCHITECTURES}>,D,U>CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-$<IF:$<BOOL:${CMAKE_ANDROID_NDK}>,D,U>CMAKE_ANDROID_NDK=${CMAKE_ANDROID_NDK}
-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DBUILD_TESTING=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . -j${n}
BUILD_BYPRODUCTS <INSTALL_DIR>/${TAGLIB_LIBRARY}
EXCLUDE_FROM_ALL TRUE
)

# The include folder needs to already exist, otherwise INTERFACE_INCLUDE_DIRECTORIES will not be propagated
file(MAKE_DIRECTORY "${TAGLIB_INSTALL_DIR}/include/taglib")

# Assemble a library based on the external project.
add_library(mixxx-taglib STATIC IMPORTED)
set_target_properties(
mixxx-taglib
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${TAGLIB_INSTALL_DIR}/include/taglib"
IMPORTED_LOCATION "${TAGLIB_INSTALL_DIR}/${TAGLIB_LIBRARY}"
)
add_dependencies(mixxx-taglib taglib)
# Add the local include directory explicitly before linking the library
# to make sure not the system provided headers are used
target_include_directories(
mixxx-lib
BEFORE
PRIVATE "${TAGLIB_INSTALL_DIR}/include/taglib"
)
target_include_directories(
mixxx
BEFORE
PRIVATE "${TAGLIB_INSTALL_DIR}/include/taglib"
)
if(BUILD_TESTING)
target_include_directories(
mixxx-test
BEFORE
PRIVATE "${TAGLIB_INSTALL_DIR}/include/taglib"
)
endif()
target_link_libraries(mixxx-lib PUBLIC mixxx-taglib)
if(QML)
target_link_libraries(mixxx-qml-lib PUBLIC mixxx-taglib)
endif()
else()
target_link_libraries(mixxx-lib PUBLIC TagLib::TagLib)
if(QML)
target_link_libraries(mixxx-qml-lib PUBLIC TagLib::TagLib)
endif()
endif()

# Threads
Expand Down
8 changes: 8 additions & 0 deletions res/schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -593,4 +593,12 @@ reapplying those migrations.
ALTER TABLE library ADD COLUMN tuning_frequency_hz FLOAT DEFAULT 0.0;
</sql>
</revision>
<revision version="41" min_compatible="3">
<description>
Add stems column to library table
</description>
<sql>
ALTER TABLE Library ADD COLUMN stems BLOB;
</sql>
</revision>
</schema>
2 changes: 1 addition & 1 deletion src/analyzer/analyzerwaveform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ bool AnalyzerWaveform::shouldAnalyze(TrackPointer pTrack) const {
ConstWaveformPointer pLoadedTrackWaveform;
ConstWaveformPointer pLoadedTrackWaveformSummary;
#ifdef __STEM__
bool isStemTrack = !pTrack->getStemInfo().isEmpty();
bool isStemTrack = pTrack->getStemInfo().isValid();
#endif

TrackId trackId = pTrack->getId();
Expand Down
7 changes: 7 additions & 0 deletions src/database/mixxxdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@
const QString MixxxDb::kDefaultSchemaFile(":/schema.xml");

//static
#ifdef __STEM__
const int MixxxDb::kRequiredSchemaVersion = 41;
#else
// Not applying the DB migration for stem if those aren't in used. In case a new
// DB migration comes available, we will need to apply the STEM migration
// unconditionally.
const int MixxxDb::kRequiredSchemaVersion = 40;
#endif

namespace {

Expand Down
37 changes: 37 additions & 0 deletions src/library/dao/trackdao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
#include <QThread>
#include <QtDebug>

#ifdef __STEM__
#include "track/steminfo.h"
#endif

#ifdef __SQLITE3__
#include <sqlite3.h>
#endif // __SQLITE3__
Expand Down Expand Up @@ -475,6 +479,9 @@ void TrackDAO::addTracksPrepare() {
"beats_version,"
"beats_sub_version,"
"beats,"
#ifdef __STEM__
"stems,"
#endif
"bpm_lock,"
"keys_version,"
"keys_sub_version,"
Expand Down Expand Up @@ -524,6 +531,9 @@ void TrackDAO::addTracksPrepare() {
":beats_version,"
":beats_sub_version,"
":beats,"
#ifdef __STEM__
":stems,"
#endif
":bpm_lock,"
":keys_version,"
":keys_sub_version,"
Expand Down Expand Up @@ -672,6 +682,14 @@ void bindTrackLibraryValues(
pTrackLibraryQuery->bindValue(":beats_sub_version", beatsSubVersion);
pTrackLibraryQuery->bindValue(":beats", beatsBlob);

#ifdef __STEM__
QByteArray steamInfoBlob;
if (trackMetadata.getStemInfo().isValid()) {
steamInfoBlob = trackMetadata.getStemInfo().toByteArray();
}
pTrackLibraryQuery->bindValue(":stems", steamInfoBlob);
#endif

const Keys keys = track.getKeys();
QByteArray keysBlob = keys.toByteArray();
QString keysVersion = keys.getVersion();
Expand Down Expand Up @@ -1326,6 +1344,18 @@ void setTrackBeats(const QSqlRecord& record, const int column, Track* pTrack) {
}
}

#ifdef __STEM__
void setTrackStems(const QSqlRecord& record, const int column, Track* pTrack) {
QByteArray stemsBlob = record.value(column).toByteArray();
if (stemsBlob.isEmpty()) {
return;
}
const auto stemInfo = mixxx::StemInfo::fromByteArray(
stemsBlob);
pTrack->trySetStemInfo(stemInfo);
}
#endif

void setTrackKey(const QSqlRecord& record, const int column, Track* pTrack) {
QString keyText = record.value(column).toString();
QString keysVersion = record.value(column + 1).toString();
Expand Down Expand Up @@ -1428,6 +1458,10 @@ TrackPointer TrackDAO::getTrackById(TrackId trackId) const {
{"beats", nullptr},
{"bpm_lock", nullptr},

#ifdef __STEM__
{"stems", setTrackStems},
#endif

// Key detection columns are handled by setTrackKey. Do not change the
// ordering of these columns or put other columns in between them!
{"key", setTrackKey},
Expand Down Expand Up @@ -1731,6 +1765,9 @@ bool TrackDAO::updateTrack(const Track& track) const {
"beats_version=:beats_version,"
"beats_sub_version=:beats_sub_version,"
"beats=:beats,"
#ifdef __STEM__
"stems=:stems,"
#endif
"bpm_lock=:bpm_lock,"
"keys_version=:keys_version,"
"keys_sub_version=:keys_sub_version,"
Expand Down
Loading