From 7245ee2b5da08f4288cc0e6342745462b21d7dae Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 15 Jul 2024 00:35:15 +0100 Subject: [PATCH] musly: add patches for FFmpeg 7, C++17, and external deps --- .../musly/0001-Fix-build-with-FFmpeg-7.patch | 341 ++++++++++++++++++ .../mu/musly/0002-Fix-build-with-C-17.patch | 35 ++ .../0003-Modernize-CMake-build-system.patch | 151 ++++++++ ...nfig-to-find-libresample-and-kissfft.patch | 110 ++++++ pkgs/by-name/mu/musly/package.nix | 37 +- 5 files changed, 667 insertions(+), 7 deletions(-) create mode 100644 pkgs/by-name/mu/musly/0001-Fix-build-with-FFmpeg-7.patch create mode 100644 pkgs/by-name/mu/musly/0002-Fix-build-with-C-17.patch create mode 100644 pkgs/by-name/mu/musly/0003-Modernize-CMake-build-system.patch create mode 100644 pkgs/by-name/mu/musly/0004-Use-pkg-config-to-find-libresample-and-kissfft.patch diff --git a/pkgs/by-name/mu/musly/0001-Fix-build-with-FFmpeg-7.patch b/pkgs/by-name/mu/musly/0001-Fix-build-with-FFmpeg-7.patch new file mode 100644 index 000000000000..13fbe6a374c3 --- /dev/null +++ b/pkgs/by-name/mu/musly/0001-Fix-build-with-FFmpeg-7.patch @@ -0,0 +1,341 @@ +From ab430ea4460aba050d97d3e3a712a3b6dd809db9 Mon Sep 17 00:00:00 2001 +From: Emily +Date: Mon, 15 Jul 2024 00:41:04 +0100 +Subject: [PATCH 1/4] Fix build with FFmpeg 7 + +--- + libmusly/CMakeLists.txt | 5 -- + libmusly/decoders/libav.cpp | 136 +++++++++++------------------------- + 2 files changed, 42 insertions(+), 99 deletions(-) + +diff --git a/libmusly/CMakeLists.txt b/libmusly/CMakeLists.txt +index d6d3680..98151df 100644 +--- a/libmusly/CMakeLists.txt ++++ b/libmusly/CMakeLists.txt +@@ -16,11 +16,6 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external") + PROPERTIES COMPILE_FLAGS "-DLIBMUSLY_EXTERNAL ${LIBMUSLY_EXTERNAL_FLAGS}") + endif() + +-if(EXISTS "${LIBAV_INCLUDE_DIRS}/libavutil/channel_layout.h") +- set_source_files_properties(decoders/libav.cpp +- PROPERTIES COMPILE_FLAGS "-DHAVE_AVUTIL_CHANNEL_LAYOUT") +-endif() +- + if(USE_OPENMP AND OPENMP_FOUND) + # disable OpenMP for kiss FFT, it slows things down terribly + set_source_files_properties(kissfft/kiss_fft.c +diff --git a/libmusly/decoders/libav.cpp b/libmusly/decoders/libav.cpp +index a78b904..90f93ae 100644 +--- a/libmusly/decoders/libav.cpp ++++ b/libmusly/decoders/libav.cpp +@@ -20,37 +20,13 @@ + extern "C" { + #include + #include +-#ifdef HAVE_AVUTIL_CHANNEL_LAYOUT + #include +-#endif + } + + #include "minilog.h" + #include "resampler.h" + #include "libav.h" + +-// We define some macros to be compatible to different libav versions +-// without spreading #if and #else all over the place. +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 45, 101) +-#define AV_FRAME_ALLOC avcodec_alloc_frame +-#define AV_FRAME_UNREF avcodec_get_frame_defaults +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 28, 0) +-#define AV_FRAME_FREE(X) av_free(*(X)) +-#else +-#define AV_FRAME_FREE avcodec_free_frame +-#endif +-#else +-#define AV_FRAME_ALLOC av_frame_alloc +-#define AV_FRAME_UNREF av_frame_unref +-#define AV_FRAME_FREE av_frame_free +-#endif +- +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 7, 0) +-#define AV_PACKET_UNREF av_free_packet +-#else +-#define AV_PACKET_UNREF av_packet_unref +-#endif +- + namespace musly { + namespace decoders { + +@@ -58,12 +34,6 @@ MUSLY_DECODER_REGIMPL(libav, 0); + + libav::libav() + { +-#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100) +- av_register_all(); +-#endif +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 9, 100) +- avcodec_register_all(); +-#endif + } + + int +@@ -177,13 +147,7 @@ libav::decodeto_22050hz_mono_float( + AVStream *st = fmtx->streams[audio_stream_idx]; + + // find a decoder for the stream +-#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 14, 0)) || ((LIBAVCODEC_VERSION_MICRO >= 100) && (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 33, 100))) +- // old libav version (libavcodec < 57.14 for libav, < 57.33 for ffmpeg): +- // stream has a codec context we can use +- AVCodecContext *decx = st->codec; +- #define AVCODEC_FREE_CONTEXT(x) +-#else +- // new libav version: need to create codec context for stream ++ // need to create codec context for stream + AVCodecParameters *decp = st->codecpar; + AVCodecContext *decx = avcodec_alloc_context3(NULL); + if (!decx) { +@@ -200,71 +164,63 @@ libav::decodeto_22050hz_mono_float( + avformat_close_input(&fmtx); + return std::vector(0); + } +- #if LIBAVCODEC_VERSION_MICRO >= 100 +- #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,3,102) +- // only available in ffmpeg, deprecated after 58 +- av_codec_set_pkt_timebase(decx, st->time_base); +- #endif +- #endif +- #define AVCODEC_FREE_CONTEXT(x) avcodec_free_context(x) +-#endif +- AVCodec *dec = avcodec_find_decoder(decx->codec_id); ++ const AVCodec *dec = avcodec_find_decoder(decx->codec_id); + if (!dec) { + MINILOG(logERROR) << "Could not find codec."; + +- AVCODEC_FREE_CONTEXT(&decx); ++ avcodec_free_context(&decx); + avformat_close_input(&fmtx); + return std::vector(0); + } + + // open the decoder + // (kindly ask for stereo downmix and floats, but not all decoders care) +- decx->request_channel_layout = AV_CH_LAYOUT_STEREO_DOWNMIX; + decx->request_sample_fmt = AV_SAMPLE_FMT_FLT; + #ifdef _OPENMP + #pragma omp critical + #endif + { +- avret = avcodec_open2(decx, dec, NULL); ++ AVDictionary *options = NULL; ++ av_dict_set(&options, "downmix", "stereo", 0); ++ avret = avcodec_open2(decx, dec, &options); + } + if (avret < 0) { + MINILOG(logERROR) << "Could not open codec."; + +- AVCODEC_FREE_CONTEXT(&decx); ++ avcodec_free_context(&decx); + avformat_close_input(&fmtx); + return std::vector(0); + } + + // Currently only mono and stereo files are supported. +- if ((decx->channels != 1) && (decx->channels != 2)) { ++ if ((decx->ch_layout.nb_channels != 1) && (decx->ch_layout.nb_channels != 2)) { + MINILOG(logWARNING) << "Unsupported number of channels: " +- << decx->channels; ++ << decx->ch_layout.nb_channels; + +- AVCODEC_FREE_CONTEXT(&decx); ++ avcodec_free_context(&decx); + avformat_close_input(&fmtx); + return std::vector(0); + } + + // allocate a frame +- AVFrame* frame = AV_FRAME_ALLOC(); ++ AVFrame* frame = av_frame_alloc(); + if (!frame) { + MINILOG(logWARNING) << "Could not allocate frame"; + +- AVCODEC_FREE_CONTEXT(&decx); ++ avcodec_free_context(&decx); + avformat_close_input(&fmtx); + return std::vector(0); + } + + // allocate and initialize a packet +- AVPacket pkt; +- av_init_packet(&pkt); +- pkt.data = NULL; +- pkt.size = 0; ++ AVPacket* pkt = av_packet_alloc(); ++ pkt->data = NULL; ++ pkt->size = 0; + int got_frame = 0; + + // configuration + const int input_stride = av_get_bytes_per_sample(decx->sample_fmt); +- const int num_planes = av_sample_fmt_is_planar(decx->sample_fmt) ? decx->channels : 1; ++ const int num_planes = av_sample_fmt_is_planar(decx->sample_fmt) ? decx->ch_layout.nb_channels : 1; + const int output_stride = sizeof(float) * num_planes; + int decode_samples; // how many samples to decode; zero to decode all + +@@ -296,7 +252,7 @@ libav::decodeto_22050hz_mono_float( + // fault when trying to access frame->data[i] for i > 0 further below) + if ((excerpt_start > 0) and (av_seek_frame(fmtx, audio_stream_idx, + excerpt_start * st->time_base.den / st->time_base.num, +- AVSEEK_FLAG_BACKWARD || AVSEEK_FLAG_ANY) >= 0)) { ++ AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY) >= 0)) { + // skipping went fine: decode only what's needed + decode_samples = excerpt_length * decx->sample_rate; + excerpt_start = 0; +@@ -333,7 +289,7 @@ libav::decodeto_22050hz_mono_float( + // excerpt_start tells us up to how many seconds to cut from the beginning. + + // read packets +- const int channels = decx->channels; ++ const int channels = decx->ch_layout.nb_channels; + const int sample_rate = decx->sample_rate; + float* buffer = NULL; + int buffersize = 0; +@@ -344,35 +300,29 @@ libav::decodeto_22050hz_mono_float( + { + // skip all frames that are not part of the audio stream, and spurious + // frames possibly found after seeking (wrong channels / sample_rate) +- while (((avret = av_read_frame(fmtx, &pkt)) >= 0) +- && ((pkt.stream_index != audio_stream_idx) || +- (decx->channels != channels) || ++ while (((avret = av_read_frame(fmtx, pkt)) >= 0) ++ && ((pkt->stream_index != audio_stream_idx) || ++ (decx->ch_layout.nb_channels != channels) || + (decx->sample_rate != sample_rate))) + { +- AV_PACKET_UNREF(&pkt); ++ av_packet_unref(pkt); + MINILOG(logTRACE) << "Skipping frame..."; + } + if (avret < 0) { + // stop decoding if av_read_frame() failed +- AV_PACKET_UNREF(&pkt); ++ av_packet_unref(pkt); + break; + } + +- uint8_t* data = pkt.data; +- int size = pkt.size; +- while (pkt.size > 0) { ++ uint8_t* data = pkt->data; ++ int size = pkt->size; ++ while (pkt->size > 0) { + + // try to decode a frame +- AV_FRAME_UNREF(frame); ++ av_frame_unref(frame); + + int len = 0; + got_frame = 0; +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 48, 101) +- len = avcodec_decode_audio4(decx, frame, &got_frame, &pkt); +- if (len < 0) { +- avret = AVERROR(EINVAL); +- } +-#else + avret = avcodec_receive_frame(decx, frame); + if (avret == 0) { + got_frame = 1; +@@ -381,14 +331,13 @@ libav::decodeto_22050hz_mono_float( + avret = 0; + } + if (avret == 0) { +- avret = avcodec_send_packet(decx, &pkt); ++ avret = avcodec_send_packet(decx, pkt); + if (avret == 0) { +- len = pkt.size; ++ len = pkt->size; + } else if (avret == AVERROR(EAGAIN)) { + avret = 0; + } + } +-#endif + if (avret < 0) { + MINILOG(logWARNING) << "Error decoding an audio frame"; + +@@ -400,8 +349,8 @@ libav::decodeto_22050hz_mono_float( + + // if too many frames failed decoding, abort + MINILOG(logERROR) << "Too many errors, aborting."; +- AV_FRAME_FREE(&frame); +- AV_PACKET_UNREF(&pkt); ++ av_frame_free(&frame); ++ av_packet_unref(pkt); + avformat_close_input(&fmtx); + if (buffer) { + delete[] buffer; +@@ -414,7 +363,7 @@ libav::decodeto_22050hz_mono_float( + // if we got a frame + if (got_frame) { + // do we need to increase the buffer size? +- int input_samples = frame->nb_samples*decx->channels; ++ int input_samples = frame->nb_samples*decx->ch_layout.nb_channels; + if (input_samples > buffersize) { + if (buffer) { + delete[] buffer; +@@ -434,8 +383,8 @@ libav::decodeto_22050hz_mono_float( + input_samples / num_planes) < 0) { + MINILOG(logERROR) << "Strange sample format. Abort."; + +- AV_FRAME_FREE(&frame); +- AV_PACKET_UNREF(&pkt); ++ av_frame_free(&frame); ++ av_packet_unref(pkt); + avformat_close_input(&fmtx); + if (buffer) { + delete[] buffer; +@@ -445,7 +394,7 @@ libav::decodeto_22050hz_mono_float( + } + + // inplace downmix to mono, if required +- if (decx->channels == 2) { ++ if (decx->ch_layout.nb_channels == 2) { + for (int i = 0; i < frame->nb_samples; i++) { + buffer[i] = (buffer[i*2] + buffer[i*2+1]) / 2.0f; + } +@@ -457,13 +406,13 @@ libav::decodeto_22050hz_mono_float( + } + + // consume the packet +- pkt.data += len; +- pkt.size -= len; ++ pkt->data += len; ++ pkt->size -= len; + } +- pkt.data = data; +- pkt.size = size; ++ pkt->data = data; ++ pkt->size = size; + +- AV_PACKET_UNREF(&pkt); ++ av_packet_unref(pkt); + } + MINILOG(logTRACE) << "Decoding loop finished."; + +@@ -514,13 +463,12 @@ libav::decodeto_22050hz_mono_float( + if (buffer) { + delete[] buffer; + } +- AV_FRAME_FREE(&frame); ++ av_frame_free(&frame); + #ifdef _OPENMP + #pragma omp critical + #endif + { +- avcodec_close(decx); +- AVCODEC_FREE_CONTEXT(&decx); ++ avcodec_free_context(&decx); + avformat_close_input(&fmtx); + } + +-- +2.45.2 + diff --git a/pkgs/by-name/mu/musly/0002-Fix-build-with-C-17.patch b/pkgs/by-name/mu/musly/0002-Fix-build-with-C-17.patch new file mode 100644 index 000000000000..f128bd4d0c02 --- /dev/null +++ b/pkgs/by-name/mu/musly/0002-Fix-build-with-C-17.patch @@ -0,0 +1,35 @@ +From 75efe27cbb03f2883e53e7a7f68386d93e2c1874 Mon Sep 17 00:00:00 2001 +From: Emily +Date: Sat, 3 Aug 2024 12:17:19 +0100 +Subject: [PATCH 2/4] Fix build with C++17 + +--- + musly/main.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/musly/main.cpp b/musly/main.cpp +index a9644f2..bb8b7ae 100644 +--- a/musly/main.cpp ++++ b/musly/main.cpp +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -239,7 +240,9 @@ tracks_initialize( + else { + // use a random subset of 1000 tracks + std::vector tracks2(tracks); +- std::random_shuffle(tracks2.begin(), tracks2.end()); ++ std::random_device seeder; ++ std::default_random_engine rng(seeder()); ++ std::shuffle(tracks2.begin(), tracks2.end(), rng); + ret = musly_jukebox_setmusicstyle(mj, tracks2.data(), 1000); + } + if (ret != 0) { +-- +2.45.2 + diff --git a/pkgs/by-name/mu/musly/0003-Modernize-CMake-build-system.patch b/pkgs/by-name/mu/musly/0003-Modernize-CMake-build-system.patch new file mode 100644 index 000000000000..3696fee9ba40 --- /dev/null +++ b/pkgs/by-name/mu/musly/0003-Modernize-CMake-build-system.patch @@ -0,0 +1,151 @@ +From 8abe6385e433b44c43134b4deef208c7498ab0d7 Mon Sep 17 00:00:00 2001 +From: Emily +Date: Sat, 3 Aug 2024 12:21:12 +0100 +Subject: [PATCH 3/4] Modernize CMake build system + +Use GNUInstallDirs, CTest, and FindPkgConfig. +--- + .travis.yml | 2 +- + CMakeLists.txt | 25 +++++++++++-------------- + libmusly/CMakeLists.txt | 11 +++-------- + musly/CMakeLists.txt | 6 +----- + 4 files changed, 16 insertions(+), 28 deletions(-) + +diff --git a/.travis.yml b/.travis.yml +index 8556b26..b051004 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -19,7 +19,7 @@ matrix: + script: + - mkdir -p build + - cd build +- - cmake -DBUILD_TEST=ON .. ++ - cmake .. + - make -j + - ctest -V + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4fab4ab..8d8bf0e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -4,9 +4,11 @@ + # (c) 2013-2014, Dominik Schnitzer + # 2014, Jan Schlueter + +-cmake_minimum_required(VERSION 2.8) ++cmake_minimum_required(VERSION 3.17) + + project(musly) ++include(GNUInstallDirs) ++include(CTest) + set(MUSLY_VERSION "0.2") + add_definitions(-DMUSLY_VERSION="${MUSLY_VERSION}") + +@@ -36,8 +38,6 @@ else () + set(BUILD_SHARED_LIBS ON) + endif () + +-option(BUILD_TEST "Build selftest executable" OFF) +- + option(USE_OPENMP "Compile with OpenMP support (Parallelization)" OFF) + if (USE_OPENMP) + find_package(OpenMP) +@@ -54,26 +54,23 @@ if (USE_OPENMP) + endif() + endif () + +-set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +- +-find_package(Eigen3 REQUIRED) +-find_package(LibAV 0.8 COMPONENTS avcodec avformat avutil REQUIRED) ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(EIGEN3 REQUIRED IMPORTED_TARGET eigen3) ++pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET ++ libavcodec ++ libavformat ++ libavutil) + + include_directories( +- "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/include") + + add_subdirectory(libmusly) + add_subdirectory(musly) + add_subdirectory(include) +-if (BUILD_TEST) +- enable_testing() ++if (BUILD_TESTING) + add_subdirectory(test) + endif () + + # Documentation + set(musly_DOC_FILES AUTHORS COPYING README.md) +-set(musly_DOC_PATH "share/doc/musly") +-install(FILES ${musly_DOC_FILES} +- DESTINATION ${musly_DOC_PATH}) +- ++install(FILES ${musly_DOC_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}) +diff --git a/libmusly/CMakeLists.txt b/libmusly/CMakeLists.txt +index 98151df..b9f6d11 100644 +--- a/libmusly/CMakeLists.txt ++++ b/libmusly/CMakeLists.txt +@@ -4,9 +4,6 @@ + # (c) 2013-2014, Dominik Schnitzer + # 2014-2016, Jan Schlueter + +-add_subdirectory( +- libresample) +- + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external") + add_subdirectory( + external) +@@ -24,8 +21,6 @@ endif() + + include_directories( + ${LIBMUSLY_INCLUDE} +- ${EIGEN3_INCLUDE_DIR} +- ${LIBAV_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}) + + add_library(libmusly +@@ -60,7 +55,8 @@ set_target_properties(libmusly + + target_link_libraries(libmusly + ${LIBMUSLY_LIBS} +- ${LIBAV_LIBRARIES}) ++ PkgConfig::EIGEN3 ++ PkgConfig::FFMPEG) + if(WIN32 OR MINGW) + # link against winsock2 for ntohl() and htonl() + target_link_libraries(libmusly ws2_32) +@@ -69,5 +65,4 @@ endif() + set_target_properties(libmusly + PROPERTIES PREFIX "") + +-install(TARGETS libmusly +- DESTINATION lib) ++install(TARGETS libmusly) +diff --git a/musly/CMakeLists.txt b/musly/CMakeLists.txt +index 88d153b..846ed2c 100644 +--- a/musly/CMakeLists.txt ++++ b/musly/CMakeLists.txt +@@ -3,10 +3,6 @@ + + # (c) 2013, Dominik Schnitzer + +-include_directories( +- ${EIGEN3_INCLUDE_DIR}) +- +- + add_executable(musly + tools.cpp + fileiterator.cpp +@@ -17,4 +13,4 @@ add_executable(musly + target_link_libraries(musly + libmusly) + +-install(TARGETS musly DESTINATION bin) ++install(TARGETS musly) +-- +2.45.2 + diff --git a/pkgs/by-name/mu/musly/0004-Use-pkg-config-to-find-libresample-and-kissfft.patch b/pkgs/by-name/mu/musly/0004-Use-pkg-config-to-find-libresample-and-kissfft.patch new file mode 100644 index 000000000000..c7f893a6a866 --- /dev/null +++ b/pkgs/by-name/mu/musly/0004-Use-pkg-config-to-find-libresample-and-kissfft.patch @@ -0,0 +1,110 @@ +From e4a0d0b48905bb949831c30c941e921da0b6f09c Mon Sep 17 00:00:00 2001 +From: Emily +Date: Sat, 3 Aug 2024 12:21:12 +0100 +Subject: [PATCH 4/4] Use pkg-config to find libresample and kissfft + +--- + .travis.yml | 2 ++ + CMakeLists.txt | 12 ++++++++++++ + libmusly/CMakeLists.txt | 12 +++--------- + libmusly/powerspectrum.h | 2 +- + libmusly/resampler.h | 2 +- + 5 files changed, 19 insertions(+), 11 deletions(-) + +diff --git a/.travis.yml b/.travis.yml +index b051004..b354641 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -31,3 +31,5 @@ addons: + - libavcodec-dev + - libavformat-dev + - libavutil-dev ++ - libresample-dev ++ - libkissfft-dev +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8d8bf0e..c5b0d2c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -60,6 +60,18 @@ pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET + libavcodec + libavformat + libavutil) ++pkg_check_modules(LIBRESAMPLE REQUIRED IMPORTED_TARGET libresample) ++pkg_search_module(KISSFFT REQUIRED IMPORTED_TARGET ++ kissfft-simd ++ kissfft-double ++ kissfft-float ++ kissfft-int32_t ++ kissfft-int16_t ++ kissfft-simd-openmp ++ kissfft-double-openmp ++ kissfft-float-openmp ++ kissfft-int32_t-openmp ++ kissfft-int16_t-openmp) + + include_directories( + "${PROJECT_SOURCE_DIR}/include") +diff --git a/libmusly/CMakeLists.txt b/libmusly/CMakeLists.txt +index b9f6d11..6f8c8e9 100644 +--- a/libmusly/CMakeLists.txt ++++ b/libmusly/CMakeLists.txt +@@ -13,19 +13,11 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external") + PROPERTIES COMPILE_FLAGS "-DLIBMUSLY_EXTERNAL ${LIBMUSLY_EXTERNAL_FLAGS}") + endif() + +-if(USE_OPENMP AND OPENMP_FOUND) +- # disable OpenMP for kiss FFT, it slows things down terribly +- set_source_files_properties(kissfft/kiss_fft.c +- PROPERTIES COMPILE_FLAGS "-U_OPENMP") +-endif() +- + include_directories( + ${LIBMUSLY_INCLUDE} + ${CMAKE_CURRENT_SOURCE_DIR}) + + add_library(libmusly +- kissfft/kiss_fft.c +- kissfft/kiss_fftr.c + methods/mandelellis.cpp + methods/timbre.cpp + decoders/libav.cpp +@@ -56,7 +48,9 @@ set_target_properties(libmusly + target_link_libraries(libmusly + ${LIBMUSLY_LIBS} + PkgConfig::EIGEN3 +- PkgConfig::FFMPEG) ++ PkgConfig::FFMPEG ++ PkgConfig::LIBRESAMPLE ++ PkgConfig::KISSFFT) + if(WIN32 OR MINGW) + # link against winsock2 for ntohl() and htonl() + target_link_libraries(libmusly ws2_32) +diff --git a/libmusly/powerspectrum.h b/libmusly/powerspectrum.h +index 6957db4..096fc31 100644 +--- a/libmusly/powerspectrum.h ++++ b/libmusly/powerspectrum.h +@@ -14,7 +14,7 @@ + + #include + extern "C" { +- #include "kissfft/kiss_fftr.h" ++ #include + } + + +diff --git a/libmusly/resampler.h b/libmusly/resampler.h +index df8aaa4..f48e22a 100644 +--- a/libmusly/resampler.h ++++ b/libmusly/resampler.h +@@ -14,7 +14,7 @@ + + #include + extern "C" { +- #include "libresample/libresample.h" ++ #include + } + + namespace musly { +-- +2.45.2 + diff --git a/pkgs/by-name/mu/musly/package.nix b/pkgs/by-name/mu/musly/package.nix index 48c11111b946..25938c2059fa 100644 --- a/pkgs/by-name/mu/musly/package.nix +++ b/pkgs/by-name/mu/musly/package.nix @@ -4,32 +4,55 @@ fetchFromGitHub, cmake, ninja, + pkg-config, eigen, - ffmpeg_4, + ffmpeg_7, + libresample, + kissfft, }: + stdenv.mkDerivation { pname = "musly"; version = "0.1-unstable-2019-09-05"; + outputs = [ + "bin" + "dev" + "out" + "doc" + ]; + src = fetchFromGitHub { owner = "dominikschnitzer"; repo = "musly"; rev = "7a0c6a9a2782e6fca84fb86fce5232a8c8a104ed"; hash = "sha256-DOvGGx3pCcvPPsT97sQlINjT1sJy8ZWvxLsFGGZbgzE="; }; + + patches = [ + # Fix build with FFmpeg 7, C++17, and external libresample and kissfft + # https://github.com/dominikschnitzer/musly/pull/53 + # Last commit omitted, as it is a large non‐functional removal + ./0001-Fix-build-with-FFmpeg-7.patch + ./0002-Fix-build-with-C-17.patch + ./0003-Modernize-CMake-build-system.patch + ./0004-Use-pkg-config-to-find-libresample-and-kissfft.patch + ]; + nativeBuildInputs = [ cmake ninja + pkg-config ]; + buildInputs = [ eigen - ffmpeg_4 + ffmpeg_7 + libresample + kissfft ]; - fixupPhase = lib.optionalString stdenv.isDarwin '' - install_name_tool -change libmusly.dylib $out/lib/libmusly.dylib $out/bin/musly - install_name_tool -change libmusly_resample.dylib $out/lib/libmusly_resample.dylib $out/bin/musly - install_name_tool -change libmusly_resample.dylib $out/lib/libmusly_resample.dylib $out/lib/libmusly.dylib - ''; + + doCheck = true; meta = { homepage = "https://www.musly.org";