@@ -1,266 +0,0 @@ | |||||
// !$*UTF8*$! | |||||
{ | |||||
archiveVersion = 1; | |||||
classes = { | |||||
}; | |||||
objectVersion = 46; | |||||
objects = { | |||||
/* Begin PBXBuildFile section */ | |||||
BD2A1F5751BB6465EFEB5889 /* plugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD2A144C3B32EFA5180A38F5 /* plugin.cpp */; }; | |||||
/* End PBXBuildFile section */ | |||||
/* Begin PBXFileReference section */ | |||||
BD2A1226DD4B6ED23F230900 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.info; path = Info.plist; sourceTree = "<group>"; }; | |||||
BD2A144C3B32EFA5180A38F5 /* plugin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = plugin.cpp; sourceTree = "<group>"; }; | |||||
BD2A17C571405D51496892C4 /* M3dB.___VARIABLE_bundleExtension___ */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "M3dB.___VARIABLE_bundleExtension___"; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
BD2A18D6CA1C93179E40396A /* aeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aeffect.h; path = ../vst2.x/aeffect.h; sourceTree = "<group>"; }; | |||||
BD2A1CFE51F03D1B40DA1230 /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aeffectx.h; path = ../vst2.x/aeffectx.h; sourceTree = "<group>"; }; | |||||
/* End PBXFileReference section */ | |||||
/* Begin PBXFrameworksBuildPhase section */ | |||||
BD2A17410135F1BFA2BB6503 /* Frameworks */ = { | |||||
isa = PBXFrameworksBuildPhase; | |||||
buildActionMask = 2147483647; | |||||
files = ( | |||||
); | |||||
runOnlyForDeploymentPostprocessing = 0; | |||||
}; | |||||
/* End PBXFrameworksBuildPhase section */ | |||||
/* Begin PBXGroup section */ | |||||
BD2A15554318E7C2EF2CD5DC /* Products */ = { | |||||
isa = PBXGroup; | |||||
children = ( | |||||
BD2A17C571405D51496892C4 /* M3dB.___VARIABLE_bundleExtension___ */, | |||||
); | |||||
name = Products; | |||||
sourceTree = "<group>"; | |||||
}; | |||||
BD2A1DCFA27E77A6603B70A2 = { | |||||
isa = PBXGroup; | |||||
children = ( | |||||
BD2A15554318E7C2EF2CD5DC /* Products */, | |||||
BD2A1F10D41E35E7FCDFA898 /* M3dB */, | |||||
BD2A144C3B32EFA5180A38F5 /* plugin.cpp */, | |||||
BD2A18D6CA1C93179E40396A /* aeffect.h */, | |||||
BD2A1CFE51F03D1B40DA1230 /* aeffectx.h */, | |||||
); | |||||
sourceTree = "<group>"; | |||||
}; | |||||
BD2A1F10D41E35E7FCDFA898 /* M3dB */ = { | |||||
isa = PBXGroup; | |||||
children = ( | |||||
BD2A1226DD4B6ED23F230900 /* Info.plist */, | |||||
); | |||||
path = M3dB; | |||||
sourceTree = "<group>"; | |||||
}; | |||||
/* End PBXGroup section */ | |||||
/* Begin PBXNativeTarget section */ | |||||
BD2A186B82B2C6E8A0E9022C /* M3dB */ = { | |||||
isa = PBXNativeTarget; | |||||
buildConfigurationList = BD2A12A4CFEA12B6C7A8873E /* Build configuration list for PBXNativeTarget "M3dB" */; | |||||
buildPhases = ( | |||||
BD2A15C927C3AD450E2DD52C /* Sources */, | |||||
BD2A17410135F1BFA2BB6503 /* Frameworks */, | |||||
BD2A175E365F9ED8C1C35C6F /* Resources */, | |||||
); | |||||
buildRules = ( | |||||
); | |||||
dependencies = ( | |||||
); | |||||
name = M3dB; | |||||
productName = M3dB; | |||||
productReference = BD2A17C571405D51496892C4 /* M3dB.___VARIABLE_bundleExtension___ */; | |||||
productType = "com.apple.product-type.bundle"; | |||||
}; | |||||
/* End PBXNativeTarget section */ | |||||
/* Begin PBXProject section */ | |||||
BD2A116B4EC711555868B9BA /* Project object */ = { | |||||
isa = PBXProject; | |||||
attributes = { | |||||
ORGANIZATIONNAME = pongasoft; | |||||
}; | |||||
buildConfigurationList = BD2A1B7627DAA8FF541E84EC /* Build configuration list for PBXProject "M3dB" */; | |||||
compatibilityVersion = "Xcode 3.2"; | |||||
developmentRegion = English; | |||||
hasScannedForEncodings = 0; | |||||
knownRegions = ( | |||||
en, | |||||
); | |||||
mainGroup = BD2A1DCFA27E77A6603B70A2; | |||||
productRefGroup = BD2A15554318E7C2EF2CD5DC /* Products */; | |||||
projectDirPath = ""; | |||||
projectRoot = ""; | |||||
targets = ( | |||||
BD2A186B82B2C6E8A0E9022C /* M3dB */, | |||||
); | |||||
}; | |||||
/* End PBXProject section */ | |||||
/* Begin PBXResourcesBuildPhase section */ | |||||
BD2A175E365F9ED8C1C35C6F /* Resources */ = { | |||||
isa = PBXResourcesBuildPhase; | |||||
buildActionMask = 2147483647; | |||||
files = ( | |||||
); | |||||
runOnlyForDeploymentPostprocessing = 0; | |||||
}; | |||||
/* End PBXResourcesBuildPhase section */ | |||||
/* Begin PBXSourcesBuildPhase section */ | |||||
BD2A15C927C3AD450E2DD52C /* Sources */ = { | |||||
isa = PBXSourcesBuildPhase; | |||||
buildActionMask = 2147483647; | |||||
files = ( | |||||
BD2A1F5751BB6465EFEB5889 /* plugin.cpp in Sources */, | |||||
); | |||||
runOnlyForDeploymentPostprocessing = 0; | |||||
}; | |||||
/* End PBXSourcesBuildPhase section */ | |||||
/* Begin XCBuildConfiguration section */ | |||||
BD2A1223BF2A633FEE5D6099 /* Debug */ = { | |||||
isa = XCBuildConfiguration; | |||||
buildSettings = { | |||||
COMBINE_HIDPI_IMAGES = YES; | |||||
INFOPLIST_FILE = M3dB/Info.plist; | |||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; | |||||
PRODUCT_BUNDLE_IDENTIFIER = org.pongasoft.vst24.M3dB; | |||||
PRODUCT_NAME = "$(TARGET_NAME)"; | |||||
SKIP_INSTALL = YES; | |||||
WRAPPER_EXTENSION = vst; | |||||
}; | |||||
name = Debug; | |||||
}; | |||||
BD2A17437E006499CC8685D1 /* Debug */ = { | |||||
isa = XCBuildConfiguration; | |||||
buildSettings = { | |||||
ALWAYS_SEARCH_USER_PATHS = NO; | |||||
CLANG_ANALYZER_NONNULL = YES; | |||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |||||
CLANG_CXX_LIBRARY = "libc++"; | |||||
CLANG_ENABLE_MODULES = YES; | |||||
CLANG_ENABLE_OBJC_ARC = YES; | |||||
CLANG_WARN_BOOL_CONVERSION = YES; | |||||
CLANG_WARN_CONSTANT_CONVERSION = YES; | |||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | |||||
CLANG_WARN_EMPTY_BODY = YES; | |||||
CLANG_WARN_ENUM_CONVERSION = YES; | |||||
CLANG_WARN_INFINITE_RECURSION = YES; | |||||
CLANG_WARN_INT_CONVERSION = YES; | |||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |||||
CLANG_WARN_SUSPICIOUS_MOVES = YES; | |||||
CLANG_WARN_UNREACHABLE_CODE = YES; | |||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |||||
CODE_SIGN_IDENTITY = "-"; | |||||
COPY_PHASE_STRIP = NO; | |||||
DEBUG_INFORMATION_FORMAT = dwarf; | |||||
ENABLE_STRICT_OBJC_MSGSEND = YES; | |||||
ENABLE_TESTABILITY = YES; | |||||
GCC_C_LANGUAGE_STANDARD = gnu99; | |||||
GCC_DYNAMIC_NO_PIC = NO; | |||||
GCC_NO_COMMON_BLOCKS = YES; | |||||
GCC_OPTIMIZATION_LEVEL = 0; | |||||
GCC_PREPROCESSOR_DEFINITIONS = ( | |||||
"DEBUG=1", | |||||
"$(inherited)", | |||||
); | |||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |||||
GCC_WARN_UNDECLARED_SELECTOR = YES; | |||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |||||
GCC_WARN_UNUSED_FUNCTION = YES; | |||||
GCC_WARN_UNUSED_VARIABLE = YES; | |||||
MACOSX_DEPLOYMENT_TARGET = 10.11; | |||||
MTL_ENABLE_DEBUG_INFO = YES; | |||||
ONLY_ACTIVE_ARCH = YES; | |||||
SDKROOT = macosx; | |||||
}; | |||||
name = Debug; | |||||
}; | |||||
BD2A186609800B3BD0ECFF98 /* Release */ = { | |||||
isa = XCBuildConfiguration; | |||||
buildSettings = { | |||||
COMBINE_HIDPI_IMAGES = YES; | |||||
DEPLOYMENT_POSTPROCESSING = YES; | |||||
INFOPLIST_FILE = M3dB/Info.plist; | |||||
INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/VST"; | |||||
PRODUCT_BUNDLE_IDENTIFIER = org.pongasoft.vst24.M3dB; | |||||
PRODUCT_NAME = "$(TARGET_NAME)"; | |||||
SKIP_INSTALL = NO; | |||||
WRAPPER_EXTENSION = vst; | |||||
}; | |||||
name = Release; | |||||
}; | |||||
BD2A1D1EC28D17DC43ACBA09 /* Release */ = { | |||||
isa = XCBuildConfiguration; | |||||
buildSettings = { | |||||
ALWAYS_SEARCH_USER_PATHS = NO; | |||||
CLANG_ANALYZER_NONNULL = YES; | |||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |||||
CLANG_CXX_LIBRARY = "libc++"; | |||||
CLANG_ENABLE_MODULES = YES; | |||||
CLANG_ENABLE_OBJC_ARC = YES; | |||||
CLANG_WARN_BOOL_CONVERSION = YES; | |||||
CLANG_WARN_CONSTANT_CONVERSION = YES; | |||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | |||||
CLANG_WARN_EMPTY_BODY = YES; | |||||
CLANG_WARN_ENUM_CONVERSION = YES; | |||||
CLANG_WARN_INFINITE_RECURSION = YES; | |||||
CLANG_WARN_INT_CONVERSION = YES; | |||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |||||
CLANG_WARN_SUSPICIOUS_MOVES = YES; | |||||
CLANG_WARN_UNREACHABLE_CODE = YES; | |||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |||||
CODE_SIGN_IDENTITY = "-"; | |||||
COPY_PHASE_STRIP = NO; | |||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |||||
DEPLOYMENT_LOCATION = NO; | |||||
DEPLOYMENT_POSTPROCESSING = NO; | |||||
ENABLE_NS_ASSERTIONS = NO; | |||||
ENABLE_STRICT_OBJC_MSGSEND = YES; | |||||
GCC_C_LANGUAGE_STANDARD = gnu99; | |||||
GCC_NO_COMMON_BLOCKS = YES; | |||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |||||
GCC_WARN_UNDECLARED_SELECTOR = YES; | |||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |||||
GCC_WARN_UNUSED_FUNCTION = YES; | |||||
GCC_WARN_UNUSED_VARIABLE = YES; | |||||
INSTALL_PATH = ""; | |||||
MACOSX_DEPLOYMENT_TARGET = 10.11; | |||||
MTL_ENABLE_DEBUG_INFO = NO; | |||||
SDKROOT = macosx; | |||||
}; | |||||
name = Release; | |||||
}; | |||||
/* End XCBuildConfiguration section */ | |||||
/* Begin XCConfigurationList section */ | |||||
BD2A12A4CFEA12B6C7A8873E /* Build configuration list for PBXNativeTarget "M3dB" */ = { | |||||
isa = XCConfigurationList; | |||||
buildConfigurations = ( | |||||
BD2A1223BF2A633FEE5D6099 /* Debug */, | |||||
BD2A186609800B3BD0ECFF98 /* Release */, | |||||
); | |||||
defaultConfigurationIsVisible = 0; | |||||
}; | |||||
BD2A1B7627DAA8FF541E84EC /* Build configuration list for PBXProject "M3dB" */ = { | |||||
isa = XCConfigurationList; | |||||
buildConfigurations = ( | |||||
BD2A17437E006499CC8685D1 /* Debug */, | |||||
BD2A1D1EC28D17DC43ACBA09 /* Release */, | |||||
); | |||||
defaultConfigurationIsVisible = 0; | |||||
defaultConfigurationName = Release; | |||||
}; | |||||
/* End XCConfigurationList section */ | |||||
}; | |||||
rootObject = BD2A116B4EC711555868B9BA /* Project object */; | |||||
} |
@@ -1,7 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<Workspace | |||||
version = "1.0"> | |||||
<FileRef | |||||
location = "self:"> | |||||
</FileRef> | |||||
</Workspace> |
@@ -1,5 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict /> | |||||
</plist> |
@@ -1,22 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<Scheme | |||||
version = "1.3"> | |||||
<BuildAction> | |||||
<BuildActionEntries> | |||||
<BuildActionEntry | |||||
buildForRunning = "YES"> | |||||
<BuildableReference | |||||
BuildableIdentifier = "primary" | |||||
BlueprintIdentifier = "BD2A186B82B2C6E8A0E9022C" | |||||
BuildableName = "M3dB.vst" | |||||
BlueprintName = "M3dB" | |||||
ReferencedContainer = "container:M3dB.xcodeproj"> | |||||
</BuildableReference> | |||||
</BuildActionEntry> | |||||
</BuildActionEntries> | |||||
</BuildAction> | |||||
<LaunchAction | |||||
useCustomWorkingDirectory = "NO" | |||||
buildConfiguration = "Debug"> | |||||
</LaunchAction> | |||||
</Scheme> |
@@ -1,22 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<Scheme | |||||
version = "1.3"> | |||||
<BuildAction> | |||||
<BuildActionEntries> | |||||
<BuildActionEntry | |||||
buildForRunning = "YES"> | |||||
<BuildableReference | |||||
BuildableIdentifier = "primary" | |||||
BlueprintIdentifier = "BD2A186B82B2C6E8A0E9022C" | |||||
BuildableName = "M3dB.vst" | |||||
BlueprintName = "M3dB" | |||||
ReferencedContainer = "container:M3dB.xcodeproj"> | |||||
</BuildableReference> | |||||
</BuildActionEntry> | |||||
</BuildActionEntries> | |||||
</BuildAction> | |||||
<LaunchAction | |||||
useCustomWorkingDirectory = "NO" | |||||
buildConfiguration = "Release"> | |||||
</LaunchAction> | |||||
</Scheme> |
@@ -1,19 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>SchemeUserState</key> | |||||
<dict> | |||||
<key>M3dB - Debug.xcscheme</key> | |||||
<dict> | |||||
<key>orderHint</key> | |||||
<integer>0</integer> | |||||
</dict> | |||||
<key>M3dB - Release.xcscheme</key> | |||||
<dict> | |||||
<key>orderHint</key> | |||||
<integer>1</integer> | |||||
</dict> | |||||
</dict> | |||||
</dict> | |||||
</plist> |
@@ -1,26 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>CFBundleDevelopmentRegion</key> | |||||
<string>en</string> | |||||
<key>CFBundleExecutable</key> | |||||
<string>$(EXECUTABLE_NAME)</string> | |||||
<key>CFBundleIdentifier</key> | |||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||||
<key>CFBundleInfoDictionaryVersion</key> | |||||
<string>6.0</string> | |||||
<key>CFBundleName</key> | |||||
<string>$(PRODUCT_NAME)</string> | |||||
<key>CFBundlePackageType</key> | |||||
<string>BNDL</string> | |||||
<key>CFBundleShortVersionString</key> | |||||
<string>1.0</string> | |||||
<key>CFBundleVersion</key> | |||||
<string>1</string> | |||||
<key>NSHumanReadableCopyright</key> | |||||
<string>Copyright © 2017 pongasoft. All rights reserved.</string> | |||||
<key>NSPrincipalClass</key> | |||||
<string></string> | |||||
</dict> | |||||
</plist> |
@@ -1,615 +0,0 @@ | |||||
#include <aeffect.h> | |||||
#include <aeffectx.h> | |||||
#include <stdio.h> | |||||
#if defined(_WIN32) || defined(_WIN64) | |||||
#include <windows.h> | |||||
#include <wingdi.h> | |||||
#define VST_EXPORT extern "C" __declspec(dllexport) | |||||
#else | |||||
#define VST_EXPORT extern | |||||
#endif | |||||
#include <GL/GL.h> | |||||
#define EDITWIN_X 20 | |||||
#define EDITWIN_Y 20 | |||||
#define EDITWIN_W 640 | |||||
#define EDITWIN_H 480 | |||||
#define EDITWIN_CLASS_NAME "VeeSeeVSTWindow" | |||||
#define EDITWIN_HIDDEN_CLASS_NAME "hidden_VeeSeeVSTWindow" | |||||
/* | |||||
* I find the naming a bit confusing so I decided to use more meaningful names instead. | |||||
*/ | |||||
/** | |||||
* The VSTHostCallback is a function pointer so that the plugin can communicate with the host (not used in this small example) | |||||
*/ | |||||
typedef audioMasterCallback VSTHostCallback; | |||||
/** | |||||
* The VSTPlugin structure (AEffect) contains information about the plugin (like version, number of inputs, ...) and | |||||
* callbacks so that the host can call the plugin to do its work. The primary callback will be `processReplacing` for | |||||
* single precision (float) sample processing (or `processDoubleReplacing` for double precision (double)). | |||||
*/ | |||||
typedef AEffect VSTPlugin; | |||||
// Since the host is expecting a very specific API we need to make sure it has C linkage (not C++) | |||||
extern "C" { | |||||
/* | |||||
* This is the main entry point to the VST plugin. | |||||
* | |||||
* The host (DAW like Maschine, Ableton Live, Reason, ...) will look for this function with this exact API. | |||||
* | |||||
* It is the equivalent to `int main(int argc, char *argv[])` for a C executable. | |||||
* | |||||
* @param vstHostCallback is a callback so that the plugin can communicate with the host (not used in this small example) | |||||
* @return a pointer to the AEffect structure | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback); | |||||
// note this looks like this without the type aliases (and is obviously 100% equivalent) | |||||
// extern AEffect *VSTPluginMain(audioMasterCallback audioMaster); | |||||
} | |||||
/* | |||||
* Constant for the version of the plugin. For example 1100 for version 1.1.0.0 | |||||
*/ | |||||
const VstInt32 PLUGIN_VERSION = 1000; | |||||
extern "C" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); | |||||
/** | |||||
* Encapsulates the plugin as a C++ class. It will keep both the host callback and the structure required by the | |||||
* host (VSTPlugin). This class will be stored in the `VSTPlugin.object` field (circular reference) so that it can | |||||
* be accessed when the host calls the plugin back (for example in `processDoubleReplacing`). | |||||
*/ | |||||
class VSTPluginWrapper | |||||
{ | |||||
public: | |||||
ERect editor_rect; | |||||
HWND parent_hwnd; // created by host | |||||
struct { | |||||
HWND hwnd; | |||||
HDC hdc; | |||||
} hidden; | |||||
struct { | |||||
HWND hwnd; | |||||
HDC hdc; | |||||
} editor; | |||||
HGLRC hglrc; | |||||
float clear_color = 0.0f; | |||||
static const char *registered_class_name; | |||||
static VSTPluginWrapper *window_to_wrapper; | |||||
public: | |||||
VSTPluginWrapper(VSTHostCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs); | |||||
~VSTPluginWrapper(); | |||||
inline VSTPlugin *getVSTPlugin() | |||||
{ | |||||
return &_vstPlugin; | |||||
} | |||||
inline VstInt32 getNumInputs() const | |||||
{ | |||||
return _vstPlugin.numInputs; | |||||
} | |||||
inline VstInt32 getNumOutputs() const | |||||
{ | |||||
return _vstPlugin.numOutputs; | |||||
} | |||||
void createHiddenWindow(void) { | |||||
WNDCLASS wc; | |||||
::ZeroMemory(&wc, sizeof(wc)); | |||||
wc.style = CS_OWNDC; | |||||
wc.lpfnWndProc = (WNDPROC) WndProc; | |||||
wc.hInstance = ::GetModuleHandle(NULL); | |||||
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); | |||||
wc.lpszClassName = EDITWIN_HIDDEN_CLASS_NAME; | |||||
if(!::RegisterClass(&wc)) | |||||
{ | |||||
// something went terribly wrong | |||||
printf("[---] vstgltest: failed to register hidden window class\n"); | |||||
return; | |||||
} | |||||
DWORD dwExStyle = 0; | |||||
DWORD dwStyle = 0; | |||||
hidden.hwnd = ::CreateWindowEx(dwExStyle, | |||||
EDITWIN_HIDDEN_CLASS_NAME, | |||||
"Test", | |||||
dwStyle, | |||||
0/*xpos*/, 0/*ypos*/, | |||||
EDITWIN_W, EDITWIN_H, | |||||
NULL/*parentHWND*/, | |||||
NULL, // window menu | |||||
::GetModuleHandle(NULL), | |||||
NULL | |||||
); | |||||
PIXELFORMATDESCRIPTOR pfd = { | |||||
sizeof(PIXELFORMATDESCRIPTOR), | |||||
1, | |||||
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags | |||||
PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette. | |||||
32, // Colordepth of the framebuffer. | |||||
0, 0, 0, 0, 0, 0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, 0, 0, 0, | |||||
24, // Number of bits for the depthbuffer | |||||
8, // Number of bits for the stencilbuffer | |||||
0, // Number of Aux buffers in the framebuffer. | |||||
PFD_MAIN_PLANE, | |||||
0, | |||||
0, 0, 0 | |||||
}; | |||||
hidden.hdc = ::GetDC(hidden.hwnd); | |||||
printf("xxx vstgltest: hidden hdc=%p\n", hidden.hdc); | |||||
int pfmt = ::ChoosePixelFormat(hidden.hdc, &pfd); | |||||
printf("xxx vstgltest: hidden pfmt=%d\n", pfmt); | |||||
::SetPixelFormat(hidden.hdc, pfmt, &pfd); | |||||
hglrc = ::wglCreateContext(hidden.hdc); | |||||
printf("xxx vstgltest: hidden hglrc=%p\n", hglrc); | |||||
} | |||||
void destroyHiddenWindow(void) { | |||||
if(NULL != hidden.hwnd) | |||||
{ | |||||
::wglDeleteContext(hglrc); | |||||
::DestroyWindow(hidden.hwnd); | |||||
::UnregisterClass(EDITWIN_HIDDEN_CLASS_NAME, ::GetModuleHandle(NULL)); | |||||
} | |||||
} | |||||
void openEditor(HWND _hwnd) { | |||||
parent_hwnd = _hwnd; | |||||
if(NULL == registered_class_name) | |||||
{ | |||||
WNDCLASS wc; | |||||
::ZeroMemory(&wc, sizeof(wc)); | |||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; | |||||
wc.lpfnWndProc = (WNDPROC) WndProc; | |||||
wc.hInstance = ::GetModuleHandle(NULL); | |||||
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); | |||||
wc.lpszClassName = EDITWIN_CLASS_NAME; | |||||
if(!::RegisterClass(&wc)) | |||||
{ | |||||
// something went terribly wrong | |||||
printf("[---] vstgltest: failed to register window class\n"); | |||||
return; | |||||
} | |||||
registered_class_name = EDITWIN_CLASS_NAME; | |||||
} | |||||
DWORD dwExStyle = 0; | |||||
DWORD dwStyle = WS_CHILD | WS_VISIBLE; | |||||
editor.hwnd = ::CreateWindowEx(dwExStyle, | |||||
EDITWIN_CLASS_NAME, | |||||
"Test", | |||||
dwStyle, | |||||
0/*xpos*/, 0/*ypos*/, | |||||
EDITWIN_W, EDITWIN_H, | |||||
parent_hwnd, | |||||
NULL, // window menu | |||||
::GetModuleHandle(NULL), | |||||
NULL | |||||
); | |||||
window_to_wrapper = this; | |||||
PIXELFORMATDESCRIPTOR pfd = { | |||||
sizeof(PIXELFORMATDESCRIPTOR), | |||||
1, | |||||
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags | |||||
PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette. | |||||
32, // Colordepth of the framebuffer. | |||||
0, 0, 0, 0, 0, 0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, 0, 0, 0, | |||||
24, // Number of bits for the depthbuffer | |||||
8, // Number of bits for the stencilbuffer | |||||
0, // Number of Aux buffers in the framebuffer. | |||||
PFD_MAIN_PLANE, | |||||
0, | |||||
0, 0, 0 | |||||
}; | |||||
editor.hdc = ::GetDC(editor.hwnd); | |||||
int pfmt = ::ChoosePixelFormat(editor.hdc, &pfd); | |||||
printf("xxx vstgltest: editor pfmt=%d\n", pfmt); | |||||
::SetPixelFormat(editor.hdc, pfmt, &pfd); | |||||
// // hglrc = ::wglCreateContext(hdc); | |||||
} | |||||
void closeEditor(void) { | |||||
if(NULL != editor.hwnd) | |||||
{ | |||||
::DestroyWindow(editor.hwnd); | |||||
editor.hwnd = NULL; | |||||
// (todo) unregister when last window is closed | |||||
::UnregisterClass(EDITWIN_CLASS_NAME, ::GetModuleHandle(NULL)); | |||||
registered_class_name = NULL; | |||||
window_to_wrapper = NULL; | |||||
} | |||||
} | |||||
static VSTPluginWrapper *FindWrapperByWindow(HWND hwnd) { | |||||
return window_to_wrapper; | |||||
} | |||||
void redrawWindow(void) { | |||||
// Save host GL context | |||||
HDC hostHDC = ::wglGetCurrentDC(); | |||||
HGLRC hostHGLRC = ::wglGetCurrentContext(); | |||||
printf("xxx vstgltest: WM_PAINT: hostHDC=%p hostGLRC=%p\n", hostHDC, hostHGLRC); | |||||
// Bind plugin GL context | |||||
printf("xxx vstgltest: WM_PAINT: pluginHDC=%p pluginGLRC=%p\n", editor.hdc, hglrc); | |||||
::wglMakeCurrent(editor.hdc, hglrc); | |||||
// Draw something | |||||
::glClearColor(0.0, 1.0, clear_color, 1.0); | |||||
clear_color += 0.05f; | |||||
if(clear_color >= 1.0f) | |||||
clear_color -= 1.0f; | |||||
::glClear(GL_COLOR_BUFFER_BIT); | |||||
::glFlush(); | |||||
::wglSwapLayerBuffers(editor.hdc, WGL_SWAP_MAIN_PLANE); | |||||
// Restore host GL context | |||||
::wglMakeCurrent(hostHDC, hostHGLRC); | |||||
} | |||||
private: | |||||
// the host callback (a function pointer) | |||||
VSTHostCallback _vstHostCallback; | |||||
// the actual structure required by the host | |||||
VSTPlugin _vstPlugin; | |||||
}; | |||||
const char *VSTPluginWrapper::registered_class_name = NULL; | |||||
VSTPluginWrapper *VSTPluginWrapper::window_to_wrapper = NULL; | |||||
extern "C" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { | |||||
switch(message) | |||||
{ | |||||
case WM_CREATE: | |||||
printf("xxx vstgltest: WM_CREATE\n"); | |||||
break; | |||||
case WM_DESTROY: | |||||
printf("xxx vstgltest: WM_DESTROY\n"); | |||||
break; | |||||
case WM_LBUTTONDOWN: | |||||
printf("xxx vstgltest: WM_LBUTTONDOWN\n"); | |||||
break; | |||||
case WM_LBUTTONUP: | |||||
printf("xxx vstgltest: WM_LBUTTONUP\n"); | |||||
break; | |||||
case WM_PAINT: | |||||
// https://docs.microsoft.com/en-us/windows/desktop/api/Winuser/nf-winuser-redrawwindow | |||||
printf("xxx vstgltest: WM_PAINT\n"); | |||||
VSTPluginWrapper *wrapper = VSTPluginWrapper::FindWrapperByWindow(hWnd); | |||||
wrapper->redrawWindow(); | |||||
break; | |||||
} | |||||
return DefWindowProc(hWnd, message, wParam, lParam); | |||||
} | |||||
/******************************************* | |||||
* Callbacks: Host -> Plugin | |||||
* | |||||
* Defined here because they are used in the rest of the code later | |||||
*/ | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of single precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat32(VSTPlugin *vstPlugin, float **inputs, float **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5f; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of double precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat64(VSTPlugin *vstPlugin, double **inputs, double **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the plugin called by the host to communicate with the plugin, mainly to request information (like the | |||||
* vendor string, the plugin category...) or communicate state/changes (like open/close, frame rate...) | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param opCode defined in aeffect.h/AEffectOpcodes and which continues in aeffectx.h/AEffectXOpcodes for a grand | |||||
* total of 79 of them! Only a few of them are implemented in this small plugin. | |||||
* @param index depend on the opcode | |||||
* @param value depend on the opcode | |||||
* @param ptr depend on the opcode | |||||
* @param opt depend on the opcode | |||||
* @return depend on the opcode (0 is ok when you don't implement an opcode...) | |||||
*/ | |||||
VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt) | |||||
{ | |||||
printf("vstgltest: called VSTPluginDispatcher(%d)\n", opCode); | |||||
VstIntPtr r = 0; | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// see aeffect.h/AEffectOpcodes and aeffectx.h/AEffectXOpcodes for details on all of them | |||||
switch(opCode) | |||||
{ | |||||
// request for the category of the plugin: in this case it is an effect since it is modifying the input (as opposed | |||||
// to generating sound) | |||||
case effGetPlugCategory: | |||||
return kPlugCategEffect; | |||||
// called by the host when the plugin was called... time to reclaim memory! | |||||
case effClose: | |||||
delete wrapper; | |||||
break; | |||||
case effGetEffectName: | |||||
::strncpy((char*)ptr, "VST GL Test", kVstMaxEffectNameLen); | |||||
r = 1; | |||||
break; | |||||
// request for the vendor string (usually used in the UI for plugin grouping) | |||||
case effGetVendorString: | |||||
strncpy(static_cast<char *>(ptr), "bsp", kVstMaxVendorStrLen); | |||||
r = 1; | |||||
break; | |||||
// request for the version | |||||
case effGetVendorVersion: | |||||
return PLUGIN_VERSION; | |||||
case effEditIdle: | |||||
if(NULL != wrapper->editor.hwnd) | |||||
{ | |||||
printf("xxx vstgltest: redraw window\n"); | |||||
// (void)::RedrawWindow(wrapper->hwnd, NULL, NULL, RDW_INTERNALPAINT); | |||||
//(void)::UpdateWindow(wrapper->hwnd); | |||||
if(::IsWindowVisible(wrapper->editor.hwnd)) | |||||
{ | |||||
wrapper->redrawWindow(); | |||||
} | |||||
} | |||||
break; | |||||
case effEditGetRect: | |||||
// Query editor window geometry | |||||
// ptr: ERect* (on Windows) | |||||
if(NULL != ptr) // yeah, this should never be NULL | |||||
{ | |||||
// ... | |||||
wrapper->editor_rect.left = EDITWIN_X; | |||||
wrapper->editor_rect.top = EDITWIN_Y; | |||||
wrapper->editor_rect.right = EDITWIN_X + EDITWIN_W; | |||||
wrapper->editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | |||||
*(void**)ptr = (void*) &wrapper->editor_rect; | |||||
r = 1; | |||||
} | |||||
else | |||||
{ | |||||
r = 0; | |||||
} | |||||
break; | |||||
#if 0 | |||||
case effEditTop: | |||||
// deprecated in vst2.4 | |||||
r = 0; | |||||
break; | |||||
#endif | |||||
case effEditOpen: | |||||
// Show editor window | |||||
// ptr: native window handle (hWnd on Windows) | |||||
wrapper->openEditor((HWND)ptr); | |||||
r = 1; | |||||
break; | |||||
case effEditClose: | |||||
// Hide editor window | |||||
wrapper->closeEditor(); | |||||
r = 1; | |||||
break; | |||||
// ignoring all other opcodes | |||||
default: | |||||
printf("Unknown opCode %d [ignored] \n", opCode); | |||||
break; | |||||
} | |||||
return r; | |||||
} | |||||
/** | |||||
* Used for parameter setting (not used by this plugin) | |||||
*/ | |||||
void VSTPluginSetParameter(VSTPlugin *vstPlugin, VstInt32 index, float parameter) | |||||
{ | |||||
printf("called VSTPluginSetParameter(%d, %f)\n", index, parameter); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
} | |||||
/** | |||||
* Used for parameter (not used by this plugin) | |||||
*/ | |||||
float VSTPluginGetParameter(VSTPlugin *vstPlugin, VstInt32 index) | |||||
{ | |||||
printf("called VSTPluginGetParameter(%d)\n", index); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
return 0; | |||||
} | |||||
/** | |||||
* Main constructor for our C++ class | |||||
*/ | |||||
VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs) : | |||||
_vstHostCallback(vstHostCallback) | |||||
{ | |||||
// Make sure that the memory is properly initialized | |||||
memset(&_vstPlugin, 0, sizeof(_vstPlugin)); | |||||
// this field must be set with this constant... | |||||
_vstPlugin.magic = kEffectMagic; | |||||
// storing this object into the VSTPlugin so that it can be retrieved when called back (see callbacks for use) | |||||
_vstPlugin.object = this; | |||||
// specifying that we handle both single and double precision (there are other flags see aeffect.h/VstAEffectFlags) | |||||
_vstPlugin.flags = effFlagsCanReplacing | effFlagsCanDoubleReplacing | effFlagsHasEditor; | |||||
// initializing the plugin with the various values | |||||
_vstPlugin.uniqueID = vendorUniqueID; | |||||
_vstPlugin.version = vendorVersion; | |||||
_vstPlugin.numParams = numParams; | |||||
_vstPlugin.numPrograms = numPrograms; | |||||
_vstPlugin.numInputs = numInputs; | |||||
_vstPlugin.numOutputs = numOutputs; | |||||
// setting the callbacks to the previously defined functions | |||||
_vstPlugin.dispatcher = VSTPluginDispatcher; | |||||
_vstPlugin.getParameter = VSTPluginGetParameter; | |||||
_vstPlugin.setParameter = VSTPluginSetParameter; | |||||
_vstPlugin.processReplacing = VSTPluginProcessSamplesFloat32; | |||||
_vstPlugin.processDoubleReplacing = VSTPluginProcessSamplesFloat64; | |||||
parent_hwnd = NULL; | |||||
hidden.hwnd = NULL; | |||||
hidden.hdc = NULL; | |||||
editor.hwnd = NULL; | |||||
editor.hdc = NULL; | |||||
hglrc = NULL; | |||||
createHiddenWindow(); | |||||
} | |||||
/** | |||||
* Destructor called when the plugin is closed (see VSTPluginDispatcher with effClose opCode). In this very simply plugin | |||||
* there is nothing to do but in general the memory that gets allocated MUST be freed here otherwise there might be a | |||||
* memory leak which may end up slowing down and/or crashing the host | |||||
*/ | |||||
VSTPluginWrapper::~VSTPluginWrapper() { | |||||
destroyHiddenWindow(); | |||||
} | |||||
/** | |||||
* Implementation of the main entry point of the plugin | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) | |||||
{ | |||||
printf("called VSTPluginMain... \n"); | |||||
// simply create our plugin C++ class | |||||
VSTPluginWrapper *plugin = | |||||
new VSTPluginWrapper(vstHostCallback, | |||||
CCONST('u', 's', 'a', '§'), // registered with Steinberg (http://service.steinberg.de/databases/plugin.nsf/plugIn?openForm) | |||||
PLUGIN_VERSION, // version | |||||
0, // no params | |||||
0, // no programs | |||||
2, // 2 inputs | |||||
2); // 2 outputs | |||||
// return the plugin per the contract of the API | |||||
return plugin->getVSTPlugin(); | |||||
} |
@@ -1,527 +0,0 @@ | |||||
#include <aeffect.h> | |||||
#include <aeffectx.h> | |||||
#include <stdio.h> | |||||
#if defined(_WIN32) || defined(_WIN64) | |||||
#include <windows.h> | |||||
#include <wingdi.h> | |||||
#define VST_EXPORT extern "C" __declspec(dllexport) | |||||
#else | |||||
#define VST_EXPORT extern | |||||
#endif | |||||
#include <GL/GL.h> | |||||
#define EDITWIN_X 20 | |||||
#define EDITWIN_Y 20 | |||||
#define EDITWIN_W 640 | |||||
#define EDITWIN_H 480 | |||||
#define EDITWIN_CLASS_NAME "VeeSeeVSTWindow" | |||||
/* | |||||
* I find the naming a bit confusing so I decided to use more meaningful names instead. | |||||
*/ | |||||
/** | |||||
* The VSTHostCallback is a function pointer so that the plugin can communicate with the host (not used in this small example) | |||||
*/ | |||||
typedef audioMasterCallback VSTHostCallback; | |||||
/** | |||||
* The VSTPlugin structure (AEffect) contains information about the plugin (like version, number of inputs, ...) and | |||||
* callbacks so that the host can call the plugin to do its work. The primary callback will be `processReplacing` for | |||||
* single precision (float) sample processing (or `processDoubleReplacing` for double precision (double)). | |||||
*/ | |||||
typedef AEffect VSTPlugin; | |||||
// Since the host is expecting a very specific API we need to make sure it has C linkage (not C++) | |||||
extern "C" { | |||||
/* | |||||
* This is the main entry point to the VST plugin. | |||||
* | |||||
* The host (DAW like Maschine, Ableton Live, Reason, ...) will look for this function with this exact API. | |||||
* | |||||
* It is the equivalent to `int main(int argc, char *argv[])` for a C executable. | |||||
* | |||||
* @param vstHostCallback is a callback so that the plugin can communicate with the host (not used in this small example) | |||||
* @return a pointer to the AEffect structure | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback); | |||||
// note this looks like this without the type aliases (and is obviously 100% equivalent) | |||||
// extern AEffect *VSTPluginMain(audioMasterCallback audioMaster); | |||||
} | |||||
/* | |||||
* Constant for the version of the plugin. For example 1100 for version 1.1.0.0 | |||||
*/ | |||||
const VstInt32 PLUGIN_VERSION = 1000; | |||||
extern "C" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); | |||||
/** | |||||
* Encapsulates the plugin as a C++ class. It will keep both the host callback and the structure required by the | |||||
* host (VSTPlugin). This class will be stored in the `VSTPlugin.object` field (circular reference) so that it can | |||||
* be accessed when the host calls the plugin back (for example in `processDoubleReplacing`). | |||||
*/ | |||||
class VSTPluginWrapper | |||||
{ | |||||
public: | |||||
ERect editor_rect; | |||||
HWND parent_hwnd; // created by host | |||||
HWND hwnd; | |||||
HDC hdc; | |||||
HGLRC hglrc; | |||||
float clear_color = 0.0f; | |||||
static const char *registered_class_name; | |||||
static VSTPluginWrapper *window_to_wrapper; | |||||
public: | |||||
VSTPluginWrapper(VSTHostCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs); | |||||
~VSTPluginWrapper(); | |||||
inline VSTPlugin *getVSTPlugin() | |||||
{ | |||||
return &_vstPlugin; | |||||
} | |||||
inline VstInt32 getNumInputs() const | |||||
{ | |||||
return _vstPlugin.numInputs; | |||||
} | |||||
inline VstInt32 getNumOutputs() const | |||||
{ | |||||
return _vstPlugin.numOutputs; | |||||
} | |||||
void openEditor(HWND _hwnd) { | |||||
parent_hwnd = _hwnd; | |||||
if(NULL == registered_class_name) | |||||
{ | |||||
WNDCLASS wc; | |||||
::ZeroMemory(&wc, sizeof(wc)); | |||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; | |||||
wc.lpfnWndProc = (WNDPROC) WndProc; | |||||
wc.hInstance = ::GetModuleHandle(NULL); | |||||
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); | |||||
wc.lpszClassName = EDITWIN_CLASS_NAME; | |||||
if(!::RegisterClass(&wc)) | |||||
{ | |||||
// something went terribly wrong | |||||
printf("[---] vstgltest: failed to register window class\n"); | |||||
return; | |||||
} | |||||
registered_class_name = EDITWIN_CLASS_NAME; | |||||
} | |||||
DWORD dwExStyle = 0; | |||||
DWORD dwStyle = WS_CHILD | WS_VISIBLE; | |||||
hwnd = ::CreateWindowEx(dwExStyle, | |||||
EDITWIN_CLASS_NAME, | |||||
"Test", | |||||
dwStyle, | |||||
0/*xpos*/, 0/*ypos*/, | |||||
EDITWIN_W, EDITWIN_H, | |||||
parent_hwnd, | |||||
NULL, // window menu | |||||
::GetModuleHandle(NULL), | |||||
NULL | |||||
); | |||||
window_to_wrapper = this; | |||||
PIXELFORMATDESCRIPTOR pfd = { | |||||
sizeof(PIXELFORMATDESCRIPTOR), | |||||
1, | |||||
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags | |||||
PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette. | |||||
32, // Colordepth of the framebuffer. | |||||
0, 0, 0, 0, 0, 0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, 0, 0, 0, | |||||
24, // Number of bits for the depthbuffer | |||||
8, // Number of bits for the stencilbuffer | |||||
0, // Number of Aux buffers in the framebuffer. | |||||
PFD_MAIN_PLANE, | |||||
0, | |||||
0, 0, 0 | |||||
}; | |||||
hdc = ::GetDC(hwnd); | |||||
int pfmt = ::ChoosePixelFormat(hdc, &pfd); | |||||
printf("xxx vstgltest: pfmt=%d", pfmt); | |||||
::SetPixelFormat(hdc, pfmt, &pfd); | |||||
hglrc = ::wglCreateContext(hdc); | |||||
} | |||||
void closeEditor(void) { | |||||
if(NULL != hwnd) | |||||
{ | |||||
::wglDeleteContext(hglrc); | |||||
::DestroyWindow(hwnd); | |||||
// (todo) unregister when last window is closed | |||||
::UnregisterClass(EDITWIN_CLASS_NAME, ::GetModuleHandle(NULL)); | |||||
registered_class_name = NULL; | |||||
window_to_wrapper = NULL; | |||||
} | |||||
} | |||||
static VSTPluginWrapper *FindWrapperByWindow(HWND hwnd) { | |||||
return window_to_wrapper; | |||||
} | |||||
void redrawWindow(void) { | |||||
// Save host GL context | |||||
HDC hostHDC = ::wglGetCurrentDC(); | |||||
HGLRC hostHGLRC = ::wglGetCurrentContext(); | |||||
printf("xxx vstgltest: WM_PAINT: hostHDC=%p hostGLRC=%p\n", hostHDC, hostHGLRC); | |||||
// Bind plugin GL context | |||||
printf("xxx vstgltest: WM_PAINT: pluginHDC=%p pluginGLRC=%p\n", hdc, hglrc); | |||||
::wglMakeCurrent(hdc, hglrc); | |||||
// Draw something | |||||
::glClearColor(0.0, 1.0, clear_color, 1.0); | |||||
clear_color += 0.05f; | |||||
if(clear_color >= 1.0f) | |||||
clear_color -= 1.0f; | |||||
::glClear(GL_COLOR_BUFFER_BIT); | |||||
::glFlush(); | |||||
::wglSwapLayerBuffers(hdc, WGL_SWAP_MAIN_PLANE); | |||||
// Restore host GL context | |||||
::wglMakeCurrent(hostHDC, hostHGLRC); | |||||
} | |||||
private: | |||||
// the host callback (a function pointer) | |||||
VSTHostCallback _vstHostCallback; | |||||
// the actual structure required by the host | |||||
VSTPlugin _vstPlugin; | |||||
}; | |||||
const char *VSTPluginWrapper::registered_class_name = NULL; | |||||
VSTPluginWrapper *VSTPluginWrapper::window_to_wrapper = NULL; | |||||
extern "C" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { | |||||
switch(message) | |||||
{ | |||||
case WM_CREATE: | |||||
printf("xxx vstgltest: WM_CREATE\n"); | |||||
break; | |||||
case WM_DESTROY: | |||||
printf("xxx vstgltest: WM_DESTROY\n"); | |||||
break; | |||||
case WM_LBUTTONDOWN: | |||||
printf("xxx vstgltest: WM_LBUTTONDOWN\n"); | |||||
break; | |||||
case WM_LBUTTONUP: | |||||
printf("xxx vstgltest: WM_LBUTTONUP\n"); | |||||
break; | |||||
case WM_PAINT: | |||||
// https://docs.microsoft.com/en-us/windows/desktop/api/Winuser/nf-winuser-redrawwindow | |||||
printf("xxx vstgltest: WM_PAINT\n"); | |||||
VSTPluginWrapper *wrapper = VSTPluginWrapper::FindWrapperByWindow(hWnd); | |||||
wrapper->redrawWindow(); | |||||
break; | |||||
} | |||||
return DefWindowProc(hWnd, message, wParam, lParam); | |||||
} | |||||
/******************************************* | |||||
* Callbacks: Host -> Plugin | |||||
* | |||||
* Defined here because they are used in the rest of the code later | |||||
*/ | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of single precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat32(VSTPlugin *vstPlugin, float **inputs, float **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5f; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the callback that will be called to process the samples in the case of double precision. This is where the | |||||
* meat of the logic happens! | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||||
* @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||||
* @param sampleFrames the number of samples (second dimension in both arrays) | |||||
*/ | |||||
void VSTPluginProcessSamplesFloat64(VSTPlugin *vstPlugin, double **inputs, double **outputs, VstInt32 sampleFrames) | |||||
{ | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||||
// result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||||
for(int i = 0; i < wrapper->getNumInputs(); i++) | |||||
{ | |||||
auto inputSamples = inputs[i]; | |||||
auto outputSamples = outputs[i]; | |||||
for(int j = 0; j < sampleFrames; j++) | |||||
{ | |||||
outputSamples[j] = inputSamples[j] * 0.5; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* This is the plugin called by the host to communicate with the plugin, mainly to request information (like the | |||||
* vendor string, the plugin category...) or communicate state/changes (like open/close, frame rate...) | |||||
* | |||||
* @param vstPlugin the object returned by VSTPluginMain | |||||
* @param opCode defined in aeffect.h/AEffectOpcodes and which continues in aeffectx.h/AEffectXOpcodes for a grand | |||||
* total of 79 of them! Only a few of them are implemented in this small plugin. | |||||
* @param index depend on the opcode | |||||
* @param value depend on the opcode | |||||
* @param ptr depend on the opcode | |||||
* @param opt depend on the opcode | |||||
* @return depend on the opcode (0 is ok when you don't implement an opcode...) | |||||
*/ | |||||
VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt) | |||||
{ | |||||
printf("vstgltest: called VSTPluginDispatcher(%d)\n", opCode); | |||||
VstIntPtr r = 0; | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
// see aeffect.h/AEffectOpcodes and aeffectx.h/AEffectXOpcodes for details on all of them | |||||
switch(opCode) | |||||
{ | |||||
// request for the category of the plugin: in this case it is an effect since it is modifying the input (as opposed | |||||
// to generating sound) | |||||
case effGetPlugCategory: | |||||
return kPlugCategEffect; | |||||
// called by the host when the plugin was called... time to reclaim memory! | |||||
case effClose: | |||||
delete wrapper; | |||||
break; | |||||
case effGetEffectName: | |||||
::strncpy((char*)ptr, "VST GL Test", kVstMaxEffectNameLen); | |||||
r = 1; | |||||
break; | |||||
// request for the vendor string (usually used in the UI for plugin grouping) | |||||
case effGetVendorString: | |||||
strncpy(static_cast<char *>(ptr), "bsp", kVstMaxVendorStrLen); | |||||
r = 1; | |||||
break; | |||||
// request for the version | |||||
case effGetVendorVersion: | |||||
return PLUGIN_VERSION; | |||||
case effEditIdle: | |||||
if(NULL != wrapper->hwnd) | |||||
{ | |||||
printf("xxx vstgltest: redraw window\n"); | |||||
// (void)::RedrawWindow(wrapper->hwnd, NULL, NULL, RDW_INTERNALPAINT); | |||||
//(void)::UpdateWindow(wrapper->hwnd); | |||||
if(::IsWindowVisible(wrapper->hwnd)) | |||||
{ | |||||
wrapper->redrawWindow(); | |||||
} | |||||
} | |||||
break; | |||||
case effEditGetRect: | |||||
// Query editor window geometry | |||||
// ptr: ERect* (on Windows) | |||||
if(NULL != ptr) // yeah, this should never be NULL | |||||
{ | |||||
// ... | |||||
wrapper->editor_rect.left = EDITWIN_X; | |||||
wrapper->editor_rect.top = EDITWIN_Y; | |||||
wrapper->editor_rect.right = EDITWIN_X + EDITWIN_W; | |||||
wrapper->editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | |||||
*(void**)ptr = (void*) &wrapper->editor_rect; | |||||
r = 1; | |||||
} | |||||
else | |||||
{ | |||||
r = 0; | |||||
} | |||||
break; | |||||
#if 0 | |||||
case effEditTop: | |||||
// deprecated in vst2.4 | |||||
r = 0; | |||||
break; | |||||
#endif | |||||
case effEditOpen: | |||||
// Show editor window | |||||
// ptr: native window handle (hWnd on Windows) | |||||
wrapper->openEditor((HWND)ptr); | |||||
r = 1; | |||||
break; | |||||
case effEditClose: | |||||
// Hide editor window | |||||
wrapper->closeEditor(); | |||||
r = 1; | |||||
break; | |||||
// ignoring all other opcodes | |||||
default: | |||||
printf("Unknown opCode %d [ignored] \n", opCode); | |||||
break; | |||||
} | |||||
return r; | |||||
} | |||||
/** | |||||
* Used for parameter setting (not used by this plugin) | |||||
*/ | |||||
void VSTPluginSetParameter(VSTPlugin *vstPlugin, VstInt32 index, float parameter) | |||||
{ | |||||
printf("called VSTPluginSetParameter(%d, %f)\n", index, parameter); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
} | |||||
/** | |||||
* Used for parameter (not used by this plugin) | |||||
*/ | |||||
float VSTPluginGetParameter(VSTPlugin *vstPlugin, VstInt32 index) | |||||
{ | |||||
printf("called VSTPluginGetParameter(%d)\n", index); | |||||
// we can get a hold to our C++ class since we stored it in the `object` field (see constructor) | |||||
VSTPluginWrapper *wrapper = static_cast<VSTPluginWrapper *>(vstPlugin->object); | |||||
return 0; | |||||
} | |||||
/** | |||||
* Main constructor for our C++ class | |||||
*/ | |||||
VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
VstInt32 vendorUniqueID, | |||||
VstInt32 vendorVersion, | |||||
VstInt32 numParams, | |||||
VstInt32 numPrograms, | |||||
VstInt32 numInputs, | |||||
VstInt32 numOutputs) : | |||||
_vstHostCallback(vstHostCallback) | |||||
{ | |||||
// Make sure that the memory is properly initialized | |||||
memset(&_vstPlugin, 0, sizeof(_vstPlugin)); | |||||
// this field must be set with this constant... | |||||
_vstPlugin.magic = kEffectMagic; | |||||
// storing this object into the VSTPlugin so that it can be retrieved when called back (see callbacks for use) | |||||
_vstPlugin.object = this; | |||||
// specifying that we handle both single and double precision (there are other flags see aeffect.h/VstAEffectFlags) | |||||
_vstPlugin.flags = effFlagsCanReplacing | effFlagsCanDoubleReplacing | effFlagsHasEditor; | |||||
// initializing the plugin with the various values | |||||
_vstPlugin.uniqueID = vendorUniqueID; | |||||
_vstPlugin.version = vendorVersion; | |||||
_vstPlugin.numParams = numParams; | |||||
_vstPlugin.numPrograms = numPrograms; | |||||
_vstPlugin.numInputs = numInputs; | |||||
_vstPlugin.numOutputs = numOutputs; | |||||
// setting the callbacks to the previously defined functions | |||||
_vstPlugin.dispatcher = VSTPluginDispatcher; | |||||
_vstPlugin.getParameter = VSTPluginGetParameter; | |||||
_vstPlugin.setParameter = VSTPluginSetParameter; | |||||
_vstPlugin.processReplacing = VSTPluginProcessSamplesFloat32; | |||||
_vstPlugin.processDoubleReplacing = VSTPluginProcessSamplesFloat64; | |||||
parent_hwnd = NULL; | |||||
hwnd = NULL; | |||||
hdc = NULL; | |||||
hglrc = NULL; | |||||
} | |||||
/** | |||||
* Destructor called when the plugin is closed (see VSTPluginDispatcher with effClose opCode). In this very simply plugin | |||||
* there is nothing to do but in general the memory that gets allocated MUST be freed here otherwise there might be a | |||||
* memory leak which may end up slowing down and/or crashing the host | |||||
*/ | |||||
VSTPluginWrapper::~VSTPluginWrapper() | |||||
{ | |||||
} | |||||
/** | |||||
* Implementation of the main entry point of the plugin | |||||
*/ | |||||
VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) | |||||
{ | |||||
printf("called VSTPluginMain... \n"); | |||||
// simply create our plugin C++ class | |||||
VSTPluginWrapper *plugin = | |||||
new VSTPluginWrapper(vstHostCallback, | |||||
CCONST('u', 's', 'a', '§'), // registered with Steinberg (http://service.steinberg.de/databases/plugin.nsf/plugIn?openForm) | |||||
PLUGIN_VERSION, // version | |||||
0, // no params | |||||
0, // no programs | |||||
2, // 2 inputs | |||||
2); // 2 outputs | |||||
// return the plugin per the contract of the API | |||||
return plugin->getVSTPlugin(); | |||||
} |
@@ -1,31 +0,0 @@ | |||||
| |||||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio 15 | |||||
VisualStudioVersion = 15.0.27130.2024 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | |||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "m3db", "m3db\m3db.vcxproj", "{ADEB3292-4BBF-4B20-9A11-3D8076423F16}" | |||||
EndProject | |||||
Global | |||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||||
Debug|x64 = Debug|x64 | |||||
Debug|x86 = Debug|x86 | |||||
Release|x64 = Release|x64 | |||||
Release|x86 = Release|x86 | |||||
EndGlobalSection | |||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Debug|x64.ActiveCfg = Debug|x64 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Debug|x64.Build.0 = Debug|x64 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Debug|x86.ActiveCfg = Debug|Win32 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Debug|x86.Build.0 = Debug|Win32 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Release|x64.ActiveCfg = Release|x64 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Release|x64.Build.0 = Release|x64 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Release|x86.ActiveCfg = Release|Win32 | |||||
{ADEB3292-4BBF-4B20-9A11-3D8076423F16}.Release|x86.Build.0 = Release|Win32 | |||||
EndGlobalSection | |||||
GlobalSection(SolutionProperties) = preSolution | |||||
HideSolutionNode = FALSE | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {A1B75069-8782-4AB1-A661-12FED71250D4} | |||||
EndGlobalSection | |||||
EndGlobal |
@@ -1,167 +0,0 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<ItemGroup Label="ProjectConfigurations"> | |||||
<ProjectConfiguration Include="Debug|Win32"> | |||||
<Configuration>Debug</Configuration> | |||||
<Platform>Win32</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Release|Win32"> | |||||
<Configuration>Release</Configuration> | |||||
<Platform>Win32</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Debug|x64"> | |||||
<Configuration>Debug</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Release|x64"> | |||||
<Configuration>Release</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
</ItemGroup> | |||||
<PropertyGroup Label="Globals"> | |||||
<VCProjectVersion>15.0</VCProjectVersion> | |||||
<ProjectGuid>{ADEB3292-4BBF-4B20-9A11-3D8076423F16}</ProjectGuid> | |||||
<Keyword>Win32Proj</Keyword> | |||||
<RootNamespace>m3db</RootNamespace> | |||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>true</UseDebugLibraries> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
<CharacterSet>Unicode</CharacterSet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>false</UseDebugLibraries> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
<WholeProgramOptimization>true</WholeProgramOptimization> | |||||
<CharacterSet>Unicode</CharacterSet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>true</UseDebugLibraries> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
<CharacterSet>Unicode</CharacterSet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>false</UseDebugLibraries> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
<WholeProgramOptimization>true</WholeProgramOptimization> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | |||||
<ImportGroup Label="ExtensionSettings"> | |||||
</ImportGroup> | |||||
<ImportGroup Label="Shared"> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<PropertyGroup Label="UserMacros" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
<LinkIncremental>true</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<LinkIncremental>true</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
<LinkIncremental>false</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<LinkIncremental>false</LinkIncremental> | |||||
</PropertyGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
<ClCompile> | |||||
<PrecompiledHeader>NotUsing</PrecompiledHeader> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<Optimization>Disabled</Optimization> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>WIN32;_DEBUG;M3DB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<ConformanceMode>true</ConformanceMode> | |||||
<AdditionalIncludeDirectories>f:\dev\vstsdk2.4</AdditionalIncludeDirectories> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Windows</SubSystem> | |||||
<GenerateDebugInformation>true</GenerateDebugInformation> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<ClCompile> | |||||
<PrecompiledHeader>NotUsing</PrecompiledHeader> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<Optimization>Disabled</Optimization> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>_DEBUG;M3DB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<ConformanceMode>true</ConformanceMode> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Windows</SubSystem> | |||||
<GenerateDebugInformation>true</GenerateDebugInformation> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
<ClCompile> | |||||
<PrecompiledHeader>NotUsing</PrecompiledHeader> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<Optimization>MaxSpeed</Optimization> | |||||
<FunctionLevelLinking>true</FunctionLevelLinking> | |||||
<IntrinsicFunctions>true</IntrinsicFunctions> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>WIN32;NDEBUG;M3DB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<ConformanceMode>true</ConformanceMode> | |||||
<AdditionalIncludeDirectories>f:\dev\vstsdk2.4</AdditionalIncludeDirectories> | |||||
<DebugInformationFormat>None</DebugInformationFormat> | |||||
<PrecompiledHeaderFile /> | |||||
<PrecompiledHeaderOutputFile /> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Windows</SubSystem> | |||||
<EnableCOMDATFolding>true</EnableCOMDATFolding> | |||||
<OptimizeReferences>true</OptimizeReferences> | |||||
<GenerateDebugInformation>false</GenerateDebugInformation> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<ClCompile> | |||||
<PrecompiledHeader>NotUsing</PrecompiledHeader> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<Optimization>MaxSpeed</Optimization> | |||||
<FunctionLevelLinking>true</FunctionLevelLinking> | |||||
<IntrinsicFunctions>true</IntrinsicFunctions> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>NDEBUG;M3DB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_DEPRECATE</PreprocessorDefinitions> | |||||
<ConformanceMode>true</ConformanceMode> | |||||
<AdditionalIncludeDirectories>F:\git\VeeSeeVSTRack\dep\lglw;f:\dev\vstsdk2.4\pluginterfaces\vst2.x\</AdditionalIncludeDirectories> | |||||
<DebugInformationFormat>None</DebugInformationFormat> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Windows</SubSystem> | |||||
<EnableCOMDATFolding>true</EnableCOMDATFolding> | |||||
<OptimizeReferences>true</OptimizeReferences> | |||||
<GenerateDebugInformation>false</GenerateDebugInformation> | |||||
<AdditionalDependencies>opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemGroup> | |||||
<ClCompile Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw_windows.c" /> | |||||
<ClCompile Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw_windows_cpp.cpp" /> | |||||
<ClCompile Include="..\..\..\plugin.cpp" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClInclude Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw.h" /> | |||||
</ItemGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
<ImportGroup Label="ExtensionTargets"> | |||||
</ImportGroup> | |||||
</Project> |
@@ -1,33 +0,0 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<ItemGroup> | |||||
<Filter Include="Source Files"> | |||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> | |||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> | |||||
</Filter> | |||||
<Filter Include="Header Files"> | |||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> | |||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> | |||||
</Filter> | |||||
<Filter Include="Resource Files"> | |||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> | |||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | |||||
</Filter> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClCompile Include="..\..\..\plugin.cpp"> | |||||
<Filter>Source Files</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw_windows.c"> | |||||
<Filter>Source Files</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw_windows_cpp.cpp"> | |||||
<Filter>Source Files</Filter> | |||||
</ClCompile> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClInclude Include="..\..\..\..\..\..\..\git\VeeSeeVSTRack\dep\lglw\lglw.h"> | |||||
<Filter>Source Files</Filter> | |||||
</ClInclude> | |||||
</ItemGroup> | |||||
</Project> |
@@ -1,4 +0,0 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<PropertyGroup /> | |||||
</Project> |
@@ -1,5 +0,0 @@ | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\vs2017\m3db\m3db\x64\debug\vc141.pdb | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\vs2017\m3db\m3db\x64\debug\vc141.idb | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\vs2017\m3db\m3db\x64\debug\m3db.tlog\cl.command.1.tlog | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\vs2017\m3db\m3db\x64\debug\m3db.tlog\cl.read.1.tlog | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\vs2017\m3db\m3db\x64\debug\m3db.tlog\cl.write.1.tlog |
@@ -1,2 +0,0 @@ | |||||
plugin.cpp | |||||
f:\projects\research\pongasoft_vst24-hello-world-master\m3db\plugin.cpp(3): fatal error C1083: Cannot open include file: 'aeffect.h': No such file or directory |
@@ -1,2 +0,0 @@ | |||||
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.16299.0 | |||||
Debug|x64|F:\Projects\research\pongasoft_vst24-hello-world-master\M3dB\vs2017\m3db\| |
@@ -1,15 +0,0 @@ | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\plugin.obj | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\lglw_windows.obj | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\lglw_windows_cpp.obj | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\x64\release\m3db.dll | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\x64\release\m3db.lib | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\x64\release\m3db.exp | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\x64\release\m3db.ipdb | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\x64\release\m3db.iobj | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\cl.command.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\cl.read.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\cl.write.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\link.command.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\link.read.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\link.write.1.tlog | |||||
f:\projects\research\vst24_gl_test\m3db\vs2017\m3db\m3db\x64\release\m3db.tlog\m3db.write.1u.tlog |
@@ -1,8 +0,0 @@ | |||||
lglw_windows.c | |||||
lglw_windows_cpp.cpp | |||||
plugin.cpp | |||||
Creating library F:\Projects\research\vst24_gl_test\M3dB\vs2017\m3db\x64\Release\m3db.lib and object F:\Projects\research\vst24_gl_test\M3dB\vs2017\m3db\x64\Release\m3db.exp | |||||
Generating code | |||||
All 57 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. | |||||
Finished generating code | |||||
m3db.vcxproj -> F:\Projects\research\vst24_gl_test\M3dB\vs2017\m3db\x64\Release\m3db.dll |
@@ -1,2 +0,0 @@ | |||||
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.16299.0 | |||||
Release|x64|F:\Projects\research\vst24_gl_test\M3dB\vs2017\m3db\| |