From d4eea1c127981d518550b3bf1798c748562673c4 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 03:19:11 +0400 Subject: [PATCH 1/7] split clap-wrapper into 2 crates; embed vst3sdk and AudioUnitSDK, simplify usage --- .github/workflows/validate.yml | 58 ++- .gitignore | 1 - .gitmodules | 27 +- Cargo.lock | 37 +- Cargo.toml | 24 +- build.rs | 337 ------------------ clap-wrapper-auv2/Cargo.toml | 34 ++ clap-wrapper-auv2/README.md | 0 clap-wrapper-auv2/build.rs | 84 +++++ clap-wrapper-auv2/external/AudioUnitSDK | 1 + clap-wrapper-auv2/external/clap | 1 + .../external}/clap-wrapper | 0 clap-wrapper-auv2/external/filesystem | 1 + .../src}/cpp/generated_cocoaclasses.hxx | 0 .../src}/cpp/generated_entrypoints.hxx | 0 clap-wrapper-auv2/src/lib.rs | 26 ++ clap-wrapper-vst3/Cargo.toml | 34 ++ clap-wrapper-vst3/README.md | 0 clap-wrapper-vst3/build.rs | 142 ++++++++ clap-wrapper-vst3/external/clap | 1 + clap-wrapper-vst3/external/clap-wrapper | 1 + clap-wrapper-vst3/external/filesystem | 1 + clap-wrapper-vst3/external/vst3sdk | 1 + clap-wrapper-vst3/src/lib.rs | 77 ++++ examples/example-clack/Cargo.toml | 4 +- examples/example-clack/src/lib.rs | 4 +- examples/example-nih-plug/Cargo.toml | 4 +- examples/example-nih-plug/src/lib.rs | 4 +- external/clap | 1 - external/filesystem | 1 - src/auv2.rs | 12 - src/lib.rs | 46 --- src/vst3.rs | 66 ---- 33 files changed, 479 insertions(+), 551 deletions(-) delete mode 100644 build.rs create mode 100644 clap-wrapper-auv2/Cargo.toml create mode 100644 clap-wrapper-auv2/README.md create mode 100644 clap-wrapper-auv2/build.rs create mode 160000 clap-wrapper-auv2/external/AudioUnitSDK create mode 160000 clap-wrapper-auv2/external/clap rename {external => clap-wrapper-auv2/external}/clap-wrapper (100%) create mode 160000 clap-wrapper-auv2/external/filesystem rename {src => clap-wrapper-auv2/src}/cpp/generated_cocoaclasses.hxx (100%) rename {src => clap-wrapper-auv2/src}/cpp/generated_entrypoints.hxx (100%) create mode 100644 clap-wrapper-auv2/src/lib.rs create mode 100644 clap-wrapper-vst3/Cargo.toml create mode 100644 clap-wrapper-vst3/README.md create mode 100644 clap-wrapper-vst3/build.rs create mode 160000 clap-wrapper-vst3/external/clap create mode 160000 clap-wrapper-vst3/external/clap-wrapper create mode 160000 clap-wrapper-vst3/external/filesystem create mode 160000 clap-wrapper-vst3/external/vst3sdk create mode 100644 clap-wrapper-vst3/src/lib.rs delete mode 160000 external/clap delete mode 160000 external/filesystem delete mode 100644 src/auv2.rs delete mode 100644 src/lib.rs delete mode 100644 src/vst3.rs diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index d60459a..ff3f0ee 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -21,17 +21,6 @@ jobs: with: submodules: recursive - - name: Checkout `vst3sdk` - shell: bash - run: | - git clone --depth=1 https://github.com/steinbergmedia/vst3sdk - cd vst3sdk - git submodule update --init base - git submodule update --init cmake - git submodule update --init public.sdk - git submodule update --init pluginterfaces - cd .. - - name: Install dependencies shell: bash run: | @@ -41,7 +30,7 @@ jobs: - name: Build `${{ matrix.package }}` shell: bash run: | - CLAP_WRAPPER_VST3_SDK="$(realpath vst3sdk)" CLAP_WRAPPER_VERBOSE=1 cargo build -p ${{ matrix.package }} + cargo build -p ${{ matrix.package }} # bundle vst3 mkdir -p ${{ matrix.package }}.vst3/Contents/x86_64-linux/ @@ -57,7 +46,12 @@ jobs: - name: Build `vst3-validator` shell: bash run: | + git clone --depth=1 https://github.com/steinbergmedia/vst3sdk cd vst3sdk + git submodule update --init base + git submodule update --init cmake + git submodule update --init public.sdk + git submodule update --init pluginterfaces cmake -DSMTG_ENABLE_VSTGUI_SUPPORT=OFF -DSMTG_ENABLE_VST3_PLUGIN_EXAMPLES=OFF -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF -B cmake-build cmake --build cmake-build --target validator cd .. @@ -86,21 +80,10 @@ jobs: with: submodules: recursive - - name: Checkout `vst3sdk` - shell: bash - run: | - git clone --depth=1 https://github.com/steinbergmedia/vst3sdk - cd vst3sdk - git submodule update --init base - git submodule update --init cmake - git submodule update --init public.sdk - git submodule update --init pluginterfaces - cd .. - - name: Build `${{ matrix.package }}` shell: bash run: | - CLAP_WRAPPER_VST3_SDK="$(realpath vst3sdk)" CLAP_WRAPPER_VERBOSE=1 cargo build -p ${{ matrix.package }} + cargo build -p ${{ matrix.package }} # bundle vst3. we dont really have to do that as the dll file by itself can be used as a vst3, # but the validator really wants it to be a vst3 bundle so we have no choice @@ -118,8 +101,13 @@ jobs: - name: Build `vst3-validator` shell: bash run: | + git clone --depth=1 https://github.com/steinbergmedia/vst3sdk cd vst3sdk - cmake -DSMTG_ENABLE_VSTGUI_SUPPORT=OFF -DSMTG_ENABLE_VST3_PLUGIN_EXAMPLES=OFF -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF -B cmake-build + git submodule update --init base + git submodule update --init cmake + git submodule update --init public.sdk + git submodule update --init pluginterfaces + cmake -DSMTG_ENABLE_VSTGUI_SUPPORT=OFF -DSMTG_ENABLE_VST3_PLUGIN_EXAMPLES=OFF -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF -B cmake-build cmake --build cmake-build --target validator cd .. @@ -153,17 +141,6 @@ jobs: with: submodules: recursive - - name: Checkout `vst3sdk` - shell: bash - run: | - git clone --depth=1 https://github.com/steinbergmedia/vst3sdk - cd vst3sdk - git submodule update --init base - git submodule update --init cmake - git submodule update --init public.sdk - git submodule update --init pluginterfaces - cd .. - - name: Checkout `AudioUnitSDK` shell: bash run: | @@ -172,7 +149,7 @@ jobs: - name: Build `${{ matrix.package }}` shell: bash run: | - CLAP_WRAPPER_VST3_SDK="$(realpath vst3sdk)" CLAP_WRAPPER_AUV2_SDK="$(realpath AudioUnitSDK)" CLAP_WRAPPER_VERBOSE=1 cargo build -p ${{ matrix.package }} + cargo build -p ${{ matrix.package }} # bundle vst3 and include the Info.plist stuff # for more info on directory structure, see https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Locations+Format/Plugin+Format.html @@ -208,8 +185,13 @@ jobs: - name: Build `vst3-validator` shell: bash run: | + git clone --depth=1 https://github.com/steinbergmedia/vst3sdk cd vst3sdk - cmake -DSMTG_ENABLE_VSTGUI_SUPPORT=OFF -DSMTG_ENABLE_VST3_PLUGIN_EXAMPLES=OFF -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF -B cmake-build + git submodule update --init base + git submodule update --init cmake + git submodule update --init public.sdk + git submodule update --init pluginterfaces + cmake -DSMTG_ENABLE_VSTGUI_SUPPORT=OFF -DSMTG_ENABLE_VST3_PLUGIN_EXAMPLES=OFF -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF -B cmake-build cmake --build cmake-build --target validator cd .. diff --git a/.gitignore b/.gitignore index f407b79..7be846b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ target -vst3sdk .vscode \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index dd3ee73..a2cf065 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,24 @@ -[submodule "clap-wrapper"] - path = external/clap-wrapper +[submodule "clap-wrapper-vst3/external/clap-wrapper"] + path = clap-wrapper-vst3/external/clap-wrapper url = https://github.com/free-audio/clap-wrapper -[submodule "clap"] - path = external/clap +[submodule "clap-wrapper-vst3/external/clap"] + path = clap-wrapper-vst3/external/clap url = https://github.com/free-audio/clap -[submodule "filesystem"] - path = external/filesystem +[submodule "clap-wrapper-vst3/external/filesystem"] + path = clap-wrapper-vst3/external/filesystem + url = https://github.com/gulrak/filesystem +[submodule "clap-wrapper-vst3/external/vst3sdk"] + path = clap-wrapper-vst3/external/vst3sdk + url = https://github.com/steinbergmedia/vst3sdk +[submodule "clap-wrapper-auv2/external/AudioUnitSDK"] + path = clap-wrapper-auv2/external/AudioUnitSDK + url = https://github.com/apple/AudioUnitSDK +[submodule "clap-wrapper-auv2/external/clap"] + path = clap-wrapper-auv2/external/clap + url = https://github.com/free-audio/clap +[submodule "clap-wrapper-auv2/external/clap-wrapper"] + path = clap-wrapper-auv2/external/clap-wrapper + url = https://github.com/free-audio/clap-wrapper +[submodule "clap-wrapper-auv2/external/filesystem"] + path = clap-wrapper-auv2/external/filesystem url = https://github.com/gulrak/filesystem diff --git a/Cargo.lock b/Cargo.lock index b3eabea..e39496b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -532,10 +532,11 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.2.19" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -617,11 +618,17 @@ version = "0.5.0" source = "git+https://github.com/micahrj/clap-sys.git?rev=25d7f53fdb6363ad63fbd80049cb7a42a97ac156#25d7f53fdb6363ad63fbd80049cb7a42a97ac156" [[package]] -name = "clap-wrapper" +name = "clap-wrapper-auv2" +version = "0.1.2" +dependencies = [ + "cc", +] + +[[package]] +name = "clap-wrapper-vst3" version = "0.1.2" dependencies = [ "cc", - "stdio-override", ] [[package]] @@ -1034,7 +1041,8 @@ version = "0.1.0" dependencies = [ "clack-extensions", "clack-plugin", - "clap-wrapper", + "clap-wrapper-auv2", + "clap-wrapper-vst3", ] [[package]] @@ -1042,7 +1050,8 @@ name = "example-nih-plug" version = "0.1.0" dependencies = [ "atomic_float 1.1.0", - "clap-wrapper", + "clap-wrapper-auv2", + "clap-wrapper-vst3", "nih_plug", "nih_plug_vizia", ] @@ -1092,6 +1101,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + [[package]] name = "flate2" version = "1.1.1" @@ -2738,16 +2753,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stdio-override" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffa8a2e517b4e9f270c47e1c4120df90506d9451c1efa67e3698d66446d30ce" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "swash" version = "0.1.19" diff --git a/Cargo.toml b/Cargo.toml index 77c5b29..547fb45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,24 +3,10 @@ resolver = "3" members = [ ".", "examples/example-clack", - "examples/example-nih-plug" + "examples/example-nih-plug", + "./clap-wrapper-vst3", + "./clap-wrapper-auv2" ] -[package] -name = "clap-wrapper" -version = "0.1.2" -edition = "2024" -authors = ["Quant1um"] -readme = "README.md" -repository = "https://github.com/blepfx/clap-wrapper-rs" -license = "MIT OR Apache-2.0" -description = "An easy way to use clap-wrapper in your audio plugins!" -keywords = ["vst3", "auv2", "clap", "audio", "plugin"] - -[build-dependencies] -cc = "1.2.19" -stdio-override = "0.2.0" - -[features] -default = ["parallel"] -parallel = ["cc/parallel"] \ No newline at end of file +[workspace.dependencies] +cc = "1.2.52" diff --git a/build.rs b/build.rs deleted file mode 100644 index 3c94cc5..0000000 --- a/build.rs +++ /dev/null @@ -1,337 +0,0 @@ -use std::{ - fmt::Display, - hash::{DefaultHasher, Hash, Hasher}, - panic::{AssertUnwindSafe, catch_unwind, resume_unwind}, - path::{Path, PathBuf, absolute}, -}; - -fn main() { - println!("cargo:rerun-if-env-changed=CLAP_WRAPPER_VST3_SDK"); - println!("cargo:rerun-if-env-changed=CLAP_WRAPPER_AUV2_SDK"); - println!("cargo:rerun-if-env-changed=CLAP_WRAPPER_VERBOSE"); - println!("cargo:rerun-if-changed=build.rs"); - println!("cargo:rustc-check-cfg=cfg(clap_wrapper_vst3)"); - println!("cargo:rustc-check-cfg=cfg(clap_wrapper_auv2)"); - - let context = BuildContext { - os: std::env::var("CARGO_CFG_TARGET_OS").unwrap(), - debug: std::env::var("DEBUG").unwrap_or_default() == "true", - verbose: std::env::var("CLAP_WRAPPER_VERBOSE").unwrap_or_default() == "1", - vst3_sdk: std::env::var_os("CLAP_WRAPPER_VST3_SDK").map(PathBuf::from), - auv2_sdk: std::env::var_os("CLAP_WRAPPER_AUV2_SDK").map(PathBuf::from), - }; - - build_vst3(&context); - build_auv2(&context); -} - -struct BuildContext { - os: String, - debug: bool, - verbose: bool, - - vst3_sdk: Option, - auv2_sdk: Option, -} - -fn build_vst3(context: &BuildContext) { - let sdk = match context.vst3_sdk { - Some(ref sdk) => { - if !sdk.is_dir() { - panic!( - "invalid vst3 sdk path: {}", - absolute(sdk).unwrap_or(sdk.clone()).display(), - ) - } - - sdk - } - None => return, - }; - - run_cached(format_args!("vst3-{}", sdk.display()), |dir| { - let mut cc = cc::Build::new(); - cc.cpp(true).std("c++17"); - - // msvc stuff - cc.flag_if_supported("/utf-8"); - cc.flag_if_supported("/EHsc"); - - cc.out_dir(dir); - - cc.include("./external/clap/include"); - cc.include("./external/clap-wrapper/include"); - cc.include("./external/clap-wrapper/libs/fmt"); - cc.include("./external/clap-wrapper/libs/psl"); - cc.include("./external/clap-wrapper/src"); - cc.include(&sdk); - cc.include(sdk.join("public.sdk")); - cc.include(sdk.join("pluginterfaces")); - - cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); - cc.define("CLAP_WRAPPER_BUILD_FOR_VST3", Some("1")); - cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); - - // absolutely cursed fucked up evil and twisted way to "reexport" the entry point symbols - // FIXME: if anyone knows a better way to do this, please let me know - cc.define("GetPluginFactory", Some("clap_wrapper_GetPluginFactory")); - cc.define("ModuleEntry", Some("clap_wrapper_ModuleEntry")); - cc.define("ModuleExit", Some("clap_wrapper_ModuleExit")); - cc.define("InitDll", Some("clap_wrapper_InitDll")); - cc.define("ExitDll", Some("clap_wrapper_ExitDll")); - cc.define("bundleEntry", Some("clap_wrapper_bundleEntry")); - cc.define("bundleExit", Some("clap_wrapper_bundleExit")); - - // vst3 sdk - cc.files(walk_files(sdk.join("base/source"), "cpp")); - cc.files(walk_files(sdk.join("base/thread/source"), "cpp")); - cc.files(walk_files(sdk.join("public.sdk/source/common"), "cpp")); - cc.files(walk_files(sdk.join("pluginterfaces/base"), "cpp")); - cc.files( - [ - "public.sdk/source/main/pluginfactory.cpp", - "public.sdk/source/main/moduleinit.cpp", - "public.sdk/source/vst/vstinitiids.cpp", - "public.sdk/source/vst/vstnoteexpressiontypes.cpp", - "public.sdk/source/vst/vstaudioeffect.cpp", - "public.sdk/source/vst/vstcomponent.cpp", - "public.sdk/source/vst/vstsinglecomponenteffect.cpp", - "public.sdk/source/vst/vstcomponentbase.cpp", - "public.sdk/source/vst/vstbus.cpp", - "public.sdk/source/vst/vstparameters.cpp", - "public.sdk/source/vst/utility/stringconvert.cpp", - ] - .iter() - .map(|s| sdk.join(s)), - ); - - // clap wrapper shared - cc.files([ - "./external/clap-wrapper/src/clap_proxy.cpp", - "./external/clap-wrapper/src/detail/clap/fsutil.cpp", - "./external/clap-wrapper/src/detail/shared/sha1.cpp", - ]); - - // clap vst3 wrapper - cc.files([ - "./external/clap-wrapper/src/wrapasvst3_export_entry.cpp", - "./external/clap-wrapper/src/wrapasvst3.cpp", - "./external/clap-wrapper/src/wrapasvst3_entry.cpp", - "./external/clap-wrapper/src/detail/vst3/parameter.cpp", - "./external/clap-wrapper/src/detail/vst3/plugview.cpp", - "./external/clap-wrapper/src/detail/vst3/process.cpp", - "./external/clap-wrapper/src/detail/vst3/categories.cpp", - ]); - - if context.debug { - cc.define("DEVELOPMENT", Some("1")); - } else { - cc.define("RELEASE", Some("1")); - } - - match context.os.as_str() { - "macos" => { - cc.file(sdk.join("public.sdk/source/main/macmain.cpp")); - cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); - cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); - - cc.define("MAC", None); - - // TODO: test on macos below 10.15 - cc.define("MACOS_USE_GHC_FILESYSTEM", None); - cc.include("./external/filesystem/include"); - - println!("cargo:rustc-link-lib=framework=CoreFoundation"); - println!("cargo:rustc-link-lib=framework=Foundation"); - } - "windows" => { - cc.file(sdk.join("public.sdk/source/main/dllmain.cpp")); - cc.file("./external/clap-wrapper/src/detail/os/windows.cpp"); - cc.define("WIN", None); - - println!("cargo:rustc-link-lib=Shell32"); - println!("cargo:rustc-link-lib=user32"); - println!("cargo:rustc-link-lib=ole32"); - } - "linux" => { - cc.file(sdk.join("public.sdk/source/main/linuxmain.cpp")); - cc.file("./external/clap-wrapper/src/detail/os/linux.cpp"); - cc.define("LIN", None); - } - _ => { - panic!("Unsupported target OS: {}", context.os); - } - } - - if !context.verbose { - cc.warnings(false); - cc.cargo_warnings(false); - } - - cc.try_compile("clap_wrapper_vst3") - .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (vst3): {}", e)); - - println!("cargo:rustc-cfg=clap_wrapper_vst3"); - }); -} - -fn build_auv2(context: &BuildContext) { - let sdk = match context.auv2_sdk { - Some(ref sdk) if context.os == "macos" => { - if !sdk.is_dir() { - panic!( - "invalid auv2 sdk path: {}", - absolute(sdk).unwrap_or(sdk.clone()).display(), - ) - } - - sdk - } - _ => return, - }; - - run_cached(format_args!("auv2-{}", sdk.display()), |dir| { - let mut cc = cc::Build::new(); - cc.cpp(true).std("c++20"); //latest AudioUnitSDK requires C++20 - cc.flag_if_supported("-fno-char8_t"); - cc.out_dir(dir); - - cc.include("./src/cpp"); - cc.include("./external/clap/include"); - cc.include("./external/clap-wrapper/include"); - cc.include("./external/clap-wrapper/libs/fmt"); - cc.include("./external/clap-wrapper/src"); - cc.include(sdk.join("include")); - - cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); - cc.define("CLAP_WRAPPER_BUILD_AUV2", Some("1")); - cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); - cc.define("DICTIONARY_STREAM_FORMAT_WRAPPER", Some("1")); - - // auv2 sdk - cc.files( - [ - "src/AudioUnitSDK/AUBase.cpp", - "src/AudioUnitSDK/AUBuffer.cpp", - "src/AudioUnitSDK/AUBufferAllocator.cpp", - "src/AudioUnitSDK/AUEffectBase.cpp", - "src/AudioUnitSDK/AUMIDIBase.cpp", - "src/AudioUnitSDK/AUMIDIEffectBase.cpp", - "src/AudioUnitSDK/AUInputElement.cpp", - "src/AudioUnitSDK/AUOutputElement.cpp", - "src/AudioUnitSDK/AUScopeElement.cpp", - "src/AudioUnitSDK/AUPlugInDispatch.cpp", - "src/AudioUnitSDK/ComponentBase.cpp", - "src/AudioUnitSDK/MusicDeviceBase.cpp", - ] - .iter() - .map(|s| sdk.join(s)), - ); - - // clap wrapper shared - cc.files([ - "./external/clap-wrapper/src/clap_proxy.cpp", - "./external/clap-wrapper/src/detail/clap/fsutil.cpp", - "./external/clap-wrapper/src/detail/shared/sha1.cpp", - ]); - - // clap auv2 wrapper - cc.files([ - "./external/clap-wrapper/src/wrapasauv2.cpp", - "./external/clap-wrapper/src/detail/auv2/auv2_shared.mm", - "./external/clap-wrapper/src/detail/auv2/process.cpp", - "./external/clap-wrapper/src/detail/auv2/wrappedview.mm", - "./external/clap-wrapper/src/detail/auv2/parameter.cpp", - ]); - - cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); - cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); - - // TODO: test on macos below 10.15 - cc.define("MACOS_USE_GHC_FILESYSTEM", None); - cc.include("./external/filesystem/include"); - - cc.define("MAC", None); - - println!("cargo:rustc-link-lib=framework=Foundation"); - println!("cargo:rustc-link-lib=framework=CoreFoundation"); - println!("cargo:rustc-link-lib=framework=AudioToolbox"); - println!("cargo:rustc-link-lib=framework=CoreMIDI"); - println!("cargo:rustc-link-lib=framework=AppKit"); - - if context.debug { - cc.define("DEVELOPMENT", Some("1")); - } else { - cc.define("RELEASE", Some("1")); - } - - if !context.verbose { - cc.warnings(false); - cc.cargo_warnings(false); - } - - cc.try_compile("clap_wrapper_auv2") - .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (auv2): {}", e)); - - println!("cargo:rustc-cfg=clap_wrapper_auv2"); - }); -} - -fn walk_files(dir: PathBuf, ext: &str) -> Vec { - let mut stack = Vec::new(); - let mut files = Vec::new(); - - stack.push(dir.clone()); - while let Some(top) = stack.pop() { - for entry in std::fs::read_dir(&top).unwrap() { - let path = entry.unwrap().path(); - if path.is_dir() { - stack.push(path); - } else if path.extension().map_or(false, |e| e == ext) { - files.push(path); - } - } - } - - files -} - -fn run_cached(key: impl Display, f: impl FnOnce(&Path)) { - let hash = { - let key = format!("{}", key); - let mut hasher = DefaultHasher::new(); - key.hash(&mut hasher); - format!("{:x}", hasher.finish()) - }; - - let out_path = PathBuf::from(std::env::var_os("OUT_DIR").unwrap_or_default()); - let lock_path = out_path.join(format!("build-{}.lock", hash)); - let log_path = out_path.join(format!("build-{}.output", hash)); - let cache_dir = out_path.join(format!("build-{}", hash)); - - let output = match std::fs::read_to_string(&log_path).ok() { - Some(s) => s, - _ => { - let stdio = stdio_override::StdoutOverride::from_file(&lock_path).unwrap(); - let result = catch_unwind(AssertUnwindSafe(|| { - f(&cache_dir); - })); - - drop(stdio); - - let output = std::fs::read_to_string(&lock_path).unwrap(); - match result { - Ok(_) => { - std::fs::rename(&lock_path, &log_path).unwrap(); - output - } - Err(e) => { - println!("{}", output); - resume_unwind(e) - } - } - } - }; - - print!("{}", output); -} diff --git a/clap-wrapper-auv2/Cargo.toml b/clap-wrapper-auv2/Cargo.toml new file mode 100644 index 0000000..829b8ad --- /dev/null +++ b/clap-wrapper-auv2/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "clap-wrapper-auv2" +version = "0.1.2" +edition = "2024" +authors = ["Quant1um "] +readme = "README.md" +repository = "https://github.com/blepfx/clap-wrapper-rs" +license = "MIT OR Apache-2.0" +description = "An easy way to use clap-wrapper in your audio plugins!" +keywords = ["auv2", "clap", "audio", "plugin"] + +include = [ + "src/**", + "build.rs", + "Cargo.toml", + "Cargo.lock", + "./README.md", + + "external/clap/include/**", + "external/clap-wrapper/include/**", + "external/clap-wrapper/libs/**", + "external/clap-wrapper/src/**", + "external/filesystem/include/**", + + "external/AudioUnitSDK/include/**", + "external/AudioUnitSDK/src/**", +] + +[build-dependencies] +cc = { workspace = true } + +[features] +default = ["parallel"] +parallel = ["cc/parallel"] \ No newline at end of file diff --git a/clap-wrapper-auv2/README.md b/clap-wrapper-auv2/README.md new file mode 100644 index 0000000..e69de29 diff --git a/clap-wrapper-auv2/build.rs b/clap-wrapper-auv2/build.rs new file mode 100644 index 0000000..54b52f1 --- /dev/null +++ b/clap-wrapper-auv2/build.rs @@ -0,0 +1,84 @@ +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + + let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); + let debug = std::env::var("DEBUG").unwrap_or_default() == "true"; + + if os != "macos" { + return; + } + + let mut cc = cc::Build::new(); + cc.cpp(true).std("c++20"); //latest AudioUnitSDK requires C++20 + cc.flag_if_supported("-fno-char8_t"); + + cc.include("./src/cpp"); + cc.include("./external/clap/include"); + cc.include("./external/clap-wrapper/include"); + cc.include("./external/clap-wrapper/libs/fmt"); + cc.include("./external/clap-wrapper/src"); + cc.include("./external/AudioUnitSDK/include"); + + cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); + cc.define("CLAP_WRAPPER_BUILD_AUV2", Some("1")); + cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); + cc.define("DICTIONARY_STREAM_FORMAT_WRAPPER", Some("1")); + + // auv2 sdk + cc.files([ + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBuffer.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBufferAllocator.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUEffectBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIEffectBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUInputElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUOutputElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUScopeElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUPlugInDispatch.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/ComponentBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/MusicDeviceBase.cpp", + ]); + + // clap wrapper shared + cc.files([ + "./external/clap-wrapper/src/clap_proxy.cpp", + "./external/clap-wrapper/src/detail/clap/fsutil.cpp", + "./external/clap-wrapper/src/detail/shared/sha1.cpp", + ]); + + // clap auv2 wrapper + cc.files([ + "./external/clap-wrapper/src/wrapasauv2.cpp", + "./external/clap-wrapper/src/detail/auv2/auv2_shared.mm", + "./external/clap-wrapper/src/detail/auv2/process.cpp", + "./external/clap-wrapper/src/detail/auv2/wrappedview.mm", + "./external/clap-wrapper/src/detail/auv2/parameter.cpp", + ]); + + cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); + cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); + + // TODO: test on macos below 10.15 + cc.define("MACOS_USE_GHC_FILESYSTEM", None); + cc.include("./external/filesystem/include"); + + cc.define("MAC", None); + + println!("cargo:rustc-link-lib=framework=Foundation"); + println!("cargo:rustc-link-lib=framework=CoreFoundation"); + println!("cargo:rustc-link-lib=framework=AudioToolbox"); + println!("cargo:rustc-link-lib=framework=CoreMIDI"); + println!("cargo:rustc-link-lib=framework=AppKit"); + + if debug { + cc.define("DEVELOPMENT", Some("1")); + } else { + cc.define("RELEASE", Some("1")); + } + + cc.try_compile("clap_wrapper_auv2") + .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (auv2): {}", e)); + + println!("cargo:rustc-cfg=clap_wrapper_auv2"); +} diff --git a/clap-wrapper-auv2/external/AudioUnitSDK b/clap-wrapper-auv2/external/AudioUnitSDK new file mode 160000 index 0000000..e789bc8 --- /dev/null +++ b/clap-wrapper-auv2/external/AudioUnitSDK @@ -0,0 +1 @@ +Subproject commit e789bc83ddc07cbf80e7bfaf84f1ade975287400 diff --git a/clap-wrapper-auv2/external/clap b/clap-wrapper-auv2/external/clap new file mode 160000 index 0000000..29ffcc2 --- /dev/null +++ b/clap-wrapper-auv2/external/clap @@ -0,0 +1 @@ +Subproject commit 29ffcc273be7c7c651f6c9953b99e69700e2387a diff --git a/external/clap-wrapper b/clap-wrapper-auv2/external/clap-wrapper similarity index 100% rename from external/clap-wrapper rename to clap-wrapper-auv2/external/clap-wrapper diff --git a/clap-wrapper-auv2/external/filesystem b/clap-wrapper-auv2/external/filesystem new file mode 160000 index 0000000..0e72911 --- /dev/null +++ b/clap-wrapper-auv2/external/filesystem @@ -0,0 +1 @@ +Subproject commit 0e72911ba0f37f3eb883b181b855a5f4eb046ca1 diff --git a/src/cpp/generated_cocoaclasses.hxx b/clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx similarity index 100% rename from src/cpp/generated_cocoaclasses.hxx rename to clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx diff --git a/src/cpp/generated_entrypoints.hxx b/clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx similarity index 100% rename from src/cpp/generated_entrypoints.hxx rename to clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx diff --git a/clap-wrapper-auv2/src/lib.rs b/clap-wrapper-auv2/src/lib.rs new file mode 100644 index 0000000..df36bdf --- /dev/null +++ b/clap-wrapper-auv2/src/lib.rs @@ -0,0 +1,26 @@ +#[macro_export] +macro_rules! export { + () => { + #[allow(unused_imports)] + pub use $crate::internal::*; + }; +} + +#[doc(hidden)] +pub mod internal { + #[cfg(target_os = "macos")] + #[link(name = "clap_wrapper_auv2")] + unsafe extern "C" { + pub unsafe fn wrapAsAUV2_inst0Factory( + desc: *const core::ffi::c_void, + ) -> *mut core::ffi::c_void; + } + + #[cfg(target_os = "macos")] + #[unsafe(no_mangle)] + pub unsafe extern "C" fn GetPluginFactoryAUV2( + desc: *const core::ffi::c_void, + ) -> *mut core::ffi::c_void { + unsafe { wrapAsAUV2_inst0Factory(desc) } + } +} diff --git a/clap-wrapper-vst3/Cargo.toml b/clap-wrapper-vst3/Cargo.toml new file mode 100644 index 0000000..da76041 --- /dev/null +++ b/clap-wrapper-vst3/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "clap-wrapper-vst3" +version = "0.1.2" +edition = "2024" +authors = ["Quant1um "] +readme = "README.md" +repository = "https://github.com/blepfx/clap-wrapper-rs" +license = "MIT OR Apache-2.0" +description = "An easy way to use clap-wrapper in your audio plugins!" +keywords = ["vst3", "clap", "audio", "plugin"] +include = [ + "src/**", + "build.rs", + "Cargo.toml", + "Cargo.lock", + "./README.md", + + "external/clap/include/**", + "external/clap-wrapper/include/**", + "external/clap-wrapper/libs/**", + "external/clap-wrapper/src/**", + "external/filesystem/include/**", + + "external/vst3sdk/pluginterfaces/**", + "external/vst3sdk/public.sdk/source/**", + "external/vst3sdk/base/**", +] + +[build-dependencies] +cc = { workspace = true } + +[features] +default = ["parallel"] +parallel = ["cc/parallel"] \ No newline at end of file diff --git a/clap-wrapper-vst3/README.md b/clap-wrapper-vst3/README.md new file mode 100644 index 0000000..e69de29 diff --git a/clap-wrapper-vst3/build.rs b/clap-wrapper-vst3/build.rs new file mode 100644 index 0000000..0f6f0e1 --- /dev/null +++ b/clap-wrapper-vst3/build.rs @@ -0,0 +1,142 @@ +use std::path::PathBuf; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + + let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); + let debug = std::env::var("DEBUG").unwrap_or_default() == "true"; + + let mut cc = cc::Build::new(); + cc.cpp(true).std("c++17"); + + // msvc stuff + cc.flag_if_supported("/utf-8"); + cc.flag_if_supported("/EHsc"); + + cc.include("./external/clap/include"); + cc.include("./external/clap-wrapper/include"); + cc.include("./external/clap-wrapper/libs/fmt"); + cc.include("./external/clap-wrapper/libs/psl"); + cc.include("./external/clap-wrapper/src"); + cc.include("./external/vst3sdk"); + cc.include("./external/vst3sdk/public.sdk"); + cc.include("./external/vst3sdk/pluginterfaces"); + + cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); + cc.define("CLAP_WRAPPER_BUILD_FOR_VST3", Some("1")); + cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); + + // absolutely cursed fucked up evil and twisted way to "reexport" the entry point symbols + // FIXME: if anyone knows a better way to do this, please let me know + cc.define("GetPluginFactory", Some("clap_wrapper_GetPluginFactory")); + cc.define("ModuleEntry", Some("clap_wrapper_ModuleEntry")); + cc.define("ModuleExit", Some("clap_wrapper_ModuleExit")); + cc.define("InitDll", Some("clap_wrapper_InitDll")); + cc.define("ExitDll", Some("clap_wrapper_ExitDll")); + cc.define("bundleEntry", Some("clap_wrapper_bundleEntry")); + cc.define("bundleExit", Some("clap_wrapper_bundleExit")); + + // vst3 sdk + cc.files(walk_files("./external/vst3sdk/base/source", "cpp")); + cc.files(walk_files("./external/vst3sdk/base/thread/source", "cpp")); + cc.files(walk_files("./external/vst3sdk/pluginterfaces/base", "cpp")); + cc.files(walk_files( + "./external/vst3sdk/public.sdk/source/common", + "cpp", + )); + cc.files([ + "./external/vst3sdk/public.sdk/source/main/pluginfactory.cpp", + "./external/vst3sdk/public.sdk/source/main/moduleinit.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstinitiids.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstnoteexpressiontypes.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstaudioeffect.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstcomponent.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstsinglecomponenteffect.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstcomponentbase.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstbus.cpp", + "./external/vst3sdk/public.sdk/source/vst/vstparameters.cpp", + "./external/vst3sdk/public.sdk/source/vst/utility/stringconvert.cpp", + ]); + + // clap wrapper shared + cc.files([ + "./external/clap-wrapper/src/clap_proxy.cpp", + "./external/clap-wrapper/src/detail/clap/fsutil.cpp", + "./external/clap-wrapper/src/detail/shared/sha1.cpp", + ]); + + // clap vst3 wrapper + cc.files([ + "./external/clap-wrapper/src/wrapasvst3_export_entry.cpp", + "./external/clap-wrapper/src/wrapasvst3.cpp", + "./external/clap-wrapper/src/wrapasvst3_entry.cpp", + "./external/clap-wrapper/src/detail/vst3/parameter.cpp", + "./external/clap-wrapper/src/detail/vst3/plugview.cpp", + "./external/clap-wrapper/src/detail/vst3/process.cpp", + "./external/clap-wrapper/src/detail/vst3/categories.cpp", + ]); + + if debug { + cc.define("DEVELOPMENT", Some("1")); + } else { + cc.define("RELEASE", Some("1")); + } + + match os.as_str() { + "macos" => { + cc.file("./external/vst3sdk/public.sdk/source/main/macmain.cpp"); + cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); + cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); + + cc.define("MAC", None); + + // TODO: test on macos below 10.15 + cc.define("MACOS_USE_GHC_FILESYSTEM", None); + cc.include("./external/filesystem/include"); + + println!("cargo:rustc-link-lib=framework=CoreFoundation"); + println!("cargo:rustc-link-lib=framework=Foundation"); + } + "windows" => { + cc.file("./external/vst3sdk/public.sdk/source/main/dllmain.cpp"); + cc.file("./external/clap-wrapper/src/detail/os/windows.cpp"); + cc.define("WIN", None); + + println!("cargo:rustc-link-lib=Shell32"); + println!("cargo:rustc-link-lib=user32"); + println!("cargo:rustc-link-lib=ole32"); + } + "linux" => { + cc.file("./external/vst3sdk/public.sdk/source/main/linuxmain.cpp"); + cc.file("./external/clap-wrapper/src/detail/os/linux.cpp"); + cc.define("LIN", None); + } + _ => { + panic!("Unsupported target OS: {}", os); + } + } + + cc.try_compile("clap_wrapper_vst3") + .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (vst3): {}", e)); + + println!("cargo:rustc-cfg=clap_wrapper_vst3"); +} + +fn walk_files(dir: impl Into, ext: &str) -> Vec { + let mut stack = Vec::new(); + let mut files = Vec::new(); + + stack.push(dir.into()); + while let Some(top) = stack.pop() { + for entry in std::fs::read_dir(&top).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + stack.push(path); + } else if path.extension().map_or(false, |e| e == ext) { + files.push(path); + } + } + } + + files +} diff --git a/clap-wrapper-vst3/external/clap b/clap-wrapper-vst3/external/clap new file mode 160000 index 0000000..29ffcc2 --- /dev/null +++ b/clap-wrapper-vst3/external/clap @@ -0,0 +1 @@ +Subproject commit 29ffcc273be7c7c651f6c9953b99e69700e2387a diff --git a/clap-wrapper-vst3/external/clap-wrapper b/clap-wrapper-vst3/external/clap-wrapper new file mode 160000 index 0000000..62bf4f1 --- /dev/null +++ b/clap-wrapper-vst3/external/clap-wrapper @@ -0,0 +1 @@ +Subproject commit 62bf4f193d8dac354a946c1e0cffda9174317042 diff --git a/clap-wrapper-vst3/external/filesystem b/clap-wrapper-vst3/external/filesystem new file mode 160000 index 0000000..0e72911 --- /dev/null +++ b/clap-wrapper-vst3/external/filesystem @@ -0,0 +1 @@ +Subproject commit 0e72911ba0f37f3eb883b181b855a5f4eb046ca1 diff --git a/clap-wrapper-vst3/external/vst3sdk b/clap-wrapper-vst3/external/vst3sdk new file mode 160000 index 0000000..58f8da7 --- /dev/null +++ b/clap-wrapper-vst3/external/vst3sdk @@ -0,0 +1 @@ +Subproject commit 58f8da7936800732561402d7936584ca4505de07 diff --git a/clap-wrapper-vst3/src/lib.rs b/clap-wrapper-vst3/src/lib.rs new file mode 100644 index 0000000..46775bf --- /dev/null +++ b/clap-wrapper-vst3/src/lib.rs @@ -0,0 +1,77 @@ +#[macro_export] +macro_rules! export { + () => { + #[allow(unused_imports)] + pub use $crate::internal::*; + }; +} + +#[doc(hidden)] +pub mod internal { + #[link(name = "clap_wrapper_vst3")] + unsafe extern "system" { + unsafe fn clap_wrapper_GetPluginFactory() -> *mut core::ffi::c_void; + } + + #[link(name = "clap_wrapper_vst3")] + #[cfg(all(target_family = "unix", not(target_os = "macos")))] + unsafe extern "C" { + unsafe fn clap_wrapper_ModuleEntry(lib_module: *mut core::ffi::c_void) -> bool; + unsafe fn clap_wrapper_ModuleExit() -> bool; + } + + #[link(name = "clap_wrapper_vst3")] + #[cfg(target_os = "macos")] + unsafe extern "C" { + unsafe fn clap_wrapper_bundleEntry(lib_module: *mut core::ffi::c_void) -> bool; + unsafe fn clap_wrapper_bundleExit() -> bool; + } + + #[link(name = "clap_wrapper_vst3")] + #[cfg(target_os = "windows")] + unsafe extern "system" { + unsafe fn clap_wrapper_InitDll() -> bool; + unsafe fn clap_wrapper_ExitDll() -> bool; + } + + #[unsafe(no_mangle)] + pub extern "system" fn GetPluginFactory() -> *mut core::ffi::c_void { + unsafe { clap_wrapper_GetPluginFactory() } + } + + #[unsafe(no_mangle)] + #[cfg(all(target_family = "unix", not(target_os = "macos")))] + pub extern "C" fn ModuleEntry(lib_module: *mut core::ffi::c_void) -> bool { + unsafe { clap_wrapper_ModuleEntry(lib_module) } + } + + #[unsafe(no_mangle)] + #[cfg(all(target_family = "unix", not(target_os = "macos")))] + pub extern "C" fn ModuleExit() -> bool { + unsafe { clap_wrapper_ModuleExit() } + } + + #[unsafe(no_mangle)] + #[cfg(target_os = "macos")] + pub extern "C" fn bundleEntry(lib_module: *mut core::ffi::c_void) -> bool { + unsafe { clap_wrapper_bundleEntry(lib_module) } + } + + #[unsafe(no_mangle)] + #[cfg(target_os = "macos")] + pub extern "C" fn bundleExit() -> bool { + unsafe { clap_wrapper_bundleExit() } + } + + #[unsafe(no_mangle)] + #[cfg(target_os = "windows")] + pub extern "system" fn InitDll() -> bool { + unsafe { clap_wrapper_InitDll() } + } + + #[unsafe(no_mangle)] + #[cfg(target_os = "windows")] + pub extern "system" fn ExitDll() -> bool { + unsafe { clap_wrapper_ExitDll() } + } +} diff --git a/examples/example-clack/Cargo.toml b/examples/example-clack/Cargo.toml index 9ef22a6..bd44f24 100644 --- a/examples/example-clack/Cargo.toml +++ b/examples/example-clack/Cargo.toml @@ -2,7 +2,6 @@ name = "example-clack" version = "0.1.0" edition = "2024" - license = "MIT OR Apache-2.0" publish = false @@ -12,4 +11,5 @@ crate-type = ["cdylib"] [dependencies] clack-plugin = { git = "https://github.com/prokopyl/clack", rev = "5deaa1be9b5af7078d75cbe54abefee12ed40f63" } clack-extensions = { git = "https://github.com/prokopyl/clack", rev = "5deaa1be9b5af7078d75cbe54abefee12ed40f63", features = ["audio-ports", "clack-plugin", "note-ports", "params", "state"] } -clap-wrapper = { path = "../.." } \ No newline at end of file +clap-wrapper-auv2 = { path = "../../clap-wrapper-auv2" } +clap-wrapper-vst3 = { path = "../../clap-wrapper-vst3" } \ No newline at end of file diff --git a/examples/example-clack/src/lib.rs b/examples/example-clack/src/lib.rs index e171d45..58da162 100644 --- a/examples/example-clack/src/lib.rs +++ b/examples/example-clack/src/lib.rs @@ -232,5 +232,5 @@ pub struct PolySynthPluginMainThread<'a> { impl<'a> PluginMainThread<'a, PolySynthPluginShared> for PolySynthPluginMainThread<'a> {} clack_export_entry!(SinglePluginEntry); -clap_wrapper::export_auv2!(); -clap_wrapper::export_vst3!(); +clap_wrapper_auv2::export!(); +clap_wrapper_vst3::export!(); diff --git a/examples/example-nih-plug/Cargo.toml b/examples/example-nih-plug/Cargo.toml index 546bd52..b122116 100644 --- a/examples/example-nih-plug/Cargo.toml +++ b/examples/example-nih-plug/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2024" authors = ["Robbert van der Helm "] license = "ISC" - description = "A simple gain plugin with an vizia GUI" publish = false @@ -12,7 +11,8 @@ publish = false crate-type = ["cdylib"] [dependencies] -clap-wrapper = { path = "../.." } +clap-wrapper-auv2 = { path = "../../clap-wrapper-auv2" } +clap-wrapper-vst3 = { path = "../../clap-wrapper-vst3" } nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "400eb3156f221073fbcaf95607b56842272d134b" } nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "400eb3156f221073fbcaf95607b56842272d134b" } atomic_float = "1.1" \ No newline at end of file diff --git a/examples/example-nih-plug/src/lib.rs b/examples/example-nih-plug/src/lib.rs index 19959fa..7f6ddfb 100644 --- a/examples/example-nih-plug/src/lib.rs +++ b/examples/example-nih-plug/src/lib.rs @@ -176,5 +176,5 @@ impl Vst3Plugin for Gain { } nih_export_clap!(Gain); -clap_wrapper::export_auv2!(); -clap_wrapper::export_vst3!(); +clap_wrapper_auv2::export!(); +clap_wrapper_vst3::export!(); diff --git a/external/clap b/external/clap deleted file mode 160000 index 69a6925..0000000 --- a/external/clap +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 69a69252fdd6ac1d06e246d9a04c0a89d9607a17 diff --git a/external/filesystem b/external/filesystem deleted file mode 160000 index 9fda7b0..0000000 --- a/external/filesystem +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9fda7b0afbd0640f482f4aea8720a8c0afd18740 diff --git a/src/auv2.rs b/src/auv2.rs deleted file mode 100644 index a93acd0..0000000 --- a/src/auv2.rs +++ /dev/null @@ -1,12 +0,0 @@ -#[link(name = "clap_wrapper_auv2")] -unsafe extern "C" { - pub unsafe fn wrapAsAUV2_inst0Factory(desc: *const core::ffi::c_void) - -> *mut core::ffi::c_void; -} - -#[unsafe(no_mangle)] -pub unsafe extern "C" fn GetPluginFactoryAUV2( - desc: *const core::ffi::c_void, -) -> *mut core::ffi::c_void { - unsafe { wrapAsAUV2_inst0Factory(desc) } -} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 288d537..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,46 +0,0 @@ -#![doc = include_str!("../README.md")] -#![allow(non_snake_case)] -#![no_std] - -#[cfg(clap_wrapper_vst3)] -#[doc(hidden)] -pub mod vst3; - -#[cfg(not(clap_wrapper_vst3))] -#[doc(hidden)] -pub mod vst3 {} - -#[cfg(clap_wrapper_auv2)] -#[doc(hidden)] -pub mod auv2; - -#[cfg(not(clap_wrapper_auv2))] -#[doc(hidden)] -pub mod auv2 {} - -/// Exports an AUv2 entrypoint named `GetPluginFactoryAUV2` that wraps a global CLAP entrypoint (`clap_entry`) exported from the resulting shared library. -/// Currently it only reexports the first plugin available through the CLAP entrypoint, but this limitation might be lifted in the future. -/// -/// Requires `CLAP_WRAPPER_AUV2_SDK` environment variable to be set to a valid Apple AudioUnit SDK path, does nothing otherwise. -/// -/// Failure to export a CLAP entrypoint might result in linker errors or missing symbols. -#[macro_export] -macro_rules! export_auv2 { - () => { - #[allow(unused_imports)] - pub use $crate::auv2::*; - }; -} - -/// Exports a VST3 entrypoint named `GetPluginFactory` that wraps a global CLAP entrypoint (`clap_entry`) exported from the resulting shared library. -/// -/// Requires `CLAP_WRAPPER_VST3_SDK` environment variable to be set to a valid VST3 SDK path (GPLv3 or Steinberg Proprietary), does nothing otherwise. -/// -/// Failure to export a CLAP entrypoint might result in linker errors or missing symbols. -#[macro_export] -macro_rules! export_vst3 { - () => { - #[allow(unused_imports)] - pub use $crate::vst3::*; - }; -} diff --git a/src/vst3.rs b/src/vst3.rs deleted file mode 100644 index 1c79056..0000000 --- a/src/vst3.rs +++ /dev/null @@ -1,66 +0,0 @@ -#[link(name = "clap_wrapper_vst3")] -unsafe extern "system" { - unsafe fn clap_wrapper_GetPluginFactory() -> *mut core::ffi::c_void; -} - -#[link(name = "clap_wrapper_vst3")] -#[cfg(all(target_family = "unix", not(target_os = "macos")))] -unsafe extern "C" { - unsafe fn clap_wrapper_ModuleEntry(lib_module: *mut core::ffi::c_void) -> bool; - unsafe fn clap_wrapper_ModuleExit() -> bool; -} - -#[link(name = "clap_wrapper_vst3")] -#[cfg(target_os = "macos")] -unsafe extern "C" { - unsafe fn clap_wrapper_bundleEntry(lib_module: *mut core::ffi::c_void) -> bool; - unsafe fn clap_wrapper_bundleExit() -> bool; -} - -#[link(name = "clap_wrapper_vst3")] -#[cfg(target_os = "windows")] -unsafe extern "system" { - unsafe fn clap_wrapper_InitDll() -> bool; - unsafe fn clap_wrapper_ExitDll() -> bool; -} - -#[unsafe(no_mangle)] -pub extern "system" fn GetPluginFactory() -> *mut core::ffi::c_void { - unsafe { clap_wrapper_GetPluginFactory() } -} - -#[unsafe(no_mangle)] -#[cfg(all(target_family = "unix", not(target_os = "macos")))] -pub extern "C" fn ModuleEntry(lib_module: *mut core::ffi::c_void) -> bool { - unsafe { clap_wrapper_ModuleEntry(lib_module) } -} - -#[unsafe(no_mangle)] -#[cfg(all(target_family = "unix", not(target_os = "macos")))] -pub extern "C" fn ModuleExit() -> bool { - unsafe { clap_wrapper_ModuleExit() } -} - -#[unsafe(no_mangle)] -#[cfg(target_os = "macos")] -pub extern "C" fn bundleEntry(lib_module: *mut core::ffi::c_void) -> bool { - unsafe { clap_wrapper_bundleEntry(lib_module) } -} - -#[unsafe(no_mangle)] -#[cfg(target_os = "macos")] -pub extern "C" fn bundleExit() -> bool { - unsafe { clap_wrapper_bundleExit() } -} - -#[unsafe(no_mangle)] -#[cfg(target_os = "windows")] -pub extern "system" fn InitDll() -> bool { - unsafe { clap_wrapper_InitDll() } -} - -#[unsafe(no_mangle)] -#[cfg(target_os = "windows")] -pub extern "system" fn ExitDll() -> bool { - unsafe { clap_wrapper_ExitDll() } -} From 3ab3e3f5f9ed70031ae77c54d5fde0220a9dc0e3 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 03:25:59 +0400 Subject: [PATCH 2/7] bump crate versions; add packaging step to validate ci; use macos-15 runners instead of deprecated macos-13 runners --- .github/workflows/validate.yml | 20 +++++++++++++++++--- Cargo.lock | 4 ++-- clap-wrapper-auv2/Cargo.toml | 2 +- clap-wrapper-vst3/Cargo.toml | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index ff3f0ee..b5fd70f 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -27,6 +27,12 @@ jobs: # needed for baseview and other example-nih-plug deps sudo apt-get install -y libgl-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev + - name: Package `clap-wrapper` crates + shell: bash + run: | + # we test the packaged versions to make sure everything needed is included + cargo package -p clap-wrapper-vst3 + - name: Build `${{ matrix.package }}` shell: bash run: | @@ -80,6 +86,12 @@ jobs: with: submodules: recursive + - name: Package `clap-wrapper` crates + shell: bash + run: | + # we test the packaged versions to make sure everything needed is included + cargo package -p clap-wrapper-vst3 + - name: Build `${{ matrix.package }}` shell: bash run: | @@ -119,7 +131,7 @@ jobs: validate-macos: strategy: matrix: - runner: [macos-13] + runner: [macos-15] package: [example-nih-plug, example-clack] include: - package: example-nih-plug @@ -141,10 +153,12 @@ jobs: with: submodules: recursive - - name: Checkout `AudioUnitSDK` + - name: Package `clap-wrapper` crates shell: bash run: | - git clone --depth=1 https://github.com/apple/AudioUnitSDK + # we test the packaged versions to make sure everything needed is included + cargo package -p clap-wrapper-auv2 + cargo package -p clap-wrapper-vst3 - name: Build `${{ matrix.package }}` shell: bash diff --git a/Cargo.lock b/Cargo.lock index e39496b..1105f3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -619,14 +619,14 @@ source = "git+https://github.com/micahrj/clap-sys.git?rev=25d7f53fdb6363ad63fbd8 [[package]] name = "clap-wrapper-auv2" -version = "0.1.2" +version = "0.2.0" dependencies = [ "cc", ] [[package]] name = "clap-wrapper-vst3" -version = "0.1.2" +version = "0.2.0" dependencies = [ "cc", ] diff --git a/clap-wrapper-auv2/Cargo.toml b/clap-wrapper-auv2/Cargo.toml index 829b8ad..6f61c9f 100644 --- a/clap-wrapper-auv2/Cargo.toml +++ b/clap-wrapper-auv2/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clap-wrapper-auv2" -version = "0.1.2" +version = "0.2.0" edition = "2024" authors = ["Quant1um "] readme = "README.md" diff --git a/clap-wrapper-vst3/Cargo.toml b/clap-wrapper-vst3/Cargo.toml index da76041..9e48060 100644 --- a/clap-wrapper-vst3/Cargo.toml +++ b/clap-wrapper-vst3/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clap-wrapper-vst3" -version = "0.1.2" +version = "0.2.0" edition = "2024" authors = ["Quant1um "] readme = "README.md" From fa078120fc35dba8c08dd083289018cc9b40b9c3 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 03:35:51 +0400 Subject: [PATCH 3/7] update README.md --- README.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5ab9e99..f6c1a38 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,7 @@ An easy way to use [clap-wrapper](https://github.com/free-audio/clap-wrapper) in your Rust plugins! ## Usecases -- Adding VST3 or AUv2 support to existing Rust plugin frameworks that do not support them -- Using [nih-plug](https://github.com/robbert-vdh/nih-plug) with non-GPLv3 licensed VST3 SDK +- Adding VST3 or AUv2 support to existing Rust plugin frameworks that do not support them (e.g. [clack](https://github.com/prokopyl/clack)) - Making your own audio plugin framework without dealing with VST3 and AUv2 directly ## Features @@ -27,25 +26,20 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -clap-wrapper = "0.1.2" +clap-wrapper-vst3 = "0.2.0" # not available on crates.io yet +clap-wrapper-auv2 = "0.2.0" # not available on crates.io yet ``` Then, in your `lib.rs`: ```rust -// exports `GetPluginFactoryAUV2` symbol if CLAP_WRAPPER_AUV2_SDK env variable is present -clap_wrapper::export_auv2!(); -// exports `GetPluginFactory` symbol and extra VST3 symbols if CLAP_WRAPPER_VST3_SDK env variable is present -clap_wrapper::export_vst3!(); +// exports `GetPluginFactoryAUV2` symbol. +clap_wrapper_auv2::export!(); +// exports `GetPluginFactory` symbol and extra VST3 symbols. +clap_wrapper_vst3::export!(); ``` This will export VST3 and AUv2 entrypoints that use the `clap_entry` symbol exported from your crate (as an example, `nih_plug::nih_export_clap` exports it). -To build the plugin with VST3 or AUv2 capabilities, add `CLAP_WRAPPER_VST3_SDK` and/or `CLAP_WRAPPER_AUV2_SDK` environment variables to your build command. For example: - -```bash -CLAP_WRAPPER_VST3_SDK=/path/to/vst3sdk cargo build -p example-clap -``` - Keep in mind, that `clap-wrapper-rs` only adds the necessary entrypoints that reexport the CLAP plugin you already have. You'd still have to use a crate like `nih-plug` to actually create the plugin. From b67dc91a50292d8a21b69305d867b97444b333c8 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 21:16:20 +0400 Subject: [PATCH 4/7] merge auv2 and vst3 crates back, splitting it not worth it --- .gitmodules | 19 +--- Cargo.lock | 15 +-- Cargo.toml | 21 +++- README.md | 16 ++- clap-wrapper-vst3/build.rs => build.rs | 97 ++++++++++++++++++- clap-wrapper-auv2/Cargo.toml | 34 ------- clap-wrapper-auv2/README.md | 0 clap-wrapper-auv2/build.rs | 84 ---------------- .../src/cpp/generated_cocoaclasses.hxx | 13 --- .../src/cpp/generated_entrypoints.hxx | 27 ------ clap-wrapper-auv2/src/lib.rs | 26 ----- clap-wrapper-vst3/Cargo.toml | 34 ------- clap-wrapper-vst3/README.md | 0 clap-wrapper-vst3/external/clap | 1 - clap-wrapper-vst3/external/clap-wrapper | 1 - clap-wrapper-vst3/external/filesystem | 1 - examples/example-clack/Cargo.toml | 3 +- examples/example-clack/src/lib.rs | 4 +- examples/example-nih-plug/Cargo.toml | 3 +- examples/example-nih-plug/src/lib.rs | 4 +- .../external => external}/AudioUnitSDK | 0 {clap-wrapper-auv2/external => external}/clap | 0 .../external => external}/clap-wrapper | 0 .../external => external}/filesystem | 0 .../external => external}/vst3sdk | 0 {clap-wrapper-vst3/src => src}/lib.rs | 41 +++++++- 26 files changed, 174 insertions(+), 270 deletions(-) rename clap-wrapper-vst3/build.rs => build.rs (60%) delete mode 100644 clap-wrapper-auv2/Cargo.toml delete mode 100644 clap-wrapper-auv2/README.md delete mode 100644 clap-wrapper-auv2/build.rs delete mode 100644 clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx delete mode 100644 clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx delete mode 100644 clap-wrapper-auv2/src/lib.rs delete mode 100644 clap-wrapper-vst3/Cargo.toml delete mode 100644 clap-wrapper-vst3/README.md delete mode 160000 clap-wrapper-vst3/external/clap delete mode 160000 clap-wrapper-vst3/external/clap-wrapper delete mode 160000 clap-wrapper-vst3/external/filesystem rename {clap-wrapper-auv2/external => external}/AudioUnitSDK (100%) rename {clap-wrapper-auv2/external => external}/clap (100%) rename {clap-wrapper-auv2/external => external}/clap-wrapper (100%) rename {clap-wrapper-auv2/external => external}/filesystem (100%) rename {clap-wrapper-vst3/external => external}/vst3sdk (100%) rename {clap-wrapper-vst3/src => src}/lib.rs (71%) diff --git a/.gitmodules b/.gitmodules index a2cf065..fc04d6f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,24 +1,15 @@ -[submodule "clap-wrapper-vst3/external/clap-wrapper"] - path = clap-wrapper-vst3/external/clap-wrapper - url = https://github.com/free-audio/clap-wrapper -[submodule "clap-wrapper-vst3/external/clap"] - path = clap-wrapper-vst3/external/clap - url = https://github.com/free-audio/clap -[submodule "clap-wrapper-vst3/external/filesystem"] - path = clap-wrapper-vst3/external/filesystem - url = https://github.com/gulrak/filesystem [submodule "clap-wrapper-vst3/external/vst3sdk"] - path = clap-wrapper-vst3/external/vst3sdk + path = external/vst3sdk url = https://github.com/steinbergmedia/vst3sdk [submodule "clap-wrapper-auv2/external/AudioUnitSDK"] - path = clap-wrapper-auv2/external/AudioUnitSDK + path = external/AudioUnitSDK url = https://github.com/apple/AudioUnitSDK [submodule "clap-wrapper-auv2/external/clap"] - path = clap-wrapper-auv2/external/clap + path = external/clap url = https://github.com/free-audio/clap [submodule "clap-wrapper-auv2/external/clap-wrapper"] - path = clap-wrapper-auv2/external/clap-wrapper + path = external/clap-wrapper url = https://github.com/free-audio/clap-wrapper [submodule "clap-wrapper-auv2/external/filesystem"] - path = clap-wrapper-auv2/external/filesystem + path = external/filesystem url = https://github.com/gulrak/filesystem diff --git a/Cargo.lock b/Cargo.lock index 1105f3e..59c72ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -618,14 +618,7 @@ version = "0.5.0" source = "git+https://github.com/micahrj/clap-sys.git?rev=25d7f53fdb6363ad63fbd80049cb7a42a97ac156#25d7f53fdb6363ad63fbd80049cb7a42a97ac156" [[package]] -name = "clap-wrapper-auv2" -version = "0.2.0" -dependencies = [ - "cc", -] - -[[package]] -name = "clap-wrapper-vst3" +name = "clap-wrapper" version = "0.2.0" dependencies = [ "cc", @@ -1041,8 +1034,7 @@ version = "0.1.0" dependencies = [ "clack-extensions", "clack-plugin", - "clap-wrapper-auv2", - "clap-wrapper-vst3", + "clap-wrapper", ] [[package]] @@ -1050,8 +1042,7 @@ name = "example-nih-plug" version = "0.1.0" dependencies = [ "atomic_float 1.1.0", - "clap-wrapper-auv2", - "clap-wrapper-vst3", + "clap-wrapper", "nih_plug", "nih_plug_vizia", ] diff --git a/Cargo.toml b/Cargo.toml index 547fb45..31c576a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,24 @@ members = [ ".", "examples/example-clack", "examples/example-nih-plug", - "./clap-wrapper-vst3", - "./clap-wrapper-auv2" ] -[workspace.dependencies] +[package] +name = "clap-wrapper" +version = "0.2.0" +edition = "2024" +authors = ["Quant1um"] +readme = "README.md" +repository = "https://github.com/blepfx/clap-wrapper-rs" +license = "MIT OR Apache-2.0" +description = "An easy way to use clap-wrapper in your audio plugins!" +keywords = ["vst3", "auv2", "clap", "audio", "plugin"] + +[build-dependencies] cc = "1.2.52" + +[features] +default = ["parallel", "vst3", "auv2"] +parallel = ["cc/parallel"] +vst3 = [] +auv2 = [] \ No newline at end of file diff --git a/README.md b/README.md index f6c1a38..e6418d8 100644 --- a/README.md +++ b/README.md @@ -26,16 +26,15 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -clap-wrapper-vst3 = "0.2.0" # not available on crates.io yet -clap-wrapper-auv2 = "0.2.0" # not available on crates.io yet +clap-wrapper = { version = "0.2.0", features = ["vst3", "auv2", "parallel"] } # these features are enabled by default ``` Then, in your `lib.rs`: ```rust // exports `GetPluginFactoryAUV2` symbol. -clap_wrapper_auv2::export!(); +clap_wrapper::export_auv2!(); // exports `GetPluginFactory` symbol and extra VST3 symbols. -clap_wrapper_vst3::export!(); +clap_wrapper::export_vst3!(); ``` This will export VST3 and AUv2 entrypoints that use the `clap_entry` symbol exported from your crate (as an example, `nih_plug::nih_export_clap` exports it). @@ -50,6 +49,15 @@ Check out [Info.vst3.plist](examples/example-clack/Info.vst3.plist) and [Info.au See [validate.yml](.github/workflows/validate.yml) for a complete example of how to build, bundle and validate a plugin. +## Changelog + +- 0.2.0: + - Embed VST3 and AUv2 SDKs directly into the crate, removing the need to download them separately. This is possible thanks to VST3 SDK's new MIT license. + - Added `vst3` and `auv2` features to enable/disable building those wrappers. + - Simplified build.rs by a lot. +- 0.1.2: + - Updated `clap-wrapper` to latest. + ## License Licensed under either of diff --git a/clap-wrapper-vst3/build.rs b/build.rs similarity index 60% rename from clap-wrapper-vst3/build.rs rename to build.rs index 0f6f0e1..a7659ab 100644 --- a/clap-wrapper-vst3/build.rs +++ b/build.rs @@ -1,11 +1,21 @@ -use std::path::PathBuf; +use std::path::{PathBuf, absolute}; fn main() { println!("cargo:rerun-if-changed=build.rs"); let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); - let debug = std::env::var("DEBUG").unwrap_or_default() == "true"; + let debug = std::env::var("DEBUG").unwrap() == "true"; + if cfg!(feature = "vst3") { + build_vst3(&os, debug); + } + + if cfg!(feature = "auv2") && os == "macos" { + build_auv2(debug); + } +} + +fn build_vst3(os: &str, debug: bool) { let mut cc = cc::Build::new(); cc.cpp(true).std("c++17"); @@ -82,7 +92,7 @@ fn main() { cc.define("RELEASE", Some("1")); } - match os.as_str() { + match os { "macos" => { cc.file("./external/vst3sdk/public.sdk/source/main/macmain.cpp"); cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); @@ -118,8 +128,80 @@ fn main() { cc.try_compile("clap_wrapper_vst3") .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (vst3): {}", e)); +} + +fn build_auv2(debug: bool) { + let mut cc = cc::Build::new(); + cc.cpp(true).std("c++20"); //AudioUnitSDK requires C++20 + cc.flag_if_supported("-fno-char8_t"); + + cc.include("./src/cpp"); + cc.include("./external/clap/include"); + cc.include("./external/clap-wrapper/include"); + cc.include("./external/clap-wrapper/libs/fmt"); + cc.include("./external/clap-wrapper/src"); + cc.include("./external/AudioUnitSDK/include"); + + cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); + cc.define("CLAP_WRAPPER_BUILD_AUV2", Some("1")); + cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); + cc.define("DICTIONARY_STREAM_FORMAT_WRAPPER", Some("1")); + + // auv2 sdk + cc.files([ + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBuffer.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUBufferAllocator.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUEffectBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIEffectBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUInputElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUOutputElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUScopeElement.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/AUPlugInDispatch.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/ComponentBase.cpp", + "./external/AudioUnitSDK/src/AudioUnitSDK/MusicDeviceBase.cpp", + ]); + + // clap wrapper shared + cc.files([ + "./external/clap-wrapper/src/clap_proxy.cpp", + "./external/clap-wrapper/src/detail/clap/fsutil.cpp", + "./external/clap-wrapper/src/detail/shared/sha1.cpp", + ]); + + // clap auv2 wrapper + cc.files([ + "./external/clap-wrapper/src/wrapasauv2.cpp", + "./external/clap-wrapper/src/detail/auv2/auv2_shared.mm", + "./external/clap-wrapper/src/detail/auv2/process.cpp", + "./external/clap-wrapper/src/detail/auv2/wrappedview.mm", + "./external/clap-wrapper/src/detail/auv2/parameter.cpp", + ]); + + cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); + cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); + + // TODO: test on macos below 10.15 + cc.define("MACOS_USE_GHC_FILESYSTEM", None); + cc.include("./external/filesystem/include"); + + cc.define("MAC", None); + + println!("cargo:rustc-link-lib=framework=Foundation"); + println!("cargo:rustc-link-lib=framework=CoreFoundation"); + println!("cargo:rustc-link-lib=framework=AudioToolbox"); + println!("cargo:rustc-link-lib=framework=CoreMIDI"); + println!("cargo:rustc-link-lib=framework=AppKit"); + + if debug { + cc.define("DEVELOPMENT", Some("1")); + } else { + cc.define("RELEASE", Some("1")); + } - println!("cargo:rustc-cfg=clap_wrapper_vst3"); + cc.try_compile("clap_wrapper_auv2") + .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (auv2): {}", e)); } fn walk_files(dir: impl Into, ext: &str) -> Vec { @@ -128,7 +210,12 @@ fn walk_files(dir: impl Into, ext: &str) -> Vec { stack.push(dir.into()); while let Some(top) = stack.pop() { - for entry in std::fs::read_dir(&top).unwrap() { + for entry in std::fs::read_dir(&top).unwrap_or_else(|_| { + panic!( + "failed to list directory {:?}", + absolute(&top).unwrap_or(top.clone()) + ) + }) { let path = entry.unwrap().path(); if path.is_dir() { stack.push(path); diff --git a/clap-wrapper-auv2/Cargo.toml b/clap-wrapper-auv2/Cargo.toml deleted file mode 100644 index 6f61c9f..0000000 --- a/clap-wrapper-auv2/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "clap-wrapper-auv2" -version = "0.2.0" -edition = "2024" -authors = ["Quant1um "] -readme = "README.md" -repository = "https://github.com/blepfx/clap-wrapper-rs" -license = "MIT OR Apache-2.0" -description = "An easy way to use clap-wrapper in your audio plugins!" -keywords = ["auv2", "clap", "audio", "plugin"] - -include = [ - "src/**", - "build.rs", - "Cargo.toml", - "Cargo.lock", - "./README.md", - - "external/clap/include/**", - "external/clap-wrapper/include/**", - "external/clap-wrapper/libs/**", - "external/clap-wrapper/src/**", - "external/filesystem/include/**", - - "external/AudioUnitSDK/include/**", - "external/AudioUnitSDK/src/**", -] - -[build-dependencies] -cc = { workspace = true } - -[features] -default = ["parallel"] -parallel = ["cc/parallel"] \ No newline at end of file diff --git a/clap-wrapper-auv2/README.md b/clap-wrapper-auv2/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/clap-wrapper-auv2/build.rs b/clap-wrapper-auv2/build.rs deleted file mode 100644 index 54b52f1..0000000 --- a/clap-wrapper-auv2/build.rs +++ /dev/null @@ -1,84 +0,0 @@ -fn main() { - println!("cargo:rerun-if-changed=build.rs"); - - let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); - let debug = std::env::var("DEBUG").unwrap_or_default() == "true"; - - if os != "macos" { - return; - } - - let mut cc = cc::Build::new(); - cc.cpp(true).std("c++20"); //latest AudioUnitSDK requires C++20 - cc.flag_if_supported("-fno-char8_t"); - - cc.include("./src/cpp"); - cc.include("./external/clap/include"); - cc.include("./external/clap-wrapper/include"); - cc.include("./external/clap-wrapper/libs/fmt"); - cc.include("./external/clap-wrapper/src"); - cc.include("./external/AudioUnitSDK/include"); - - cc.define("CLAP_WRAPPER_VERSION", Some("\"0.11.0\"")); - cc.define("CLAP_WRAPPER_BUILD_AUV2", Some("1")); - cc.define("STATICALLY_LINKED_CLAP_ENTRY", Some("1")); - cc.define("DICTIONARY_STREAM_FORMAT_WRAPPER", Some("1")); - - // auv2 sdk - cc.files([ - "./external/AudioUnitSDK/src/AudioUnitSDK/AUBase.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUBuffer.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUBufferAllocator.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUEffectBase.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIBase.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUMIDIEffectBase.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUInputElement.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUOutputElement.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUScopeElement.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/AUPlugInDispatch.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/ComponentBase.cpp", - "./external/AudioUnitSDK/src/AudioUnitSDK/MusicDeviceBase.cpp", - ]); - - // clap wrapper shared - cc.files([ - "./external/clap-wrapper/src/clap_proxy.cpp", - "./external/clap-wrapper/src/detail/clap/fsutil.cpp", - "./external/clap-wrapper/src/detail/shared/sha1.cpp", - ]); - - // clap auv2 wrapper - cc.files([ - "./external/clap-wrapper/src/wrapasauv2.cpp", - "./external/clap-wrapper/src/detail/auv2/auv2_shared.mm", - "./external/clap-wrapper/src/detail/auv2/process.cpp", - "./external/clap-wrapper/src/detail/auv2/wrappedview.mm", - "./external/clap-wrapper/src/detail/auv2/parameter.cpp", - ]); - - cc.file("./external/clap-wrapper/src/detail/os/macos.mm"); - cc.file("./external/clap-wrapper/src/detail/clap/mac_helpers.mm"); - - // TODO: test on macos below 10.15 - cc.define("MACOS_USE_GHC_FILESYSTEM", None); - cc.include("./external/filesystem/include"); - - cc.define("MAC", None); - - println!("cargo:rustc-link-lib=framework=Foundation"); - println!("cargo:rustc-link-lib=framework=CoreFoundation"); - println!("cargo:rustc-link-lib=framework=AudioToolbox"); - println!("cargo:rustc-link-lib=framework=CoreMIDI"); - println!("cargo:rustc-link-lib=framework=AppKit"); - - if debug { - cc.define("DEVELOPMENT", Some("1")); - } else { - cc.define("RELEASE", Some("1")); - } - - cc.try_compile("clap_wrapper_auv2") - .unwrap_or_else(|e| panic!("failed to compile clap-wrapper (auv2): {}", e)); - - println!("cargo:rustc-cfg=clap_wrapper_auv2"); -} diff --git a/clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx b/clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx deleted file mode 100644 index 89ba083..0000000 --- a/clap-wrapper-auv2/src/cpp/generated_cocoaclasses.hxx +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#define CLAP_WRAPPER_COCOA_CLASS_NSVIEW wrapAsAUV2_inst0_cocoaUI_nsview -#define CLAP_WRAPPER_COCOA_CLASS wrapAsAUV2_inst0_cocoaUI -#define CLAP_WRAPPER_TIMER_CALLBACK timerCallback_wrapAsAUV2_inst0_cocoaUI -#define CLAP_WRAPPER_FILL_AUCV fillAUCV_wrapAsAUV2_inst0_cocoaUI -#define CLAP_WRAPPER_EDITOR_NAME "Plugin View" -#include "detail/auv2/wrappedview.asinclude.mm" - -bool fillAudioUnitCocoaView(AudioUnitCocoaViewInfo *viewInfo, std::shared_ptr _plugin) -{ - return fillAUCV_wrapAsAUV2_inst0_cocoaUI(viewInfo); -} \ No newline at end of file diff --git a/clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx b/clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx deleted file mode 100644 index 3412b9b..0000000 --- a/clap-wrapper-auv2/src/cpp/generated_entrypoints.hxx +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include "detail/auv2/auv2_base_classes.h" - -AUV2_Type typeFromAUInstance(AudioComponentInstance *ci) -{ - AudioComponent comp = AudioComponentInstanceGetComponent(*ci); - AudioComponentDescription desc; - - if (comp == nullptr || AudioComponentGetDescription(comp, &desc) != 0) - return AUV2_Type::aumu_musicdevice; - - if (desc.componentType == 'aufx') - return AUV2_Type::aufx_effect; - if (desc.componentType == 'aumi') - return AUV2_Type::aumi_noteeffect; - - return AUV2_Type::aumu_musicdevice; -} - -struct wrapAsAUV2_inst0 : free_audio::auv2_wrapper::WrapAsAUV2 -{ - wrapAsAUV2_inst0(AudioComponentInstance ci) : free_audio::auv2_wrapper::WrapAsAUV2(typeFromAUInstance(&ci), "", "", 0, ci) - { - } -}; - -AUSDK_COMPONENT_ENTRY(ausdk::AUMusicDeviceFactory, wrapAsAUV2_inst0); diff --git a/clap-wrapper-auv2/src/lib.rs b/clap-wrapper-auv2/src/lib.rs deleted file mode 100644 index df36bdf..0000000 --- a/clap-wrapper-auv2/src/lib.rs +++ /dev/null @@ -1,26 +0,0 @@ -#[macro_export] -macro_rules! export { - () => { - #[allow(unused_imports)] - pub use $crate::internal::*; - }; -} - -#[doc(hidden)] -pub mod internal { - #[cfg(target_os = "macos")] - #[link(name = "clap_wrapper_auv2")] - unsafe extern "C" { - pub unsafe fn wrapAsAUV2_inst0Factory( - desc: *const core::ffi::c_void, - ) -> *mut core::ffi::c_void; - } - - #[cfg(target_os = "macos")] - #[unsafe(no_mangle)] - pub unsafe extern "C" fn GetPluginFactoryAUV2( - desc: *const core::ffi::c_void, - ) -> *mut core::ffi::c_void { - unsafe { wrapAsAUV2_inst0Factory(desc) } - } -} diff --git a/clap-wrapper-vst3/Cargo.toml b/clap-wrapper-vst3/Cargo.toml deleted file mode 100644 index 9e48060..0000000 --- a/clap-wrapper-vst3/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "clap-wrapper-vst3" -version = "0.2.0" -edition = "2024" -authors = ["Quant1um "] -readme = "README.md" -repository = "https://github.com/blepfx/clap-wrapper-rs" -license = "MIT OR Apache-2.0" -description = "An easy way to use clap-wrapper in your audio plugins!" -keywords = ["vst3", "clap", "audio", "plugin"] -include = [ - "src/**", - "build.rs", - "Cargo.toml", - "Cargo.lock", - "./README.md", - - "external/clap/include/**", - "external/clap-wrapper/include/**", - "external/clap-wrapper/libs/**", - "external/clap-wrapper/src/**", - "external/filesystem/include/**", - - "external/vst3sdk/pluginterfaces/**", - "external/vst3sdk/public.sdk/source/**", - "external/vst3sdk/base/**", -] - -[build-dependencies] -cc = { workspace = true } - -[features] -default = ["parallel"] -parallel = ["cc/parallel"] \ No newline at end of file diff --git a/clap-wrapper-vst3/README.md b/clap-wrapper-vst3/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/clap-wrapper-vst3/external/clap b/clap-wrapper-vst3/external/clap deleted file mode 160000 index 29ffcc2..0000000 --- a/clap-wrapper-vst3/external/clap +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 29ffcc273be7c7c651f6c9953b99e69700e2387a diff --git a/clap-wrapper-vst3/external/clap-wrapper b/clap-wrapper-vst3/external/clap-wrapper deleted file mode 160000 index 62bf4f1..0000000 --- a/clap-wrapper-vst3/external/clap-wrapper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 62bf4f193d8dac354a946c1e0cffda9174317042 diff --git a/clap-wrapper-vst3/external/filesystem b/clap-wrapper-vst3/external/filesystem deleted file mode 160000 index 0e72911..0000000 --- a/clap-wrapper-vst3/external/filesystem +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0e72911ba0f37f3eb883b181b855a5f4eb046ca1 diff --git a/examples/example-clack/Cargo.toml b/examples/example-clack/Cargo.toml index bd44f24..438fb1d 100644 --- a/examples/example-clack/Cargo.toml +++ b/examples/example-clack/Cargo.toml @@ -9,7 +9,6 @@ publish = false crate-type = ["cdylib"] [dependencies] +clap-wrapper= { path = "../.." } clack-plugin = { git = "https://github.com/prokopyl/clack", rev = "5deaa1be9b5af7078d75cbe54abefee12ed40f63" } clack-extensions = { git = "https://github.com/prokopyl/clack", rev = "5deaa1be9b5af7078d75cbe54abefee12ed40f63", features = ["audio-ports", "clack-plugin", "note-ports", "params", "state"] } -clap-wrapper-auv2 = { path = "../../clap-wrapper-auv2" } -clap-wrapper-vst3 = { path = "../../clap-wrapper-vst3" } \ No newline at end of file diff --git a/examples/example-clack/src/lib.rs b/examples/example-clack/src/lib.rs index 58da162..3a06633 100644 --- a/examples/example-clack/src/lib.rs +++ b/examples/example-clack/src/lib.rs @@ -232,5 +232,5 @@ pub struct PolySynthPluginMainThread<'a> { impl<'a> PluginMainThread<'a, PolySynthPluginShared> for PolySynthPluginMainThread<'a> {} clack_export_entry!(SinglePluginEntry); -clap_wrapper_auv2::export!(); -clap_wrapper_vst3::export!(); +clap_wrapper::export_vst3!(); +clap_wrapper::export_auv2!(); diff --git a/examples/example-nih-plug/Cargo.toml b/examples/example-nih-plug/Cargo.toml index b122116..a112155 100644 --- a/examples/example-nih-plug/Cargo.toml +++ b/examples/example-nih-plug/Cargo.toml @@ -11,8 +11,7 @@ publish = false crate-type = ["cdylib"] [dependencies] -clap-wrapper-auv2 = { path = "../../clap-wrapper-auv2" } -clap-wrapper-vst3 = { path = "../../clap-wrapper-vst3" } +clap-wrapper= { path = "../.." } nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "400eb3156f221073fbcaf95607b56842272d134b" } nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "400eb3156f221073fbcaf95607b56842272d134b" } atomic_float = "1.1" \ No newline at end of file diff --git a/examples/example-nih-plug/src/lib.rs b/examples/example-nih-plug/src/lib.rs index 7f6ddfb..b1e3821 100644 --- a/examples/example-nih-plug/src/lib.rs +++ b/examples/example-nih-plug/src/lib.rs @@ -176,5 +176,5 @@ impl Vst3Plugin for Gain { } nih_export_clap!(Gain); -clap_wrapper_auv2::export!(); -clap_wrapper_vst3::export!(); +clap_wrapper::export_vst3!(); +clap_wrapper::export_auv2!(); diff --git a/clap-wrapper-auv2/external/AudioUnitSDK b/external/AudioUnitSDK similarity index 100% rename from clap-wrapper-auv2/external/AudioUnitSDK rename to external/AudioUnitSDK diff --git a/clap-wrapper-auv2/external/clap b/external/clap similarity index 100% rename from clap-wrapper-auv2/external/clap rename to external/clap diff --git a/clap-wrapper-auv2/external/clap-wrapper b/external/clap-wrapper similarity index 100% rename from clap-wrapper-auv2/external/clap-wrapper rename to external/clap-wrapper diff --git a/clap-wrapper-auv2/external/filesystem b/external/filesystem similarity index 100% rename from clap-wrapper-auv2/external/filesystem rename to external/filesystem diff --git a/clap-wrapper-vst3/external/vst3sdk b/external/vst3sdk similarity index 100% rename from clap-wrapper-vst3/external/vst3sdk rename to external/vst3sdk diff --git a/clap-wrapper-vst3/src/lib.rs b/src/lib.rs similarity index 71% rename from clap-wrapper-vst3/src/lib.rs rename to src/lib.rs index 46775bf..c2a54fb 100644 --- a/clap-wrapper-vst3/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,40 @@ #[macro_export] -macro_rules! export { +macro_rules! export_vst3 { () => { #[allow(unused_imports)] - pub use $crate::internal::*; + pub use $crate::vst3::*; }; } +#[macro_export] +macro_rules! export_auv2 { + () => { + #[allow(unused_imports)] + pub use $crate::auv2::*; + }; +} + +#[cfg(all(target_os = "macos", feature = "auv2"))] +#[doc(hidden)] +pub mod auv2 { + #[link(name = "clap_wrapper_auv2")] + unsafe extern "C" { + pub unsafe fn wrapAsAUV2_inst0Factory( + desc: *const core::ffi::c_void, + ) -> *mut core::ffi::c_void; + } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn GetPluginFactoryAUV2( + desc: *const core::ffi::c_void, + ) -> *mut core::ffi::c_void { + unsafe { wrapAsAUV2_inst0Factory(desc) } + } +} + +#[cfg(feature = "vst3")] #[doc(hidden)] -pub mod internal { +pub mod vst3 { #[link(name = "clap_wrapper_vst3")] unsafe extern "system" { unsafe fn clap_wrapper_GetPluginFactory() -> *mut core::ffi::c_void; @@ -75,3 +102,11 @@ pub mod internal { unsafe { clap_wrapper_ExitDll() } } } + +#[cfg(not(all(target_os = "macos", feature = "auv2")))] +#[doc(hidden)] +pub mod auv2 {} + +#[cfg(not(feature = "vst3"))] +#[doc(hidden)] +pub mod vst3 {} From a344d00116ca8a9172b212a5f04089434824d76b Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 21:25:38 +0400 Subject: [PATCH 5/7] fix workflow package job, add include section to Cargo.toml (crate size from 100+mb down to 4mb, under 1mb compressed) --- .github/workflows/validate.yml | 19 +++++++++---------- Cargo.toml | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index b5fd70f..9a930e1 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -27,11 +27,11 @@ jobs: # needed for baseview and other example-nih-plug deps sudo apt-get install -y libgl-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev - - name: Package `clap-wrapper` crates + - name: Package `clap-wrapper` shell: bash run: | - # we test the packaged versions to make sure everything needed is included - cargo package -p clap-wrapper-vst3 + # we test the packaged version to make sure everything needed is included + cargo package -p clap-wrapper - name: Build `${{ matrix.package }}` shell: bash @@ -86,11 +86,11 @@ jobs: with: submodules: recursive - - name: Package `clap-wrapper` crates + - name: Package `clap-wrapper` shell: bash run: | - # we test the packaged versions to make sure everything needed is included - cargo package -p clap-wrapper-vst3 + # we test the packaged version to make sure everything needed is included + cargo package -p clap-wrapper - name: Build `${{ matrix.package }}` shell: bash @@ -153,12 +153,11 @@ jobs: with: submodules: recursive - - name: Package `clap-wrapper` crates + - name: Package `clap-wrapper` shell: bash run: | - # we test the packaged versions to make sure everything needed is included - cargo package -p clap-wrapper-auv2 - cargo package -p clap-wrapper-vst3 + # we test the packaged version to make sure everything needed is included + cargo package -p clap-wrapper - name: Build `${{ matrix.package }}` shell: bash diff --git a/Cargo.toml b/Cargo.toml index 31c576a..d26e9d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,28 @@ license = "MIT OR Apache-2.0" description = "An easy way to use clap-wrapper in your audio plugins!" keywords = ["vst3", "auv2", "clap", "audio", "plugin"] +include = [ + "src/**", + "build.rs", + "./README.md", + + # Include external dependency licenses, just in case + "LICENSE*", + + "external/clap/include/**", + "external/clap-wrapper/include/**", + "external/clap-wrapper/libs/**", + "external/clap-wrapper/src/**", + "external/filesystem/include/**", + + "external/AudioUnitSDK/include/**", + "external/AudioUnitSDK/src/**", + + "external/vst3sdk/pluginterfaces/**", + "external/vst3sdk/public.sdk/source/**", + "external/vst3sdk/base/**", +] + [build-dependencies] cc = "1.2.52" From 8d6b108e151a3e158457f83805b75918b7dde336 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 21:28:29 +0400 Subject: [PATCH 6/7] add missing cpp shims for auv2 --- build.rs | 2 +- src/auv2-cpp/generated_cocoaclasses.hxx | 13 ++++++++++++ src/auv2-cpp/generated_entrypoints.hxx | 27 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/auv2-cpp/generated_cocoaclasses.hxx create mode 100644 src/auv2-cpp/generated_entrypoints.hxx diff --git a/build.rs b/build.rs index a7659ab..c4fc2aa 100644 --- a/build.rs +++ b/build.rs @@ -135,7 +135,7 @@ fn build_auv2(debug: bool) { cc.cpp(true).std("c++20"); //AudioUnitSDK requires C++20 cc.flag_if_supported("-fno-char8_t"); - cc.include("./src/cpp"); + cc.include("./src/auv2-cpp"); cc.include("./external/clap/include"); cc.include("./external/clap-wrapper/include"); cc.include("./external/clap-wrapper/libs/fmt"); diff --git a/src/auv2-cpp/generated_cocoaclasses.hxx b/src/auv2-cpp/generated_cocoaclasses.hxx new file mode 100644 index 0000000..89ba083 --- /dev/null +++ b/src/auv2-cpp/generated_cocoaclasses.hxx @@ -0,0 +1,13 @@ +#pragma once + +#define CLAP_WRAPPER_COCOA_CLASS_NSVIEW wrapAsAUV2_inst0_cocoaUI_nsview +#define CLAP_WRAPPER_COCOA_CLASS wrapAsAUV2_inst0_cocoaUI +#define CLAP_WRAPPER_TIMER_CALLBACK timerCallback_wrapAsAUV2_inst0_cocoaUI +#define CLAP_WRAPPER_FILL_AUCV fillAUCV_wrapAsAUV2_inst0_cocoaUI +#define CLAP_WRAPPER_EDITOR_NAME "Plugin View" +#include "detail/auv2/wrappedview.asinclude.mm" + +bool fillAudioUnitCocoaView(AudioUnitCocoaViewInfo *viewInfo, std::shared_ptr _plugin) +{ + return fillAUCV_wrapAsAUV2_inst0_cocoaUI(viewInfo); +} \ No newline at end of file diff --git a/src/auv2-cpp/generated_entrypoints.hxx b/src/auv2-cpp/generated_entrypoints.hxx new file mode 100644 index 0000000..3412b9b --- /dev/null +++ b/src/auv2-cpp/generated_entrypoints.hxx @@ -0,0 +1,27 @@ +#pragma once +#include "detail/auv2/auv2_base_classes.h" + +AUV2_Type typeFromAUInstance(AudioComponentInstance *ci) +{ + AudioComponent comp = AudioComponentInstanceGetComponent(*ci); + AudioComponentDescription desc; + + if (comp == nullptr || AudioComponentGetDescription(comp, &desc) != 0) + return AUV2_Type::aumu_musicdevice; + + if (desc.componentType == 'aufx') + return AUV2_Type::aufx_effect; + if (desc.componentType == 'aumi') + return AUV2_Type::aumi_noteeffect; + + return AUV2_Type::aumu_musicdevice; +} + +struct wrapAsAUV2_inst0 : free_audio::auv2_wrapper::WrapAsAUV2 +{ + wrapAsAUV2_inst0(AudioComponentInstance ci) : free_audio::auv2_wrapper::WrapAsAUV2(typeFromAUInstance(&ci), "", "", 0, ci) + { + } +}; + +AUSDK_COMPONENT_ENTRY(ausdk::AUMusicDeviceFactory, wrapAsAUV2_inst0); From e3bf62234635c4b9f883e968d52a74edda1edd17 Mon Sep 17 00:00:00 2001 From: Quant1um Date: Sun, 11 Jan 2026 23:10:37 +0400 Subject: [PATCH 7/7] v0.2.0 --- README.md | 2 +- src/lib.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e6418d8..689e307 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ See [validate.yml](.github/workflows/validate.yml) for a complete example of how ## Changelog - 0.2.0: - - Embed VST3 and AUv2 SDKs directly into the crate, removing the need to download them separately. This is possible thanks to VST3 SDK's new MIT license. + - Embedded VST3 and AUv2 SDKs directly into the crate, removing the need to download them separately. This is possible thanks to VST3 SDK's new MIT license. - Added `vst3` and `auv2` features to enable/disable building those wrappers. - Simplified build.rs by a lot. - 0.1.2: diff --git a/src/lib.rs b/src/lib.rs index c2a54fb..29baf67 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,6 +32,10 @@ pub mod auv2 { } } +#[cfg(not(all(target_os = "macos", feature = "auv2")))] +#[doc(hidden)] +pub mod auv2 {} + #[cfg(feature = "vst3")] #[doc(hidden)] pub mod vst3 { @@ -103,10 +107,6 @@ pub mod vst3 { } } -#[cfg(not(all(target_os = "macos", feature = "auv2")))] -#[doc(hidden)] -pub mod auv2 {} - #[cfg(not(feature = "vst3"))] #[doc(hidden)] pub mod vst3 {}