diff --git a/.github/workflows/build-distros.yml b/.github/workflows/build-distros.yml index 4960223a3..78ceafe31 100644 --- a/.github/workflows/build-distros.yml +++ b/.github/workflows/build-distros.yml @@ -37,7 +37,7 @@ jobs: sed -i 's/^Types: deb/Types: deb deb-src/' /etc/apt/sources.list.d/ubuntu.sources DEBIAN_FRONTEND=noninteractive apt-get -qq update DEBIAN_FRONTEND=noninteractive apt-get -yqq build-dep mlt - DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev + DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise cd /tmp/rnnoise ./autogen.sh @@ -50,7 +50,7 @@ jobs: sed -i 's/^Types: deb/Types: deb deb-src/' /etc/apt/sources.list.d/ubuntu.sources DEBIAN_FRONTEND=noninteractive apt-get -qq update DEBIAN_FRONTEND=noninteractive apt-get -yqq build-dep mlt - DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake qt6-base-dev libplacebo-dev libqt6svg6-dev + DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake qt6-base-dev libplacebo-dev libqt6svg6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise cd /tmp/rnnoise ./autogen.sh @@ -63,7 +63,7 @@ jobs: sed -i '/^#\sdeb-src /s/^#//' "/etc/apt/sources.list" DEBIAN_FRONTEND=noninteractive apt-get -qq update DEBIAN_FRONTEND=noninteractive apt-get -yqq build-dep mlt - DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev libqt6core5compat6-dev + DEBIAN_FRONTEND=noninteractive apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev libqt6core5compat6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise cd /tmp/rnnoise ./autogen.sh @@ -76,7 +76,7 @@ jobs: echo 'deb-src http://deb.debian.org/debian testing main' >> /etc/apt/sources.list apt-get -qq update apt-get -yqq build-dep mlt - apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev + apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise cd /tmp/rnnoise ./autogen.sh @@ -90,7 +90,7 @@ jobs: echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list apt-get -qq update apt-get -yqq build-dep mlt - apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev + apt-get -yqq install autoconf automake git libtool pkg-config wget cmake libplacebo-dev qt6-base-dev libqt6svg6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise cd /tmp/rnnoise ./autogen.sh @@ -105,7 +105,7 @@ jobs: yasm gavl-devel libsamplerate-devel libxml2-devel \ ladspa-devel jack-audio-connection-kit-devel sox-devel \ SDL2-devel fftw-devel frei0r-devel gtk2-devel libexif-devel \ - qt6-qtbase-devel qt6-qtsvg-devel \ + qt6-qtbase-devel qt6-qtsvg-devel lilv-devel \ libtheora-devel libvorbis-devel libvdpau-devel \ libsoup-devel liboil-devel python-devel alsa-lib \ pulseaudio-libs-devel gcc-c++ cmake ffmpeg-free-devel \ @@ -118,7 +118,7 @@ jobs: yasm gavl-devel libsamplerate-devel libxml2-devel \ ladspa-devel jack-audio-connection-kit-devel sox-devel \ SDL2-devel fftw-devel frei0r-devel gtk2-devel libexif-devel \ - qt6-qtbase-devel qt6-qtsvg-devel \ + qt6-qtbase-devel qt6-qtsvg-devel lilv-devel \ libtheora-devel libvorbis-devel libvdpau-devel \ libsoup-devel liboil-devel python-devel alsa-lib \ pulseaudio-libs-devel gcc-c++ cmake ffmpeg-free-devel \ diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 7be2345f2..1f4754519 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -46,7 +46,7 @@ jobs: sudo sed -i '/^#\sdeb-src /s/^#//' "/etc/apt/sources.list" sudo apt-get -qq update sudo apt-get -yqq build-dep mlt - sudo apt-get -yqq install autoconf automake git libtool pkg-config wget libplacebo-dev qt6-base-dev libqt6svg6-dev libqt6core5compat6-dev + sudo apt-get -yqq install autoconf automake git libtool pkg-config wget libplacebo-dev qt6-base-dev libqt6svg6-dev libqt6core5compat6-dev liblilv-dev git clone --depth 1 --branch v0.2 https://github.com/xiph/rnnoise.git /tmp/rnnoise pushd /tmp/rnnoise ./autogen.sh diff --git a/.github/workflows/build-msys2-mingw64.yml b/.github/workflows/build-msys2-mingw64.yml index fc20023de..5691de332 100644 --- a/.github/workflows/build-msys2-mingw64.yml +++ b/.github/workflows/build-msys2-mingw64.yml @@ -51,6 +51,7 @@ jobs: mingw-w64-x86_64-libvpx mingw-w64-x86_64-libwebp mingw-w64-x86_64-libxml2 + mingw-w64-x86_64-lilv mingw-w64-x86_64-onevpl mingw-w64-x86_64-openblas mingw-w64-x86_64-openssl diff --git a/CMakeLists.txt b/CMakeLists.txt index fe23b2de9..5de3a51dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,9 @@ option(MOD_FREI0R "Enable Frei0r module" ON) option(MOD_GDK "Enable GDK module" ON) option(MOD_GLAXNIMATE_QT6 "Enable Glaxnimate module (Qt6)" OFF) option(MOD_JACKRACK "Enable JACK Rack module" ON) -option(USE_LV2 "Enable LV2 features" ON) -option(USE_VST2 "Enable LV2 features" ON) +option(USE_LADSPA "Enable LADSPA features (GPL)" ON) +option(USE_LV2 "Enable LV2 features (GPL)" ON) +option(USE_VST2 "Enable VST2 features (GPL)" ON) option(MOD_KDENLIVE "Enable Kdenlive module" ON) option(MOD_MOVIT "Enable OpenGL module" ON) option(MOD_NDI "Enable NDI module" OFF) @@ -78,6 +79,7 @@ endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(CheckIncludeFile) include(FeatureSummary) include(GNUInstallDirs) @@ -123,7 +125,6 @@ endif() set(MLT_SUBDIR mlt) if(NOT (WIN32 OR APPLE)) set(MLT_SUBDIR mlt-${MLT_VERSION_MAJOR}) - set(MLT_SUBDIR mlt-${MLT_VERSION_MAJOR}) endif() set(MLT_INSTALL_MODULE_DIR ${CMAKE_INSTALL_LIBDIR}/${MLT_SUBDIR}) set(MLT_INSTALL_DATA_DIR ${CMAKE_INSTALL_DATADIR}/${MLT_SUBDIR}) @@ -267,23 +268,24 @@ endif() if(MOD_JACKRACK) find_package(JACK) - pkg_check_modules(glib IMPORTED_TARGET glib-2.0) - pkg_check_modules(xml IMPORTED_TARGET libxml-2.0) - check_include_file(ladspa.h ladspa_h_FOUND) - if(NOT ladspa_h_FOUND) - set(USE_LV2 OFF) - set(USE_VST2 OFF) + if(USE_LADSPA) + if(GPL) + pkg_check_modules(glib REQUIRED IMPORTED_TARGET glib-2.0) + pkg_check_modules(xml REQUIRED IMPORTED_TARGET libxml-2.0) + if(USE_LV2) + pkg_check_modules(lilv REQUIRED IMPORTED_TARGET lilv-0) + endif() + check_include_file(ladspa.h ladspa_h_FOUND) + if(NOT ladspa_h_FOUND) + message(FATAL_ERROR "ladspa.h not found. Install LADSPA or set USE_LADSPA=OFF.") + endif() + else() + message(FATAL_ERROR "LADSPA support requires GPL. Set GPL=ON or USE_LADSPA=OFF.") + endif() endif() list(APPEND MLT_SUPPORTED_COMPONENTS jackrack) endif() -if(USE_LV2) - pkg_check_modules(lilv IMPORTED_TARGET lilv-0) - if(NOT lilv_FOUND) - set(USE_LV2 OFF) - endif() -endif() - if(MOD_KDENLIVE) list(APPEND MLT_SUPPORTED_COMPONENTS kdenlive) endif() @@ -633,7 +635,8 @@ add_feature_info("SWIG: PHP" SWIG_PHP "") add_feature_info("SWIG: Python" SWIG_PYTHON "") add_feature_info("SWIG: Ruby" SWIG_RUBY "") add_feature_info("SWIG: Tcl" SWIG_TCL "") -add_feature_info("lv2: LV2 Plugins support" USE_LV2 "") -add_feature_info("vst2: VST2 Plugins support" USE_VST2 "") +add_feature_info("jackrack: LADSPA plugins support" USE_LADSPA "") +add_feature_info("jackrack: LV2 plugins support" USE_LV2 "") +add_feature_info("jackrack: VST2 plugins support" USE_VST2 "") feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/framework/mlt_repository.c b/src/framework/mlt_repository.c index 482a9ebbf..b82a347ad 100644 --- a/src/framework/mlt_repository.c +++ b/src/framework/mlt_repository.c @@ -230,52 +230,50 @@ void mlt_repository_register(mlt_repository self, const char *service, mlt_register_callback symbol) { + mlt_properties service_list = NULL; + const char *service_type_name = "unknown"; + // Add the entry point to the corresponding service list switch (service_type) { case mlt_service_consumer_type: - mlt_properties_set_data(self->consumers, - service, - new_service(symbol), - 0, - (mlt_destructor) mlt_properties_close, - NULL); + service_list = self->consumers; + service_type_name = "consumer"; break; case mlt_service_filter_type: - mlt_properties_set_data(self->filters, - service, - new_service(symbol), - 0, - (mlt_destructor) mlt_properties_close, - NULL); + service_list = self->filters; + service_type_name = "filter"; break; case mlt_service_link_type: - mlt_properties_set_data(self->links, - service, - new_service(symbol), - 0, - (mlt_destructor) mlt_properties_close, - NULL); + service_list = self->links; + service_type_name = "link"; break; case mlt_service_producer_type: - mlt_properties_set_data(self->producers, - service, - new_service(symbol), - 0, - (mlt_destructor) mlt_properties_close, - NULL); + service_list = self->producers; + service_type_name = "producer"; break; case mlt_service_transition_type: - mlt_properties_set_data(self->transitions, - service, - new_service(symbol), - 0, - (mlt_destructor) mlt_properties_close, - NULL); + service_list = self->transitions; + service_type_name = "transition"; break; default: mlt_log_error(NULL, "%s: Unable to register \"%s\"\n", __FUNCTION__, service); - break; + return; + } + + if (mlt_properties_get_data(service_list, service, NULL)) { + mlt_log_error(NULL, + "%s: Duplicate %s registration for \"%s\"\n", + __FUNCTION__, + service_type_name, + service); } + + mlt_properties_set_data(service_list, + service, + new_service(symbol), + 0, + (mlt_destructor) mlt_properties_close, + NULL); } /** Get the repository properties for particular service class. diff --git a/src/modules/jackrack/CMakeLists.txt b/src/modules/jackrack/CMakeLists.txt index 8ad3711eb..843179f08 100644 --- a/src/modules/jackrack/CMakeLists.txt +++ b/src/modules/jackrack/CMakeLists.txt @@ -1,86 +1,65 @@ -add_library(mltjackrack MODULE factory.c) - file(GLOB YML "*.yml") add_custom_target(Other_jackrack_Files SOURCES ${YML} ) -include(GenerateExportHeader) -generate_export_header(mltjackrack) -target_compile_options(mltjackrack PRIVATE ${MLT_COMPILE_OPTIONS}) - -target_link_libraries(mltjackrack PRIVATE mlt Threads::Threads) -if(MSVC) - target_link_libraries(mltjackrack PRIVATE PThreads4W::PThreads4W) -endif() -target_include_directories(mltjackrack PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(TARGET JACK::JACK) + add_library(mltjackrack MODULE factory.c) + + include(GenerateExportHeader) + generate_export_header(mltjackrack) + target_compile_options(mltjackrack PRIVATE ${MLT_COMPILE_OPTIONS}) + target_sources(mltjackrack PRIVATE consumer_jack.c) - target_link_libraries(mltjackrack PRIVATE JACK::JACK) - if(MSVC) - target_link_libraries(mltjackrack PRIVATE msvccompat) - endif() + target_include_directories(mltjackrack PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_compile_definitions(mltjackrack PRIVATE WITH_JACK) - install(FILES consumer_jack.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) -endif() - -if(GPL AND TARGET PkgConfig::xml AND TARGET PkgConfig::glib AND ladspa_h_FOUND) - target_sources(mltjackrack PRIVATE - jack_rack.c jack_rack.h - lock_free_fifo.c lock_free_fifo.h - plugin.c plugin.h - plugin_desc.c plugin_desc.h - plugin_mgr.c plugin_mgr.h - plugin_settings.c plugin_settings.h - process.c process.h - producer_ladspa.c - filter_ladspa.c - ) - target_link_libraries(mltjackrack PRIVATE ${CMAKE_DL_LIBS} PkgConfig::xml PkgConfig::glib) + target_link_libraries(mltjackrack PRIVATE mlt Threads::Threads JACK::JACK) if(MSVC) - target_link_libraries(mltjackrack PRIVATE dirent) - else() - target_link_libraries(mltjackrack PRIVATE m) + target_link_libraries(mltjackrack PRIVATE PThreads4W::PThreads4W msvccompat) endif() + install(FILES consumer_jack.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) - target_compile_definitions(mltjackrack PRIVATE GPL) - if(RELOCATABLE) - target_compile_definitions(mltjackrack PRIVATE RELOCATABLE) + if(USE_LADSPA) + target_sources(mltjackrack PRIVATE + filter_jackrack.c + jack_rack.c jack_rack.h + lock_free_fifo.c lock_free_fifo.h + plugin.c plugin.h + plugin_desc.c plugin_desc.h + plugin_mgr.c plugin_mgr.h + plugin_settings.c plugin_settings.h + process.c process.h + producer_ladspa.c + filter_ladspa.c + ) + target_compile_definitions(mltjackrack PRIVATE WITH_LADSPA) + if(RELOCATABLE) + target_compile_definitions(mltjackrack PRIVATE RELOCATABLE) + endif() + target_link_libraries(mltjackrack PRIVATE ${CMAKE_DL_LIBS} PkgConfig::xml PkgConfig::glib) + if(MSVC) + target_link_libraries(mltjackrack PRIVATE dirent) + else() + target_link_libraries(mltjackrack PRIVATE m) + endif() + + install(FILES filter_jack.yml filter_jackrack.yml blacklist.txt DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) endif() - install(FILES filter_jack.yml blacklist.txt DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) - - if(TARGET JACK::JACK) - target_sources(mltjackrack PRIVATE filter_jackrack.c) - install(FILES filter_jackrack.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) - endif() + set_target_properties(mltjackrack PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") + install(TARGETS mltjackrack LIBRARY DESTINATION ${MLT_INSTALL_MODULE_DIR}) +else() + message(STATUS "JACK not found; disabling mltjackrack target") endif() -set_target_properties(mltjackrack PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") -add_library(mltladspa MODULE factory.c) +if(USE_LADSPA) + add_library(mltladspa MODULE factory.c) + include(GenerateExportHeader) + generate_export_header(mltladspa) + target_compile_options(mltladspa PRIVATE ${MLT_COMPILE_OPTIONS}) -generate_export_header(mltladspa) -target_compile_options(mltladspa PRIVATE ${MLT_COMPILE_OPTIONS}) - -target_link_libraries(mltladspa PRIVATE mlt Threads::Threads) -if(MSVC) - target_link_libraries(mltladspa PRIVATE PThreads4W::PThreads4W) -endif() -target_include_directories(mltladspa PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) - -if(USE_LV2 AND GPL) - target_compile_definitions(mltladspa PRIVATE WITH_LV2) - install(FILES filter_lv2.yml producer_lv2.yml lv2blacklist.txt DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) -endif() - -if(USE_VST2 AND GPL) - target_compile_definitions(mltladspa PRIVATE WITH_VST2) - install(FILES filter_vst2.yml producer_vst2.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) -endif() - -if(GPL AND TARGET PkgConfig::xml AND TARGET PkgConfig::glib AND ladspa_h_FOUND) target_sources(mltladspa PRIVATE jack_rack.c jack_rack.h lock_free_fifo.c lock_free_fifo.h @@ -92,21 +71,23 @@ if(GPL AND TARGET PkgConfig::xml AND TARGET PkgConfig::glib AND ladspa_h_FOUND) producer_ladspa.c filter_ladspa.c ) - target_link_libraries(mltladspa PRIVATE ${CMAKE_DL_LIBS} PkgConfig::xml PkgConfig::glib) + target_include_directories(mltladspa PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_compile_definitions(mltladspa PRIVATE WITH_LADSPA) + if(RELOCATABLE) + target_compile_definitions(mltladspa PRIVATE RELOCATABLE) + endif() + target_link_libraries(mltladspa PRIVATE ${CMAKE_DL_LIBS} mlt PkgConfig::xml PkgConfig::glib Threads::Threads) if(MSVC) target_link_libraries(mltladspa PRIVATE dirent) + target_link_libraries(mltladspa PRIVATE PThreads4W::PThreads4W) else() target_link_libraries(mltladspa PRIVATE m) endif() - target_compile_definitions(mltladspa PRIVATE GPL) - if(RELOCATABLE) - target_compile_definitions(mltladspa PRIVATE RELOCATABLE) - endif() - install(FILES filter_ladspa.yml producer_ladspa.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) - if(USE_LV2 AND TARGET PkgConfig::lilv) + if(USE_LV2) + target_compile_definitions(mltladspa PRIVATE WITH_LV2) target_link_libraries(mltladspa PRIVATE PkgConfig::lilv) target_sources(mltladspa PRIVATE filter_lv2.c producer_lv2.c @@ -115,10 +96,11 @@ if(GPL AND TARGET PkgConfig::xml AND TARGET PkgConfig::glib AND ladspa_h_FOUND) lv2_process.c lv2_process.h lv2_plugin_settings.c lv2_plugin_settings.h lv2_urid_helper.h) - install(FILES filter_lv2.yml producer_lv2.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) + install(FILES filter_lv2.yml producer_lv2.yml lv2blacklist.txt DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) endif() if(USE_VST2) + target_compile_definitions(mltladspa PRIVATE WITH_VST2) target_sources(mltladspa PRIVATE filter_vst2.c producer_vst2.c vst2_context.c vst2_context.h @@ -128,8 +110,7 @@ if(GPL AND TARGET PkgConfig::xml AND TARGET PkgConfig::glib AND ladspa_h_FOUND) vestige.h) install(FILES filter_vst2.yml producer_vst2.yml DESTINATION ${MLT_INSTALL_DATA_DIR}/jackrack) endif() -endif() -set_target_properties(mltladspa PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") - -install(TARGETS mltjackrack mltladspa LIBRARY DESTINATION ${MLT_INSTALL_MODULE_DIR}) + set_target_properties(mltladspa PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") + install(TARGETS mltladspa LIBRARY DESTINATION ${MLT_INSTALL_MODULE_DIR}) +endif() diff --git a/src/modules/jackrack/factory.c b/src/modules/jackrack/factory.c index ff815737c..7cd98ea0c 100644 --- a/src/modules/jackrack/factory.c +++ b/src/modules/jackrack/factory.c @@ -20,7 +20,6 @@ #include #include -#include #include #include #include @@ -34,21 +33,22 @@ #define JACKRACK_MODULE_EXPORT #endif +#ifdef WITH_JACK extern mlt_consumer consumer_jack_init(mlt_profile profile, mlt_service_type type, const char *id, char *arg); - -#ifdef GPL -#include "plugin_mgr.h" -#include - -#ifdef WITH_JACK +#ifdef WITH_LADSPA extern mlt_filter filter_jackrack_init(mlt_profile profile, mlt_service_type type, const char *id, char *arg); #endif +#endif + +#ifdef WITH_LADSPA + +#if !defined(WITH_JACK) extern mlt_filter filter_ladspa_init(mlt_profile profile, mlt_service_type type, const char *id, @@ -57,6 +57,11 @@ extern mlt_producer producer_ladspa_init(mlt_profile profile, mlt_service_type type, const char *id, char *arg); +#endif + +#include "plugin_mgr.h" +#include +plugin_mgr_t *g_jackrack_plugin_mgr = NULL; #ifdef WITH_LV2 @@ -82,6 +87,7 @@ extern mlt_producer producer_lv2_init(mlt_profile profile, mlt_service_type type, const char *id, char *arg); +lv2_mgr_t *g_lv2_plugin_mgr = NULL; #endif #ifdef WITH_VST2 @@ -97,15 +103,6 @@ extern mlt_producer producer_vst2_init(mlt_profile profile, const char *id, char *arg); -#endif - -plugin_mgr_t *g_jackrack_plugin_mgr = NULL; - -#ifdef WITH_LV2 -lv2_mgr_t *g_lv2_plugin_mgr = NULL; -#endif - -#ifdef WITH_VST2 vst2_mgr_t *g_vst2_plugin_mgr = NULL; #endif @@ -154,28 +151,29 @@ static void add_port_to_metadata(mlt_properties p, plugin_desc_t *desc, int j) mlt_properties_set(p, "animation", "yes"); } -#endif +#endif // WITH_LADSPA static mlt_properties metadata(mlt_service_type type, const char *id, char *data) { + int is_ladspa = !strncmp(id, "ladspa.", 7); char file[PATH_MAX]; if (type == mlt_service_filter_type) { snprintf(file, PATH_MAX, "%s/jackrack/%s", mlt_environment("MLT_DATA"), - strncmp(id, "ladspa.", 7) ? data : "filter_ladspa.yml"); + is_ladspa ? "filter_ladspa.yml" : data); } else { snprintf(file, PATH_MAX, "%s/jackrack/%s", mlt_environment("MLT_DATA"), - strncmp(id, "ladspa.", 7) ? data : "producer_ladspa.yml"); + is_ladspa ? "producer_ladspa.yml" : data); } mlt_properties result = mlt_properties_parse_yaml(file); -#ifdef GPL - if (!strncmp(id, "ladspa.", 7)) { +#ifdef WITH_LADSPA + if (is_ladspa) { // Annotate the yaml properties with ladspa control port info. plugin_desc_t *desc = plugin_mgr_get_any_desc(g_jackrack_plugin_mgr, strtol(id + 7, NULL, 10)); @@ -492,7 +490,7 @@ static mlt_properties lv2_metadata(mlt_service_type type, const char *id, char * mlt_properties_set(p, "title", "Channel Mask"); mlt_properties_set(p, "description", - "A bitmask inidicating which channels to affect."); + "A bitmask indicating which channels to affect."); mlt_properties_set(p, "type", "integer"); mlt_properties_set(p, "default", "0xFFFFFFFF"); mlt_properties_set_int(p, "minimum", 0); @@ -624,19 +622,19 @@ static mlt_properties vst2_metadata(mlt_service_type type, const char *id, char mlt_properties_set(p, "mutable", "yes"); } /* for (i = 0; i < desc->status_port_count; i++) { - int j = desc->status_port_indicies[i]; - p = mlt_properties_new(); - snprintf(key, sizeof(key), "%d", mlt_properties_count(params)); - mlt_properties_set_data(params, - key, - p, - 0, - (mlt_destructor) mlt_properties_close, - NULL); - snprintf(key, sizeof(key), "%d[*]", j); - mlt_properties_set(p, "identifier", key); - vst2_add_port_to_metadata(p, desc, j); - mlt_properties_set(p, "readonly", "yes"); + int j = desc->status_port_indicies[i]; + p = mlt_properties_new(); + snprintf(key, sizeof(key), "%d", mlt_properties_count(params)); + mlt_properties_set_data(params, + key, + p, + 0, + (mlt_destructor) mlt_properties_close, + NULL); + snprintf(key, sizeof(key), "%d[*]", j); + mlt_properties_set(p, "identifier", key); + vst2_add_port_to_metadata(p, desc, j); + mlt_properties_set(p, "readonly", "yes"); } */ p = mlt_properties_new(); @@ -686,7 +684,7 @@ static mlt_properties vst2_metadata(mlt_service_type type, const char *id, char mlt_properties_set(p, "title", "Channel Mask"); mlt_properties_set(p, "description", - "A bitmask inidicating which channels to affect."); + "A bitmask indicating which channels to affect."); mlt_properties_set(p, "type", "integer"); mlt_properties_set(p, "default", "0xFFFFFFFF"); mlt_properties_set_int(p, "minimum", 0); @@ -703,97 +701,106 @@ static mlt_properties vst2_metadata(mlt_service_type type, const char *id, char JACKRACK_MODULE_EXPORT MLT_REPOSITORY { -#ifdef GPL - GSList *list; - g_jackrack_plugin_mgr = plugin_mgr_new(); - - for (list = g_jackrack_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { - plugin_desc_t *desc = (plugin_desc_t *) list->data; - char *s = malloc(strlen("ladpsa.") + 21); - - sprintf(s, "ladspa.%lu", desc->id); - - if (desc->has_input) { - MLT_REGISTER(mlt_service_filter_type, s, filter_ladspa_init); - MLT_REGISTER_METADATA(mlt_service_filter_type, s, metadata, NULL); - } else { - MLT_REGISTER(mlt_service_producer_type, s, producer_ladspa_init); - MLT_REGISTER_METADATA(mlt_service_producer_type, s, metadata, NULL); - } + // Registrations owned by mltladspa. +#if defined(WITH_LADSPA) && !defined(WITH_JACK) + MLT_REGISTER(mlt_service_filter_type, "ladspa", filter_ladspa_init); + MLT_REGISTER_METADATA(mlt_service_filter_type, "ladspa", metadata, "filter_ladspa.yml"); + { + GSList *list; + g_jackrack_plugin_mgr = plugin_mgr_new(); + + for (list = g_jackrack_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { + plugin_desc_t *desc = (plugin_desc_t *) list->data; + char *s = malloc(strlen("ladspa.") + 21); + + sprintf(s, "ladspa.%lu", desc->id); + + if (desc->has_input) { + MLT_REGISTER(mlt_service_filter_type, s, filter_ladspa_init); + MLT_REGISTER_METADATA(mlt_service_filter_type, s, metadata, NULL); + } else { + MLT_REGISTER(mlt_service_producer_type, s, producer_ladspa_init); + MLT_REGISTER_METADATA(mlt_service_producer_type, s, metadata, NULL); + } - free(s); + free(s); + } + mlt_factory_register_for_clean_up(g_jackrack_plugin_mgr, + (mlt_destructor) plugin_mgr_destroy); } - mlt_factory_register_for_clean_up(g_jackrack_plugin_mgr, (mlt_destructor) plugin_mgr_destroy); +#endif #ifdef WITH_LV2 - g_lv2_plugin_mgr = lv2_mgr_new(); + { + GSList *list; + g_lv2_plugin_mgr = lv2_mgr_new(); - char global_lv2_world[20]; - snprintf(global_lv2_world, 20, "%p", g_lv2_plugin_mgr->lv2_world); - mlt_environment_set("global_lv2_world", global_lv2_world); + char global_lv2_world[20]; + snprintf(global_lv2_world, 20, "%p", g_lv2_plugin_mgr->lv2_world); + mlt_environment_set("global_lv2_world", global_lv2_world); - for (list = g_lv2_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { - lv2_plugin_desc_t *desc = (lv2_plugin_desc_t *) list->data; - char *s = NULL; - s = calloc(1, strlen("lv2.") + strlen(desc->uri) + 1); + for (list = g_lv2_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { + lv2_plugin_desc_t *desc = (lv2_plugin_desc_t *) list->data; + char *s = NULL; + s = calloc(1, strlen("lv2.") + strlen(desc->uri) + 1); - sprintf(s, "lv2.%s", desc->uri); + sprintf(s, "lv2.%s", desc->uri); - char *str_ptr = strchr(s, ':'); - while (str_ptr != NULL) { - *str_ptr++ = '^'; - str_ptr = strchr(str_ptr, ':'); - } + char *str_ptr = strchr(s, ':'); + while (str_ptr != NULL) { + *str_ptr++ = '^'; + str_ptr = strchr(str_ptr, ':'); + } - if (desc->has_input) { - MLT_REGISTER(mlt_service_filter_type, s, filter_lv2_init); - MLT_REGISTER_METADATA(mlt_service_filter_type, s, lv2_metadata, NULL); - } else { - MLT_REGISTER(mlt_service_producer_type, s, producer_lv2_init); - MLT_REGISTER_METADATA(mlt_service_producer_type, s, lv2_metadata, NULL); - } + if (desc->has_input) { + MLT_REGISTER(mlt_service_filter_type, s, filter_lv2_init); + MLT_REGISTER_METADATA(mlt_service_filter_type, s, lv2_metadata, NULL); + } else { + MLT_REGISTER(mlt_service_producer_type, s, producer_lv2_init); + MLT_REGISTER_METADATA(mlt_service_producer_type, s, lv2_metadata, NULL); + } - if (s) { - free(s); + if (s) { + free(s); + } } } #endif #ifdef WITH_VST2 + { + GSList *list; + g_vst2_plugin_mgr = vst2_mgr_new(); + + for (list = g_vst2_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { + vst2_plugin_desc_t *desc = (vst2_plugin_desc_t *) list->data; + char *s = malloc(strlen("vst2.") + 21); + + sprintf(s, "vst2.%lu", desc->id); + + if (desc->has_input) { + MLT_REGISTER(mlt_service_filter_type, s, filter_vst2_init); + MLT_REGISTER_METADATA(mlt_service_filter_type, s, vst2_metadata, NULL); + } else { + MLT_REGISTER(mlt_service_producer_type, s, producer_vst2_init); + MLT_REGISTER_METADATA(mlt_service_producer_type, s, vst2_metadata, NULL); + } - g_vst2_plugin_mgr = vst2_mgr_new(); - - for (list = g_vst2_plugin_mgr->all_plugins; list; list = g_slist_next(list)) { - vst2_plugin_desc_t *desc = (vst2_plugin_desc_t *) list->data; - char *s = malloc(strlen("vst2.") + 21); - - sprintf(s, "vst2.%lu", desc->id); - - if (desc->has_input) { - MLT_REGISTER(mlt_service_filter_type, s, filter_vst2_init); - MLT_REGISTER_METADATA(mlt_service_filter_type, s, vst2_metadata, NULL); - } else { - MLT_REGISTER(mlt_service_producer_type, s, producer_vst2_init); - MLT_REGISTER_METADATA(mlt_service_producer_type, s, vst2_metadata, NULL); + free(s); } - - free(s); + mlt_factory_register_for_clean_up(g_vst2_plugin_mgr, (mlt_destructor) vst2_mgr_destroy); } - mlt_factory_register_for_clean_up(g_vst2_plugin_mgr, (mlt_destructor) vst2_mgr_destroy); - #endif + // Registrations owned by mltjackrack. #ifdef WITH_JACK + MLT_REGISTER(mlt_service_consumer_type, "jack", consumer_jack_init); + MLT_REGISTER_METADATA(mlt_service_consumer_type, "jack", metadata, "consumer_jack.yml"); +#ifdef WITH_LADSPA MLT_REGISTER(mlt_service_filter_type, "jack", filter_jackrack_init); MLT_REGISTER_METADATA(mlt_service_filter_type, "jack", metadata, "filter_jack.yml"); MLT_REGISTER(mlt_service_filter_type, "jackrack", filter_jackrack_init); MLT_REGISTER_METADATA(mlt_service_filter_type, "jackrack", metadata, "filter_jackrack.yml"); #endif - MLT_REGISTER(mlt_service_filter_type, "ladspa", filter_ladspa_init); - MLT_REGISTER_METADATA(mlt_service_filter_type, "ladspa", metadata, "filter_ladspa.yml"); -#endif -#ifdef WITH_JACK - MLT_REGISTER(mlt_service_consumer_type, "jack", consumer_jack_init); - MLT_REGISTER_METADATA(mlt_service_consumer_type, "jack", metadata, "consumer_jack.yml"); #endif }