diff --git a/.gitignore b/.gitignore index ca11ced..c50dbf0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ cmake-build-*/ /src/frontend/obj/ /build /.vs +*.DotSettings.user diff --git a/src/backend/CMakeLists.txt b/src/backend/CMakeLists.txt index b329bdf..5c4711c 100644 --- a/src/backend/CMakeLists.txt +++ b/src/backend/CMakeLists.txt @@ -1,5 +1,5 @@ # ============================================================================== -# NinaEngine - 构建脚本 +# AlichoEngine - 构建脚本 # # 核心职责: # 该 CMakeLists.txt 文件负责定义 "NinaEngine" 可执行文件的完整构建流程。 @@ -24,6 +24,7 @@ include(cmake_script/retrieve_files.cmake) # 负责递归查找源文件。 include(cmake_script/utils.cmake) # 提供其他工具函数,如 compile_proto_files。 include(cmake_script/detect_os.cmake) include(cmake_script/plugin_host_register.cmake) +include(cmake_script/configure_glfw_native.cmake) # 使用自定义函数来配置项目的编译选项。 # @param STANDARD: 指定C++语言标准,此处为 C++23。 @@ -63,6 +64,7 @@ compile_proto_files( GRPC_ENABLED TRUE ) +add_subdirectory(src/misc) add_subdirectory(src/vst2_host) add_subdirectory(src/vst3_host) add_subdirectory(src/engine) diff --git a/src/backend/cmake_script/configure_glfw_native.cmake b/src/backend/cmake_script/configure_glfw_native.cmake new file mode 100644 index 0000000..aff54e8 --- /dev/null +++ b/src/backend/cmake_script/configure_glfw_native.cmake @@ -0,0 +1,42 @@ +function(configure_glfw_native target) + # 检测操作系统 + if(WIN32) + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_WIN32) + message(STATUS "公开 GLFW 原生 Win32 API") + elseif(APPLE) + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_COCOA) + message(STATUS "公开 GLFW 原生 Cocoa API") + elseif(UNIX) + # 对于 Unix-like 系统,我们需要进一步检测 + if(CMAKE_SYSTEM_NAME MATCHES "Linux") + # 检测 Wayland + find_package(Wayland) + if(Wayland_FOUND) + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_WAYLAND) + message(STATUS "公开 GLFW 原生 Wayland API") + else() + # 如果没有 Wayland,默认使用 X11 + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_X11) + message(STATUS "公开 GLFW 原生 X11 API") + endif() + elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD") + # BSD 系统通常使用 X11 + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_X11) + message(STATUS "公开 BSD 的 GLFW 原生 X11 API") + else() + message(WARNING "未知的类 Unix 系统,GLFW 原生 API 可能无法正确暴露") + endif() + elseif (ANDROID) + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_ANDROID) + message(STATUS "公开 GLFW 原生 Android API") + else() + message(WARNING "未知作系统,GLFW 原生 API 可能无法正确暴露") + endif() + + # 对于 EGL 支持,你可能需要额外的检测 + # 这里我们简单地为所有非 Windows 和非 macOS 系统启用它 + if(NOT WIN32 AND NOT APPLE) + target_compile_definitions(${target} PRIVATE GLFW_EXPOSE_NATIVE_EGL) + message(STATUS "公开 GLFW 原生 EGL API") + endif() +endfunction() diff --git a/src/backend/cmake_script/detect_os.cmake b/src/backend/cmake_script/detect_os.cmake index e7d9f90..2fbae8d 100644 --- a/src/backend/cmake_script/detect_os.cmake +++ b/src/backend/cmake_script/detect_os.cmake @@ -10,62 +10,65 @@ function(add_os_definitions target) # --- 阶段 1: 确定宏的值 --- # 初始化所有平台、架构和特性宏的值为 0 - set(piko_def_windows 0) - set(piko_def_macos 0) - set(piko_def_linux 0) - set(piko_def_freebsd 0) - set(piko_def_ios 0) - set(piko_def_android 0) - set(piko_def_cygwin 0) - set(piko_def_unix 0) - set(piko_def_posix 0) - set(piko_def_mobile 0) - set(piko_def_arch_64bit 0) - set(piko_def_arch_32bit 0) + set(alicho_def_windows 0) + set(alicho_def_macos 0) + set(alicho_def_linux 0) + set(alicho_def_freebsd 0) + set(alicho_def_ios 0) + set(alicho_def_android 0) + set(alicho_def_cygwin 0) + set(alicho_def_unix 0) + set(alicho_def_posix 0) + set(alicho_def_mobile 0) + set(alicho_def_arch_64bit 0) + set(alicho_def_arch_32bit 0) + set(alicho_def_apple 0) # 用于 iOS 和 macOS 的通用定义 # -- 操作系统检测与赋值 -- # 注意检测顺序:优先检测更具体的平台 if(CYGWIN) # Cygwin 环境比较特殊,它在 Windows 上模拟 Unix - set(piko_def_windows 1) # 基础是 Windows - set(piko_def_cygwin 1) # 明确是 Cygwin - set(piko_def_unix 1) # 提供 Unix API - set(piko_def_posix 1) # 提供 POSIX API + set(alicho_def_windows 1) # 基础是 Windows + set(alicho_def_cygwin 1) # 明确是 Cygwin + set(alicho_def_unix 1) # 提供 Unix API + set(alicho_def_posix 1) # 提供 POSIX API message(STATUS "检测到 **Cygwin** 环境 (运行于 Windows)") elseif(WIN32) # 非 Cygwin 的 Windows 环境 (MSVC, MinGW, etc.) - set(piko_def_windows 1) + set(alicho_def_windows 1) message(STATUS "检测到 **Windows** 操作系统 (非 Cygwin)") elseif(ANDROID) # Android 平台 (通常需要特定工具链设置 ANDROID 变量) - set(piko_def_android 1) - set(piko_def_unix 1) # Android NDK 基于 Unix - set(piko_def_posix 1) # NDK 提供 POSIX API - set(piko_def_mobile 1) # 移动平台 + set(alicho_def_android 1) + set(alicho_def_unix 1) # Android NDK 基于 Unix + set(alicho_def_posix 1) # NDK 提供 POSIX API + set(alicho_def_mobile 1) # 移动平台 message(STATUS "检测到 **Android** 操作系统") elseif(IOS) # iOS 平台 (通常需要特定工具链设置 IOS 变量) # 需要在 APPLE 之前判断,因为 iOS 下 APPLE 也为 TRUE - set(piko_def_ios 1) - set(piko_def_unix 1) # iOS (Darwin) 基于 Unix - set(piko_def_posix 1) # 提供 POSIX API - set(piko_def_mobile 1) # 移动平台 + set(alicho_def_ios 1) + set(alicho_def_unix 1) # iOS (Darwin) 基于 Unix + set(alicho_def_posix 1) # 提供 POSIX API + set(alicho_def_mobile 1) # 移动平台 + set(alicho_def_apple 1) # iOS 是 Apple 生态的一部分 message(STATUS "检测到 **iOS** 操作系统") elseif(APPLE) # 此时排除了 iOS,确定是 macOS - set(piko_def_macos 1) - set(piko_def_unix 1) # macOS (Darwin) 基于 Unix - set(piko_def_posix 1) # 提供 POSIX API + set(alicho_def_macos 1) + set(alicho_def_unix 1) # macOS (Darwin) 基于 Unix + set(alicho_def_posix 1) # 提供 POSIX API + set(alicho_def_apple 1) # macOS 是 Apple 生态的一部分 message(STATUS "检测到 **macOS** 操作系统") elseif(UNIX) # 此时排除了 Apple, Android, Cygwin 的其他 Unix-like 系统 - set(piko_def_unix 1) - set(piko_def_posix 1) + set(alicho_def_unix 1) + set(alicho_def_posix 1) if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(piko_def_linux 1) + set(alicho_def_linux 1) message(STATUS "检测到 **Linux** 操作系统") elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - set(piko_def_freebsd 1) + set(alicho_def_freebsd 1) message(STATUS "检测到 **FreeBSD** 操作系统") else() message(WARNING "检测到未知的 类Unix 操作系统: ${CMAKE_SYSTEM_NAME}") @@ -76,12 +79,12 @@ function(add_os_definitions target) # -- 架构检测与赋值 -- if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(piko_def_arch_64bit 1) - set(piko_def_arch_32bit 0) # 明确设置为 0 + set(alicho_def_arch_64bit 1) + set(alicho_def_arch_32bit 0) # 明确设置为 0 message(STATUS "检测到 **64-bit** 架构") elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(piko_def_arch_64bit 0) # 明确设置为 0 - set(piko_def_arch_32bit 1) + set(alicho_def_arch_64bit 0) # 明确设置为 0 + set(alicho_def_arch_32bit 1) message(STATUS "检测到 **32-bit** 架构") else() # 对于未知或未定义的指针大小,两者都保持 0 @@ -92,22 +95,23 @@ function(add_os_definitions target) set(definitions_list "") # 初始化空列表 # 添加平台定义 - list(APPEND definitions_list "PIKO_PLATFORM_WINDOWS=${piko_def_windows}") - list(APPEND definitions_list "PIKO_PLATFORM_MACOS=${piko_def_macos}") - list(APPEND definitions_list "PIKO_PLATFORM_LINUX=${piko_def_linux}") - list(APPEND definitions_list "PIKO_PLATFORM_FREEBSD=${piko_def_freebsd}") - list(APPEND definitions_list "PIKO_PLATFORM_IOS=${piko_def_ios}") - list(APPEND definitions_list "PIKO_PLATFORM_ANDROID=${piko_def_android}") - list(APPEND definitions_list "PIKO_PLATFORM_CYGWIN=${piko_def_cygwin}") + list(APPEND definitions_list "ALICHO_PLATFORM_WINDOWS=${alicho_def_windows}") + list(APPEND definitions_list "ALICHO_PLATFORM_MACOS=${alicho_def_macos}") + list(APPEND definitions_list "ALICHO_PLATFORM_LINUX=${alicho_def_linux}") + list(APPEND definitions_list "ALICHO_PLATFORM_FREEBSD=${alicho_def_freebsd}") + list(APPEND definitions_list "ALICHO_PLATFORM_IOS=${alicho_def_ios}") + list(APPEND definitions_list "ALICHO_PLATFORM_ANDROID=${alicho_def_android}") + list(APPEND definitions_list "ALICHO_PLATFORM_CYGWIN=${alicho_def_cygwin}") + list(APPEND definitions_list "ALICHO_PLATFORM_APPLE=${alicho_def_apple}") # 用于 iOS 和 macOS 的通用定义 # 添加架构定义 - list(APPEND definitions_list "PIKO_PLATFORM_ARCH_64BIT=${piko_def_arch_64bit}") - list(APPEND definitions_list "PIKO_PLATFORM_ARCH_32BIT=${piko_def_arch_32bit}") + list(APPEND definitions_list "ALICHO_PLATFORM_ARCH_64BIT=${alicho_def_arch_64bit}") + list(APPEND definitions_list "ALICHO_PLATFORM_ARCH_32BIT=${alicho_def_arch_32bit}") # 添加特性定义 - list(APPEND definitions_list "PIKO_PLATFORM_UNIX=${piko_def_unix}") - list(APPEND definitions_list "PIKO_PLATFORM_POSIX=${piko_def_posix}") - list(APPEND definitions_list "PIKO_PLATFORM_IS_MOBILE=${piko_def_mobile}") + list(APPEND definitions_list "ALICHO_PLATFORM_UNIX=${alicho_def_unix}") + list(APPEND definitions_list "ALICHO_PLATFORM_POSIX=${alicho_def_posix}") + list(APPEND definitions_list "ALICHO_PLATFORM_IS_MOBILE=${alicho_def_mobile}") # --- 阶段 3: 应用所有定义 --- # **关键:使用一次调用将所有定义添加到目标** @@ -115,7 +119,7 @@ function(add_os_definitions target) target_compile_definitions(${target} PUBLIC ${definitions_list}) endif() - # 函数作用域结束时,piko_def_* 变量会自动销毁,无需显式 unset + # 函数作用域结束时,alicho_def_* 变量会自动销毁,无需显式 unset endfunction() diff --git a/src/backend/src/misc/CMakeLists.txt b/src/backend/src/misc/CMakeLists.txt new file mode 100644 index 0000000..23a25c1 --- /dev/null +++ b/src/backend/src/misc/CMakeLists.txt @@ -0,0 +1,29 @@ +project(AlichoMisc) + +# --- 源代码文件管理 (Source File Management) --- +# 初始化一个变量用于存储所有源文件的路径。 +set(SRC_FILES "") + +# 调用自定义函数递归地从 'src' 目录中检索所有源文件, +# 并将文件列表追加到 SRC_FILES 变量中。 +# @param CMAKE_CURRENT_SOURCE_DIR/src: 要搜索的源文件根目录。 +# @param SRC_FILES: 用于接收文件列表的输出变量。 +retrieve_files(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_FILES) + +# --- 可执行文件目标定义 (Executable Target Definition) --- +# 创建一个名为 NinaEngine (与项目名相同) 的可执行文件。 +# @param ${PROJECT_NAME}: 目标名称。 +# @param ${SRC_FILES}: 构成该目标的所有源文件。 +add_library(${PROJECT_NAME} STATIC ${SRC_FILES}) + +# 将依赖库链接到我们的可执行文件目标。 +# @param ${PROJECT_NAME}: 要链接的目标。 +# @param PRIVATE: 表示链接的依赖项仅对 ${PROJECT_NAME} 自身可见, +# 不会传递给链接到 ${PROJECT_NAME} 的其他目标。 +# @param config_target: 链接之前创建的接口目标,以应用通用的编译设置。 +# @param gRPC::grpc++: gRPC 库提供的 C++ 目标。 +# @param protobuf::libprotobuf: Protobuf 运行时库目标。 +# @param zmq: ZeroMQ 库目标。 +target_link_libraries(${PROJECT_NAME} PRIVATE config_target) +target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) +add_os_definitions(${PROJECT_NAME}) diff --git a/src/backend/src/misc/src/library_handle.h b/src/backend/src/misc/src/library_handle.h new file mode 100644 index 0000000..24ab1a2 --- /dev/null +++ b/src/backend/src/misc/src/library_handle.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include + +class library_handle { + friend class std::shared_ptr; +public: + virtual ~library_handle() = default; + static library_handle* create(const std::filesystem::path& in_path); + + void* get_func_address(const char* in_name) const; + + template + auto get_func(const char* in_name) const -> FuncType { + void* addr = get_func_address(in_name); + if (!addr) + return nullptr; + return reinterpret_cast(addr); + } + + [[nodiscard]] const auto& get_path() const noexcept { + return path_; + } +protected: + library_handle() = default; + std::filesystem::path path_; + void* handle_ = nullptr; +}; diff --git a/src/backend/src/misc/src/size_type.h b/src/backend/src/misc/src/size_type.h new file mode 100644 index 0000000..01bfdb9 --- /dev/null +++ b/src/backend/src/misc/src/size_type.h @@ -0,0 +1,11 @@ +#pragma once +#include + +template +struct vec { + T x, y; + vec() : x(0), y(0) {} +}; + +using i_vec2 = vec; +using f_vec2 = vec; diff --git a/src/backend/src/misc/src/windows/library_handle.cpp b/src/backend/src/misc/src/windows/library_handle.cpp new file mode 100644 index 0000000..b191033 --- /dev/null +++ b/src/backend/src/misc/src/windows/library_handle.cpp @@ -0,0 +1,21 @@ +#include "library_handle.h" +#include + +library_handle* library_handle::create(const std::filesystem::path& in_path) { + const auto lib_handle = LoadLibraryA(in_path.string().c_str()); + if (!lib_handle) { + throw std::runtime_error("Failed to load library: " + in_path.string()); + } + auto lib = new library_handle(); + lib->path_ = in_path; + lib->handle_ = lib_handle; + return lib; +} + +void* library_handle::get_func_address(const char* in_name) const { + void* func_address = GetProcAddress(static_cast(handle_), in_name); + if (!func_address) { + throw std::runtime_error("Failed to get function address: " + std::string(in_name)); + } + return func_address; +} diff --git a/src/backend/src/vst2_host/CMakeLists.txt b/src/backend/src/vst2_host/CMakeLists.txt index 3fa2866..adf74df 100644 --- a/src/backend/src/vst2_host/CMakeLists.txt +++ b/src/backend/src/vst2_host/CMakeLists.txt @@ -1,5 +1,7 @@ project(AlichoPluginHostVst2) +find_package(glfw3 CONFIG REQUIRED) + # --- 源代码文件管理 (Source File Management) --- # 初始化一个变量用于存储所有源文件的路径。 set(SRC_FILES "") @@ -17,5 +19,10 @@ target_link_libraries(${PROJECT_NAME} PRIVATE gRPC::grpc++ protobuf::libprotobuf libzmq + glfw + AlichoMisc ) +target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) register_plugin_host(${PROJECT_NAME}) +configure_glfw_native(${PROJECT_NAME}) +add_os_definitions(${PROJECT_NAME}) diff --git a/src/backend/src/vst2_host/src/linux/editor.cpp b/src/backend/src/vst2_host/src/linux/editor.cpp new file mode 100644 index 0000000..4227e30 --- /dev/null +++ b/src/backend/src/vst2_host/src/linux/editor.cpp @@ -0,0 +1,3 @@ +// +// Created by 46944 on 25-8-14. +// diff --git a/src/backend/src/vst2_host/src/macos/editor.cpp b/src/backend/src/vst2_host/src/macos/editor.cpp new file mode 100644 index 0000000..4227e30 --- /dev/null +++ b/src/backend/src/vst2_host/src/macos/editor.cpp @@ -0,0 +1,3 @@ +// +// Created by 46944 on 25-8-14. +// diff --git a/src/backend/src/vst2_host/src/main.cpp b/src/backend/src/vst2_host/src/main.cpp index 2ae2668..18e23a8 100644 --- a/src/backend/src/vst2_host/src/main.cpp +++ b/src/backend/src/vst2_host/src/main.cpp @@ -1,42 +1,32 @@ -// -// Created by A on 2025/8/13. -// -#include "daw_api.grpc.pb.h" +#include "GLFW/glfw3.h" +#include -class test_service : public daw::api::TrackService::Service { -public: - virtual ~test_service() override; - - virtual grpc::Status AddTrack(grpc::ServerContext* context, - const daw::api::AddTrackRequest* request, - daw::api::TrackInfo* response) override { - return grpc::Status::OK; - } - - virtual grpc::Status RemoveTrack(grpc::ServerContext* context, - const daw::api::TrackIdRequest* request, - daw::api::StatusResponse* response) override { - - return grpc::Status::OK; - } - - virtual grpc::Status SetTrackVolume(grpc::ServerContext* context, - const daw::api::SetTrackVolumeRequest* request, - daw::api::StatusResponse* response) override { - - return grpc::Status::OK; - } - - virtual grpc::Status SetTrackPan(grpc::ServerContext* context, - const daw::api::SetTrackPanRequest* request, - daw::api::StatusResponse* response) override { - - return grpc::Status::OK; - } -}; +#include "vst2host.h" int main(int argc, char *argv[]) { + glfwSetErrorCallback([](int error, const char* description) { + std::println(std::cerr, "GLFW Error {}: {}", error, description); + }); + glfwInit(); // 初始化 GLFW + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); // 仅使用 GLFW 的窗口功能,不使用 OpenGL + auto plugin_path = argv[1]; + + load_plugin(plugin_path, 44100, 512); + open_editor(); + + while (true) { + if (is_editor_open()) { + glfwPollEvents(); + idle_editor(); + } + else { + break; + } + } + unload_plugin(); + + glfwTerminate(); return 0; } diff --git a/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffect.h b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffect.h new file mode 100644 index 0000000..6bba888 --- /dev/null +++ b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffect.h @@ -0,0 +1,351 @@ +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// Version 2.4 $Date: 2006/06/20 17:22:55 $ +// +// Category : VST 2.x Interfaces +// Filename : aeffect.h +// Created by : Steinberg Media Technologies +// Description : Definition of AEffect structure +// +// © 2006, Steinberg Media Technologies, All Rights Reserved +//------------------------------------------------------------------------------------------------------- + +#ifndef __aeffect__ +#define __aeffect__ + +// gcc based compiler, or CodeWarrior on Mac OS X +#if ((defined(__GNUC__) && (defined(__APPLE_CPP__) || defined(__APPLE_CC__))) || (defined (__MWERKS__) && defined (__MACH__))) + #ifndef TARGET_API_MAC_CARBON + #define TARGET_API_MAC_CARBON 1 + #endif + #if __ppc__ + #ifndef VST_FORCE_DEPRECATED + #define VST_FORCE_DEPRECATED 0 + #endif + #endif +#endif + +#if TARGET_API_MAC_CARBON + #ifdef __LP64__ + #pragma options align=power + #else + #pragma options align=mac68k + #endif + #define VSTCALLBACK +#elif defined __BORLANDC__ + #pragma -a8 +#elif defined(__GNUC__) + #pragma pack(push,8) + #define VSTCALLBACK __cdecl +#elif defined(WIN32) || defined(__FLAT__) || defined CBUILDER + #pragma pack(push) + #pragma pack(8) + #define VSTCALLBACK __cdecl +#else + #define VSTCALLBACK +#endif +//------------------------------------------------------------------------------------------------------- + +#include // for strncpy + +//------------------------------------------------------------------------------------------------------- +// VST Version +//------------------------------------------------------------------------------------------------------- + +/** Define SDK Version (you can generate different versions (from 2.0 to 2.4) of this SDK by setting the unwanted extensions to 0). */ +#define VST_2_1_EXTENSIONS 1 ///< Version 2.1 extensions (08-06-2000) +#define VST_2_2_EXTENSIONS 1 ///< Version 2.2 extensions (08-06-2001) +#define VST_2_3_EXTENSIONS 1 ///< Version 2.3 extensions (20-05-2003) +#ifndef VST_2_4_EXTENSIONS +#define VST_2_4_EXTENSIONS 1 ///< Version 2.4 extensions (01-01-2006) +#endif + +/** Current VST Version */ +#if VST_2_4_EXTENSIONS + #define kVstVersion 2400 +#elif VST_2_3_EXTENSIONS + #define kVstVersion 2300 +#elif VST_2_2_EXTENSIONS + #define kVstVersion 2200 +#elif VST_2_1_EXTENSIONS + #define kVstVersion 2100 +#else + #define kVstVersion 2 +#endif + +/** Disable for Hosts to serve Plug-ins below VST 2.4 */ +#ifndef VST_FORCE_DEPRECATED +#define VST_FORCE_DEPRECATED VST_2_4_EXTENSIONS +#endif + +/** Declares identifier as deprecated. */ +#if VST_FORCE_DEPRECATED +#define DECLARE_VST_DEPRECATED(identifier) __##identifier##Deprecated +#else +#define DECLARE_VST_DEPRECATED(identifier) identifier +#endif + +/** Define for 64 Bit Platform. */ +#ifndef VST_64BIT_PLATFORM +#define VST_64BIT_PLATFORM _WIN64 || __LP64__ +#endif + +//------------------------------------------------------------------------------------------------------- +// Integral Types +//------------------------------------------------------------------------------------------------------- + +#ifdef WIN32 +typedef short VstInt16; ///< 16 bit integer type +typedef int VstInt32; ///< 32 bit integer type +typedef __int64 VstInt64; ///< 64 bit integer type +#else +#include +typedef int16_t VstInt16; ///< 16 bit integer type +typedef int32_t VstInt32; ///< 32 bit integer type +typedef int64_t VstInt64; ///< 64 bit integer type +#endif + +//------------------------------------------------------------------------------------------------------- +// Generic Types +//------------------------------------------------------------------------------------------------------- + +#if VST_64BIT_PLATFORM +typedef VstInt64 VstIntPtr; ///< platform-dependent integer type, same size as pointer +#else +typedef VstInt32 VstIntPtr; ///< platform-dependent integer type, same size as pointer +#endif + +//------------------------------------------------------------------------------------------------------- +// Misc. Definition +//------------------------------------------------------------------------------------------------------- +#undef CCONST +struct AEffect; + +/// @cond ignore +typedef VstIntPtr (VSTCALLBACK *audioMasterCallback) (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); +typedef VstIntPtr (VSTCALLBACK *AEffectDispatcherProc) (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); +typedef void (VSTCALLBACK *AEffectProcessProc) (AEffect* effect, float** inputs, float** outputs, VstInt32 sampleFrames); +typedef void (VSTCALLBACK *AEffectProcessDoubleProc) (AEffect* effect, double** inputs, double** outputs, VstInt32 sampleFrames); +typedef void (VSTCALLBACK *AEffectSetParameterProc) (AEffect* effect, VstInt32 index, float parameter); +typedef float (VSTCALLBACK *AEffectGetParameterProc) (AEffect* effect, VstInt32 index); +/// @endcond + +/** Four Character Constant (for AEffect->uniqueID) */ +#define CCONST(a, b, c, d) \ + ((((VstInt32)a) << 24) | (((VstInt32)b) << 16) | (((VstInt32)c) << 8) | (((VstInt32)d) << 0)) + +/** AEffect magic number */ +#define kEffectMagic CCONST ('V', 's', 't', 'P') + +//------------------------------------------------------------------------------------------------------- +/** Basic VST Effect "C" Interface. */ +//------------------------------------------------------------------------------------------------------- +struct AEffect +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 magic; ///< must be #kEffectMagic ('VstP') + + /** Host to Plug-in dispatcher @see AudioEffect::dispatcher */ + AEffectDispatcherProc dispatcher; + + /** \deprecated Accumulating process mode is deprecated in VST 2.4! Use AEffect::processReplacing instead! */ + AEffectProcessProc DECLARE_VST_DEPRECATED (process); + + /** Set new value of automatable parameter @see AudioEffect::setParameter */ + AEffectSetParameterProc setParameter; + + /** Returns current value of automatable parameter @see AudioEffect::getParameter*/ + AEffectGetParameterProc getParameter; + + VstInt32 numPrograms; ///< number of programs + VstInt32 numParams; ///< all programs are assumed to have numParams parameters + VstInt32 numInputs; ///< number of audio inputs + VstInt32 numOutputs; ///< number of audio outputs + + VstInt32 flags; ///< @see VstAEffectFlags + + VstIntPtr resvd1; ///< reserved for Host, must be 0 + VstIntPtr resvd2; ///< reserved for Host, must be 0 + + VstInt32 initialDelay; ///< for algorithms which need input in the first place (Group delay or latency in Samples). This value should be initialized in a resume state. + + VstInt32 DECLARE_VST_DEPRECATED (realQualities); ///< \deprecated unused member + VstInt32 DECLARE_VST_DEPRECATED (offQualities); ///< \deprecated unused member + float DECLARE_VST_DEPRECATED (ioRatio); ///< \deprecated unused member + + void* object; ///< #AudioEffect class pointer + void* user; ///< user-defined pointer + + VstInt32 uniqueID; ///< registered unique identifier (register it at Steinberg 3rd party support Web). This is used to identify a plug-in during save+load of preset and project. + VstInt32 version; ///< plug-in version (example 1100 for version 1.1.0.0) + + /** Process audio samples in replacing mode @see AudioEffect::processReplacing */ + AEffectProcessProc processReplacing; + +#if VST_2_4_EXTENSIONS + /** Process double-precision audio samples in replacing mode @see AudioEffect::processDoubleReplacing */ + AEffectProcessDoubleProc processDoubleReplacing; + + char future[56]; ///< reserved for future use (please zero) +#else + char future[60]; ///< reserved for future use (please zero) +#endif +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** AEffect flags */ +//------------------------------------------------------------------------------------------------------- +enum VstAEffectFlags +{ +//------------------------------------------------------------------------------------------------------- + effFlagsHasEditor = 1 << 0, ///< set if the plug-in provides a custom editor + effFlagsCanReplacing = 1 << 4, ///< supports replacing process mode (which should the default mode in VST 2.4) + effFlagsProgramChunks = 1 << 5, ///< program data is handled in formatless chunks + effFlagsIsSynth = 1 << 8, ///< plug-in is a synth (VSTi), Host may assign mixer channels for its outputs + effFlagsNoSoundInStop = 1 << 9, ///< plug-in does not produce sound when input is all silence + +#if VST_2_4_EXTENSIONS + effFlagsCanDoubleReplacing = 1 << 12, ///< plug-in supports double precision processing +#endif + + DECLARE_VST_DEPRECATED (effFlagsHasClip) = 1 << 1, ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effFlagsHasVu) = 1 << 2, ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effFlagsCanMono) = 1 << 3, ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effFlagsExtIsAsync) = 1 << 10, ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effFlagsExtHasBuffer) = 1 << 11 ///< \deprecated deprecated in VST 2.4 +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Basic dispatcher Opcodes (Host to Plug-in) */ +//------------------------------------------------------------------------------------------------------- +enum AEffectOpcodes +{ + effOpen = 0, ///< no arguments @see AudioEffect::open + effClose, ///< no arguments @see AudioEffect::close + + effSetProgram, ///< [value]: new program number @see AudioEffect::setProgram + effGetProgram, ///< [return value]: current program number @see AudioEffect::getProgram + effSetProgramName, ///< [ptr]: char* with new program name, limited to #kVstMaxProgNameLen @see AudioEffect::setProgramName + effGetProgramName, ///< [ptr]: char buffer for current program name, limited to #kVstMaxProgNameLen @see AudioEffect::getProgramName + + effGetParamLabel, ///< [ptr]: char buffer for parameter label, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterLabel + effGetParamDisplay, ///< [ptr]: char buffer for parameter display, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterDisplay + effGetParamName, ///< [ptr]: char buffer for parameter name, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterName + + DECLARE_VST_DEPRECATED (effGetVu), ///< \deprecated deprecated in VST 2.4 + + effSetSampleRate, ///< [opt]: new sample rate for audio processing @see AudioEffect::setSampleRate + effSetBlockSize, ///< [value]: new maximum block size for audio processing @see AudioEffect::setBlockSize + effMainsChanged, ///< [value]: 0 means "turn off", 1 means "turn on" @see AudioEffect::suspend @see AudioEffect::resume + + effEditGetRect, ///< [ptr]: #ERect** receiving pointer to editor size @see ERect @see AEffEditor::getRect + effEditOpen, ///< [ptr]: system dependent Window pointer, e.g. HWND on Windows @see AEffEditor::open + effEditClose, ///< no arguments @see AEffEditor::close + + DECLARE_VST_DEPRECATED (effEditDraw), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effEditMouse), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effEditKey), ///< \deprecated deprecated in VST 2.4 + + effEditIdle, ///< no arguments @see AEffEditor::idle + + DECLARE_VST_DEPRECATED (effEditTop), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effEditSleep), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (effIdentify), ///< \deprecated deprecated in VST 2.4 + + effGetChunk, ///< [ptr]: void** for chunk data address [index]: 0 for bank, 1 for program @see AudioEffect::getChunk + effSetChunk, ///< [ptr]: chunk data [value]: byte size [index]: 0 for bank, 1 for program @see AudioEffect::setChunk + + effNumOpcodes +}; + +//------------------------------------------------------------------------------------------------------- +/** Basic dispatcher Opcodes (Plug-in to Host) */ +//------------------------------------------------------------------------------------------------------- +enum AudioMasterOpcodes +{ +//------------------------------------------------------------------------------------------------------- + audioMasterAutomate = 0, ///< [index]: parameter index [opt]: parameter value @see AudioEffect::setParameterAutomated + audioMasterVersion, ///< [return value]: Host VST version (for example 2400 for VST 2.4) @see AudioEffect::getMasterVersion + audioMasterCurrentId, ///< [return value]: current unique identifier on shell plug-in @see AudioEffect::getCurrentUniqueId + audioMasterIdle, ///< no arguments @see AudioEffect::masterIdle + DECLARE_VST_DEPRECATED (audioMasterPinConnected) ///< \deprecated deprecated in VST 2.4 r2 +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** String length limits (in characters excl. 0 byte) */ +//------------------------------------------------------------------------------------------------------- +enum VstStringConstants +{ +//------------------------------------------------------------------------------------------------------- + kVstMaxProgNameLen = 24, ///< used for #effGetProgramName, #effSetProgramName, #effGetProgramNameIndexed + kVstMaxParamStrLen = 8, ///< used for #effGetParamLabel, #effGetParamDisplay, #effGetParamName + kVstMaxVendorStrLen = 64, ///< used for #effGetVendorString, #audioMasterGetVendorString + kVstMaxProductStrLen = 64, ///< used for #effGetProductString, #audioMasterGetProductString + kVstMaxEffectNameLen = 32 ///< used for #effGetEffectName +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** String copy taking care of null terminator. */ +//------------------------------------------------------------------------------------------------------- +inline char* vst_strncpy (char* dst, const char* src, size_t maxLen) +{ + char* result = strncpy (dst, src, maxLen); + dst[maxLen] = 0; + return result; +} + +//------------------------------------------------------------------------------------------------------- +/** String concatenation taking care of null terminator. */ +//------------------------------------------------------------------------------------------------------- +inline char* vst_strncat (char* dst, const char* src, size_t maxLen) +{ + char* result = strncat (dst, src, maxLen); + dst[maxLen] = 0; + return result; +} + +//------------------------------------------------------------------------------------------------------- +/** Cast #VstIntPtr to pointer. */ +//------------------------------------------------------------------------------------------------------- +template inline T* FromVstPtr (VstIntPtr& arg) +{ + T** address = (T**)&arg; + return *address; +} + +//------------------------------------------------------------------------------------------------------- +/** Cast pointer to #VstIntPtr. */ +//------------------------------------------------------------------------------------------------------- +template inline VstIntPtr ToVstPtr (T* ptr) +{ + VstIntPtr* address = (VstIntPtr*)&ptr; + return *address; +} + +//------------------------------------------------------------------------------------------------------- +/** Structure used for #effEditGetRect. */ +//------------------------------------------------------------------------------------------------------- +struct ERect +{ +//------------------------------------------------------------------------------------------------------- + VstInt16 top; ///< top coordinate + VstInt16 left; ///< left coordinate + VstInt16 bottom; ///< bottom coordinate + VstInt16 right; ///< right coordinate +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +#if TARGET_API_MAC_CARBON + #pragma options align=reset +#elif defined(WIN32) || defined(__FLAT__) || defined(__GNUC__) + #pragma pack(pop) +#elif defined __BORLANDC__ + #pragma -a- +#endif + +#endif // __aeffect__ diff --git a/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffectx.h b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffectx.h new file mode 100644 index 0000000..5b23015 --- /dev/null +++ b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/aeffectx.h @@ -0,0 +1,1143 @@ +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// Version 2.4 $Date: 2006/06/20 12:43:42 $ +// +// Category : VST 2.x Interfaces +// Filename : aeffectx.h +// Created by : Steinberg Media Technologies +// Description : Definition of auxiliary structures, extensions from VST 1.0 to VST 2.4 +// +// © 2006, Steinberg Media Technologies, All Rights Reserved +//------------------------------------------------------------------------------------------------------- + +#ifndef __aeffectx__ +#define __aeffectx__ + +#ifndef __aeffect__ +#include "aeffect.h" +#endif + +//------------------------------------------------------------------------------------------------------- +#if TARGET_API_MAC_CARBON + #ifdef __LP64__ + #pragma options align=power + #else + #pragma options align=mac68k + #endif +#elif defined __BORLANDC__ + #pragma -a8 +#elif defined(__GNUC__) + #pragma pack(push,8) +#elif defined(WIN32) || defined(__FLAT__) + #pragma pack(push) + #pragma pack(8) +#endif +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +/** String length limits (in characters excl. 0 byte). */ +//------------------------------------------------------------------------------------------------------- +enum Vst2StringConstants +{ +//------------------------------------------------------------------------------------------------------- + kVstMaxNameLen = 64, ///< used for #MidiProgramName, #MidiProgramCategory, #MidiKeyName, #VstSpeakerProperties, #VstPinProperties + kVstMaxLabelLen = 64, ///< used for #VstParameterProperties->label, #VstPinProperties->label + kVstMaxShortLabelLen = 8, ///< used for #VstParameterProperties->shortLabel, #VstPinProperties->shortLabel + kVstMaxCategLabelLen = 24, ///< used for #VstParameterProperties->label + kVstMaxFileNameLen = 100 ///< used for #VstAudioFile->name +//------------------------------------------------------------------------------------------------------- +}; +//------------------------------------------------------------------------------------------------------- +// VstEvent +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +/** A generic timestamped event. */ +//------------------------------------------------------------------------------------------------------- +struct VstEvent +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 type; ///< @see VstEventTypes + VstInt32 byteSize; ///< size of this event, excl. type and byteSize + VstInt32 deltaFrames; ///< sample frames related to the current block start sample position + VstInt32 flags; ///< generic flags, none defined yet + + char data[16]; ///< data size may vary, depending on event type +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** VstEvent Types used by #VstEvent. */ +//------------------------------------------------------------------------------------------------------- +enum VstEventTypes +{ +//------------------------------------------------------------------------------------------------------- + kVstMidiType = 1, ///< MIDI event @see VstMidiEvent + DECLARE_VST_DEPRECATED (kVstAudioType), ///< \deprecated unused event type + DECLARE_VST_DEPRECATED (kVstVideoType), ///< \deprecated unused event type + DECLARE_VST_DEPRECATED (kVstParameterType), ///< \deprecated unused event type + DECLARE_VST_DEPRECATED (kVstTriggerType), ///< \deprecated unused event type + kVstSysExType ///< MIDI system exclusive @see VstMidiSysexEvent +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** A block of events for the current processed audio block. */ +//------------------------------------------------------------------------------------------------------- +struct VstEvents +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 numEvents; ///< number of Events in array + VstIntPtr reserved; ///< zero (Reserved for future use) + VstEvent* events[2]; ///< event pointer array, variable size +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** MIDI Event (to be casted from VstEvent). */ +//------------------------------------------------------------------------------------------------------- +struct VstMidiEvent +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 type; ///< #kVstMidiType + VstInt32 byteSize; ///< sizeof (VstMidiEvent) + VstInt32 deltaFrames; ///< sample frames related to the current block start sample position + VstInt32 flags; ///< @see VstMidiEventFlags + VstInt32 noteLength; ///< (in sample frames) of entire note, if available, else 0 + VstInt32 noteOffset; ///< offset (in sample frames) into note from note start if available, else 0 + char midiData[4]; ///< 1 to 3 MIDI bytes; midiData[3] is reserved (zero) + char detune; ///< -64 to +63 cents; for scales other than 'well-tempered' ('microtuning') + char noteOffVelocity; ///< Note Off Velocity [0, 127] + char reserved1; ///< zero (Reserved for future use) + char reserved2; ///< zero (Reserved for future use) +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstMidiEvent. */ +//------------------------------------------------------------------------------------------------------- +enum VstMidiEventFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstMidiEventIsRealtime = 1 << 0 ///< means that this event is played life (not in playback from a sequencer track).\n This allows the Plug-In to handle these flagged events with higher priority, especially when the Plug-In has a big latency (AEffect::initialDelay) +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** MIDI Sysex Event (to be casted from #VstEvent). */ +//------------------------------------------------------------------------------------------------------- +struct VstMidiSysexEvent +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 type; ///< #kVstSysexType + VstInt32 byteSize; ///< sizeof (VstMidiSysexEvent) + VstInt32 deltaFrames; ///< sample frames related to the current block start sample position + VstInt32 flags; ///< none defined yet (should be zero) + VstInt32 dumpBytes; ///< byte size of sysexDump + VstIntPtr resvd1; ///< zero (Reserved for future use) + char* sysexDump; ///< sysex dump + VstIntPtr resvd2; ///< zero (Reserved for future use) +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +// VstTimeInfo +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +/** VstTimeInfo requested via #audioMasterGetTime. @see AudioEffectX::getTimeInfo + +\note VstTimeInfo::samplePos :Current Position. It must always be valid, and should not cost a lot to ask for. The sample position is ahead of the time displayed to the user. In sequencer stop mode, its value does not change. A 32 bit integer is too small for sample positions, and it's a double to make it easier to convert between ppq and samples. +\note VstTimeInfo::ppqPos : At tempo 120, 1 quarter makes 1/2 second, so 2.0 ppq translates to 48000 samples at 48kHz sample rate. +.25 ppq is one sixteenth note then. if you need something like 480ppq, you simply multiply ppq by that scaler. +\note VstTimeInfo::barStartPos : Say we're at bars/beats readout 3.3.3. That's 2 bars + 2 q + 2 sixteenth, makes 2 * 4 + 2 + .25 = 10.25 ppq. at tempo 120, that's 10.25 * .5 = 5.125 seconds, times 48000 = 246000 samples (if my calculator servers me well :-). +\note VstTimeInfo::samplesToNextClock : MIDI Clock Resolution (24 per Quarter Note), can be negative the distance to the next midi clock (24 ppq, pulses per quarter) in samples. unless samplePos falls precicely on a midi clock, this will either be negative such that the previous MIDI clock is addressed, or positive when referencing the following (future) MIDI clock. +*/ +//------------------------------------------------------------------------------------------------------- +struct VstTimeInfo +{ +//------------------------------------------------------------------------------------------------------- + double samplePos; ///< current Position in audio samples (always valid) + double sampleRate; ///< current Sample Rate in Herz (always valid) + double nanoSeconds; ///< System Time in nanoseconds (10^-9 second) + double ppqPos; ///< Musical Position, in Quarter Note (1.0 equals 1 Quarter Note) + double tempo; ///< current Tempo in BPM (Beats Per Minute) + double barStartPos; ///< last Bar Start Position, in Quarter Note + double cycleStartPos; ///< Cycle Start (left locator), in Quarter Note + double cycleEndPos; ///< Cycle End (right locator), in Quarter Note + VstInt32 timeSigNumerator; ///< Time Signature Numerator (e.g. 3 for 3/4) + VstInt32 timeSigDenominator; ///< Time Signature Denominator (e.g. 4 for 3/4) + VstInt32 smpteOffset; ///< SMPTE offset (in SMPTE subframes (bits; 1/80 of a frame)). The current SMPTE position can be calculated using #samplePos, #sampleRate, and #smpteFrameRate. + VstInt32 smpteFrameRate; ///< @see VstSmpteFrameRate + VstInt32 samplesToNextClock; ///< MIDI Clock Resolution (24 Per Quarter Note), can be negative (nearest clock) + VstInt32 flags; ///< @see VstTimeInfoFlags +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstTimeInfo. */ +//------------------------------------------------------------------------------------------------------- +enum VstTimeInfoFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstTransportChanged = 1, ///< indicates that play, cycle or record state has changed + kVstTransportPlaying = 1 << 1, ///< set if Host sequencer is currently playing + kVstTransportCycleActive = 1 << 2, ///< set if Host sequencer is in cycle mode + kVstTransportRecording = 1 << 3, ///< set if Host sequencer is in record mode + kVstAutomationWriting = 1 << 6, ///< set if automation write mode active (record parameter changes) + kVstAutomationReading = 1 << 7, ///< set if automation read mode active (play parameter changes) + kVstNanosValid = 1 << 8, ///< VstTimeInfo::nanoSeconds valid + kVstPpqPosValid = 1 << 9, ///< VstTimeInfo::ppqPos valid + kVstTempoValid = 1 << 10, ///< VstTimeInfo::tempo valid + kVstBarsValid = 1 << 11, ///< VstTimeInfo::barStartPos valid + kVstCyclePosValid = 1 << 12, ///< VstTimeInfo::cycleStartPos and VstTimeInfo::cycleEndPos valid + kVstTimeSigValid = 1 << 13, ///< VstTimeInfo::timeSigNumerator and VstTimeInfo::timeSigDenominator valid + kVstSmpteValid = 1 << 14, ///< VstTimeInfo::smpteOffset and VstTimeInfo::smpteFrameRate valid + kVstClockValid = 1 << 15 ///< VstTimeInfo::samplesToNextClock valid +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** SMPTE Frame Rates. */ +//------------------------------------------------------------------------------------------------------- +enum VstSmpteFrameRate +{ +//------------------------------------------------------------------------------------------------------- + kVstSmpte24fps = 0, ///< 24 fps + kVstSmpte25fps = 1, ///< 25 fps + kVstSmpte2997fps = 2, ///< 29.97 fps + kVstSmpte30fps = 3, ///< 30 fps + kVstSmpte2997dfps = 4, ///< 29.97 drop + kVstSmpte30dfps = 5, ///< 30 drop + + kVstSmpteFilm16mm = 6, ///< Film 16mm + kVstSmpteFilm35mm = 7, ///< Film 35mm + kVstSmpte239fps = 10, ///< HDTV: 23.976 fps + kVstSmpte249fps = 11, ///< HDTV: 24.976 fps + kVstSmpte599fps = 12, ///< HDTV: 59.94 fps + kVstSmpte60fps = 13 ///< HDTV: 60 fps +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Variable IO for Offline Processing. */ +//------------------------------------------------------------------------------------------------------- +struct VstVariableIo +{ +//------------------------------------------------------------------------------------------------------- + float** inputs; ///< input audio buffers + float** outputs; ///< output audio buffers + VstInt32 numSamplesInput; ///< number of incoming samples + VstInt32 numSamplesOutput; ///< number of outgoing samples + VstInt32* numSamplesInputProcessed; ///< number of samples actually processed of input + VstInt32* numSamplesOutputProcessed; ///< number of samples actually processed of output +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Language code returned by audioMasterGetLanguage. */ +//------------------------------------------------------------------------------------------------------- +enum VstHostLanguage +{ +//------------------------------------------------------------------------------------------------------- + kVstLangEnglish = 1, ///< English + kVstLangGerman, ///< German + kVstLangFrench, ///< French + kVstLangItalian, ///< Italian + kVstLangSpanish, ///< Spanish + kVstLangJapanese ///< Japanese +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** VST 2.x dispatcher Opcodes (Plug-in to Host). Extension of #AudioMasterOpcodes */ +//------------------------------------------------------------------------------------------------------- +enum AudioMasterOpcodesX +{ +//------------------------------------------------------------------------------------------------------- + DECLARE_VST_DEPRECATED (audioMasterWantMidi) = DECLARE_VST_DEPRECATED (audioMasterPinConnected) + 2, ///< \deprecated deprecated in VST 2.4 + + audioMasterGetTime, ///< [return value]: #VstTimeInfo* or null if not supported [value]: request mask @see VstTimeInfoFlags @see AudioEffectX::getTimeInfo + audioMasterProcessEvents, ///< [ptr]: pointer to #VstEvents @see VstEvents @see AudioEffectX::sendVstEventsToHost + + DECLARE_VST_DEPRECATED (audioMasterSetTime), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterTempoAt), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterGetNumAutomatableParameters), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterGetParameterQuantization), ///< \deprecated deprecated in VST 2.4 + + audioMasterIOChanged, ///< [return value]: 1 if supported @see AudioEffectX::ioChanged + + DECLARE_VST_DEPRECATED (audioMasterNeedIdle), ///< \deprecated deprecated in VST 2.4 + + audioMasterSizeWindow, ///< [index]: new width [value]: new height [return value]: 1 if supported @see AudioEffectX::sizeWindow + audioMasterGetSampleRate, ///< [return value]: current sample rate @see AudioEffectX::updateSampleRate + audioMasterGetBlockSize, ///< [return value]: current block size @see AudioEffectX::updateBlockSize + audioMasterGetInputLatency, ///< [return value]: input latency in audio samples @see AudioEffectX::getInputLatency + audioMasterGetOutputLatency, ///< [return value]: output latency in audio samples @see AudioEffectX::getOutputLatency + + DECLARE_VST_DEPRECATED (audioMasterGetPreviousPlug), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterGetNextPlug), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterWillReplaceOrAccumulate), ///< \deprecated deprecated in VST 2.4 + + audioMasterGetCurrentProcessLevel, ///< [return value]: current process level @see VstProcessLevels + audioMasterGetAutomationState, ///< [return value]: current automation state @see VstAutomationStates + + audioMasterOfflineStart, ///< [index]: numNewAudioFiles [value]: numAudioFiles [ptr]: #VstAudioFile* @see AudioEffectX::offlineStart + audioMasterOfflineRead, ///< [index]: bool readSource [value]: #VstOfflineOption* @see VstOfflineOption [ptr]: #VstOfflineTask* @see VstOfflineTask @see AudioEffectX::offlineRead + audioMasterOfflineWrite, ///< @see audioMasterOfflineRead @see AudioEffectX::offlineRead + audioMasterOfflineGetCurrentPass, ///< @see AudioEffectX::offlineGetCurrentPass + audioMasterOfflineGetCurrentMetaPass, ///< @see AudioEffectX::offlineGetCurrentMetaPass + + DECLARE_VST_DEPRECATED (audioMasterSetOutputSampleRate), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterGetOutputSpeakerArrangement), ///< \deprecated deprecated in VST 2.4 + + audioMasterGetVendorString, ///< [ptr]: char buffer for vendor string, limited to #kVstMaxVendorStrLen @see AudioEffectX::getHostVendorString + audioMasterGetProductString, ///< [ptr]: char buffer for vendor string, limited to #kVstMaxProductStrLen @see AudioEffectX::getHostProductString + audioMasterGetVendorVersion, ///< [return value]: vendor-specific version @see AudioEffectX::getHostVendorVersion + audioMasterVendorSpecific, ///< no definition, vendor specific handling @see AudioEffectX::hostVendorSpecific + + DECLARE_VST_DEPRECATED (audioMasterSetIcon), ///< \deprecated deprecated in VST 2.4 + + audioMasterCanDo, ///< [ptr]: "can do" string [return value]: 1 for supported + audioMasterGetLanguage, ///< [return value]: language code @see VstHostLanguage + + DECLARE_VST_DEPRECATED (audioMasterOpenWindow), ///< \deprecated deprecated in VST 2.4 + DECLARE_VST_DEPRECATED (audioMasterCloseWindow), ///< \deprecated deprecated in VST 2.4 + + audioMasterGetDirectory, ///< [return value]: FSSpec on MAC, else char* @see AudioEffectX::getDirectory + audioMasterUpdateDisplay, ///< no arguments + audioMasterBeginEdit, ///< [index]: parameter index @see AudioEffectX::beginEdit + audioMasterEndEdit, ///< [index]: parameter index @see AudioEffectX::endEdit + audioMasterOpenFileSelector, ///< [ptr]: VstFileSelect* [return value]: 1 if supported @see AudioEffectX::openFileSelector + audioMasterCloseFileSelector, ///< [ptr]: VstFileSelect* @see AudioEffectX::closeFileSelector + + DECLARE_VST_DEPRECATED (audioMasterEditFile), ///< \deprecated deprecated in VST 2.4 + + DECLARE_VST_DEPRECATED (audioMasterGetChunkFile), ///< \deprecated deprecated in VST 2.4 [ptr]: char[2048] or sizeof (FSSpec) [return value]: 1 if supported @see AudioEffectX::getChunkFile + + DECLARE_VST_DEPRECATED (audioMasterGetInputSpeakerArrangement) ///< \deprecated deprecated in VST 2.4 +}; + +//------------------------------------------------------------------------------------------------------- +/** VST 2.x dispatcher Opcodes (Host to Plug-in). Extension of #AEffectOpcodes */ +//------------------------------------------------------------------------------------------------------- +enum AEffectXOpcodes +{ +//------------------------------------------------------------------------------------------------------- + effProcessEvents = effSetChunk + 1 ///< [ptr]: #VstEvents* @see AudioEffectX::processEvents + + , effCanBeAutomated ///< [index]: parameter index [return value]: 1=true, 0=false @see AudioEffectX::canParameterBeAutomated + , effString2Parameter ///< [index]: parameter index [ptr]: parameter string [return value]: true for success @see AudioEffectX::string2parameter + + , DECLARE_VST_DEPRECATED (effGetNumProgramCategories) ///< \deprecated deprecated in VST 2.4 + + , effGetProgramNameIndexed ///< [index]: program index [ptr]: buffer for program name, limited to #kVstMaxProgNameLen [return value]: true for success @see AudioEffectX::getProgramNameIndexed + + , DECLARE_VST_DEPRECATED (effCopyProgram) ///< \deprecated deprecated in VST 2.4 + , DECLARE_VST_DEPRECATED (effConnectInput) ///< \deprecated deprecated in VST 2.4 + , DECLARE_VST_DEPRECATED (effConnectOutput) ///< \deprecated deprecated in VST 2.4 + + , effGetInputProperties ///< [index]: input index [ptr]: #VstPinProperties* [return value]: 1 if supported @see AudioEffectX::getInputProperties + , effGetOutputProperties ///< [index]: output index [ptr]: #VstPinProperties* [return value]: 1 if supported @see AudioEffectX::getOutputProperties + , effGetPlugCategory ///< [return value]: category @see VstPlugCategory @see AudioEffectX::getPlugCategory + + , DECLARE_VST_DEPRECATED (effGetCurrentPosition) ///< \deprecated deprecated in VST 2.4 + , DECLARE_VST_DEPRECATED (effGetDestinationBuffer) ///< \deprecated deprecated in VST 2.4 + + , effOfflineNotify ///< [ptr]: #VstAudioFile array [value]: count [index]: start flag @see AudioEffectX::offlineNotify + , effOfflinePrepare ///< [ptr]: #VstOfflineTask array [value]: count @see AudioEffectX::offlinePrepare + , effOfflineRun ///< [ptr]: #VstOfflineTask array [value]: count @see AudioEffectX::offlineRun + + , effProcessVarIo ///< [ptr]: #VstVariableIo* @see AudioEffectX::processVariableIo + , effSetSpeakerArrangement ///< [value]: input #VstSpeakerArrangement* [ptr]: output #VstSpeakerArrangement* @see AudioEffectX::setSpeakerArrangement + + , DECLARE_VST_DEPRECATED (effSetBlockSizeAndSampleRate) ///< \deprecated deprecated in VST 2.4 + + , effSetBypass ///< [value]: 1 = bypass, 0 = no bypass @see AudioEffectX::setBypass + , effGetEffectName ///< [ptr]: buffer for effect name, limited to #kVstMaxEffectNameLen @see AudioEffectX::getEffectName + + , DECLARE_VST_DEPRECATED (effGetErrorText) ///< \deprecated deprecated in VST 2.4 + + , effGetVendorString ///< [ptr]: buffer for effect vendor string, limited to #kVstMaxVendorStrLen @see AudioEffectX::getVendorString + , effGetProductString ///< [ptr]: buffer for effect vendor string, limited to #kVstMaxProductStrLen @see AudioEffectX::getProductString + , effGetVendorVersion ///< [return value]: vendor-specific version @see AudioEffectX::getVendorVersion + , effVendorSpecific ///< no definition, vendor specific handling @see AudioEffectX::vendorSpecific + , effCanDo ///< [ptr]: "can do" string [return value]: 0: "don't know" -1: "no" 1: "yes" @see AudioEffectX::canDo + , effGetTailSize ///< [return value]: tail size (for example the reverb time of a reverb plug-in); 0 is default (return 1 for 'no tail') + + , DECLARE_VST_DEPRECATED (effIdle) ///< \deprecated deprecated in VST 2.4 + , DECLARE_VST_DEPRECATED (effGetIcon) ///< \deprecated deprecated in VST 2.4 + , DECLARE_VST_DEPRECATED (effSetViewPosition) ///< \deprecated deprecated in VST 2.4 + + , effGetParameterProperties ///< [index]: parameter index [ptr]: #VstParameterProperties* [return value]: 1 if supported @see AudioEffectX::getParameterProperties + + , DECLARE_VST_DEPRECATED (effKeysRequired) ///< \deprecated deprecated in VST 2.4 + + , effGetVstVersion ///< [return value]: VST version @see AudioEffectX::getVstVersion + +#if VST_2_1_EXTENSIONS + , effEditKeyDown ///< [index]: ASCII character [value]: virtual key [opt]: modifiers [return value]: 1 if key used @see AEffEditor::onKeyDown + , effEditKeyUp ///< [index]: ASCII character [value]: virtual key [opt]: modifiers [return value]: 1 if key used @see AEffEditor::onKeyUp + , effSetEditKnobMode ///< [value]: knob mode 0: circular, 1: circular relativ, 2: linear (CKnobMode in VSTGUI) @see AEffEditor::setKnobMode + + , effGetMidiProgramName ///< [index]: MIDI channel [ptr]: #MidiProgramName* [return value]: number of used programs, 0 if unsupported @see AudioEffectX::getMidiProgramName + , effGetCurrentMidiProgram ///< [index]: MIDI channel [ptr]: #MidiProgramName* [return value]: index of current program @see AudioEffectX::getCurrentMidiProgram + , effGetMidiProgramCategory ///< [index]: MIDI channel [ptr]: #MidiProgramCategory* [return value]: number of used categories, 0 if unsupported @see AudioEffectX::getMidiProgramCategory + , effHasMidiProgramsChanged ///< [index]: MIDI channel [return value]: 1 if the #MidiProgramName(s) or #MidiKeyName(s) have changed @see AudioEffectX::hasMidiProgramsChanged + , effGetMidiKeyName ///< [index]: MIDI channel [ptr]: #MidiKeyName* [return value]: true if supported, false otherwise @see AudioEffectX::getMidiKeyName + + , effBeginSetProgram ///< no arguments @see AudioEffectX::beginSetProgram + , effEndSetProgram ///< no arguments @see AudioEffectX::endSetProgram +#endif // VST_2_1_EXTENSIONS + +#if VST_2_3_EXTENSIONS + , effGetSpeakerArrangement ///< [value]: input #VstSpeakerArrangement* [ptr]: output #VstSpeakerArrangement* @see AudioEffectX::getSpeakerArrangement + , effShellGetNextPlugin ///< [ptr]: buffer for plug-in name, limited to #kVstMaxProductStrLen [return value]: next plugin's uniqueID @see AudioEffectX::getNextShellPlugin + + , effStartProcess ///< no arguments @see AudioEffectX::startProcess + , effStopProcess ///< no arguments @see AudioEffectX::stopProcess + , effSetTotalSampleToProcess ///< [value]: number of samples to process, offline only! @see AudioEffectX::setTotalSampleToProcess + , effSetPanLaw ///< [value]: pan law [opt]: gain @see VstPanLawType @see AudioEffectX::setPanLaw + + , effBeginLoadBank ///< [ptr]: #VstPatchChunkInfo* [return value]: -1: bank can't be loaded, 1: bank can be loaded, 0: unsupported @see AudioEffectX::beginLoadBank + , effBeginLoadProgram ///< [ptr]: #VstPatchChunkInfo* [return value]: -1: prog can't be loaded, 1: prog can be loaded, 0: unsupported @see AudioEffectX::beginLoadProgram +#endif // VST_2_3_EXTENSIONS + +#if VST_2_4_EXTENSIONS + , effSetProcessPrecision ///< [value]: @see VstProcessPrecision @see AudioEffectX::setProcessPrecision + , effGetNumMidiInputChannels ///< [return value]: number of used MIDI input channels (1-15) @see AudioEffectX::getNumMidiInputChannels + , effGetNumMidiOutputChannels ///< [return value]: number of used MIDI output channels (1-15) @see AudioEffectX::getNumMidiOutputChannels +#endif // VST_2_4_EXTENSIONS +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Symbolic precision constants used for effSetProcessPrecision. */ +//------------------------------------------------------------------------------------------------------- +enum VstProcessPrecision +{ + kVstProcessPrecision32 = 0, ///< single precision float (32bits) + kVstProcessPrecision64 ///< double precision (64bits) +}; + +//------------------------------------------------------------------------------------------------------- +/** Parameter Properties used in #effGetParameterProperties. */ +//------------------------------------------------------------------------------------------------------- +struct VstParameterProperties +{ +//------------------------------------------------------------------------------------------------------- + float stepFloat; ///< float step + float smallStepFloat; ///< small float step + float largeStepFloat; ///< large float step + char label[kVstMaxLabelLen];///< parameter label + VstInt32 flags; ///< @see VstParameterFlags + VstInt32 minInteger; ///< integer minimum + VstInt32 maxInteger; ///< integer maximum + VstInt32 stepInteger; ///< integer step + VstInt32 largeStepInteger; ///< large integer step + char shortLabel[kVstMaxShortLabelLen]; ///< short label, recommended: 6 + delimiter + + // The following are for remote controller display purposes. + // Note that the kVstParameterSupportsDisplayIndex flag must be set. + // Host can scan all parameters, and find out in what order + // to display them: + + VstInt16 displayIndex; ///< index where this parameter should be displayed (starting with 0) + + // Host can also possibly display the parameter group (category), such as... + // --------------------------- + // Osc 1 + // Wave Detune Octave Mod + // --------------------------- + // ...if the plug-in supports it (flag #kVstParameterSupportsDisplayCategory) + + VstInt16 category; ///< 0: no category, else group index + 1 + VstInt16 numParametersInCategory; ///< number of parameters in category + VstInt16 reserved; ///< zero + char categoryLabel[kVstMaxCategLabelLen]; ///< category label, e.g. "Osc 1" + + char future[16]; ///< reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstParameterProperties. */ +//------------------------------------------------------------------------------------------------------- +enum VstParameterFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstParameterIsSwitch = 1 << 0, ///< parameter is a switch (on/off) + kVstParameterUsesIntegerMinMax = 1 << 1, ///< minInteger, maxInteger valid + kVstParameterUsesFloatStep = 1 << 2, ///< stepFloat, smallStepFloat, largeStepFloat valid + kVstParameterUsesIntStep = 1 << 3, ///< stepInteger, largeStepInteger valid + kVstParameterSupportsDisplayIndex = 1 << 4, ///< displayIndex valid + kVstParameterSupportsDisplayCategory = 1 << 5, ///< category, etc. valid + kVstParameterCanRamp = 1 << 6 ///< set if parameter value can ramp up/down +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Pin Properties used in #effGetInputProperties and #effGetOutputProperties. */ +//------------------------------------------------------------------------------------------------------- +struct VstPinProperties +{ +//------------------------------------------------------------------------------------------------------- + char label[kVstMaxLabelLen]; ///< pin name + VstInt32 flags; ///< @see VstPinPropertiesFlags + VstInt32 arrangementType; ///< @see VstSpeakerArrangementType + char shortLabel[kVstMaxShortLabelLen]; ///< short name (recommended: 6 + delimiter) + + char future[48]; ///< reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstPinProperties. */ +//------------------------------------------------------------------------------------------------------- +enum VstPinPropertiesFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstPinIsActive = 1 << 0, ///< pin is active, ignored by Host + kVstPinIsStereo = 1 << 1, ///< pin is first of a stereo pair + kVstPinUseSpeaker = 1 << 2 ///< #VstPinProperties::arrangementType is valid and can be used to get the wanted arrangement +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Plug-in Categories. */ +//------------------------------------------------------------------------------------------------------- +enum VstPlugCategory +{ +//------------------------------------------------------------------------------------------------------- + kPlugCategUnknown = 0, ///< Unknown, category not implemented + kPlugCategEffect, ///< Simple Effect + kPlugCategSynth, ///< VST Instrument (Synths, samplers,...) + kPlugCategAnalysis, ///< Scope, Tuner, ... + kPlugCategMastering, ///< Dynamics, ... + kPlugCategSpacializer, ///< Panners, ... + kPlugCategRoomFx, ///< Delays and Reverbs + kPlugSurroundFx, ///< Dedicated surround processor + kPlugCategRestoration, ///< Denoiser, ... + kPlugCategOfflineProcess, ///< Offline Process + kPlugCategShell, ///< Plug-in is container of other plug-ins @see effShellGetNextPlugin + kPlugCategGenerator, ///< ToneGenerator, ... + + kPlugCategMaxCount ///< Marker to count the categories +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +// MIDI Programs +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +/** MIDI Program Description. */ +//------------------------------------------------------------------------------------------------------- +struct MidiProgramName +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 thisProgramIndex; ///< 0 or greater: fill struct for this program index + char name[kVstMaxNameLen]; ///< program name + char midiProgram; ///< -1:off, 0-127 + char midiBankMsb; ///< -1:off, 0-127 + char midiBankLsb; ///< -1:off, 0-127 + char reserved; ///< zero + VstInt32 parentCategoryIndex; ///< -1:no parent category + VstInt32 flags; ///< omni etc. @see VstMidiProgramNameFlags +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in MidiProgramName. */ +//------------------------------------------------------------------------------------------------------- +enum VstMidiProgramNameFlags +{ +//------------------------------------------------------------------------------------------------------- + kMidiIsOmni = 1 ///< default is multi. for omni mode, channel 0 is used for inquiries and program changes +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** MIDI Program Category. */ +//------------------------------------------------------------------------------------------------------- +struct MidiProgramCategory +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 thisCategoryIndex; ///< 0 or greater: fill struct for this category index. + char name[kVstMaxNameLen]; ///< name + VstInt32 parentCategoryIndex; ///< -1:no parent category + VstInt32 flags; ///< reserved, none defined yet, zero. +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** MIDI Key Description. */ +//------------------------------------------------------------------------------------------------------- +struct MidiKeyName +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 thisProgramIndex; ///< 0 or greater: fill struct for this program index. + VstInt32 thisKeyNumber; ///< 0 - 127. fill struct for this key number. + char keyName[kVstMaxNameLen]; ///< key name, empty means regular key names + VstInt32 reserved; ///< zero + VstInt32 flags; ///< reserved, none defined yet, zero. +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +// Surround Setup +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +/** Speaker Properties. + The origin for azimuth is right (as by math conventions dealing with radians). + The elevation origin is also right, visualizing a rotation of a circle across the + -pi/pi axis of the horizontal circle. Thus, an elevation of -pi/2 corresponds + to bottom, and a speaker standing on the left, and 'beaming' upwards would have + an azimuth of -pi, and an elevation of pi/2. + For user interface representation, grads are more likely to be used, and the + origins will obviously 'shift' accordingly. */ +//------------------------------------------------------------------------------------------------------- +struct VstSpeakerProperties +{ +//------------------------------------------------------------------------------------------------------- + float azimuth; ///< unit: rad, range: -PI...PI, exception: 10.f for LFE channel + float elevation; ///< unit: rad, range: -PI/2...PI/2, exception: 10.f for LFE channel + float radius; ///< unit: meter, exception: 0.f for LFE channel + float reserved; ///< zero (reserved for future use) + char name[kVstMaxNameLen]; ///< for new setups, new names should be given (L/R/C... won't do) + VstInt32 type; ///< @see VstSpeakerType + + char future[28]; ///< reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Speaker Arrangement. */ +//------------------------------------------------------------------------------------------------------- +struct VstSpeakerArrangement +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 type; ///< e.g. #kSpeakerArr51 for 5.1 @see VstSpeakerArrangementType + VstInt32 numChannels; ///< number of channels in this speaker arrangement + VstSpeakerProperties speakers[8]; ///< variable sized speaker array +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Speaker Types. */ +//------------------------------------------------------------------------------------------------------- +enum VstSpeakerType +{ +//------------------------------------------------------------------------------------------------------- + kSpeakerUndefined = 0x7fffffff, ///< Undefined + kSpeakerM = 0, ///< Mono (M) + kSpeakerL, ///< Left (L) + kSpeakerR, ///< Right (R) + kSpeakerC, ///< Center (C) + kSpeakerLfe, ///< Subbass (Lfe) + kSpeakerLs, ///< Left Surround (Ls) + kSpeakerRs, ///< Right Surround (Rs) + kSpeakerLc, ///< Left of Center (Lc) + kSpeakerRc, ///< Right of Center (Rc) + kSpeakerS, ///< Surround (S) + kSpeakerCs = kSpeakerS, ///< Center of Surround (Cs) = Surround (S) + kSpeakerSl, ///< Side Left (Sl) + kSpeakerSr, ///< Side Right (Sr) + kSpeakerTm, ///< Top Middle (Tm) + kSpeakerTfl, ///< Top Front Left (Tfl) + kSpeakerTfc, ///< Top Front Center (Tfc) + kSpeakerTfr, ///< Top Front Right (Tfr) + kSpeakerTrl, ///< Top Rear Left (Trl) + kSpeakerTrc, ///< Top Rear Center (Trc) + kSpeakerTrr, ///< Top Rear Right (Trr) + kSpeakerLfe2 ///< Subbass 2 (Lfe2) +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** User-defined speaker types, to be extended in the negative range. + Will be handled as their corresponding speaker types with abs values: + e.g abs(#kSpeakerU1) == #kSpeakerL, abs(#kSpeakerU2) == #kSpeakerR) */ +//------------------------------------------------------------------------------------------------------- +enum VstUserSpeakerType +{ +//------------------------------------------------------------------------------------------------------- + kSpeakerU32 = -32, + kSpeakerU31, + kSpeakerU30, + kSpeakerU29, + kSpeakerU28, + kSpeakerU27, + kSpeakerU26, + kSpeakerU25, + kSpeakerU24, + kSpeakerU23, + kSpeakerU22, + kSpeakerU21, + kSpeakerU20, ///< == #kSpeakerLfe2 + kSpeakerU19, ///< == #kSpeakerTrr + kSpeakerU18, ///< == #kSpeakerTrc + kSpeakerU17, ///< == #kSpeakerTrl + kSpeakerU16, ///< == #kSpeakerTfr + kSpeakerU15, ///< == #kSpeakerTfc + kSpeakerU14, ///< == #kSpeakerTfl + kSpeakerU13, ///< == #kSpeakerTm + kSpeakerU12, ///< == #kSpeakerSr + kSpeakerU11, ///< == #kSpeakerSl + kSpeakerU10, ///< == #kSpeakerCs + kSpeakerU9, ///< == #kSpeakerS + kSpeakerU8, ///< == #kSpeakerRc + kSpeakerU7, ///< == #kSpeakerLc + kSpeakerU6, ///< == #kSpeakerRs + kSpeakerU5, ///< == #kSpeakerLs + kSpeakerU4, ///< == #kSpeakerLfe + kSpeakerU3, ///< == #kSpeakerC + kSpeakerU2, ///< == #kSpeakerR + kSpeakerU1 ///< == #kSpeakerL +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Speaker Arrangement Types*/ +//------------------------------------------------------------------------------------------------------- +enum VstSpeakerArrangementType +{ +//------------------------------------------------------------------------------------------------------- + kSpeakerArrUserDefined = -2,///< user defined + kSpeakerArrEmpty = -1, ///< empty arrangement + kSpeakerArrMono = 0, ///< M + kSpeakerArrStereo, ///< L R + kSpeakerArrStereoSurround, ///< Ls Rs + kSpeakerArrStereoCenter, ///< Lc Rc + kSpeakerArrStereoSide, ///< Sl Sr + kSpeakerArrStereoCLfe, ///< C Lfe + kSpeakerArr30Cine, ///< L R C + kSpeakerArr30Music, ///< L R S + kSpeakerArr31Cine, ///< L R C Lfe + kSpeakerArr31Music, ///< L R Lfe S + kSpeakerArr40Cine, ///< L R C S (LCRS) + kSpeakerArr40Music, ///< L R Ls Rs (Quadro) + kSpeakerArr41Cine, ///< L R C Lfe S (LCRS+Lfe) + kSpeakerArr41Music, ///< L R Lfe Ls Rs (Quadro+Lfe) + kSpeakerArr50, ///< L R C Ls Rs + kSpeakerArr51, ///< L R C Lfe Ls Rs + kSpeakerArr60Cine, ///< L R C Ls Rs Cs + kSpeakerArr60Music, ///< L R Ls Rs Sl Sr + kSpeakerArr61Cine, ///< L R C Lfe Ls Rs Cs + kSpeakerArr61Music, ///< L R Lfe Ls Rs Sl Sr + kSpeakerArr70Cine, ///< L R C Ls Rs Lc Rc + kSpeakerArr70Music, ///< L R C Ls Rs Sl Sr + kSpeakerArr71Cine, ///< L R C Lfe Ls Rs Lc Rc + kSpeakerArr71Music, ///< L R C Lfe Ls Rs Sl Sr + kSpeakerArr80Cine, ///< L R C Ls Rs Lc Rc Cs + kSpeakerArr80Music, ///< L R C Ls Rs Cs Sl Sr + kSpeakerArr81Cine, ///< L R C Lfe Ls Rs Lc Rc Cs + kSpeakerArr81Music, ///< L R C Lfe Ls Rs Cs Sl Sr + kSpeakerArr102, ///< L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Lfe2 + kNumSpeakerArr +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +// Offline Processing +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +/** Offline Task Description. */ +//------------------------------------------------------------------------------------------------------- +struct VstOfflineTask +{ +//------------------------------------------------------------------------------------------------------- + char processName[96]; ///< set by plug-in + + // audio access + double readPosition; ///< set by plug-in/Host + double writePosition; ///< set by plug-in/Host + VstInt32 readCount; ///< set by plug-in/Host + VstInt32 writeCount; ///< set by plug-in + VstInt32 sizeInputBuffer; ///< set by Host + VstInt32 sizeOutputBuffer; ///< set by Host + void* inputBuffer; ///< set by Host + void* outputBuffer; ///< set by Host + double positionToProcessFrom; ///< set by Host + double numFramesToProcess; ///< set by Host + double maxFramesToWrite; ///< set by plug-in + + // other data access + void* extraBuffer; ///< set by plug-in + VstInt32 value; ///< set by Host or plug-in + VstInt32 index; ///< set by Host or plug-in + + // file attributes + double numFramesInSourceFile; ///< set by Host + double sourceSampleRate; ///< set by Host or plug-in + double destinationSampleRate; ///< set by Host or plug-in + VstInt32 numSourceChannels; ///< set by Host or plug-in + VstInt32 numDestinationChannels;///< set by Host or plug-in + VstInt32 sourceFormat; ///< set by Host + VstInt32 destinationFormat; ///< set by plug-in + char outputText[512]; ///< set by plug-in or Host + + // progress notification + double progress; ///< set by plug-in + VstInt32 progressMode; ///< Reserved for future use + char progressText[100]; ///< set by plug-in + + VstInt32 flags; ///< set by Host and plug-in; see enum #VstOfflineTaskFlags + VstInt32 returnValue; ///< Reserved for future use + void* hostOwned; ///< set by Host + void* plugOwned; ///< set by plug-in + + char future[1024]; ///< Reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstOfflineTask. */ +//------------------------------------------------------------------------------------------------------- +enum VstOfflineTaskFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstOfflineUnvalidParameter = 1 << 0, ///< set by Host + kVstOfflineNewFile = 1 << 1, ///< set by Host + + kVstOfflinePlugError = 1 << 10, ///< set by plug-in + kVstOfflineInterleavedAudio = 1 << 11, ///< set by plug-in + kVstOfflineTempOutputFile = 1 << 12, ///< set by plug-in + kVstOfflineFloatOutputFile = 1 << 13, ///< set by plug-in + kVstOfflineRandomWrite = 1 << 14, ///< set by plug-in + kVstOfflineStretch = 1 << 15, ///< set by plug-in + kVstOfflineNoThread = 1 << 16 ///< set by plug-in +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Option passed to #offlineRead/#offlineWrite. */ +//------------------------------------------------------------------------------------------------------- +enum VstOfflineOption +{ +//------------------------------------------------------------------------------------------------------- + kVstOfflineAudio, ///< reading/writing audio samples + kVstOfflinePeaks, ///< reading graphic representation + kVstOfflineParameter, ///< reading/writing parameters + kVstOfflineMarker, ///< reading/writing marker + kVstOfflineCursor, ///< reading/moving edit cursor + kVstOfflineSelection, ///< reading/changing selection + kVstOfflineQueryFiles ///< to request the Host to call asynchronously #offlineNotify +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Structure passed to #offlineNotify and #offlineStart */ +//------------------------------------------------------------------------------------------------------- +struct VstAudioFile +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 flags; ///< see enum #VstAudioFileFlags + void* hostOwned; ///< any data private to Host + void* plugOwned; ///< any data private to plug-in + char name[kVstMaxFileNameLen]; ///< file title + VstInt32 uniqueId; ///< uniquely identify a file during a session + double sampleRate; ///< file sample rate + VstInt32 numChannels; ///< number of channels (1 for mono, 2 for stereo...) + double numFrames; ///< number of frames in the audio file + VstInt32 format; ///< Reserved for future use + double editCursorPosition; ///< -1 if no such cursor + double selectionStart; ///< frame index of first selected frame, or -1 + double selectionSize; ///< number of frames in selection, or 0 + VstInt32 selectedChannelsMask; ///< 1 bit per channel + VstInt32 numMarkers; ///< number of markers in the file + VstInt32 timeRulerUnit; ///< see doc for possible values + double timeRulerOffset; ///< offset in time ruler (positive or negative) + double tempo; ///< as BPM (Beats Per Minute) + VstInt32 timeSigNumerator; ///< time signature numerator + VstInt32 timeSigDenominator; ///< time signature denominator + VstInt32 ticksPerBlackNote; ///< resolution + VstInt32 smpteFrameRate; ///< SMPTE rate (set as in #VstTimeInfo) + + char future[64]; ///< Reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Flags used in #VstAudioFile. */ +//------------------------------------------------------------------------------------------------------- +enum VstAudioFileFlags +{ +//------------------------------------------------------------------------------------------------------- + kVstOfflineReadOnly = 1 << 0, ///< set by Host (in call #offlineNotify) + kVstOfflineNoRateConversion = 1 << 1, ///< set by Host (in call #offlineNotify) + kVstOfflineNoChannelChange = 1 << 2, ///< set by Host (in call #offlineNotify) + + kVstOfflineCanProcessSelection = 1 << 10, ///< set by plug-in (in call #offlineStart) + kVstOfflineNoCrossfade = 1 << 11, ///< set by plug-in (in call #offlineStart) + kVstOfflineWantRead = 1 << 12, ///< set by plug-in (in call #offlineStart) + kVstOfflineWantWrite = 1 << 13, ///< set by plug-in (in call #offlineStart) + kVstOfflineWantWriteMarker = 1 << 14, ///< set by plug-in (in call #offlineStart) + kVstOfflineWantMoveCursor = 1 << 15, ///< set by plug-in (in call #offlineStart) + kVstOfflineWantSelect = 1 << 16 ///< set by plug-in (in call #offlineStart) +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Audio file marker. */ +//------------------------------------------------------------------------------------------------------- +struct VstAudioFileMarker +{ +//------------------------------------------------------------------------------------------------------- + double position; ///< marker position + char name[32]; ///< marker name + VstInt32 type; ///< marker type + VstInt32 id; ///< marker identifier + VstInt32 reserved; ///< reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +// Others +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +/** \deprecated Structure used for #openWindow and #closeWindow (deprecated in VST 2.4). */ +//------------------------------------------------------------------------------------------------------- +struct DECLARE_VST_DEPRECATED (VstWindow) +{ +//------------------------------------------------------------------------------------------------------- + char title[128]; + VstInt16 xPos; + VstInt16 yPos; + VstInt16 width; + VstInt16 height; + VstInt32 style; + void* parent; + void* userHandle; + void* winHandle; + + char future[104]; +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Structure used for keyUp/keyDown. */ +//------------------------------------------------------------------------------------------------------- +struct VstKeyCode +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 character; ///< ASCII character + unsigned char virt; ///< @see VstVirtualKey + unsigned char modifier; ///< @see VstModifierKey +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Platform-independent definition of Virtual Keys (used in #VstKeyCode). */ +//------------------------------------------------------------------------------------------------------- +enum VstVirtualKey +{ +//------------------------------------------------------------------------------------------------------- + VKEY_BACK = 1, + VKEY_TAB, + VKEY_CLEAR, + VKEY_RETURN, + VKEY_PAUSE, + VKEY_ESCAPE, + VKEY_SPACE, + VKEY_NEXT, + VKEY_END, + VKEY_HOME, + VKEY_LEFT, + VKEY_UP, + VKEY_RIGHT, + VKEY_DOWN, + VKEY_PAGEUP, + VKEY_PAGEDOWN, + VKEY_SELECT, + VKEY_PRINT, + VKEY_ENTER, + VKEY_SNAPSHOT, + VKEY_INSERT, + VKEY_DELETE, + VKEY_HELP, + VKEY_NUMPAD0, + VKEY_NUMPAD1, + VKEY_NUMPAD2, + VKEY_NUMPAD3, + VKEY_NUMPAD4, + VKEY_NUMPAD5, + VKEY_NUMPAD6, + VKEY_NUMPAD7, + VKEY_NUMPAD8, + VKEY_NUMPAD9, + VKEY_MULTIPLY, + VKEY_ADD, + VKEY_SEPARATOR, + VKEY_SUBTRACT, + VKEY_DECIMAL, + VKEY_DIVIDE, + VKEY_F1, + VKEY_F2, + VKEY_F3, + VKEY_F4, + VKEY_F5, + VKEY_F6, + VKEY_F7, + VKEY_F8, + VKEY_F9, + VKEY_F10, + VKEY_F11, + VKEY_F12, + VKEY_NUMLOCK, + VKEY_SCROLL, + VKEY_SHIFT, + VKEY_CONTROL, + VKEY_ALT, + VKEY_EQUALS +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Modifier flags used in #VstKeyCode. */ +//------------------------------------------------------------------------------------------------------- +enum VstModifierKey +{ +//------------------------------------------------------------------------------------------------------- + MODIFIER_SHIFT = 1<<0, ///< Shift + MODIFIER_ALTERNATE = 1<<1, ///< Alt + MODIFIER_COMMAND = 1<<2, ///< Control on Mac + MODIFIER_CONTROL = 1<<3 ///< Ctrl on PC, Apple on Mac +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** File filter used in #VstFileSelect. */ +//------------------------------------------------------------------------------------------------------- +struct VstFileType +{ +//------------------------------------------------------------------------------------------------------- + char name[128]; ///< display name + char macType[8]; ///< MacOS type + char dosType[8]; ///< Windows file extension + char unixType[8]; ///< Unix file extension + char mimeType1[128]; ///< MIME type + char mimeType2[128]; ///< additional MIME type + + VstFileType (const char* _name = 0, const char* _macType = 0, const char* _dosType = 0, + const char* _unixType = 0, const char* _mimeType1 = 0, const char* _mimeType2 = 0) + { + vst_strncpy (name, _name ? _name : "", 127); + vst_strncpy (macType, _macType ? _macType : "", 7); + vst_strncpy (dosType, _dosType ? _dosType : "", 7); + vst_strncpy (unixType, _unixType ? _unixType : "", 7); + vst_strncpy (mimeType1, _mimeType1 ? _mimeType1 : "", 127); + vst_strncpy (mimeType2, _mimeType2 ? _mimeType2 : "", 127); + } +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** File Selector Description used in #audioMasterOpenFileSelector. */ +//------------------------------------------------------------------------------------------------------- +struct VstFileSelect +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 command; ///< @see VstFileSelectCommand + VstInt32 type; ///< @see VstFileSelectType + VstInt32 macCreator; ///< optional: 0 = no creator + VstInt32 nbFileTypes; ///< number of fileTypes + VstFileType* fileTypes; ///< list of fileTypes @see VstFileType + char title[1024]; ///< text to display in file selector's title + char* initialPath; ///< initial path + char* returnPath; ///< use with #kVstFileLoad and #kVstDirectorySelect. null: Host allocates memory, plug-in must call #closeOpenFileSelector! + VstInt32 sizeReturnPath; ///< size of allocated memory for return paths + char** returnMultiplePaths; ///< use with kVstMultipleFilesLoad. Host allocates memory, plug-in must call #closeOpenFileSelector! + VstInt32 nbReturnPath; ///< number of selected paths + VstIntPtr reserved; ///< reserved for Host application + + char future[116]; ///< reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Command constants used in #VstFileSelect structure. */ +//------------------------------------------------------------------------------------------------------- +enum VstFileSelectCommand +{ +//------------------------------------------------------------------------------------------------------- + kVstFileLoad = 0, ///< for loading a file + kVstFileSave, ///< for saving a file + kVstMultipleFilesLoad, ///< for loading multiple files + kVstDirectorySelect ///< for selecting a directory/folder +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Types used in #VstFileSelect structure. */ +//------------------------------------------------------------------------------------------------------- +enum VstFileSelectType +{ +//------------------------------------------------------------------------------------------------------- + kVstFileType = 0 ///< regular file selector +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Structure used for #effBeginLoadBank/#effBeginLoadProgram. */ +//------------------------------------------------------------------------------------------------------- +struct VstPatchChunkInfo +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 version; ///< Format Version (should be 1) + VstInt32 pluginUniqueID; ///< UniqueID of the plug-in + VstInt32 pluginVersion; ///< Plug-in Version + VstInt32 numElements; ///< Number of Programs (Bank) or Parameters (Program) + + char future[48]; ///< Reserved for future use +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** PanLaw Type. */ +//------------------------------------------------------------------------------------------------------- +enum VstPanLawType +{ +//------------------------------------------------------------------------------------------------------- + kLinearPanLaw = 0, ///< L = pan * M; R = (1 - pan) * M; + kEqualPowerPanLaw ///< L = pow (pan, 0.5) * M; R = pow ((1 - pan), 0.5) * M; +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Process Levels returned by #audioMasterGetCurrentProcessLevel. */ +//------------------------------------------------------------------------------------------------------- +enum VstProcessLevels +{ +//------------------------------------------------------------------------------------------------------- + kVstProcessLevelUnknown = 0, ///< not supported by Host + kVstProcessLevelUser, ///< 1: currently in user thread (GUI) + kVstProcessLevelRealtime, ///< 2: currently in audio thread (where process is called) + kVstProcessLevelPrefetch, ///< 3: currently in 'sequencer' thread (MIDI, timer etc) + kVstProcessLevelOffline ///< 4: currently offline processing and thus in user thread +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Automation States returned by #audioMasterGetAutomationState. */ +//------------------------------------------------------------------------------------------------------- +enum VstAutomationStates +{ +//------------------------------------------------------------------------------------------------------- + kVstAutomationUnsupported = 0, ///< not supported by Host + kVstAutomationOff, ///< off + kVstAutomationRead, ///< read + kVstAutomationWrite, ///< write + kVstAutomationReadWrite ///< read and write +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +#if TARGET_API_MAC_CARBON + #pragma options align=reset +#elif defined(WIN32) || defined(__FLAT__) || defined(__GNUC__) + #pragma pack(pop) +#elif defined __BORLANDC__ + #pragma -a- +#endif +//------------------------------------------------------------------------------------------------------- + +#endif //__aeffectx__ diff --git a/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/vstfxstore.h b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/vstfxstore.h new file mode 100644 index 0000000..c66b86d --- /dev/null +++ b/src/backend/src/vst2_host/src/pluginterfaces/vst2.x/vstfxstore.h @@ -0,0 +1,106 @@ +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// Version 2.4 $Date: 2006/02/09 11:05:51 $ +// +// Category : VST 2.x Interfaces +// Filename : vstfxstore.h +// Created by : Steinberg Media Technologies +// Description : Definition of Program (fxp) and Bank (fxb) structures +// +// © 2006, Steinberg Media Technologies, All Rights Reserved +//------------------------------------------------------------------------------------------------------- + +#ifndef __vstfxstore__ +#define __vstfxstore__ + +#ifndef __aeffect__ +#include "aeffect.h" +#endif + +//------------------------------------------------------------------------------------------------------- +/** Root chunk identifier for Programs (fxp) and Banks (fxb). */ +#define cMagic 'CcnK' + +/** Regular Program (fxp) identifier. */ +#define fMagic 'FxCk' + +/** Regular Bank (fxb) identifier. */ +#define bankMagic 'FxBk' + +/** Program (fxp) identifier for opaque chunk data. */ +#define chunkPresetMagic 'FPCh' + +/** Bank (fxb) identifier for opaque chunk data. */ +#define chunkBankMagic 'FBCh' + +/* + Note: The C data structures below are for illustration only. You can not read/write them directly. + The byte order on disk of fxp and fxb files is Big Endian. You have to swap integer + and floating-point values on Little Endian platforms (Windows, MacIntel)! +*/ + +//------------------------------------------------------------------------------------------------------- +/** Program (fxp) structure. */ +//------------------------------------------------------------------------------------------------------- +struct fxProgram +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 chunkMagic; ///< 'CcnK' + VstInt32 byteSize; ///< size of this chunk, excl. magic + byteSize + + VstInt32 fxMagic; ///< 'FxCk' (regular) or 'FPCh' (opaque chunk) + VstInt32 version; ///< format version (currently 1) + VstInt32 fxID; ///< fx unique ID + VstInt32 fxVersion; ///< fx version + + VstInt32 numParams; ///< number of parameters + char prgName[28]; ///< program name (null-terminated ASCII string) + + union + { + float params[1]; ///< variable sized array with parameter values + struct + { + VstInt32 size; ///< size of program data + char chunk[1]; ///< variable sized array with opaque program data + } data; ///< program chunk data + } content; ///< program content depending on fxMagic +//------------------------------------------------------------------------------------------------------- +}; + +//------------------------------------------------------------------------------------------------------- +/** Bank (fxb) structure. */ +//------------------------------------------------------------------------------------------------------- +struct fxBank +{ +//------------------------------------------------------------------------------------------------------- + VstInt32 chunkMagic; ///< 'CcnK' + VstInt32 byteSize; ///< size of this chunk, excl. magic + byteSize + + VstInt32 fxMagic; ///< 'FxBk' (regular) or 'FBCh' (opaque chunk) + VstInt32 version; ///< format version (1 or 2) + VstInt32 fxID; ///< fx unique ID + VstInt32 fxVersion; ///< fx version + + VstInt32 numPrograms; ///< number of programs + +#if VST_2_4_EXTENSIONS + VstInt32 currentProgram; ///< version 2: current program number + char future[124]; ///< reserved, should be zero +#else + char future[128]; ///< reserved, should be zero +#endif + + union + { + fxProgram programs[1]; ///< variable number of programs + struct + { + VstInt32 size; ///< size of bank data + char chunk[1]; ///< variable sized array with opaque bank data + } data; ///< bank chunk data + } content; ///< bank content depending on fxMagic +//------------------------------------------------------------------------------------------------------- +}; + +#endif // __vstfxstore__ diff --git a/src/backend/src/vst2_host/src/vst2host.cpp b/src/backend/src/vst2_host/src/vst2host.cpp new file mode 100644 index 0000000..a3c048f --- /dev/null +++ b/src/backend/src/vst2_host/src/vst2host.cpp @@ -0,0 +1,149 @@ +#include "vst2host.h" + +using vst_plugin_entry = AEffect* (*)(audioMasterCallback); + +/* ===== Host-Callback 分发 ===== */ +inline VstIntPtr VSTCALLBACK host_callback(AEffect* effect, + VstInt32 opcode, + VstInt32 index, + VstIntPtr value, + void* ptr, + float opt) { + switch (opcode) { + /* -------- 基础能力 -------- */ + case audioMasterVersion: + return kVstVersion; + + /* -------- 参数自动化 -------- */ + case audioMasterAutomate: + /* index = paramId, opt = value (float 转型于 hostCallback 调用方) */ + /* 此处可转发至宿主自动化系统,示例仅打印 */ + // printf("Param %d automated to %f\n", index, *reinterpret_cast(&value)); + return 1; + + /* -------- 时基信息 -------- */ + case audioMasterGetTime: + if (ptr) { + static VstTimeInfo ti{}; + ti.sampleRate = current_sample_rate; + ti.samplePos = 0; // demo: 由宿主时钟更新 + ti.flags = kVstPpqPosValid | kVstTempoValid; + ti.tempo = current_bpm; + *reinterpret_cast(ptr) = &ti; + return kVstTempoValid | kVstPpqPosValid; + } + return 0; + + /* -------- Buffer/Latency -------- */ + case audioMasterGetSampleRate: + return static_cast(current_sample_rate); + case audioMasterGetBlockSize: + return current_block_size; + case audioMasterGetInputLatency: + case audioMasterGetOutputLatency: + return 0; + + /* -------- 显示刷新 -------- */ + case audioMasterUpdateDisplay: + return 1; + + /* -------- 其他默认 -------- */ + default: + return 0; + } +} + +void load_plugin(const std::filesystem::path& in_lib_path, float in_sample_rate, int in_block_size) { + lib_ = library_handle::create(in_lib_path); + auto main_entry = lib_->get_func("VSTPluginMain"); + if (!main_entry) { + throw std::runtime_error("未找到 VSTPluginMain : " + in_lib_path.string()); + } + effect_ = main_entry(host_callback); + if (!is_valid()) { + throw std::runtime_error("插件返回的 AEffect 无效: " + in_lib_path.string()); + } + current_sample_rate = in_sample_rate; + current_block_size = in_block_size; + + open_plugin(); + set_sample_rate(in_sample_rate); + set_block_size(in_block_size); + resume_plugin(); +} + +void unload_plugin() { + if (!effect_) + return; + suspend_plugin(); + close_plugin(); + delete lib_; + lib_ = nullptr; +} + +void process(std::span in_buffers, std::span out_buffers, int32_t in_frames) { + if (effect_->processReplacing) + effect_->processReplacing(effect_, in_buffers.data(), out_buffers.data(), in_frames); +} + +void process(std::span in_buffers, std::span out_buffers, int32_t in_frames) { + if (effect_->processDoubleReplacing) + effect_->processDoubleReplacing(effect_, in_buffers.data(), out_buffers.data(), in_frames); +} + +void open_editor() { + if (window_handle) + return; + // 获取插件编辑器大小 + const auto& rect = get_editor_rect(); + const auto width = rect.right - rect.left; + const auto height = rect.bottom - rect.top; + // 获取插件名称 + const auto& name = get_name(); + // 创建 GLFW 窗口 + window_handle = glfwCreateWindow(width, height, name.c_str(), nullptr, nullptr); + if (!window_handle) + throw std::runtime_error("无法为 VST 编辑器创建 GLFW 窗口"); + glfwSetWindowCloseCallback(window_handle, [](GLFWwindow* win) { + // 窗口关闭时,关闭编辑器 + close_editor(); + }); + // 如果有最后位置,设置窗口位置 + if (editor_pos) { + glfwSetWindowPos(window_handle, editor_pos->x, editor_pos->y); + } + // 否则居中显示 + else { + if (const auto monitor = glfwGetPrimaryMonitor()) { + if (const auto mode = glfwGetVideoMode(monitor)) { + const int x = (mode->width - width) / 2; + const int y = (mode->height - height) / 2; + glfwSetWindowPos(window_handle, x, y); + } + } + } + // 设置不可以调整窗口大小 + glfwSetWindowAttrib(window_handle, GLFW_RESIZABLE, GLFW_FALSE); + + // 获取窗口句柄 + auto editor_handle = get_glfw_window_handle(window_handle); + if (!editor_handle) + throw std::runtime_error("无法获取 VST 编辑器窗口句柄"); + + dispatch(effEditOpen, 0, 0, editor_handle, 0); +} + +void close_editor() { + if (!window_handle) + return; + // 保存编辑器位置 + { + i_vec2 temp; + glfwGetWindowPos(window_handle, &temp.x, &temp.y); + editor_pos = temp; + } + + dispatch(effEditClose, 0, 0); + glfwDestroyWindow(window_handle); + window_handle = nullptr; +} diff --git a/src/backend/src/vst2_host/src/vst2host.h b/src/backend/src/vst2_host/src/vst2host.h new file mode 100644 index 0000000..c8f17c4 --- /dev/null +++ b/src/backend/src/vst2_host/src/vst2host.h @@ -0,0 +1,135 @@ +#pragma once +#include "pluginterfaces/vst2.x/aeffectx.h" // Steinberg 官方头 +#include + +#include "library_handle.h" +#include + +#include "size_type.h" + + +inline library_handle* lib_ = nullptr; +inline AEffect* effect_ = nullptr; +inline float current_sample_rate; +inline int32_t current_block_size; +inline double current_bpm = 120.0; // 默认 120 BPM +inline GLFWwindow* window_handle = nullptr; +inline std::optional editor_pos{}; // 编辑器最后位置 + +void load_plugin(const std::filesystem::path& in_lib_path, float in_sample_rate, int in_block_size); +void unload_plugin(); + +/* -------- 调度分发 -------- */ +inline VstIntPtr dispatch(VstInt32 opcode, VstInt32 index = 0, VstIntPtr value = 0, void* ptr = nullptr, float opt = 0.0f) { + return effect_->dispatcher(effect_, opcode, index, value, ptr, opt); +} + +/* -------- 音频处理 -------- */ +void process(std::span in_buffers, std::span out_buffers, int32_t nFrames); +void process(std::span in_buffers, std::span out_buffers, int32_t nFrames); + +/* -------- MIDI / 事件 -------- */ +inline bool send_events(VstEvents* ev) { return dispatch(effProcessEvents, 0, 0, ev) != 0; } + +/* -------- 帮助函数 -------- */ +inline int get_num_inputs() noexcept { return effect_->numInputs; } +inline int get_num_outputs() noexcept { return effect_->numOutputs; } +inline int get_num_params() noexcept { return effect_->numParams; } +inline bool can_double() noexcept { return effect_->flags & effFlagsCanDoubleReplacing; } +inline bool is_synth() noexcept { return effect_->flags & effFlagsIsSynth; } +inline int get_unique_id() noexcept { return effect_->uniqueID; } +inline float get_parameter(int idx) { return effect_->getParameter(effect_, idx); } +inline void set_parameter(int idx, float v) { effect_->setParameter(effect_, idx, v); } +inline bool is_valid() noexcept { return effect_ && effect_->magic == kEffectMagic; } +inline void set_sample_rate(float in_sample_rate) { + current_sample_rate = in_sample_rate; + dispatch(effSetSampleRate, 0, 0, nullptr, in_sample_rate); +} +inline void set_block_size(int in_block_size) { + current_block_size = in_block_size; + dispatch(effSetBlockSize, 0, in_block_size); +} +inline std::string get_name() { + char name[kVstMaxEffectNameLen]; + dispatch(effGetEffectName, 0, 0, name); + return name; +} +inline std::string get_vendor() { + char vendor[kVstMaxVendorStrLen]; + dispatch(effGetVendorString, 0, 0, vendor); + return vendor; +} +inline std::string get_product() { + char product[kVstMaxProductStrLen]; + dispatch(effGetProductString, 0, 0, product); + return product; +} +inline std::string get_program_name() { + char name[kVstMaxProgNameLen]; + dispatch(effGetProgramName, 0, 0, name); + return name; +} +inline void set_program_name(const std::string& name) { + char buf[kVstMaxProgNameLen]; + vst_strncpy(buf, name.c_str(), kVstMaxProgNameLen); + dispatch(effSetProgramName, 0, 0, buf); +} +inline void set_program(int idx) { + if (idx < 0 || idx >= effect_->numPrograms) + return; + dispatch(effSetProgram, idx); +} +inline int32_t get_program() { + return static_cast(dispatch(effGetProgram, 0, 0)); +} +inline std::string get_param_label(int idx) { + char label[kVstMaxParamStrLen]; + dispatch(effGetParamLabel, idx, 0, label); + return label; +} +inline std::string get_param_display(int idx) { + char display[kVstMaxParamStrLen]; + dispatch(effGetParamDisplay, idx, 0, display); + return display; +} +inline std::string get_param_name(int idx) { + char name[kVstMaxParamStrLen]; + dispatch(effGetParamName, idx, 0, name); + return name; +} +inline void open_plugin() { dispatch(effOpen); } +inline void close_plugin() { dispatch(effClose); } +inline void suspend_plugin() { dispatch(effMainsChanged, 0, 0); } +inline void resume_plugin() { dispatch(effMainsChanged, 0, 1); } +inline bool is_editor_open() { + return effect_->flags & effFlagsHasEditor && window_handle != nullptr; +} +void open_editor(); +void close_editor(); +void* get_glfw_window_handle(GLFWwindow* in_glfw_window); + +inline ERect get_editor_rect() { + ERect* rect = nullptr; + dispatch(effEditGetRect, 0, 0, &rect); + return *rect; +} + +inline void idle_editor() { + if (effect_->flags & effFlagsHasEditor) { + dispatch(effEditIdle); + } +} +inline std::vector get_chunk(int index) { + std::vector chunk; + const auto size = dispatch(effGetChunk, index, 0, nullptr); + if (size > 0) { + chunk.resize(size); + dispatch(effGetChunk, index, size, chunk.data()); + } + return chunk; +} +inline void set_chunk(const std::span& chunk, int index) { + if (chunk.empty()) + return; + dispatch(effSetChunk, index, chunk.size(), chunk.data()); +} diff --git a/src/backend/src/vst2_host/src/windows/editor.cpp b/src/backend/src/vst2_host/src/windows/editor.cpp new file mode 100644 index 0000000..a862ed4 --- /dev/null +++ b/src/backend/src/vst2_host/src/windows/editor.cpp @@ -0,0 +1,11 @@ +#include +#include +#include + +void* get_glfw_window_handle(GLFWwindow* in_glfw_window) { + if (!in_glfw_window) { + return nullptr; + } + // 获取 GLFW 窗口的原生句柄 + return glfwGetWin32Window(in_glfw_window); +} diff --git a/src/backend/src/vst2_host/test/4Front Piano x64.dll b/src/backend/src/vst2_host/test/4Front Piano x64.dll new file mode 100644 index 0000000..8c91e2e Binary files /dev/null and b/src/backend/src/vst2_host/test/4Front Piano x64.dll differ diff --git a/src/backend/vcpkg.json b/src/backend/vcpkg.json index deb3dcf..3274be3 100644 --- a/src/backend/vcpkg.json +++ b/src/backend/vcpkg.json @@ -3,6 +3,7 @@ "grpc", "protobuf", "cppzmq", + "glfw3", "gtest" ], "version": "0.0.1",