diff --git a/CMakeLists.txt b/CMakeLists.txt index e71082d0..9420529d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ option (SFIZZ_JACK "Enable JACK stand-alone build [default: ON]" ON option (SFIZZ_RENDER "Enable renderer of SMF files [default: ON]" ON) option (SFIZZ_LV2 "Enable LV2 plug-in build [default: ON]" ON) option (SFIZZ_VST "Enable VST plug-in build [default: OFF]" OFF) +option (SFIZZ_AU "Enable AU plug-in build [default: OFF]" OFF) option (SFIZZ_BENCHMARKS "Enable benchmarks build [default: OFF]" OFF) option (SFIZZ_TESTS "Enable tests build [default: OFF]" OFF) option (SFIZZ_DEVTOOLS "Enable developer tools build [default: OFF]" OFF) diff --git a/cmake/SfizzConfig.cmake b/cmake/SfizzConfig.cmake index 7482857c..6b5818fc 100644 --- a/cmake/SfizzConfig.cmake +++ b/cmake/SfizzConfig.cmake @@ -105,6 +105,7 @@ Build as shared library: ${SFIZZ_SHARED} Build JACK stand-alone client: ${SFIZZ_JACK} Build LV2 plug-in: ${SFIZZ_LV2} Build VST plug-in: ${SFIZZ_VST} +Build AU plug-in: ${SFIZZ_AU} Build benchmarks: ${SFIZZ_BENCHMARKS} Build tests: ${SFIZZ_TESTS} Use vcpkg: ${SFIZZ_USE_VCPKG} diff --git a/vst/CMakeLists.txt b/vst/CMakeLists.txt index 7a38c7a2..d3f55997 100644 --- a/vst/CMakeLists.txt +++ b/vst/CMakeLists.txt @@ -12,7 +12,7 @@ configure_file (VstPluginDefs.h.in "${CMAKE_CURRENT_BINARY_DIR}/VstPluginDefs.h" include("cmake/Vst3.cmake") # Build the plugin -add_library(${VSTPLUGIN_PRJ_NAME} MODULE +set(VSTPLUGIN_SOURCES SfizzVstProcessor.cpp SfizzVstController.cpp SfizzVstEditor.cpp @@ -21,6 +21,12 @@ add_library(${VSTPLUGIN_PRJ_NAME} MODULE VstPluginFactory.cpp X11RunLoop.cpp) +set(VSTPLUGIN_RESOURCES + logo.png) + +add_library(${VSTPLUGIN_PRJ_NAME} MODULE + ${VSTPLUGIN_SOURCES}) + if(WIN32) target_sources(${VSTPLUGIN_PRJ_NAME} PRIVATE vst3.def) endif() @@ -51,8 +57,10 @@ endif() # Create the bundle (see "VST 3 Locations / Format") execute_process ( COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") -file (COPY "${CMAKE_CURRENT_SOURCE_DIR}/resources/logo.png" - DESTINATION "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") +foreach(res ${VSTPLUGIN_RESOURCES}) + file (COPY "${CMAKE_CURRENT_SOURCE_DIR}/resources/${res}" + DESTINATION "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") +endforeach() if(WIN32) set_target_properties(${VSTPLUGIN_PRJ_NAME} PROPERTIES SUFFIX ".vst3" @@ -73,7 +81,7 @@ elseif(APPLE) DESTINATION "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents") set(SFIZZ_VST3_BUNDLE_EXECUTABLE "${PROJECT_NAME}") set(SFIZZ_VST3_BUNDLE_VERSION "${PROJECT_VERSION}") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.plist" + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.vst3.plist" "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Info.plist" @ONLY) file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/mac/Plugin.icns" DESTINATION "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") @@ -109,3 +117,148 @@ if (NOT MSVC) DESTINATION "${VSTPLUGIN_INSTALL_DIR}" COMPONENT "vst") endif() + +# --- Audio Unit wrapper --- # + +if(SFIZZ_AU AND NOT APPLE) + message(WARNING "Audio Unit is available only for macOS builds") +elseif(SFIZZ_AU) + set(AUPLUGIN_PRJ_NAME "${PROJECT_NAME}_au") + set(AUPLUGIN_BUNDLE_NAME "${PROJECT_NAME}.component") + + add_library(${AUPLUGIN_PRJ_NAME} MODULE + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/aucarbonview.mm" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/aucocoaview.mm" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/ausdk.mm" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/auwrapper.mm" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/NSDataIBStream.mm") + target_include_directories(${AUPLUGIN_PRJ_NAME} PRIVATE + "${VST3SDK_BASEDIR}") + target_link_libraries(${AUPLUGIN_PRJ_NAME} PRIVATE + "${APPLE_FOUNDATION_LIBRARY}" + "${APPLE_COCOA_LIBRARY}" + "${APPLE_CARBON_LIBRARY}" + "${APPLE_AUDIOTOOLBOX_LIBRARY}" + "${APPLE_COREAUDIO_LIBRARY}" + "${APPLE_COREMIDI_LIBRARY}") + + set_target_properties(${AUPLUGIN_PRJ_NAME} PROPERTIES + OUTPUT_NAME "${PROJECT_NAME}" + PREFIX "") + + # Add Core Audio utility classes + set(CA_UTILITY_BASEDIR + "${CMAKE_CURRENT_SOURCE_DIR}/external/CoreAudioUtilityClasses") + target_include_directories(${AUPLUGIN_PRJ_NAME} PRIVATE + "${CA_UTILITY_BASEDIR}/CoreAudio" + "${CA_UTILITY_BASEDIR}/CoreAudio/AudioUnits" + "${CA_UTILITY_BASEDIR}/CoreAudio/AudioUnits/AUPublic/AUBase" + "${CA_UTILITY_BASEDIR}/CoreAudio/AudioUnits/AUPublic/Utility" + "${CA_UTILITY_BASEDIR}/CoreAudio/PublicUtility") + + # Add VST base classes + target_sources(${AUPLUGIN_PRJ_NAME} PRIVATE + "${VST3SDK_BASEDIR}/base/source/baseiids.cpp" + "${VST3SDK_BASEDIR}/base/source/fbuffer.cpp" + "${VST3SDK_BASEDIR}/base/source/fdebug.cpp" + "${VST3SDK_BASEDIR}/base/source/fdynlib.cpp" + "${VST3SDK_BASEDIR}/base/source/fobject.cpp" + "${VST3SDK_BASEDIR}/base/source/fstreamer.cpp" + "${VST3SDK_BASEDIR}/base/source/fstring.cpp" + "${VST3SDK_BASEDIR}/base/source/timer.cpp" + "${VST3SDK_BASEDIR}/base/source/updatehandler.cpp" + "${VST3SDK_BASEDIR}/base/thread/source/fcondition.cpp" + "${VST3SDK_BASEDIR}/base/thread/source/flock.cpp" + "${VST3SDK_BASEDIR}/pluginterfaces/base/conststringtable.cpp" + "${VST3SDK_BASEDIR}/pluginterfaces/base/coreiids.cpp" + "${VST3SDK_BASEDIR}/pluginterfaces/base/funknown.cpp" + "${VST3SDK_BASEDIR}/pluginterfaces/base/ustring.cpp" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/vstinitiids.cpp") + + # Add VST hosting classes + target_sources(${AUPLUGIN_PRJ_NAME} PRIVATE + "${VST3SDK_BASEDIR}/public.sdk/source/vst/hosting/eventlist.cpp" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/hosting/hostclasses.cpp" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/hosting/parameterchanges.cpp" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/hosting/processdata.cpp") + + # Add generated source + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") + target_include_directories(${AUPLUGIN_PRJ_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") + string(TIMESTAMP SFIZZ_AU_CLASS_PREFIX_NUMBER "%s" UTC) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/aucocoaclassprefix.h" + "#define SMTG_AU_NAMESPACE SMTGAUCocoa${SFIZZ_AU_CLASS_PREFIX_NUMBER}_") + + sfizz_enable_lto_if_needed (${AUPLUGIN_PRJ_NAME}) + + # Create the bundle + execute_process( + COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/Resources") + set_target_properties(${AUPLUGIN_PRJ_NAME} PROPERTIES + SUFFIX "" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/MacOS") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/mac/PkgInfo" + DESTINATION "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents") + set(SFIZZ_AU_BUNDLE_EXECUTABLE "${PROJECT_NAME}") + set(SFIZZ_AU_BUNDLE_VERSION "${PROJECT_VERSION}") + set(SFIZZ_AU_BUNDLE_IDENTIFIER "tools.sfz.sfizz.au") + set(SFIZZ_AU_BUNDLE_TYPE "aumu") + set(SFIZZ_AU_BUNDLE_SUBTYPE "samp") + set(SFIZZ_AU_BUNDLE_MANUFACTURER "Sfzt") + math(EXPR SFIZZ_AU_DECIMAL_VERSION + "${PROJECT_VERSION_MAJOR}*10000 + ${PROJECT_VERSION_MINOR}*100 + ${PROJECT_VERSION_PATCH}") + execute_process( + COMMAND "sh" "-c" "echo 'obase=16;${SFIZZ_AU_DECIMAL_VERSION}' | bc" + OUTPUT_VARIABLE SFIZZ_AU_HEXADECIMAL_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.au.plist" + "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/Info.plist" @ONLY) + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/mac/Plugin.icns" + DESTINATION "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/Resources") + + file(COPY "gpl-3.0.txt" + DESTINATION "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}") + + # Add the resource fork + execute_process(COMMAND "xcrun" "--find" "Rez" + OUTPUT_VARIABLE OSX_REZ_COMMAND OUTPUT_STRIP_TRAILING_WHITESPACE) + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/mac/audiounitconfig.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/include/audiounitconfig.h" @ONLY) + add_custom_command(TARGET ${AUPLUGIN_PRJ_NAME} POST_BUILD COMMAND + "${OSX_REZ_COMMAND}" + "-d" "SystemSevenOrLater=1" + "-script" "Roman" + "-d" "i386_YES" + "-d" "x86_64_YES" + "-is" "${CMAKE_OSX_SYSROOT}" + "-I" "${CMAKE_OSX_SYSROOT}/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers" + "-I" "/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers" + "-I" "/System/Library/Frameworks/AudioUnit.framework/Versions/A/Headers/" + "-I" "${CA_UTILITY_BASEDIR}/CoreAudio/AudioUnits/AUPublic/AUBase" + "-I" "${CMAKE_CURRENT_BINARY_DIR}/include" # generated audiounitconfig.h + "-o" "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/Resources/${PROJECT_NAME}.rsrc" + "-useDF" + "${VST3SDK_BASEDIR}/public.sdk/source/vst/auwrapper/auresource.r") + + # Copy VST3 in the bundle + add_custom_command(TARGET ${VSTPLUGIN_PRJ_NAME} POST_BUILD COMMAND + "${CMAKE_COMMAND}" "-E" + "copy_directory" + "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}" + "${PROJECT_BINARY_DIR}/${AUPLUGIN_BUNDLE_NAME}/Contents/Resources/plugin.vst3") + + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + target_compile_options(${AUPLUGIN_PRJ_NAME} PRIVATE + "-Wno-extra" + "-Wno-multichar" + "-Wno-reorder" + "-Wno-class-memaccess" + "-Wno-ignored-qualifiers" + "-Wno-unknown-pragmas" + "-Wno-unused-function" + "-Wno-unused-parameter" + "-Wno-unused-variable") + endif() +endif() diff --git a/vst/cmake/Vst3.cmake b/vst/cmake/Vst3.cmake index 6e2f62df..68118f73 100644 --- a/vst/cmake/Vst3.cmake +++ b/vst/cmake/Vst3.cmake @@ -203,18 +203,26 @@ function(plugin_add_vstgui NAME) endif() elseif(APPLE) find_library(APPLE_COREFOUNDATION_LIBRARY "CoreFoundation") + find_library(APPLE_FOUNDATION_LIBRARY "Foundation") find_library(APPLE_COCOA_LIBRARY "Cocoa") find_library(APPLE_OPENGL_LIBRARY "OpenGL") find_library(APPLE_ACCELERATE_LIBRARY "Accelerate") find_library(APPLE_QUARTZCORE_LIBRARY "QuartzCore") find_library(APPLE_CARBON_LIBRARY "Carbon") + find_library(APPLE_AUDIOTOOLBOX_LIBRARY "AudioToolbox") + find_library(APPLE_COREAUDIO_LIBRARY "CoreAudio") + find_library(APPLE_COREMIDI_LIBRARY "CoreMIDI") target_link_libraries("${NAME}" PRIVATE "${APPLE_COREFOUNDATION_LIBRARY}" + "${APPLE_FOUNDATION_LIBRARY}" "${APPLE_COCOA_LIBRARY}" "${APPLE_OPENGL_LIBRARY}" "${APPLE_ACCELERATE_LIBRARY}" "${APPLE_QUARTZCORE_LIBRARY}" - "${APPLE_CARBON_LIBRARY}") + "${APPLE_CARBON_LIBRARY}" + "${APPLE_AUDIOTOOLBOX_LIBRARY}" + "${APPLE_COREAUDIO_LIBRARY}" + "${APPLE_COREMIDI_LIBRARY}") else() find_package(X11 REQUIRED) find_package(Freetype REQUIRED) diff --git a/vst/mac/Info.au.plist b/vst/mac/Info.au.plist new file mode 100644 index 00000000..2fed7012 --- /dev/null +++ b/vst/mac/Info.au.plist @@ -0,0 +1,52 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + @SFIZZ_AU_BUNDLE_EXECUTABLE@ + CFBundleIconFile + Plugin.icns + CFBundleIdentifier + @SFIZZ_AU_BUNDLE_IDENTIFIER@ + CFBundleName + sfizz + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + @SFIZZ_AU_BUNDLE_VERSION@ + CSResourcesFileMapped + + AudioComponents + + + description + @PROJECT_NAME@ + factoryFunction + AUWrapperFactory + manufacturer + @SFIZZ_AU_BUNDLE_MANUFACTURER@ + name + @SFIZZ_AU_BUNDLE_MANUFACTURER@: @PROJECT_NAME@ + sandboxSafe + + type + @SFIZZ_AU_BUNDLE_TYPE@ + subtype + @SFIZZ_AU_BUNDLE_SUBTYPE@ + tags + + Sampler + Synthesizer + + version + @SFIZZ_AU_DECIMAL_VERSION@ + + + + diff --git a/vst/mac/Info.plist b/vst/mac/Info.vst3.plist similarity index 88% rename from vst/mac/Info.plist rename to vst/mac/Info.vst3.plist index fe09355f..f55f661d 100644 --- a/vst/mac/Info.plist +++ b/vst/mac/Info.vst3.plist @@ -9,7 +9,9 @@ CFBundleIconFile Plugin.icns CFBundleIdentifier - tools.sfz.sfizz + tools.sfz.sfizz.vst + CFBundleName + sfizz CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/vst/mac/audiounitconfig.h.in b/vst/mac/audiounitconfig.h.in new file mode 100644 index 00000000..a6fb289f --- /dev/null +++ b/vst/mac/audiounitconfig.h.in @@ -0,0 +1,15 @@ +#define kAudioUnitBundleIdentifier @SFIZZ_AU_BUNDLE_IDENTIFIER@ +#define kAudioUnitVersion 0x@SFIZZ_AU_HEXADECIMAL_VERSION@ +#define kAUPluginName @SFIZZ_AU_BUNDLE_MANUFACTURER@: @PROJECT_NAME@ +#define kAUPluginDescription @PROJECT_NAME@ +#define kAUPluginType @SFIZZ_AU_BUNDLE_TYPE@ +#define kAUPluginSubType @SFIZZ_AU_BUNDLE_SUBTYPE@ +#define kAUPluginManufacturer @SFIZZ_AU_BUNDLE_MANUFACTURER@ + +#define kAudioUnitName "@SFIZZ_AU_BUNDLE_MANUFACTURER@: @PROJECT_NAME@" +#define kAudioUnitDescription "@PROJECT_NAME@" +#define kAudioUnitType '@SFIZZ_AU_BUNDLE_TYPE@' +#define kAudioUnitComponentSubType '@SFIZZ_AU_BUNDLE_SUBTYPE@' +#define kAudioUnitComponentManuf '@SFIZZ_AU_BUNDLE_MANUFACTURER@' + +#define kAudioUnitCarbonView 1