diff --git a/.kdev4/lmms.kdev4 b/.kdev4/lmms.kdev4 new file mode 100644 index 00000000000..f5f1beb60bb --- /dev/null +++ b/.kdev4/lmms.kdev4 @@ -0,0 +1,18 @@ +[Buildset] +BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00l\x00m\x00m\x00s) + +[CMake] +Build Directory Count=1 +Current Build Directory Index=0 +ProjectRootRelative=./ + +[CMake][CMake Build Directory 0] +Build Directory Path=file:///home/rob/git/forks/lmms/build +Build Type=Debug +CMake Binary=file:///usr/bin/cmake +Environment Profile= +Extra Arguments=-DCMAKE_PREFIX_PATH=/opt/qt510 +Install Directory= + +[Project] +VersionControlSupport=kdevgit diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c67e9316c7..2bb08401d3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -560,6 +560,8 @@ IF(USE_CCACHE) ENDIF() ENDIF() +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse") + # make sub-directories ADD_SUBDIRECTORY(cmake) ADD_SUBDIRECTORY(src) diff --git a/CMakeLists.txt.bak b/CMakeLists.txt.bak new file mode 100644 index 00000000000..6c67e9316c7 --- /dev/null +++ b/CMakeLists.txt.bak @@ -0,0 +1,702 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.1.0) + +PROJECT(lmms) + +SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" ${CMAKE_MODULE_PATH}) + +IF(COMMAND CMAKE_POLICY) + CMAKE_POLICY(SET CMP0005 NEW) + CMAKE_POLICY(SET CMP0003 NEW) + IF (CMAKE_MAJOR_VERSION GREATER 2) + CMAKE_POLICY(SET CMP0026 NEW) + CMAKE_POLICY(SET CMP0045 NEW) + CMAKE_POLICY(SET CMP0050 OLD) + ENDIF() + CMAKE_POLICY(SET CMP0020 NEW) +ENDIF(COMMAND CMAKE_POLICY) + +INCLUDE(CheckSubmodules) +INCLUDE(AddFileDependencies) +INCLUDE(CheckIncludeFiles) +INCLUDE(FindPkgConfig) + +STRING(TOUPPER "${CMAKE_PROJECT_NAME}" PROJECT_NAME_UCASE) + +SET(PROJECT_YEAR 2018) + +SET(PROJECT_AUTHOR "LMMS Developers") +SET(PROJECT_URL "https://lmms.io") +SET(PROJECT_EMAIL "lmms-devel@lists.sourceforge.net") +SET(PROJECT_DESCRIPTION "${PROJECT_NAME_UCASE} - Free music production software") +SET(PROJECT_COPYRIGHT "2008-${PROJECT_YEAR} ${PROJECT_AUTHOR}") +SET(VERSION_MAJOR "1") +SET(VERSION_MINOR "2") +SET(VERSION_RELEASE "0") +SET(VERSION_STAGE "rc5") +SET(VERSION_BUILD "0") +SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_RELEASE}") +IF(VERSION_STAGE) + SET(VERSION "${VERSION}-${VERSION_STAGE}") +ENDIF() +IF(VERSION_BUILD) + SET(VERSION "${VERSION}.${VERSION_BUILD}") +ENDIF() + +# Override version information for non-base builds +INCLUDE(VersionInfo) +INCLUDE(DetectMachine) + + +OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" ON) +OPTION(WANT_CALF "Include CALF LADSPA plugins" ON) +OPTION(WANT_CAPS "Include C* Audio Plugin Suite (LADSPA plugins)" ON) +OPTION(WANT_CARLA "Include Carla plugin" ON) +OPTION(WANT_CMT "Include Computer Music Toolkit LADSPA plugins" ON) +OPTION(WANT_JACK "Include JACK (Jack Audio Connection Kit) support" ON) +OPTION(WANT_WEAKJACK "Loosely link JACK libraries" ON) +OPTION(WANT_MP3LAME "Include MP3/Lame support" ON) +OPTION(WANT_OGGVORBIS "Include OGG/Vorbis support" ON) +OPTION(WANT_PULSEAUDIO "Include PulseAudio support" ON) +OPTION(WANT_PORTAUDIO "Include PortAudio support" ON) +OPTION(WANT_SOUNDIO "Include libsoundio support" ON) +OPTION(WANT_SDL "Include SDL (Simple DirectMedia Layer) support" ON) +OPTION(WANT_SF2 "Include SoundFont2 player plugin" ON) +OPTION(WANT_GIG "Include GIG player plugin" ON) +OPTION(WANT_STK "Include Stk (Synthesis Toolkit) support" ON) +OPTION(WANT_SWH "Include Steve Harris's LADSPA plugins" ON) +OPTION(WANT_TAP "Include Tom's Audio Processing LADSPA plugins" ON) +OPTION(WANT_VST "Include VST support" ON) +OPTION(WANT_VST_NOWINE "Include partial VST support (without wine)" OFF) +OPTION(WANT_WINMM "Include WinMM MIDI support" OFF) +OPTION(WANT_DEBUG_FPE "Debug floating point exceptions" OFF) + + +IF(LMMS_BUILD_APPLE) + SET(WANT_ALSA OFF) + SET(WANT_PULSEAUDIO OFF) + SET(WANT_VST OFF) + SET(STATUS_ALSA "") + SET(STATUS_PULSEAUDIO "") + SET(STATUS_APPLEMIDI "OK") +ELSE(LMMS_BUILD_APPLE) + SET(STATUS_APPLEMIDI "") +ENDIF(LMMS_BUILD_APPLE) + + +IF(LMMS_BUILD_WIN32) + SET(WANT_ALSA OFF) + SET(WANT_JACK OFF) + SET(WANT_PULSEAUDIO OFF) + SET(WANT_PORTAUDIO OFF) + SET(WANT_SOUNDIO OFF) + SET(WANT_WINMM ON) + SET(LMMS_HAVE_WINMM TRUE) + SET(STATUS_ALSA "") + SET(STATUS_JACK "") + SET(STATUS_PULSEAUDIO "") + SET(STATUS_PORTAUDIO "") + SET(STATUS_SOUNDIO "") + SET(STATUS_WINMM "OK") + SET(STATUS_APPLEMIDI "") +ELSE(LMMS_BUILD_WIN32) + SET(STATUS_WINMM "") +ENDIF(LMMS_BUILD_WIN32) + + +# TODO: Fix linking issues with msys debug builds +IF(LMMS_BUILD_MSYS AND CMAKE_BUILD_TYPE STREQUAL "Debug") + SET(WANT_GIG OFF) + SET(WANT_STK OFF) + SET(WANT_SWH OFF) + SET(STATUS_GIG "not built as requested") + SET(STATUS_STK "not built as requested") +ENDIF() + +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +CHECK_INCLUDE_FILES(stdint.h LMMS_HAVE_STDINT_H) +CHECK_INCLUDE_FILES(stdlib.h LMMS_HAVE_STDLIB_H) +CHECK_INCLUDE_FILES(pthread.h LMMS_HAVE_PTHREAD_H) +CHECK_INCLUDE_FILES(semaphore.h LMMS_HAVE_SEMAPHORE_H) +CHECK_INCLUDE_FILES(unistd.h LMMS_HAVE_UNISTD_H) +CHECK_INCLUDE_FILES(sys/types.h LMMS_HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILES(sys/ipc.h LMMS_HAVE_SYS_IPC_H) +CHECK_INCLUDE_FILES(sys/shm.h LMMS_HAVE_SYS_SHM_H) +CHECK_INCLUDE_FILES(sys/time.h LMMS_HAVE_SYS_TIME_H) +CHECK_INCLUDE_FILES(sys/times.h LMMS_HAVE_SYS_TIMES_H) +CHECK_INCLUDE_FILES(sched.h LMMS_HAVE_SCHED_H) +CHECK_INCLUDE_FILES(sys/soundcard.h LMMS_HAVE_SYS_SOUNDCARD_H) +CHECK_INCLUDE_FILES(soundcard.h LMMS_HAVE_SOUNDCARD_H) +CHECK_INCLUDE_FILES(fcntl.h LMMS_HAVE_FCNTL_H) +CHECK_INCLUDE_FILES(sys/ioctl.h LMMS_HAVE_SYS_IOCTL_H) +CHECK_INCLUDE_FILES(ctype.h LMMS_HAVE_CTYPE_H) +CHECK_INCLUDE_FILES(string.h LMMS_HAVE_STRING_H) +CHECK_INCLUDE_FILES(process.h LMMS_HAVE_PROCESS_H) +CHECK_INCLUDE_FILES(locale.h LMMS_HAVE_LOCALE_H) + +LIST(APPEND CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}") + +FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Xml REQUIRED) +FIND_PACKAGE(Qt5 COMPONENTS LinguistTools QUIET) + +INCLUDE_DIRECTORIES( + ${Qt5Core_INCLUDE_DIRS} + ${Qt5Gui_INCLUDE_DIRS} + ${Qt5Widgets_INCLUDE_DIRS} + ${Qt5Xml_INCLUDE_DIRS} +) + +SET(QT_LIBRARIES + Qt5::Core + Qt5::Gui + Qt5::Widgets + Qt5::Xml +) + +IF(LMMS_BUILD_LINUX) + FIND_PACKAGE(Qt5 COMPONENTS X11Extras REQUIRED) + LIST(APPEND QT_LIBRARIES Qt5::X11Extras) +ENDIF() + +# Resolve Qt5::qmake to full path for use in packaging scripts +GET_TARGET_PROPERTY(QT_QMAKE_EXECUTABLE "${Qt5Core_QMAKE_EXECUTABLE}" IMPORTED_LOCATION) + +FIND_PACKAGE(Qt5Test) +SET(QT_QTTEST_LIBRARY Qt5::Test) + +# check for libsndfile +PKG_CHECK_MODULES(SNDFILE REQUIRED sndfile>=1.0.18) +IF(NOT SNDFILE_FOUND) + MESSAGE(FATAL_ERROR "LMMS requires libsndfile1 and libsndfile1-dev >= 1.0.18 - please install, remove CMakeCache.txt and try again!") +ENDIF() +# check if we can use SF_SET_COMPRESSION_LEVEL +IF(NOT SNDFILE_VERSION VERSION_LESS 1.0.26) + SET(LMMS_HAVE_SF_COMPLEVEL TRUE) +ENDIF() + +IF(WANT_CALF) + SET(LMMS_HAVE_CALF TRUE) + SET(STATUS_CALF "OK") +ELSE(WANT_CALF) + SET(STATUS_CALF "not built as requested") +ENDIF(WANT_CALF) + +IF(WANT_CAPS) + SET(LMMS_HAVE_CAPS TRUE) + SET(STATUS_CAPS "OK") +ELSE(WANT_CAPS) + SET(STATUS_CAPS "not built as requested") +ENDIF(WANT_CAPS) + +IF(WANT_CMT) + SET(LMMS_HAVE_CMT TRUE) + SET(STATUS_CMT "OK") +ELSE(WANT_CMT) + SET(STATUS_CMT "not built as requested") +ENDIF(WANT_CMT) + +IF(WANT_SWH) + SET(LMMS_HAVE_SWH TRUE) + SET(STATUS_SWH "OK") +ELSE(WANT_SWH) + SET(STATUS_SWH "not built as requested") +ENDIF(WANT_SWH) + +IF(WANT_TAP) + SET(LMMS_HAVE_TAP TRUE) + SET(STATUS_TAP "OK") +ELSE(WANT_TAP) + SET(STATUS_TAP "not built as requested") +ENDIF(WANT_TAP) + + +# check for CARLA +IF(WANT_CARLA) + PKG_CHECK_MODULES(CARLA carla-standalone>=1.9.5) + IF(CARLA_FOUND) + SET(LMMS_HAVE_CARLA TRUE) + SET(STATUS_CARLA "OK") + ELSE(CARLA_FOUND) + SET(STATUS_CARLA "not found, please install the latest carla") + ENDIF(CARLA_FOUND) +ENDIF(WANT_CARLA) + + +# check for SDL2 +IF(WANT_SDL) + SET(SDL2_BUILDING_LIBRARY TRUE) + FIND_PACKAGE(SDL2) + IF(SDL2_FOUND) + SET(LMMS_HAVE_SDL TRUE) + SET(LMMS_HAVE_SDL2 TRUE) + SET(STATUS_SDL "OK, using SDL2") + SET(SDL_INCLUDE_DIR "") + SET(SDL_LIBRARY "") + ELSE() + SET(SDL2_INCLUDE_DIR "") + SET(SDL2_LIBRARY "") + ENDIF() +ENDIF() + +# fallback to SDL1 +IF(WANT_SDL AND NOT LMMS_HAVE_SDL2) + # Fallback to SDL1.2 + SET(SDL_BUILDING_LIBRARY TRUE) + FIND_PACKAGE(SDL) + IF(SDL_FOUND) + SET(LMMS_HAVE_SDL TRUE) + SET(STATUS_SDL "OK, using SDL1.2") + # fix mingw since 53abd65 + IF(NOT SDL_INCLUDE_DIR) + SET(SDL_INCLUDE_DIR "${CMAKE_FIND_ROOT_PATH}/include") + ENDIF() + + ELSE() + SET(STATUS_SDL "not found, please install libsdl2-dev (or similar) " + "if you require SDL support") + SET(SDL_INCLUDE_DIR "") + SET(SDL_LIBRARY "") + ENDIF() +ENDIF() + +# check for Stk +IF(WANT_STK) + FIND_PACKAGE(STK) + IF(STK_FOUND) + SET(LMMS_HAVE_STK TRUE) + SET(STATUS_STK "OK") + ELSE(STK_FOUND) + SET(STK_INCLUDE_DIR "") + SET(STATUS_STK "not found, please install libstk0-dev (or similar) " + "if you require the Mallets instrument") + ENDIF(STK_FOUND) +ENDIF(WANT_STK) + + +# check for PortAudio +IF(WANT_PORTAUDIO) + FIND_PACKAGE(Portaudio) + IF(PORTAUDIO_FOUND) + SET(LMMS_HAVE_PORTAUDIO TRUE) + SET(STATUS_PORTAUDIO "OK") + ELSE(PORTAUDIO_FOUND) + SET(STATUS_PORTAUDIO "not found, please install portaudio19-dev (or similar, version >= 1.9) " + "if you require PortAudio support") + ENDIF(PORTAUDIO_FOUND) +ENDIF(WANT_PORTAUDIO) + +# check for libsoundio +IF(WANT_SOUNDIO) + FIND_PACKAGE(SoundIo) + IF(SOUNDIO_FOUND) + SET(LMMS_HAVE_SOUNDIO TRUE) + SET(STATUS_SOUNDIO "OK") + INCLUDE_DIRECTORIES("${SOUNDIO_INCLUDE_DIR}") + ELSE(SOUNDIO_FOUND) + SET(SOUNDIO_INCLUDE_DIR "") + SET(STATUS_SOUNDIO "not found, please install libsoundio if you require libsoundio support") + SET(SOUNDIO_LIBRARY "") + ENDIF(SOUNDIO_FOUND) +ENDIF(WANT_SOUNDIO) + + +# check for PulseAudio +IF(WANT_PULSEAUDIO) + FIND_PACKAGE(PulseAudio) + IF(PULSEAUDIO_FOUND) + SET(LMMS_HAVE_PULSEAUDIO TRUE) + SET(STATUS_PULSEAUDIO "OK") + ELSE(PULSEAUDIO_FOUND) + SET(STATUS_PULSEAUDIO "not found, please install libpulse-dev (or similar) " + "if you require PulseAudio support") + ENDIF(PULSEAUDIO_FOUND) +ENDIF(WANT_PULSEAUDIO) +IF(NOT LMMS_HAVE_PULSEAUDIO) + SET(PULSEAUDIO_INCLUDE_DIR "") + SET(PULSEAUDIO_LIBRARIES "") +ENDIF(NOT LMMS_HAVE_PULSEAUDIO) + + +# check for MP3/Lame-libraries +IF(WANT_MP3LAME) + FIND_PACKAGE(Lame) + IF(LAME_FOUND) + SET(LMMS_HAVE_MP3LAME TRUE) + SET(STATUS_MP3LAME "OK") + ELSE(LAME_FOUND) + SET(STATUS_MP3LAME "not found, please install libmp3lame-dev (or similar)") + SET(LAME_LIBRARIES "") + SET(LAME_INCLUDE_DIRS "") + ENDIF(LAME_FOUND) +ELSE(WANT_MP3LAME) + SET(STATUS_MP3LAME "Disabled for build") +ENDIF(WANT_MP3LAME) + +# check for OGG/Vorbis-libraries +IF(WANT_OGGVORBIS) + FIND_PACKAGE(OggVorbis) + IF(OGGVORBIS_FOUND) + SET(LMMS_HAVE_OGGVORBIS TRUE) + SET(STATUS_OGGVORBIS "OK") + ELSE(OGGVORBIS_FOUND) + SET(STATUS_OGGVORBIS "not found, libogg-dev and libvorbis-dev (or similar) " + "is highly recommended") + ENDIF(OGGVORBIS_FOUND) +ENDIF(WANT_OGGVORBIS) + + +# check whether to enable OSS-support +IF(LMMS_HAVE_SOUNDCARD_H OR LMMS_HAVE_SYS_SOUNDCARD_H) + SET(LMMS_HAVE_OSS TRUE) + SET(STATUS_OSS "OK") +ELSE(LMMS_HAVE_SOUNDCARD_H OR LMMS_HAVE_SYS_SOUNDCARD_H) + SET(STATUS_OSS "") +ENDIF(LMMS_HAVE_SOUNDCARD_H OR LMMS_HAVE_SYS_SOUNDCARD_H) + + +# check for ALSA +IF(WANT_ALSA) + FIND_PACKAGE(Alsa) + IF(ALSA_FOUND) + SET(LMMS_HAVE_ALSA TRUE) + SET(STATUS_ALSA "OK") + ELSE(ALSA_FOUND) + SET(STATUS_ALSA "not found, please install libasound2-dev (or similar) " + "if you require ALSA support") + ENDIF(ALSA_FOUND) +ENDIF(WANT_ALSA) +IF(NOT LMMS_HAVE_ALSA) + SET(ASOUND_LIBRARY "") +ENDIF(NOT LMMS_HAVE_ALSA) + + +# check for JACK +IF(WANT_JACK) + PKG_CHECK_MODULES(JACK jack>=0.77) + IF(JACK_FOUND) + IF(WANT_WEAKJACK) + SET(LMMS_HAVE_WEAKJACK TRUE) + SET(WEAKJACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/weakjack/weakjack) + SET(STATUS_JACK "OK (weak linking enabled)") + SET(JACK_INCLUDE_DIRS "") + # use dlsym instead + SET(JACK_LIBRARIES ${CMAKE_DL_LIBS}) + ELSE() + SET(STATUS_JACK "OK") + ENDIF() + SET(LMMS_HAVE_JACK TRUE) + ELSE(JACK_FOUND) + SET(STATUS_JACK "not found, please install libjack0.100.0-dev (or similar) " + "if you require JACK support") + ENDIF(JACK_FOUND) +ENDIF(WANT_JACK) + + +# check for FFTW3F-library +PKG_CHECK_MODULES(FFTW3F REQUIRED fftw3f>=3.0.0) + + +# check for FLTK +FIND_PACKAGE(FLTK) +IF(FLTK_FOUND) + SET(STATUS_ZYN "OK") +ELSE() + SET(STATUS_ZYN "not found, please install fltk") +ENDIF() + +# check for Fluidsynth +IF(WANT_SF2) + PKG_CHECK_MODULES(FLUIDSYNTH fluidsynth>=1.0.7) + IF(FLUIDSYNTH_FOUND) + SET(LMMS_HAVE_FLUIDSYNTH TRUE) + SET(STATUS_FLUIDSYNTH "OK") + ELSE(FLUIDSYNTH_FOUND) + SET(STATUS_FLUIDSYNTH "not found, libfluidsynth-dev (or similar)" + "is highly recommended") + ENDIF(FLUIDSYNTH_FOUND) +ENDIF(WANT_SF2) + +# check for libgig +If(WANT_GIG) + PKG_CHECK_MODULES(GIG gig) + IF(GIG_FOUND) + SET(LMMS_HAVE_GIG TRUE) + SET(STATUS_GIG "OK") + ELSE(GIG_FOUND) + SET(STATUS_GIG "not found, libgig needed for decoding .gig files") + ENDIF(GIG_FOUND) +ENDIF(WANT_GIG) + +# check for pthreads +IF(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE OR LMMS_BUILD_OPENBSD) + FIND_PACKAGE(Threads) +ENDIF(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE OR LMMS_BUILD_OPENBSD) + +# check for sndio (openbsd only, roaraudio won't work yet) +FIND_PACKAGE(Sndio) +IF(LMMS_BUILD_OPENBSD AND SNDIO_FOUND) + SET(LMMS_HAVE_SNDIO TRUE) + SET(STATUS_SNDIO "OK") +ELSE() + SET(STATUS_SNDIO "") + SET(SNDIO_LIBRARY "") +ENDIF() + +# check for WINE +IF(WANT_VST) + FIND_PACKAGE(Wine) + IF(WINE_FOUND) + SET(LMMS_SUPPORT_VST TRUE) + IF(WINE_LIBRARY_FIX) + SET(STATUS_VST "OK, with workaround linking ${WINE_LIBRARY_FIX}") + ELSE() + SET(STATUS_VST "OK") + ENDIF() + ELSEIF(WANT_VST_NOWINE) + SET(LMMS_SUPPORT_VST TRUE) + SET(STATUS_VST "OK") + ELSE(WINE_FOUND) + SET(STATUS_VST "not found, please install (lib)wine-dev (or similar) - 64 bit systems additionally need gcc-multilib and g++-multilib") + ENDIF(WINE_FOUND) +ENDIF(WANT_VST) +IF(LMMS_BUILD_WIN32) + SET(LMMS_SUPPORT_VST TRUE) + SET(STATUS_VST "OK") +ENDIF(LMMS_BUILD_WIN32) + +IF(WANT_DEBUG_FPE) + IF(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE) + SET(LMMS_DEBUG_FPE TRUE) + SET (STATUS_DEBUG_FPE "Enabled") + ELSE() + SET (STATUS_DEBUG_FPE "Wanted but disabled due to unsupported platform") + ENDIF() +ELSE() + SET (STATUS_DEBUG_FPE "Disabled") +ENDIF(WANT_DEBUG_FPE) + +# check for libsamplerate +PKG_CHECK_MODULES(SAMPLERATE REQUIRED samplerate>=0.1.8) + +# set compiler flags +IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|AppleClang") + SET(WERROR_FLAGS "-Wall -Werror=unused-function -Wno-sign-compare -Wno-strict-overflow") + OPTION(USE_WERROR "Add -werror to the build flags. Stops the build on warnings" OFF) + IF(${USE_WERROR}) + SET(WERROR_FLAGS "${WERROR_FLAGS} -Werror") + ENDIF() + + # Due to a regression in gcc-4.8.X, we need to disable array-bounds check + IF (CMAKE_COMPILER_IS_GNUCXX AND ((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.8.0") OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.8.0") OR LMMS_BUILD_WIN32)) + SET(WERROR_FLAGS "${WERROR_FLAGS} -Wno-array-bounds") + ENDIF() +ELSEIF(MSVC) + # Remove any existing /W flags + STRING(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + SET(WERROR_FLAGS "/W2") + IF(${USE_WERROR}) + SET(WERROR_FLAGS "${WERROR_FLAGS} /WX") + ENDIF() +ENDIF() + + +IF(NOT CMAKE_BUILD_TYPE) + message(STATUS "Setting build type to 'Release' as none was specified.") + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui + SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" + "MinSizeRel" "RelWithDebInfo") +ENDIF() + +SET(CMAKE_C_FLAGS "${WERROR_FLAGS} ${CMAKE_C_FLAGS}") +SET(CMAKE_CXX_FLAGS "${WERROR_FLAGS} ${CMAKE_CXX_FLAGS}") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DLMMS_DEBUG") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLMMS_DEBUG") + + +# people simply updating git will still have this and mess up build with it +FILE(REMOVE include/lmmsconfig.h) + +FILE(GLOB LMMS_INCLUDES "${CMAKE_SOURCE_DIR}/include/*.h") +LIST(SORT LMMS_INCLUDES) + +# Get list of all committers from git history, ordered by number of commits. +# The CONTRIBUTORS file is used by AboutDialog. This information can be provided +# with -DCONTRIBUTORS=/path/to/CONTRIBUTORS instead. For instance, to generate +# this file for version 1.1.3, the command is: +# git shortlog -sne v1.1.3 | cut -c8- +FIND_PACKAGE(Git) +IF(GIT_FOUND AND NOT CONTRIBUTORS) + SET(CONTRIBUTORS "${CMAKE_BINARY_DIR}/CONTRIBUTORS") + EXECUTE_PROCESS( + COMMAND "${GIT_EXECUTABLE}" shortlog -sne + COMMAND cut -c8- + OUTPUT_FILE "${CONTRIBUTORS}" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + TIMEOUT 1) +ENDIF() + +# we somehow have to make LMMS-binary depend on MOC-files +ADD_FILE_DEPENDENCIES("${CMAKE_BINARY_DIR}/lmmsconfig.h") + +IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|AppleClang") + IF(WIN32) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes") + ELSE(WIN32) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -DPIC") + ENDIF(WIN32) +ENDIF() + +# use ccache +OPTION(USE_CCACHE "Use ccache for compilation" OFF) +IF(USE_CCACHE) + FIND_PROGRAM(CCACHE ccache) + IF (CCACHE) + MESSAGE(STATUS "Using ccache found in PATH") + SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + ELSE() + MESSAGE(WARNING "USE_CCACHE enabled, but no ccache found") + ENDIF() +ENDIF() + +# make sub-directories +ADD_SUBDIRECTORY(cmake) +ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(plugins) +ADD_SUBDIRECTORY(tests) +ADD_SUBDIRECTORY(data) +ADD_SUBDIRECTORY(doc) + +# post-install tasks +ADD_SUBDIRECTORY(cmake/postinstall) + +ADD_CUSTOM_COMMAND(OUTPUT "${CMAKE_BINARY_DIR}/lmms.1.gz" + COMMAND gzip -c ${CMAKE_SOURCE_DIR}/doc/lmms.1 > ${CMAKE_BINARY_DIR}/lmms.1.gz + DEPENDS "${CMAKE_SOURCE_DIR}/doc/lmms.1" + COMMENT "Generating lmms.1.gz" + VERBATIM) + + +ADD_CUSTOM_TARGET(manpage ALL + DEPENDS "${CMAKE_BINARY_DIR}/lmms.1.gz") + +# install headers + +IF(LMMS_BUILD_LINUX) + INSTALL(FILES ${LMMS_INCLUDES} + "${CMAKE_BINARY_DIR}/lmmsconfig.h" + "${CMAKE_BINARY_DIR}/lmmsversion.h" + "${CMAKE_SOURCE_DIR}/src/gui/embed.cpp" + DESTINATION "${CMAKE_INSTALL_PREFIX}/include/lmms/") +ENDIF(LMMS_BUILD_LINUX) + +# package ZynAddSubFX into win32 build +IF(LMMS_BUILD_WIN32) + IF(EXISTS "${CMAKE_SOURCE_DIR}/extras") + ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/extras/data/presets") + FILE(GLOB ZASF_BINARIES + "${CMAKE_SOURCE_DIR}/extras/plugins/zynaddsubfx/zynaddsubfx.dll" + "${CMAKE_SOURCE_DIR}/extras/plugins/zynaddsubfx/remote_zynaddsubfx.exe") + LIST(SORT ZASF_BINARIES) + INSTALL(FILES "${ZASF_BINARIES}" DESTINATION "${PLUGIN_DIR}") + ENDIF(EXISTS "${CMAKE_SOURCE_DIR}/extras") +ENDIF(LMMS_BUILD_WIN32) + +# +# add distclean-target +# +ADD_CUSTOM_TARGET(distclean + COMMAND make clean + COMMAND rm -rf `find -name cmake_install.cmake` `find -name Makefile` `find -type d -name CMakeFiles` CMakeCache.txt lmmsconfig.h lmms.1.gz) + +# +# add tarball-target +# +SET(TMP "lmms-${VERSION}") +ADD_CUSTOM_TARGET(dist + COMMAND make clean + COMMAND rm -rf "${TMP}" + COMMAND mkdir -p "${TMP}" + COMMAND cp CMakeLists.txt LICENSE.txt INSTALL.txt README.md "${TMP}" + COMMAND cp -r buildtools cmake data doc include plugins src "${TMP}" + COMMAND rm -rf `find "${TMP}" -name cmake_install.cmake` `find "${TMP}" -name Makefile` `find "${TMP}" -type d -name CMakeFiles` "${TMP}/CMakeCache.txt" + COMMAND tar cjf lmms-${VERSION}-src.tar.bz2 "${TMP}" + COMMAND rm -rf "${TMP}") + +# +# display configuration information +# + +MESSAGE("\n" +"Installation Summary\n" +"--------------------\n" +"* Install Directory : ${CMAKE_INSTALL_PREFIX}\n" +) + +MESSAGE( +"Supported audio interfaces\n" +"--------------------------\n" +"* ALSA : ${STATUS_ALSA}\n" +"* JACK : ${STATUS_JACK}\n" +"* OSS : ${STATUS_OSS}\n" +"* Sndio : ${STATUS_SNDIO}\n" +"* PortAudio : ${STATUS_PORTAUDIO}\n" +"* libsoundio : ${STATUS_SOUNDIO}\n" +"* PulseAudio : ${STATUS_PULSEAUDIO}\n" +"* SDL : ${STATUS_SDL}\n" +) + +MESSAGE( +"Supported MIDI interfaces\n" +"-------------------------\n" +"* ALSA : ${STATUS_ALSA}\n" +"* OSS : ${STATUS_OSS}\n" +"* Sndio : ${STATUS_SNDIO}\n" +"* JACK : ${STATUS_JACK}\n" +"* WinMM : ${STATUS_WINMM}\n" +"* AppleMidi : ${STATUS_APPLEMIDI}\n" +) + +MESSAGE( +"Supported file formats for project export\n" +"-----------------------------------------\n" +"* WAVE : OK\n" +"* FLAC : OK\n" +"* OGG/VORBIS : ${STATUS_OGGVORBIS}\n" +"* MP3/Lame : ${STATUS_MP3LAME}\n" +) + +MESSAGE( +"Optional plugins\n" +"----------------\n" +"* ZynAddSubFX instrument : ${STATUS_ZYN}\n" +"* Carla Patchbay & Rack : ${STATUS_CARLA}\n" +"* SoundFont2 player : ${STATUS_FLUIDSYNTH}\n" +"* Stk Mallets : ${STATUS_STK}\n" +"* VST-instrument hoster : ${STATUS_VST}\n" +"* VST-effect hoster : ${STATUS_VST}\n" +"* CALF LADSPA plugins : ${STATUS_CALF}\n" +"* CAPS LADSPA plugins : ${STATUS_CAPS}\n" +"* CMT LADSPA plugins : ${STATUS_CMT}\n" +"* TAP LADSPA plugins : ${STATUS_TAP}\n" +"* SWH LADSPA plugins : ${STATUS_SWH}\n" +"* GIG player : ${STATUS_GIG}\n" +) + +MESSAGE( +"Developer options\n" +"-----------------------------------------\n" +"* Debug FP exceptions : ${STATUS_DEBUG_FPE}\n" +) + +MESSAGE( +"\n" +"-----------------------------------------------------------------\n" +"IMPORTANT:\n" +"after installing missing packages, remove CMakeCache.txt before\n" +"running cmake again!\n" +"-----------------------------------------------------------------\n" +"\n\n") + +INCLUDE(InstallRequiredSystemLibraries) diff --git a/CMakeLists.txt.user.18 b/CMakeLists.txt.user.18 new file mode 100644 index 00000000000..5bd3e13762d --- /dev/null +++ b/CMakeLists.txt.user.18 @@ -0,0 +1,289 @@ + + + + + + EnvironmentId + {ce5be502-5664-4a5d-8553-cc5510691a51} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {3a7661ec-8609-486e-b93c-afa56df83dbd} + 0 + 0 + 0 + + false + /home/rob/git/forks/lmms/build + + + + + false + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + clean + + true + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + all + + CMakeProjectManager.CMakeBuildConfiguration + + 1 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + lmms + + + 2 + + lmms + + CMakeProjectManager.CMakeRunConfiguration.lmms + 3768 + false + true + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + RemoteZynAddSubFx + + + 2 + + RemoteZynAddSubFx + + CMakeProjectManager.CMakeRunConfiguration.RemoteZynAddSubFx + 3768 + false + true + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + tests + + + 2 + + tests + + CMakeProjectManager.CMakeRunConfiguration.tests + 3768 + false + true + false + false + true + + 3 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/data/themes/default/gridmode.png b/data/themes/default/gridmode.png new file mode 100644 index 00000000000..f018b6c2f21 Binary files /dev/null and b/data/themes/default/gridmode.png differ diff --git a/include/PianoRoll.h b/include/PianoRoll.h index 9167804ae43..9af2fe094f5 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -74,7 +74,7 @@ class PianoRoll : public QWidget ModeDraw, ModeErase, ModeSelect, - ModeEditDetuning, + ModeEditDetuning }; /*! \brief Resets settings to default when e.g. creating a new project */ @@ -203,6 +203,8 @@ protected slots: void selectRegionFromPixels( int xStart, int xEnd ); + void changeSnapMode(); + signals: void currentPatternChanged(); @@ -245,6 +247,13 @@ protected slots: PR_BLACK_KEY }; + enum GridMode + { + gridNudge, + gridSnap, + gridFree + }; + QVector m_nemStr; // gui names of each edit mode QMenu * m_noteEditMenu; // when you right click below the key area @@ -276,7 +285,8 @@ protected slots: int noteEditRight() const; int noteEditLeft() const; - void dragNotes( int x, int y, bool alt, bool shift, bool ctrl ); + void dragNotes( int x, int y, bool alt, bool shift, bool ctrl, Note * foo); + Note * draggedNote; static const int cm_scrollAmtHoriz = 10; static const int cm_scrollAmtVert = 1; @@ -293,6 +303,7 @@ protected slots: static QPixmap * s_toolMove; static QPixmap * s_toolOpen; + static PianoRollKeyTypes prKeyOrder[]; static TextFloat * s_textFloat; @@ -302,6 +313,7 @@ protected slots: ComboBoxModel m_noteLenModel; ComboBoxModel m_scaleModel; ComboBoxModel m_chordModel; + ComboBoxModel m_snapModel; static const QVector m_zoomLevels; @@ -316,6 +328,7 @@ protected slots: Note * m_currentNote; Actions m_action; NoteEditMode m_noteEditMode; + GridMode m_gridMode; int m_selectStartTick; int m_selectedTick; @@ -452,6 +465,7 @@ private slots: ComboBox * m_noteLenComboBox; ComboBox * m_scaleComboBox; ComboBox * m_chordComboBox; + ComboBox * m_snapComboBox; }; diff --git a/lmms.kdev4 b/lmms.kdev4 new file mode 100644 index 00000000000..5c98b27d5ec --- /dev/null +++ b/lmms.kdev4 @@ -0,0 +1,3 @@ +[Project] +Manager=KDevCMakeManager +Name=lmms diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 983d2eb7b5f..38fdc26d9e3 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -122,6 +122,7 @@ QPixmap * PianoRoll::s_toolSelect = NULL; QPixmap * PianoRoll::s_toolMove = NULL; QPixmap * PianoRoll::s_toolOpen = NULL; + TextFloat * PianoRoll::s_textFloat = NULL; static QString s_noteStrings[12] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; @@ -443,6 +444,15 @@ PianoRoll::PianoRoll() : //connection for selecion from timeline connect( m_timeLine, SIGNAL( regionSelectedFromPixels( int, int ) ), this, SLOT( selectRegionFromPixels( int, int ) ) ); + + + // Set up snap model + m_snapModel.addItem( tr("Nudge") ); + m_snapModel.addItem( tr("Snap") ); + m_snapModel.setValue( 0 ); + connect( &m_snapModel, SIGNAL( dataChanged() ), + this, SLOT( changeSnapMode() ) ); + } @@ -1086,7 +1096,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, ke->modifiers() & Qt::ShiftModifier, - ke->modifiers() & Qt::ControlModifier ); + ke->modifiers() & Qt::ControlModifier, + nullptr); } } ke->accept(); @@ -1132,7 +1143,7 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, ke->modifiers() & Qt::ShiftModifier, - ke->modifiers() & Qt::ControlModifier ); + ke->modifiers() & Qt::ControlModifier, nullptr ); } } @@ -2051,7 +2062,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * me ) dragNotes( me->x(), me->y(), me->modifiers() & Qt::AltModifier, me->modifiers() & Qt::ShiftModifier, - me->modifiers() & Qt::ControlModifier ); + me->modifiers() & Qt::ControlModifier, noteUnderMouse() ); if( replay_note && m_action == ActionMoveNote && ! ( ( me->modifiers() & Qt::ShiftModifier ) && ! m_startedWithShift ) ) { @@ -2397,10 +2408,16 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * me ) -void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) +void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl, Note* noteDragged ) { // dragging one or more notes around + // get note that's dragged + if (noteDragged != NULL) + { + draggedNote = noteDragged; + } + // convert pixels to ticks and keys int off_x = x - m_moveStartX; int off_ticks = off_x * MidiTime::ticksPerTact() / m_ppt; @@ -2441,6 +2458,7 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) if (m_action == ActionMoveNote) { + bool firstIteration = true; for (Note *note : notes) { if( note->selected() ) @@ -2459,6 +2477,18 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) else { // moving note + if (m_gridMode == gridSnap && firstIteration) + { + firstIteration = false; + Note* copy (draggedNote); + // quantize first note + int pos_ticks = copy->oldPos().getTicks() + off_ticks; + pos_ticks = qMax(0, pos_ticks); + copy->setPos (MidiTime(pos_ticks)); + copy->quantizePos(quantization()); + // new off_ticks based on quantized (copy) note and not-quantized note + off_ticks += copy->pos().getTicks() - (draggedNote->oldPos().getTicks() + off_ticks); + } int pos_ticks = note->oldPos().getTicks() + off_ticks; int key_num = note->oldKey() + off_key; @@ -2568,10 +2598,19 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) else { // shift is not pressed; stretch length of selected notes but not their position + bool firstIteration = true; for (Note *note : notes) { if (note->selected()) { + if (m_gridMode == gridSnap && firstIteration) + { + firstIteration = false; + Note copy (*note); + int oldEndPoint = copy.oldPos()+copy.oldLength(); + int quantizedEndPoint = Note::quantized( copy.oldLength()+copy.oldPos(), quantization() ); + off_ticks += quantizedEndPoint - oldEndPoint; + } int newLength = note->oldLength() + off_ticks; newLength = qMax(1, newLength); note->setLength( MidiTime(newLength) ); @@ -4044,6 +4083,22 @@ Note * PianoRoll::noteUnderMouse() return NULL; } +void PianoRoll::changeSnapMode() +{ + // gridNudge, + // gridSnap, + // gridFree - to be implemented + + QString qs_snapMode = m_snapModel.currentText(); + if ( qs_snapMode == "Nudge" ) + { + m_gridMode = gridNudge; + } + if ( qs_snapMode == "Snap" ) + { + m_gridMode = gridSnap; + } +} @@ -4085,7 +4140,6 @@ PianoRollWindow::PianoRollWindow() : QAction* eraseAction = editModeGroup->addAction( embed::getIconPixmap( "edit_erase" ), tr("Erase mode (Shift+E)" ) ); QAction* selectAction = editModeGroup->addAction( embed::getIconPixmap( "edit_select" ), tr( "Select mode (Shift+S)" ) ); QAction* pitchBendAction = editModeGroup->addAction( embed::getIconPixmap( "automation" ), tr("Pitch Bend mode (Shift+T)" ) ); - drawAction->setChecked( true ); drawAction->setShortcut( Qt::SHIFT | Qt::Key_D ); @@ -4238,6 +4292,13 @@ PianoRollWindow::PianoRollWindow() : m_chordComboBox->setModel( &m_editor->m_chordModel ); m_chordComboBox->setFixedSize( 105, 22 ); + // setup snap-stuff + QLabel * snap_lbl = new QLabel( m_toolBar ); + snap_lbl->setPixmap( embed::getIconPixmap( "gridmode")); + + m_snapComboBox = new ComboBox ( m_toolBar ); + m_snapComboBox->setModel (&m_editor->m_snapModel ); + m_snapComboBox->setFixedSize( 105, 22 ); zoomAndNotesToolBar->addWidget( zoom_lbl ); zoomAndNotesToolBar->addWidget( m_zoomingComboBox ); @@ -4258,6 +4319,12 @@ PianoRollWindow::PianoRollWindow() : zoomAndNotesToolBar->addWidget( chord_lbl ); zoomAndNotesToolBar->addWidget( m_chordComboBox ); + zoomAndNotesToolBar->addSeparator(); + zoomAndNotesToolBar->addWidget( snap_lbl ); + zoomAndNotesToolBar->addWidget( m_snapComboBox ); + + + m_zoomingComboBox->setWhatsThis( tr( "This controls the magnification of an axis. " @@ -4305,6 +4372,13 @@ PianoRollWindow::PianoRollWindow() : "in this drop-down menu." ) ); + m_snapComboBox->setWhatsThis( + tr( + "Let you select how a note is moved when dragging." + "Nudge, the default behaviour, notes are moved in steps selected in the quantize menu/" + "Snap, notes are snapped to the nearest grid line as set by the quantize menu." + ) ); + // setup our actual window setFocusPolicy( Qt::StrongFocus ); setFocus();