diff --git a/extras/audio plugins/How to use this framework.txt b/extras/audio plugins/How to use this framework.txt index 9cde1475a6..bcf1c4c5ba 100644 --- a/extras/audio plugins/How to use this framework.txt +++ b/extras/audio plugins/How to use this framework.txt @@ -1,272 +1,289 @@ - - The Juce Audio Plugin project! - ============================== - -(c) 2005-6 by Raw Material Software, visit www.rawmaterialsoftware.com for more info. - -The idea behind this is to create a framework which lets you write a platform-independent -audio plugin using Juce, which can be easily rebuilt to target multiple different plugin -formats and platforms. - - -How does it work? -================= - -There's a generic audio plugin base class defined in juce_AudioFilterBase.h, and to write -your plugin, you just need to create a sub-class of this. - -You can then compile your class against one or more of the platform-specific projects, -so that it gets wrapped as a VST, AudioUnit, RTAS, etc. - hopefully without changing any -of your code at all, or having to go anywhere near any platform-specific stuff. - - -How do I use it? -================ - -Under the 'wrapper/formats' directory are a bunch of different sets of files containing the -wrapper code for each different plugin type. - -There is also a 'demo' folder - this shows an example plugin which can be built in all -the different formats. The demo folder contains: - -- a 'src' directory containing the common, platform-independent code that defines this - plugin's behaviour -- a 'build' directory which contains projects for building the demo for each different - platform and format. - -Have a look at the demo classes to see how it works, and then to create a real plugin, -you'll need to replace the demo files with your own code. - -I've tried to add helpful comments where you might run across common compile errors, to -help describe what you might be doing wrong, as getting a build set-up for some of these -formats can be a bit of a pain. Please let me know if you find there's anything missing -from these instructions or anything I could change to help smooth the build process along -a bit. - -I'd recommend NOT putting your own plugin code inside the JuceAudioPlugin directory - it's -much neater to keep it somewhere separate and to alter the projects to point to your -files instead of the demo ones. That way when new versions of this library come out, it'll -make it easier to update to the latest code. - -For details about how to create your own projects for the various formats, see below. - - -Sending feedback: -================= - -- if you spot a bug or some kind of host incompatibility, tell me, of course! - -- the plan is that no-one should need to change any of the platform-specific code, or the base-class - code.. So if you find that your plugin can't do something you want it to, then rather than just - jumping in and hacking things to get the functionality you need, why not contact me and we'll - figure out a nice generic way of doing it. That way it'll benefit all the users, and you won't - have to hack it all over again when the next version comes out. - -- if you're really determined to rewrite large chunks of my code and send it to me to look at, - *please* don't reformat anything in your own preferred style, or change the format of the - comments, etc.. It's bad enough looking at people's code and trying to figure out why they've - done something, but if everything's moved around I can't even diff it.. - - -What are the licensing issues? -============================== - -Juce is released under the GPL (Gnu Public License) - this means that you're free to use -and redistribute it as long as your products are also released under the GPL. Basically -this means that if you use it, you also have to give away your source code. -If you want to release a closed-source application, you can buy a commercial license -that lets you avoid this restriction - see http://www.rawmaterialsoftware.com/juce for more info, -or see the comments at the top of all the Juce source files. - -If you're building the VST projects or releasing a VST, you'll need have a look at Steinberg's -developer site to see what licensing rules apply these days. Their website's at -http://www.steinberg.net - -If you're building an RTAS then you'll need to sign Digidesign's developer license to get -their SDK. Visit http://www.digidesign.com for more info. - - ------------------------------------------------------------------------------------------------------ - - How to create your own VST project - ================================== - -- Visit http://www.steinberg.net and jump through whatever hoops are necessary to download - and install the VST SDK. -- Make sure your include path contains an entry for the "vstsdk2.4" folder containing - the SDK. -- First try loading the VST demo project in JuceAudioPlugin/demo/build. Hopefully this - should build correctly. -- To create your own project for a VST, the simplest way is to take a copy of - the demo project and go through it carefully, changing any relevent settings to reflect - your own project. - -N.B. On the Mac, there's an important point to note about exported symbols.. When XCode builds - the plugin, I've had unpredictable results when trying to stop it from exporting all of - the internal functions as public symbols. There are some flags that are supposed to turn this - off, but sometimes they don't seem to have any effect, and using an explicit exports file also - seems a bit hit-and-miss. (If anyone knows better and can get this working, please let me know!) - Anyway, as well as being wasteful and showing everyone what's inside your plugin, leaving all - the symbols in there will cause fatal crashes when used with Tracktion, or alongside any other - Juce-based plugins. A way of making sure your plugin is stripped is to use the command - "strip -x -S YourPlugin.vst/Contents/MacOS/YourPlugin" after bulding it, which removes the - unnecessary symbols (although in my experience this also doesn't seem to work all the time, - so it's a good idea to check it using the unix "nm" command). - - ------------------------------------------------------------------------------------------------------ - - How to create your own AudioUnit project - ======================================== - -- If you've got XCode installed, the demo project in JuceAudioPlugin/demo/build/AudioUnit - should just build. You may need to tweak a few paths to make sure it can find the - juce.h include file and juce library. -- When copying this project to make your own, a good plan is to open up a view of the settings - for the project and target, viewing the "customised settings" to see those values that - have to be deliberately set for the plugin to work. - -N.B. For the Mac there can be an issue with exported symbols - see the note about this for - VSTs, as the same solution can be used for AudioUnits. - - ------------------------------------------------------------------------------------------------------ - - How to create your own RTAS project - =================================== - - -RTAS is a bit more of a pain to build than VSTs or AUs. To begin with: - -- Contact Digidesign, ask to become a Digidesign Development Partner, sign the relevent - agreements and NDAs. -- From the Digidesign website, download their latest Plug-In SDK -- Install the SDK and build some of the demo plugins to make sure it all works. - -Compiling the juce demo RTAS on the PC: -======================================= - -- Using the Digidesign demo projects in the SDK, make sure you've built debug and release - versions of these static libraries: DAE.lib, DigiExt.lib, DSI.lib, PlugInLib.lib. - -- In Visual Studio, add all of this lot to your include path: - - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\common - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\common\Platform - c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public - c:\yourdirectory\PT_73_SDK\AlturaPorts\SADriver\Interfaces - c:\yourdirectory\PT_73_SDK\AlturaPorts\DigiPublic\Interfaces - c:\yourdirectory\PT_73_SDK\AlturaPorts\Fic\Interfaces\DAEClient - c:\yourdirectory\PT_73_SDK\AlturaPorts\NewFileLibs\Cmn - c:\yourdirectory\PT_73_SDK\AlturaPorts\NewFileLibs\DOA - c:\yourdirectory\PT_73_SDK\AlturaPorts\AlturaSource\PPC_H - c:\yourdirectory\PT_73_SDK\AlturaPorts\AlturaSource\AppSupport - c:\yourdirectory\PT_73_SDK\AvidCode\AVX2sdk\AVX\avx2\avx2sdk\inc - -- The Visual Studio juce_RTAS project contains a folder called "libs", with "debug" and - "release" subdirectories - these should contain links to the Digidesign lib files - DAE.lib, DigiExt.lib, DSI.lib, PlugInLib.lib - you'll need to update these links to - point to the correct locations according to where you've installed the SDK. - -- Fingers crossed, this should now compile.. - -- IMPORTANT NOTE! If you're using MSVC2005 to build your plugin, the users will need to - have the Microsoft VC8 Runtime installed on their machines, otherwise the DLL will - silently fail to load. You should probably add the runtime to your plugin's installer, - and you can get a copy of it here: - http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=en - - -Creating a project for your own RTAS on the PC: -================================================= - -- start a new empty project in Developer Studio, as a "Windows DLL" -- in the source tree, create the same folders and add to them the same list of - cpp files that are in the demo project's "wrapper code" folder. -- select all the CPP files in the "wrapper code/RTAS specific" folder, and also - the juce_RTASWrapper.cpp file, (but NOT the juce_RTASUtilities.cpp file or any - other files!), and in their properties dialog, under C++/Advanced, change their - "Calling convention" setting to "__stdcall". - Remember to do this for both your debug and release builds! -- in your project's C++/General settings, add an additional include path so that - it will be able find your JucePluginCharacteristics.h file. -- Under "linker settings", change the output file name to have the suffix ".dpm" - instead of ".dll" -- Under "linker settings/input/ignore specific library", you'll probably need to - add "libcmtd.lib" for debug, and "libcmt.lib" for release. -- Under "linkey settings", set the Module definition file to be - JuceAudioPlugin/wrapper/formats/RTAS/juce_RTAS_dlldefs.def -- You might want to change the output directory to "\Program Files\Common Files\Digidesign\DAE\Plug-Ins\" - if you want the built plugin to go directly into the PT plugins folder -- Add a custom build step to copy the dummy resource file "JuceAudioPlugin\wrapper\formats\RTAS\DefaultResourceFile" - to your target directory, renaming to to be the same as your .dpm file, but with - ".rsr" on the end of the name. The demo project does this with the command - "copy /Y ..\..\..\wrapper\formats\RTAS\DefaultResourceFile "$(TargetPath)".rsr" -- Under the "general" properties, make sure that the character set is not unicode, as - this seems to stop some of the Digi code building. Hopefully this will be fixed - in future SDK releases -- add a "libs" folder to your project, and copy the set of libraries from the - equivalent folder in the demo project. Make sure you enable the debug/release - versions of these libraries appropriately. - -There are quite a few things that you need to get right for an RTAS to compile correctly - -the Digi SDK documentation has a full list of tips on setting up a project, but the -main ones to note are: - -- the SDK uses __stdcall as its calling convention, but JUCE uses __cdecl. I've got - around this by leaving the project's default setting as __cdecl, but changing it - specifically for those files that include or build files from the SDK - i.e. for - most of the files in the "wrapper code/RTAS specific" folder of the demo project. -- the default struct alignment for the SDK is 2 bytes, wheras the default as used in - juce is 8 bytes. Again, I've left this at the default setting, and have explicitly - changed it with pragmas when including/building SDK files. -- even though it's not used, each xx.dpm file needs to have a corresponding - xx.dpm.rsr file next to it, or PT will refuse to load it. The demo project currently - does this by using a custom build step to copy and rename a small dummy rsr file called - JuceAudioPlugin/wrapper/formats/RTAS/DefaultResourceFile - - -Compiling the juce demo RTAS on the Mac: -======================================== - -- After installing the Digidesign SDK, make sure you've run the config_SDK_for_Mac command in - its root directory. This sets up some of the tools that it needs. -- Load the juce_RTASDemo.xcodeproject and look through the project in XCode to find - all the broken links to Digidesign files. You'll need to repair these to make them - point to the location of the SDK files on your machine. -- Open the project's settings, and look for the "MacBag" setting - this defines the location - of the MacBag folder in the Digidesign SDK. You'll need to update this to point to - its location on your machine. -- It should all compile now, fingers crossed.. - -- Building a universal binary on the Mac: for this, you'll need to recompile the Digidesign - PluginLibrary project as a universal binary. The easiest way to do this is to add the - following lines to the top of the CommonDebugSettings.xcconfig and CommonReleaseSettings.xcconfig - files (these are found deep in the PT SDK tree somewhere, and are used for config by both the - Digi projects and the juce plugin projects): - ARCHS = ppc i386 - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk - MACOSX_DEPLOYMENT_TARGET_ppc = 10.3 - - -Creating a new project for your own RTAS plugin on the Mac: -=========================================================== - -It's probably easiest to take a copy of the juce demo project and go through it changing -its settings to those of your plugin. - -If you decide to start from scratch, use the juce demo project as a reference to see -what needs to go in there. Looking at its project info for "customised settings" is a good -way to see what values have been set deliberately. - + + The Juce Polymorphic Plugin Project! + ==================================== + +(c) 2008 by Raw Material Software, visit www.rawmaterialsoftware.com for more info. + +----------------------------------------------------------------------------------------------------- + +The purpose of this framework is to make is simple to write an audio plugin in a generic +way, which can then be compiled as a VST, AudioUnit, RTAS, or any combination of these. + +It's "polymorphic" because the output is a single binary module that acts as all of the +different plugin formats at the same time. This means that you only need to maintain one +project, and only need to perform one build to create a multi-format plugin. + +Also included are some helper classes that make it easy to create a stand-alone app to +run your plugin without a host. This might be useful in its own right, but can also be very +handy when developing your plugin, because you can build, test and debug it without needing +to keep restarting a 3rd-party host. + + + How does it work? + ================= + +To create your plugin, you just create a subclass of the AudioPluginInstance class to +perform the processing. And your plugin UI is written like any normal Juce UI component. + +All the platform-specific code is hidden away in wrapper classes that you just add to +your project - you should (hopefully) never need to even see the inner workings of these. + + + Licensing issues + ================ + +Juce is released under the GPL (Gnu Public License) - this means that you're free to use +and redistribute it as long as your products are also released under the GPL. Basically +this means that if you use it, you also have to give away your source code. +If you want to release a closed-source application, you can buy a commercial license +that lets you avoid this restriction - see http://www.rawmaterialsoftware.com/juce for more info, +or see the comments at the top of all the Juce source files. + +If you're building the VST projects or releasing a VST, you'll need have a look at Steinberg's +developer site to see what licensing rules apply these days. Their website's at +http://www.steinberg.net + +If you're building an RTAS then you'll need to sign Digidesign's developer license to get +their SDK. Visit http://www.digidesign.com for more info. + + + + Getting Started + =============== + +There's also a 'demo' folder - this contains an example plugin which can be built in all +the different formats. + +Have a look at the demo classes to see how it works, and then to create a real plugin, +you'll need to replace the demo files with your own code. + +I've tried to add helpful comments where you might run across common compile errors, to +help describe what you might be doing wrong, as getting a build set-up for some of these +formats can be a bit of a pain. Please let me know if you find there's anything missing +from these instructions or anything I could change to help smooth the build process along +a bit. + +I'd recommend NOT putting your own plugin code inside the demo plugin directory - it's +much neater to keep it somewhere separate and to alter the projects to point to your +files instead of the demo ones. That way when new versions of this library come out, it'll +make it easier to update to the latest code. + +----------------------------------------------------------------------------------------------------- + + Prerequisites for building a VST + ================================ + +- Visit http://www.steinberg.net and jump through whatever hoops are necessary to download + and install the VST SDK. +- Make sure your include path contains an entry for the "vstsdk2.4" folder containing the SDK. + +----------------------------------------------------------------------------------------------------- + + Prerequisites for building an RTAS + ================================== + +- Contact Digidesign, ask to become a Digidesign Development Partner, sign the relevent + agreements and NDAs. +- From the Digidesign website, download their latest Plug-In SDK +- Install the SDK and build some of the demo plugins to make sure it all works. +- In Visual Studio: Add all of these to your include path: + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\common + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\common\Platform + c:\yourdirectory\PT_73_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public + c:\yourdirectory\PT_73_SDK\AlturaPorts\SADriver\Interfaces + c:\yourdirectory\PT_73_SDK\AlturaPorts\DigiPublic\Interfaces + c:\yourdirectory\PT_73_SDK\AlturaPorts\Fic\Interfaces\DAEClient + c:\yourdirectory\PT_73_SDK\AlturaPorts\NewFileLibs\Cmn + c:\yourdirectory\PT_73_SDK\AlturaPorts\NewFileLibs\DOA + c:\yourdirectory\PT_73_SDK\AlturaPorts\AlturaSource\PPC_H + c:\yourdirectory\PT_73_SDK\AlturaPorts\AlturaSource\AppSupport + c:\yourdirectory\PT_73_SDK\AvidCode\AVX2sdk\AVX\avx2\avx2sdk\inc +- In Visual Studio: Using the Digidesign demo projects in the SDK, make sure you've compiled + debug and release versions of the following static libraries: + DAE.lib, DigiExt.lib, DSI.lib, PlugInLib.lib. +- In XCode: After installing the Digidesign SDK, make sure you've run the config_SDK_for_Mac + command in the SDK's root directory. This sets up some of the tools that it needs. + + +----------------------------------------------------------------------------------------------------- + Choosing the formats to build + ============================= + +Each plugin project needs to contain a JucePluginCharacteristics.h file, which holds all the +plugin-specific build details. In here, there are three macros that you can set to enable each +of the available formats: + +#define JucePlugin_Build_VST 1 +#define JucePlugin_Build_RTAS 1 +#define JucePlugin_Build_AU 1 + +You can set these to 0 to disable the formats that you don't want to build, and this will avoid +any compilation problems if, for example, you don't have the appropriate SDK for a particular format. + +----------------------------------------------------------------------------------------------------- + + Creating a PC VST/RTAS plugin in Visual Studio + ============================================== + + +- First try loading the VST demo project in JuceAudioPlugin/demo/build. Hopefully this + should build correctly. +- Create a new, empty, win32 project using Visual Studio. Choose "DLL" as the type of + product to build +- If building an RTAS, add to your project all the juce_RTAS_*.cpp files from the wrapper/RTAS folder. +- If building a VST, add to your project all the juce_VST_*.cpp files from the wrapper/VST folder. + +- Create yourself a JucePluginCharacteristics.h file, starting with a copy of the one in the + demo project. Go through each item inside it carefully, and set them to the appropriate value + for your plugin. + +- Under "Additional Include Directories", add the folder in which you're going to put + your JucePluginCharacteristics.h file. + +- If you're doing an RTAS, change these project settings (these can all be ignored if you're only doing a VST): + - Set "C++/Code Generation/Runtime Library" to be "Multi-threaded DLL" or "Multi-threaded Debug DLL" + - Set the "Linker/Input/Module Definition file" to point to "wrapper/RTAS/juce_RTAS_WinExports.def" + - Under "Linker/Input/Delay loaded DLLs", add the following: + "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; DSPManager.dll" + - You may (or may not) need to add "libcmtd.lib; libcmt.lib" to the "Linker/Input/Ignore Specific Library" setting. + - For ONLY the following files: + juce_RTAS_Wrapper.cpp, juce_RTAS_DigiCode1.cpp, juce_RTAS_DigiCode2.cpp, juce_RTAS_DigiCode3.cpp, + change their "C++/Advanced/Calling Convention" property to "__stdcall". All other files should + be left with the default calling convention of "__cdecl" + - Set the "Linker/General/Output File" property to "$(OutDir)\$(ProjectName).dpm" (If you're building + a polymorphic VST/RTAS, then you can simply copy or rename the finished .dpm file to a .dll, and + it'll function as a VST) + - Under "Custom build step", add the following command: + copy /Y "\yourdirectory\juce\extras\audio plugins\wrapper\RTAS\juce_RTAS_WinResources.rsr" "$(TargetPath)".rsr + The corresponding "Outputs" setting for this must be set to "$(TargetPath)".rsr + (This will copy and rename the juce_RTAS_WinResources.rsr file to sit next to the finished .dpm file. It's + a dummy resource file, but PT will refuse to load the plugin unless it has a corresponding .rsr file) + - Because the RTAS code duplicates some win32 constants, you might need to force it to link correctly + by adding "/FORCE:multiple" to the linker's additional command line options. + - You might want to change the output directory to "\Program Files\Common Files\Digidesign\DAE\Plug-Ins\" + if you want the built plugin to go directly into the PT plugins folder + - When setting properties, remember to change them for both your debug and release builds! + +- Create your actual plugin classes and add them to the project. Obviously this is the hard bit! + +- Add the amalgamated juce source file to the project - have a look at the demo app for neat ways of doing this. + +- NOTE: on Windows, because RTAS uses the altura mac-style code, there are annoying clashes caused if + you also include the Apple QuickTime headers, so you might need to turn off quicktime by setting the + juce config macro: #define JUCE_QUICKTIME 0 + +- NOTE: If you're using MSVC2005 to build your plugin, the users will need to + have the Microsoft VC8 Runtime installed on their machines, otherwise the DLL will + silently fail to load. You should probably add the runtime to your plugin's installer, + and you can get a copy of it here: + http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=en + + + +----------------------------------------------------------------------------------------------------- + + Creating a Mac AU/VST/RTAS plugin in XCode + ========================================== + + +- For an AU, make sure that the JucePlugin_Build_AU is enabled in your JucePluginCharacteristics.h +- In XCode, create a new project based on the "Audio Unit Effect" template +- XCode will create a bunch of template source files for you - you can remove all of these from the project + and delete them +- In the target settings, clear the "Exported Symbols File" setting. The exports are specified by directives + within the wrapper code, so don't need to be listed explicitly. +- All all the Apple frameworks that Juce normally requires to the "External Frameworks" list +- Add all the juce_AU_* files from the /wrapper/AU directory to your project +- The template project creates an AUPublic group that contains lots of AudioUnit source files. But + it leaves out files that it thinks you might not need, e.g. if you chose an "Audio Unit Effect" project, + then it won't add the classes for handling MIDI. So you'll probably need to go into this folder + and check that it contains AUMIDIBase.cpp, AUMidiEffectBase.cpp, MusicDeviceBase.cpp, etc +- As for the PC, you'll need to make sure your project contains a correctly set-up JucePluginCharacteristics.h + file - start with a copy of the one in the demo plugin project, and go through it making sure that + all the values make sense for your plugin. +- Create your actual plugin classes and add them to the project. Obviously this is the hard bit! + +You should now be able to build a functional AU! If you want VST support as well, then read on... + +- Make sure that the JucePlugin_Build_VST is enabled in your JucePluginCharacteristics.h +- For VST support, add all the juce_VST_* files from /wrapper/VST +- In your target info settings, add the vstsdk2_4 folder to your "Header Search Paths" list +- Make sure that in your Info.plist, the "Bundle Name" value is correctly set to the name of your plugin. + +Now, if you compile, the resulting bundle should work as both a VST and AU - you can simply copy or rename it, +changing the suffix to ".vst", and put it in your VST folder. + +If you also want to build an RTAS, then carry on reading... + + +- Make sure that the JucePlugin_Build_RTAS is enabled in your JucePluginCharacteristics.h +- After installing the Digidesign SDK, make sure you've run the config_SDK_for_Mac command in + its root directory. This sets up some of the tools that it needs. +- Add the files from /wrapper/RTAS to your project. Obviously a couple of these are for Windows, so + you shouldn't add those +- In the Digi SDK, in /AlturaPorts/TDMPlugins/common/mac, there are two config files: + CommonDebugSettings.xconfig and CommonReleaseSettings.xconfig + These contain lots of Digi hackery to get their stuff to compile, so you should add them to your project + and change your project's settings to use these files as their base config. Even so, it's all a bit of a mess, + and you may need to tweak them a bit to get it to work on your system. +- In your target settings, add a custom build setting called "MacBag", and set this to the path where the + "MacBag" folder of the Digi SDK lives. +- Add the following to your "Header Search Paths" setting (it's easiest to copy-and-paste this setting from + the demo project): + "$(MacBag)/../AlturaPorts/TDMPlugIns/PlugInLibrary/**" + "$(MacBag)/../AlturaPorts/TDMPlugIns/DSPManager/**" + "$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption" + "$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions" + "$(MacBag)/../AlturaPorts/TDMPlugIns/common" + "$(MacBag)/../AlturaPorts/TDMPlugIns/common/PI_LibInterface" + "$(MacBag)/../AlturaPorts/TDMPlugIns/PACEProtection/**" + "$(MacBag)/../AlturaPorts/OMS/Headers" + "$(MacBag)/../AlturaPorts/Fic/Interfaces/**" + "$(MacBag)/../AlturaPorts/Fic/Source/SignalNets" + "$(MacBag)/../AlturaPorts/DSIPublicInterface/PublicHeaders" + "$(MacBag)/../DAEWin/Include" + "$(MacBag)/../AlturaPorts/DigiPublic/Interfaces" + "$(MacBag)/../AlturaPorts/DigiPublic" + "$(MacBag)/../AlturaPorts/NewFileLibs/DOA" + "$(MacBag)/../AlturaPorts/NewFileLibs/Cmn" + "$(MacBag)/../AlturaPorts/TDMPlugIns/SignalProcessing/**" + "$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc" + "$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/utils" +- If you get include errors compiling some of the DigiDesign code, you may need to + add "/Developer/Headers/FlatCarbon" to your header search path. +- In the SDK, find the PluginLibrary.xcodeproj file, and add this to your "External frameworks and Libraries". + If you've already compiled this library, you can open its item in your XCode project treeview, to find + the "libPluginLibrary.a" item inside it. Drag this subitem down to your Target/"Link Binary With Libraries" + build stage and drop it there to add it to the link process. +- In your Info.plist, change the "Bundle OS Type Code" to "TDMw", and the "Bundle Creator OS Type Code" to + "PTul". + +You should now be able to build an RTAS! Again, just renaming the finished bundle to ".dpm" and +putting it in your RTAS folder should be do the trick. + +If you get any weird build problems, a good tip is to try comparing the demo plugin's build settings with your +own - this should usually show up what's missing. + + +Note about exported symbols: + When XCode builds the plugin, I've had unpredictable results when trying to stop it from exporting + all of the internal functions as public symbols. There are some flags that are supposed to turn this + off, but sometimes they don't seem to have any effect, and using an explicit exports file also + seems a bit hit-and-miss. (If anyone knows better and can get this working, please let me know!) + Anyway, as well as being wasteful and showing everyone what's inside your plugin, leaving all + the symbols in there will cause fatal crashes when used with Tracktion, or alongside any other + Juce-based plugins. A way of making sure your plugin is stripped is to use the command + "strip -x -S YourPlugin.vst/Contents/MacOS/YourPlugin" after bulding it, which removes the + unnecessary symbols (although in my experience this also doesn't seem to work all the time, + so it's a good idea to check it using the unix "nm" command). diff --git a/extras/audio plugins/demo/build/linux/premake.lua b/extras/audio plugins/demo/build/linux/premake.lua new file mode 100644 index 0000000000..f3782f6840 --- /dev/null +++ b/extras/audio plugins/demo/build/linux/premake.lua @@ -0,0 +1,55 @@ + +project.name = "JucePluginDemo" +project.bindir = "build" +project.libdir = "build" + +project.configs = { "Debug", "Release" } + +package = newpackage() +package.name = "JucePluginDemo" +package.kind = "dll" +package.language = "c++" + +package.objdir = "build/intermediate" +package.config["Debug"].objdir = "build/intermediate/Debug" +package.config["Release"].objdir = "build/intermediate/Release" + +package.config["Debug"].defines = { "LINUX=1", "DEBUG=1", "_DEBUG=1" } +package.config["Debug"].buildoptions = { "-O0 -ggdb -g3 -Wall" } + +package.config["Release"].defines = { "LINUX=1", "NDEBUG=1" } +package.config["Release"].buildoptions = { "-O2 -s" } + +package.includepaths = { + "/usr/include", + "../../../../../", + "/usr/include/vst/source/common", + "/usr/include/vst", + "../../src" +} + +package.libpaths = { + "../../../../../bin", + "/usr/X11R6/lib/", + "/usr/lib" +} + +package.config["Debug"].links = { + "freetype", "pthread", "rt", "X11", "GL", "GLU", "Xinerama", "asound", "juce_debug" +} + +package.config["Release"].links = { + "freetype", "pthread", "rt", "X11", "GL", "GLU", "Xinerama", "asound", "juce" +} + +package.files = { + matchfiles ( + "../../../wrapper/*.h", + "../../../wrapper/*.cpp", + "../../../wrapper/VST/*.cpp" + ), + matchrecursive ( + "../../src/*.h", + "../../src/*.cpp" + ) +} diff --git a/extras/audio plugins/demo/build/mac/English.lproj/InfoPlist.strings b/extras/audio plugins/demo/build/mac/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..7c6f58f634 Binary files /dev/null and b/extras/audio plugins/demo/build/mac/English.lproj/InfoPlist.strings differ diff --git a/extras/audio plugins/demo/build/mac/Info.plist b/extras/audio plugins/demo/build/mac/Info.plist new file mode 100644 index 0000000000..fbf8cc771d --- /dev/null +++ b/extras/audio plugins/demo/build/mac/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.rawmaterialsoftware.${PRODUCT_NAME:identifier} + CFBundleName + ${PRODUCT_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.1 + CFBundleSignature + ???? + CFBundleVersion + 1.1 + CSResourcesFileMapped + + + diff --git a/extras/audio plugins/demo/build/mac/JuceDemoPlugin.xcodeproj/project.pbxproj b/extras/audio plugins/demo/build/mac/JuceDemoPlugin.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..9fb8800d00 --- /dev/null +++ b/extras/audio plugins/demo/build/mac/JuceDemoPlugin.xcodeproj/project.pbxproj @@ -0,0 +1,713 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 3EEA126E089847F5002C6BFC /* CAVectorUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */; }; + 3EEA126F089847F5002C6BFC /* CAVectorUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */; }; + 3EEA1270089847F5002C6BFC /* CAVectorUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */; }; + 843792AA0EFBF14B002A2725 /* DemoEditorComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843792A20EFBF14B002A2725 /* DemoEditorComponent.cpp */; }; + 843792AB0EFBF14B002A2725 /* DemoEditorComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 843792A30EFBF14B002A2725 /* DemoEditorComponent.h */; }; + 843792AC0EFBF14B002A2725 /* DemoJuceFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843792A40EFBF14B002A2725 /* DemoJuceFilter.cpp */; }; + 843792AD0EFBF14B002A2725 /* DemoJuceFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 843792A50EFBF14B002A2725 /* DemoJuceFilter.h */; }; + 843792AE0EFBF14B002A2725 /* includes.h in Headers */ = {isa = PBXBuildFile; fileRef = 843792A60EFBF14B002A2725 /* includes.h */; }; + 843792AF0EFBF14B002A2725 /* juce_AppConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 843792A70EFBF14B002A2725 /* juce_AppConfig.h */; }; + 843792B00EFBF14B002A2725 /* juce_LibrarySource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 843792A80EFBF14B002A2725 /* juce_LibrarySource.mm */; }; + 843792B10EFBF14B002A2725 /* JucePluginCharacteristics.h in Headers */ = {isa = PBXBuildFile; fileRef = 843792A90EFBF14B002A2725 /* JucePluginCharacteristics.h */; }; + 843792B50EFBF175002A2725 /* juce_AU_Resources.r in Rez */ = {isa = PBXBuildFile; fileRef = 843792B30EFBF175002A2725 /* juce_AU_Resources.r */; }; + 843792B60EFBF175002A2725 /* juce_AU_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 843792B40EFBF175002A2725 /* juce_AU_Wrapper.mm */; }; + 8437956E0EFBF323002A2725 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795630EFBF323002A2725 /* AudioToolbox.framework */; }; + 8437956F0EFBF323002A2725 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795640EFBF323002A2725 /* AudioUnit.framework */; }; + 843795700EFBF323002A2725 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795650EFBF323002A2725 /* Cocoa.framework */; }; + 843795710EFBF323002A2725 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795660EFBF323002A2725 /* OpenGL.framework */; }; + 843795720EFBF323002A2725 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795670EFBF323002A2725 /* IOKit.framework */; }; + 843795730EFBF323002A2725 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795680EFBF323002A2725 /* Carbon.framework */; }; + 843795740EFBF323002A2725 /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843795690EFBF323002A2725 /* CoreMIDI.framework */; }; + 843795750EFBF323002A2725 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8437956A0EFBF323002A2725 /* CoreAudio.framework */; }; + 843795760EFBF323002A2725 /* DiscRecording.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8437956B0EFBF323002A2725 /* DiscRecording.framework */; }; + 843795770EFBF323002A2725 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8437956C0EFBF323002A2725 /* QTKit.framework */; }; + 843795780EFBF323002A2725 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8437956D0EFBF323002A2725 /* WebKit.framework */; }; + 843796690EFBF357002A2725 /* AUMIDIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8437965F0EFBF357002A2725 /* AUMIDIBase.cpp */; }; + 8437966A0EFBF357002A2725 /* AUMIDIBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 843796600EFBF357002A2725 /* AUMIDIBase.h */; }; + 8437966B0EFBF357002A2725 /* AUMIDIEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796610EFBF357002A2725 /* AUMIDIEffectBase.cpp */; }; + 8437966C0EFBF357002A2725 /* AUMIDIEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 843796620EFBF357002A2725 /* AUMIDIEffectBase.h */; }; + 8437966D0EFBF357002A2725 /* AUOutputBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796630EFBF357002A2725 /* AUOutputBase.cpp */; }; + 8437966E0EFBF357002A2725 /* AUOutputBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 843796640EFBF357002A2725 /* AUOutputBase.h */; }; + 843796710EFBF357002A2725 /* MusicDeviceBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796670EFBF357002A2725 /* MusicDeviceBase.cpp */; }; + 843796720EFBF357002A2725 /* MusicDeviceBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 843796680EFBF357002A2725 /* MusicDeviceBase.h */; }; + 843796750EFBF416002A2725 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843796740EFBF416002A2725 /* CoreFoundation.framework */; }; + 8437967F0EFBF5E4002A2725 /* juce_VST_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8437967D0EFBF5E4002A2725 /* juce_VST_Wrapper.cpp */; }; + 843796800EFBF5E4002A2725 /* juce_VST_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8437967E0EFBF5E4002A2725 /* juce_VST_Wrapper.mm */; }; + 843796DC0EFBFD16002A2725 /* juce_RTAS_DigiCode1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796D50EFBFD16002A2725 /* juce_RTAS_DigiCode1.cpp */; }; + 843796DD0EFBFD16002A2725 /* juce_RTAS_DigiCode2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796D60EFBFD16002A2725 /* juce_RTAS_DigiCode2.cpp */; }; + 843796DE0EFBFD16002A2725 /* juce_RTAS_DigiCode3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796D70EFBFD16002A2725 /* juce_RTAS_DigiCode3.cpp */; }; + 843796DF0EFBFD16002A2725 /* juce_RTAS_DigiCode_Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 843796D80EFBFD16002A2725 /* juce_RTAS_DigiCode_Header.h */; }; + 843796E00EFBFD16002A2725 /* juce_RTAS_MacResources.r in Rez */ = {isa = PBXBuildFile; fileRef = 843796D90EFBFD16002A2725 /* juce_RTAS_MacResources.r */; }; + 843796E10EFBFD16002A2725 /* juce_RTAS_MacUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = 843796DA0EFBFD16002A2725 /* juce_RTAS_MacUtilities.mm */; }; + 843796E20EFBFD16002A2725 /* juce_RTAS_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843796DB0EFBFD16002A2725 /* juce_RTAS_Wrapper.cpp */; }; + 843796F60EFC0102002A2725 /* CommonDebugSettings.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 843796F40EFC0102002A2725 /* CommonDebugSettings.xcconfig */; }; + 843796F70EFC0102002A2725 /* CommonReleaseSettings.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 843796F50EFC0102002A2725 /* CommonReleaseSettings.xcconfig */; }; + 843797050EFC0269002A2725 /* libPluginLibrary.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 843797030EFC022E002A2725 /* libPluginLibrary.a */; }; + 8BA05AAE072073D300365D66 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A7F072073D200365D66 /* AUBase.cpp */; }; + 8BA05AAF072073D300365D66 /* AUBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A80072073D200365D66 /* AUBase.h */; }; + 8BA05AB0072073D300365D66 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A81072073D200365D66 /* AUDispatch.cpp */; }; + 8BA05AB1072073D300365D66 /* AUDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A82072073D200365D66 /* AUDispatch.h */; }; + 8BA05AB2072073D300365D66 /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A83072073D200365D66 /* AUInputElement.cpp */; }; + 8BA05AB3072073D300365D66 /* AUInputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A84072073D200365D66 /* AUInputElement.h */; }; + 8BA05AB4072073D300365D66 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A85072073D200365D66 /* AUOutputElement.cpp */; }; + 8BA05AB5072073D300365D66 /* AUOutputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A86072073D200365D66 /* AUOutputElement.h */; }; + 8BA05AB7072073D300365D66 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A88072073D200365D66 /* AUScopeElement.cpp */; }; + 8BA05AB8072073D300365D66 /* AUScopeElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A89072073D200365D66 /* AUScopeElement.h */; }; + 8BA05AB9072073D300365D66 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A8A072073D200365D66 /* ComponentBase.cpp */; }; + 8BA05ABA072073D300365D66 /* ComponentBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A8B072073D200365D66 /* ComponentBase.h */; }; + 8BA05AC6072073D300365D66 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */; }; + 8BA05AC7072073D300365D66 /* AUEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A9B072073D200365D66 /* AUEffectBase.h */; }; + 8BA05AD2072073D300365D66 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AA7072073D200365D66 /* AUBuffer.cpp */; }; + 8BA05AD3072073D300365D66 /* AUBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AA8072073D200365D66 /* AUBuffer.h */; }; + 8BA05AD4072073D300365D66 /* AUDebugDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */; }; + 8BA05AD5072073D300365D66 /* AUDebugDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */; }; + 8BA05AD6072073D300365D66 /* AUInputFormatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */; }; + 8BA05AD7072073D300365D66 /* AUSilentTimeout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */; }; + 8BA05AD8072073D300365D66 /* AUTimestampGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */; }; + 8BA05AE50720742100365D66 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */; }; + 8BA05AE60720742100365D66 /* CAAudioChannelLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */; }; + 8BA05AE70720742100365D66 /* CAMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AE10720742100365D66 /* CAMutex.cpp */; }; + 8BA05AE80720742100365D66 /* CAMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE20720742100365D66 /* CAMutex.h */; }; + 8BA05AE90720742100365D66 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */; }; + 8BA05AEA0720742100365D66 /* CAStreamBasicDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */; }; + 8BA05B070720754400365D66 /* CAAUParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05B050720754400365D66 /* CAAUParameter.cpp */; }; + 8BA05B080720754400365D66 /* CAAUParameter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05B060720754400365D66 /* CAAUParameter.h */; }; + 8D01CCCA0486CAD60068D4B7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 843797020EFC022E002A2725 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 843796FE0EFC022E002A2725 /* PluginLibrary.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B65B09B30860FB0800FE2E6A; + remoteInfo = "Plugin Library"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAVectorUnit.cpp; sourceTree = ""; }; + 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnit.h; sourceTree = ""; }; + 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnitTypes.h; sourceTree = ""; }; + 843792A20EFBF14B002A2725 /* DemoEditorComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DemoEditorComponent.cpp; path = ../../src/DemoEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 843792A30EFBF14B002A2725 /* DemoEditorComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DemoEditorComponent.h; path = ../../src/DemoEditorComponent.h; sourceTree = SOURCE_ROOT; }; + 843792A40EFBF14B002A2725 /* DemoJuceFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DemoJuceFilter.cpp; path = ../../src/DemoJuceFilter.cpp; sourceTree = SOURCE_ROOT; }; + 843792A50EFBF14B002A2725 /* DemoJuceFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DemoJuceFilter.h; path = ../../src/DemoJuceFilter.h; sourceTree = SOURCE_ROOT; }; + 843792A60EFBF14B002A2725 /* includes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = includes.h; path = ../../src/includes.h; sourceTree = SOURCE_ROOT; }; + 843792A70EFBF14B002A2725 /* juce_AppConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_AppConfig.h; path = ../../src/juce_AppConfig.h; sourceTree = SOURCE_ROOT; }; + 843792A80EFBF14B002A2725 /* juce_LibrarySource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_LibrarySource.mm; path = ../../src/juce_LibrarySource.mm; sourceTree = SOURCE_ROOT; }; + 843792A90EFBF14B002A2725 /* JucePluginCharacteristics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JucePluginCharacteristics.h; path = ../../src/JucePluginCharacteristics.h; sourceTree = SOURCE_ROOT; }; + 843792B30EFBF175002A2725 /* juce_AU_Resources.r */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; name = juce_AU_Resources.r; path = ../../../wrapper/AU/juce_AU_Resources.r; sourceTree = SOURCE_ROOT; }; + 843792B40EFBF175002A2725 /* juce_AU_Wrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_AU_Wrapper.mm; path = ../../../wrapper/AU/juce_AU_Wrapper.mm; sourceTree = SOURCE_ROOT; }; + 843795630EFBF323002A2725 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; + 843795640EFBF323002A2725 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = ""; }; + 843795650EFBF323002A2725 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 843795660EFBF323002A2725 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 843795670EFBF323002A2725 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + 843795680EFBF323002A2725 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 843795690EFBF323002A2725 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = ""; }; + 8437956A0EFBF323002A2725 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 8437956B0EFBF323002A2725 /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = /System/Library/Frameworks/DiscRecording.framework; sourceTree = ""; }; + 8437956C0EFBF323002A2725 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; + 8437956D0EFBF323002A2725 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = ""; }; + 8437965F0EFBF357002A2725 /* AUMIDIBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIBase.cpp; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp; sourceTree = DEVELOPER_DIR; }; + 843796600EFBF357002A2725 /* AUMIDIBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUMIDIBase.h; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h; sourceTree = DEVELOPER_DIR; }; + 843796610EFBF357002A2725 /* AUMIDIEffectBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIEffectBase.cpp; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp; sourceTree = DEVELOPER_DIR; }; + 843796620EFBF357002A2725 /* AUMIDIEffectBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUMIDIEffectBase.h; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h; sourceTree = DEVELOPER_DIR; }; + 843796630EFBF357002A2725 /* AUOutputBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputBase.cpp; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp; sourceTree = DEVELOPER_DIR; }; + 843796640EFBF357002A2725 /* AUOutputBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUOutputBase.h; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h; sourceTree = DEVELOPER_DIR; }; + 843796670EFBF357002A2725 /* MusicDeviceBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp; sourceTree = DEVELOPER_DIR; }; + 843796680EFBF357002A2725 /* MusicDeviceBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MusicDeviceBase.h; path = Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h; sourceTree = DEVELOPER_DIR; }; + 843796740EFBF416002A2725 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 8437967D0EFBF5E4002A2725 /* juce_VST_Wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VST_Wrapper.cpp; path = ../../../wrapper/VST/juce_VST_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; + 8437967E0EFBF5E4002A2725 /* juce_VST_Wrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_VST_Wrapper.mm; path = ../../../wrapper/VST/juce_VST_Wrapper.mm; sourceTree = SOURCE_ROOT; }; + 843796D50EFBFD16002A2725 /* juce_RTAS_DigiCode1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode1.cpp; path = ../../../wrapper/RTAS/juce_RTAS_DigiCode1.cpp; sourceTree = SOURCE_ROOT; }; + 843796D60EFBFD16002A2725 /* juce_RTAS_DigiCode2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode2.cpp; path = ../../../wrapper/RTAS/juce_RTAS_DigiCode2.cpp; sourceTree = SOURCE_ROOT; }; + 843796D70EFBFD16002A2725 /* juce_RTAS_DigiCode3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode3.cpp; path = ../../../wrapper/RTAS/juce_RTAS_DigiCode3.cpp; sourceTree = SOURCE_ROOT; }; + 843796D80EFBFD16002A2725 /* juce_RTAS_DigiCode_Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_RTAS_DigiCode_Header.h; path = ../../../wrapper/RTAS/juce_RTAS_DigiCode_Header.h; sourceTree = SOURCE_ROOT; }; + 843796D90EFBFD16002A2725 /* juce_RTAS_MacResources.r */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; name = juce_RTAS_MacResources.r; path = ../../../wrapper/RTAS/juce_RTAS_MacResources.r; sourceTree = SOURCE_ROOT; }; + 843796DA0EFBFD16002A2725 /* juce_RTAS_MacUtilities.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_RTAS_MacUtilities.mm; path = ../../../wrapper/RTAS/juce_RTAS_MacUtilities.mm; sourceTree = SOURCE_ROOT; }; + 843796DB0EFBFD16002A2725 /* juce_RTAS_Wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_Wrapper.cpp; path = ../../../wrapper/RTAS/juce_RTAS_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; + 843796F40EFC0102002A2725 /* CommonDebugSettings.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CommonDebugSettings.xcconfig; path = /Users/jules/stuff/PT_73_SDK/AlturaPorts/TDMPlugIns/common/Mac/CommonDebugSettings.xcconfig; sourceTree = ""; }; + 843796F50EFC0102002A2725 /* CommonReleaseSettings.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CommonReleaseSettings.xcconfig; path = /Users/jules/stuff/PT_73_SDK/AlturaPorts/TDMPlugIns/common/Mac/CommonReleaseSettings.xcconfig; sourceTree = ""; }; + 843796FE0EFC022E002A2725 /* PluginLibrary.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PluginLibrary.xcodeproj; path = /Users/jules/stuff/PT_73_SDK/AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild/PluginLibrary.xcodeproj; sourceTree = ""; }; + 8BA05A7F072073D200365D66 /* AUBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUBase.cpp; sourceTree = ""; }; + 8BA05A80072073D200365D66 /* AUBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUBase.h; sourceTree = ""; }; + 8BA05A81072073D200365D66 /* AUDispatch.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUDispatch.cpp; sourceTree = ""; }; + 8BA05A82072073D200365D66 /* AUDispatch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUDispatch.h; sourceTree = ""; }; + 8BA05A83072073D200365D66 /* AUInputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUInputElement.cpp; sourceTree = ""; }; + 8BA05A84072073D200365D66 /* AUInputElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUInputElement.h; sourceTree = ""; }; + 8BA05A85072073D200365D66 /* AUOutputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUOutputElement.cpp; sourceTree = ""; }; + 8BA05A86072073D200365D66 /* AUOutputElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUOutputElement.h; sourceTree = ""; }; + 8BA05A87072073D200365D66 /* AUResources.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; path = AUResources.r; sourceTree = ""; }; + 8BA05A88072073D200365D66 /* AUScopeElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUScopeElement.cpp; sourceTree = ""; }; + 8BA05A89072073D200365D66 /* AUScopeElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUScopeElement.h; sourceTree = ""; }; + 8BA05A8A072073D200365D66 /* ComponentBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ComponentBase.cpp; sourceTree = ""; }; + 8BA05A8B072073D200365D66 /* ComponentBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ComponentBase.h; sourceTree = ""; }; + 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUEffectBase.cpp; sourceTree = ""; }; + 8BA05A9B072073D200365D66 /* AUEffectBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUEffectBase.h; sourceTree = ""; }; + 8BA05AA7072073D200365D66 /* AUBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUBuffer.cpp; sourceTree = ""; }; + 8BA05AA8072073D200365D66 /* AUBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUBuffer.h; sourceTree = ""; }; + 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUDebugDispatcher.cpp; sourceTree = ""; }; + 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUDebugDispatcher.h; sourceTree = ""; }; + 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUInputFormatConverter.h; sourceTree = ""; }; + 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUSilentTimeout.h; sourceTree = ""; }; + 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUTimestampGenerator.h; sourceTree = ""; }; + 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioChannelLayout.cpp; sourceTree = ""; }; + 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAudioChannelLayout.h; sourceTree = ""; }; + 8BA05AE10720742100365D66 /* CAMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAMutex.cpp; sourceTree = ""; }; + 8BA05AE20720742100365D66 /* CAMutex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAMutex.h; sourceTree = ""; }; + 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAStreamBasicDescription.cpp; sourceTree = ""; }; + 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAStreamBasicDescription.h; sourceTree = ""; }; + 8BA05B050720754400365D66 /* CAAUParameter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAUParameter.cpp; sourceTree = ""; }; + 8BA05B060720754400365D66 /* CAAUParameter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAUParameter.h; sourceTree = ""; }; + 8D01CCD10486CAD60068D4B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D01CCD20486CAD60068D4B7 /* JuceDemoPlugin.component */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JuceDemoPlugin.component; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D01CCCD0486CAD60068D4B7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 843797050EFC0269002A2725 /* libPluginLibrary.a in Frameworks */, + 8437956E0EFBF323002A2725 /* AudioToolbox.framework in Frameworks */, + 8437956F0EFBF323002A2725 /* AudioUnit.framework in Frameworks */, + 843795700EFBF323002A2725 /* Cocoa.framework in Frameworks */, + 843795710EFBF323002A2725 /* OpenGL.framework in Frameworks */, + 843795720EFBF323002A2725 /* IOKit.framework in Frameworks */, + 843795730EFBF323002A2725 /* Carbon.framework in Frameworks */, + 843795740EFBF323002A2725 /* CoreMIDI.framework in Frameworks */, + 843795750EFBF323002A2725 /* CoreAudio.framework in Frameworks */, + 843795760EFBF323002A2725 /* DiscRecording.framework in Frameworks */, + 843795770EFBF323002A2725 /* QTKit.framework in Frameworks */, + 843795780EFBF323002A2725 /* WebKit.framework in Frameworks */, + 843796750EFBF416002A2725 /* CoreFoundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 089C166AFE841209C02AAC07 /* JuceDemoPlugin */ = { + isa = PBXGroup; + children = ( + 843796F40EFC0102002A2725 /* CommonDebugSettings.xcconfig */, + 843796F50EFC0102002A2725 /* CommonReleaseSettings.xcconfig */, + 08FB77ADFE841716C02AAC07 /* Source */, + 089C167CFE841241C02AAC07 /* Resources */, + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */, + 19C28FB4FE9D528D11CA2CBB /* Products */, + ); + name = JuceDemoPlugin; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 843796FE0EFC022E002A2725 /* PluginLibrary.xcodeproj */, + 843796740EFBF416002A2725 /* CoreFoundation.framework */, + 843795630EFBF323002A2725 /* AudioToolbox.framework */, + 843795640EFBF323002A2725 /* AudioUnit.framework */, + 843795650EFBF323002A2725 /* Cocoa.framework */, + 843795660EFBF323002A2725 /* OpenGL.framework */, + 843795670EFBF323002A2725 /* IOKit.framework */, + 843795680EFBF323002A2725 /* Carbon.framework */, + 843795690EFBF323002A2725 /* CoreMIDI.framework */, + 8437956A0EFBF323002A2725 /* CoreAudio.framework */, + 8437956B0EFBF323002A2725 /* DiscRecording.framework */, + 8437956C0EFBF323002A2725 /* QTKit.framework */, + 8437956D0EFBF323002A2725 /* WebKit.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8D01CCD10486CAD60068D4B7 /* Info.plist */, + 089C167DFE841241C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77ADFE841716C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 8437929D0EFBF08E002A2725 /* Filter */, + 8437929E0EFBF098002A2725 /* Wrapper Code */, + ); + name = Source; + sourceTree = ""; + }; + 19C28FB4FE9D528D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D01CCD20486CAD60068D4B7 /* JuceDemoPlugin.component */, + ); + name = Products; + sourceTree = ""; + }; + 8437929D0EFBF08E002A2725 /* Filter */ = { + isa = PBXGroup; + children = ( + 843792A20EFBF14B002A2725 /* DemoEditorComponent.cpp */, + 843792A30EFBF14B002A2725 /* DemoEditorComponent.h */, + 843792A40EFBF14B002A2725 /* DemoJuceFilter.cpp */, + 843792A50EFBF14B002A2725 /* DemoJuceFilter.h */, + 843792A60EFBF14B002A2725 /* includes.h */, + 843792A70EFBF14B002A2725 /* juce_AppConfig.h */, + 843792A80EFBF14B002A2725 /* juce_LibrarySource.mm */, + 843792A90EFBF14B002A2725 /* JucePluginCharacteristics.h */, + ); + name = Filter; + sourceTree = ""; + }; + 8437929E0EFBF098002A2725 /* Wrapper Code */ = { + isa = PBXGroup; + children = ( + 843796D40EFBFCE3002A2725 /* Juce RTAS Wrapper */, + 8437967C0EFBF5C6002A2725 /* Juce VST Wrapper */, + 843792B20EFBF157002A2725 /* Juce AU Wrapper */, + 8BA05AEB0720742700365D66 /* PublicUtility */, + 8BA05A7D072073D200365D66 /* AUPublic */, + ); + name = "Wrapper Code"; + sourceTree = ""; + }; + 843792B20EFBF157002A2725 /* Juce AU Wrapper */ = { + isa = PBXGroup; + children = ( + 843792B30EFBF175002A2725 /* juce_AU_Resources.r */, + 843792B40EFBF175002A2725 /* juce_AU_Wrapper.mm */, + ); + name = "Juce AU Wrapper"; + sourceTree = ""; + }; + 8437967C0EFBF5C6002A2725 /* Juce VST Wrapper */ = { + isa = PBXGroup; + children = ( + 8437967D0EFBF5E4002A2725 /* juce_VST_Wrapper.cpp */, + 8437967E0EFBF5E4002A2725 /* juce_VST_Wrapper.mm */, + ); + name = "Juce VST Wrapper"; + sourceTree = ""; + }; + 843796D40EFBFCE3002A2725 /* Juce RTAS Wrapper */ = { + isa = PBXGroup; + children = ( + 843796D50EFBFD16002A2725 /* juce_RTAS_DigiCode1.cpp */, + 843796D60EFBFD16002A2725 /* juce_RTAS_DigiCode2.cpp */, + 843796D70EFBFD16002A2725 /* juce_RTAS_DigiCode3.cpp */, + 843796D80EFBFD16002A2725 /* juce_RTAS_DigiCode_Header.h */, + 843796D90EFBFD16002A2725 /* juce_RTAS_MacResources.r */, + 843796DA0EFBFD16002A2725 /* juce_RTAS_MacUtilities.mm */, + 843796DB0EFBFD16002A2725 /* juce_RTAS_Wrapper.cpp */, + ); + name = "Juce RTAS Wrapper"; + sourceTree = ""; + }; + 843796FF0EFC022E002A2725 /* Products */ = { + isa = PBXGroup; + children = ( + 843797030EFC022E002A2725 /* libPluginLibrary.a */, + ); + name = Products; + sourceTree = ""; + }; + 8BA05A7D072073D200365D66 /* AUPublic */ = { + isa = PBXGroup; + children = ( + 8BA05A7E072073D200365D66 /* AUBase */, + 8BA05A99072073D200365D66 /* OtherBases */, + 8BA05AA6072073D200365D66 /* Utility */, + ); + name = AUPublic; + path = Examples/CoreAudio/AudioUnits/AUPublic; + sourceTree = DEVELOPER_DIR; + }; + 8BA05A7E072073D200365D66 /* AUBase */ = { + isa = PBXGroup; + children = ( + 8BA05A7F072073D200365D66 /* AUBase.cpp */, + 8BA05A80072073D200365D66 /* AUBase.h */, + 8BA05A81072073D200365D66 /* AUDispatch.cpp */, + 8BA05A82072073D200365D66 /* AUDispatch.h */, + 8BA05A83072073D200365D66 /* AUInputElement.cpp */, + 8BA05A84072073D200365D66 /* AUInputElement.h */, + 8BA05A85072073D200365D66 /* AUOutputElement.cpp */, + 8BA05A86072073D200365D66 /* AUOutputElement.h */, + 8BA05A87072073D200365D66 /* AUResources.r */, + 8BA05A88072073D200365D66 /* AUScopeElement.cpp */, + 8BA05A89072073D200365D66 /* AUScopeElement.h */, + 8BA05A8A072073D200365D66 /* ComponentBase.cpp */, + 8BA05A8B072073D200365D66 /* ComponentBase.h */, + ); + path = AUBase; + sourceTree = ""; + }; + 8BA05A99072073D200365D66 /* OtherBases */ = { + isa = PBXGroup; + children = ( + 8437965F0EFBF357002A2725 /* AUMIDIBase.cpp */, + 843796600EFBF357002A2725 /* AUMIDIBase.h */, + 843796610EFBF357002A2725 /* AUMIDIEffectBase.cpp */, + 843796620EFBF357002A2725 /* AUMIDIEffectBase.h */, + 843796630EFBF357002A2725 /* AUOutputBase.cpp */, + 843796640EFBF357002A2725 /* AUOutputBase.h */, + 843796670EFBF357002A2725 /* MusicDeviceBase.cpp */, + 843796680EFBF357002A2725 /* MusicDeviceBase.h */, + 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */, + 8BA05A9B072073D200365D66 /* AUEffectBase.h */, + ); + path = OtherBases; + sourceTree = ""; + }; + 8BA05AA6072073D200365D66 /* Utility */ = { + isa = PBXGroup; + children = ( + 8BA05AA7072073D200365D66 /* AUBuffer.cpp */, + 8BA05AA8072073D200365D66 /* AUBuffer.h */, + 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */, + 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */, + 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */, + 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */, + 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */, + ); + path = Utility; + sourceTree = ""; + }; + 8BA05AEB0720742700365D66 /* PublicUtility */ = { + isa = PBXGroup; + children = ( + 8BA05B050720754400365D66 /* CAAUParameter.cpp */, + 8BA05B060720754400365D66 /* CAAUParameter.h */, + 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */, + 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */, + 8BA05AE10720742100365D66 /* CAMutex.cpp */, + 8BA05AE20720742100365D66 /* CAMutex.h */, + 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */, + 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */, + 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */, + 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */, + 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */, + ); + name = PublicUtility; + path = Examples/CoreAudio/PublicUtility; + sourceTree = DEVELOPER_DIR; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8D01CCC70486CAD60068D4B7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BA05AAF072073D300365D66 /* AUBase.h in Headers */, + 8BA05AB1072073D300365D66 /* AUDispatch.h in Headers */, + 8BA05AB3072073D300365D66 /* AUInputElement.h in Headers */, + 8BA05AB5072073D300365D66 /* AUOutputElement.h in Headers */, + 8BA05AB8072073D300365D66 /* AUScopeElement.h in Headers */, + 8BA05ABA072073D300365D66 /* ComponentBase.h in Headers */, + 8BA05AC7072073D300365D66 /* AUEffectBase.h in Headers */, + 8BA05AD3072073D300365D66 /* AUBuffer.h in Headers */, + 8BA05AD5072073D300365D66 /* AUDebugDispatcher.h in Headers */, + 8BA05AD6072073D300365D66 /* AUInputFormatConverter.h in Headers */, + 8BA05AD7072073D300365D66 /* AUSilentTimeout.h in Headers */, + 8BA05AD8072073D300365D66 /* AUTimestampGenerator.h in Headers */, + 8BA05AE60720742100365D66 /* CAAudioChannelLayout.h in Headers */, + 8BA05AE80720742100365D66 /* CAMutex.h in Headers */, + 8BA05AEA0720742100365D66 /* CAStreamBasicDescription.h in Headers */, + 8BA05B080720754400365D66 /* CAAUParameter.h in Headers */, + 3EEA126F089847F5002C6BFC /* CAVectorUnit.h in Headers */, + 3EEA1270089847F5002C6BFC /* CAVectorUnitTypes.h in Headers */, + 843792AB0EFBF14B002A2725 /* DemoEditorComponent.h in Headers */, + 843792AD0EFBF14B002A2725 /* DemoJuceFilter.h in Headers */, + 843792AE0EFBF14B002A2725 /* includes.h in Headers */, + 843792AF0EFBF14B002A2725 /* juce_AppConfig.h in Headers */, + 843792B10EFBF14B002A2725 /* JucePluginCharacteristics.h in Headers */, + 8437966A0EFBF357002A2725 /* AUMIDIBase.h in Headers */, + 8437966C0EFBF357002A2725 /* AUMIDIEffectBase.h in Headers */, + 8437966E0EFBF357002A2725 /* AUOutputBase.h in Headers */, + 843796720EFBF357002A2725 /* MusicDeviceBase.h in Headers */, + 843796DF0EFBFD16002A2725 /* juce_RTAS_DigiCode_Header.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8D01CCC60486CAD60068D4B7 /* JuceDemoPlugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3E4BA243089833B7007656EC /* Build configuration list for PBXNativeTarget "JuceDemoPlugin" */; + buildPhases = ( + 8D01CCC70486CAD60068D4B7 /* Headers */, + 8D01CCC90486CAD60068D4B7 /* Resources */, + 8D01CCCB0486CAD60068D4B7 /* Sources */, + 8D01CCCD0486CAD60068D4B7 /* Frameworks */, + 8D01CCCF0486CAD60068D4B7 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JuceDemoPlugin; + productInstallPath = "$(HOME)/Library/Bundles"; + productName = JuceDemoPlugin; + productReference = 8D01CCD20486CAD60068D4B7 /* JuceDemoPlugin.component */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 089C1669FE841209C02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 3E4BA247089833B7007656EC /* Build configuration list for PBXProject "JuceDemoPlugin" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 089C166AFE841209C02AAC07 /* JuceDemoPlugin */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 843796FF0EFC022E002A2725 /* Products */; + ProjectRef = 843796FE0EFC022E002A2725 /* PluginLibrary.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 8D01CCC60486CAD60068D4B7 /* JuceDemoPlugin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 843797030EFC022E002A2725 /* libPluginLibrary.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libPluginLibrary.a; + remoteRef = 843797020EFC022E002A2725 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D01CCC90486CAD60068D4B7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D01CCCA0486CAD60068D4B7 /* InfoPlist.strings in Resources */, + 843796F60EFC0102002A2725 /* CommonDebugSettings.xcconfig in Resources */, + 843796F70EFC0102002A2725 /* CommonReleaseSettings.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 8D01CCCF0486CAD60068D4B7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + 843792B50EFBF175002A2725 /* juce_AU_Resources.r in Rez */, + 843796E00EFBFD16002A2725 /* juce_RTAS_MacResources.r in Rez */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D01CCCB0486CAD60068D4B7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BA05AAE072073D300365D66 /* AUBase.cpp in Sources */, + 8BA05AB0072073D300365D66 /* AUDispatch.cpp in Sources */, + 8BA05AB2072073D300365D66 /* AUInputElement.cpp in Sources */, + 8BA05AB4072073D300365D66 /* AUOutputElement.cpp in Sources */, + 8BA05AB7072073D300365D66 /* AUScopeElement.cpp in Sources */, + 8BA05AB9072073D300365D66 /* ComponentBase.cpp in Sources */, + 8BA05AC6072073D300365D66 /* AUEffectBase.cpp in Sources */, + 8BA05AD2072073D300365D66 /* AUBuffer.cpp in Sources */, + 8BA05AD4072073D300365D66 /* AUDebugDispatcher.cpp in Sources */, + 8BA05AE50720742100365D66 /* CAAudioChannelLayout.cpp in Sources */, + 8BA05AE70720742100365D66 /* CAMutex.cpp in Sources */, + 8BA05AE90720742100365D66 /* CAStreamBasicDescription.cpp in Sources */, + 8BA05B070720754400365D66 /* CAAUParameter.cpp in Sources */, + 3EEA126E089847F5002C6BFC /* CAVectorUnit.cpp in Sources */, + 843792AA0EFBF14B002A2725 /* DemoEditorComponent.cpp in Sources */, + 843792AC0EFBF14B002A2725 /* DemoJuceFilter.cpp in Sources */, + 843792B00EFBF14B002A2725 /* juce_LibrarySource.mm in Sources */, + 843792B60EFBF175002A2725 /* juce_AU_Wrapper.mm in Sources */, + 843796690EFBF357002A2725 /* AUMIDIBase.cpp in Sources */, + 8437966B0EFBF357002A2725 /* AUMIDIEffectBase.cpp in Sources */, + 8437966D0EFBF357002A2725 /* AUOutputBase.cpp in Sources */, + 843796710EFBF357002A2725 /* MusicDeviceBase.cpp in Sources */, + 8437967F0EFBF5E4002A2725 /* juce_VST_Wrapper.cpp in Sources */, + 843796800EFBF5E4002A2725 /* juce_VST_Wrapper.mm in Sources */, + 843796DC0EFBFD16002A2725 /* juce_RTAS_DigiCode1.cpp in Sources */, + 843796DD0EFBFD16002A2725 /* juce_RTAS_DigiCode2.cpp in Sources */, + 843796DE0EFBFD16002A2725 /* juce_RTAS_DigiCode3.cpp in Sources */, + 843796E10EFBFD16002A2725 /* juce_RTAS_MacUtilities.mm in Sources */, + 843796E20EFBFD16002A2725 /* juce_RTAS_Wrapper.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C167EFE841241C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3E4BA244089833B7007656EC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GENERATE_PKGINFO_FILE = YES; + HEADER_SEARCH_PATHS = ( + /Developer/Headers/FlatCarbon, + "~/stuff/vstsdk2.4", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/PlugInLibrary/**\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/DSPManager/**\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/common\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/common/PI_LibInterface\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/PACEProtection/**\"", + "\"$(MacBag)/../AlturaPorts/OMS/Headers\"", + "\"$(MacBag)/../AlturaPorts/Fic/Interfaces/**\"", + "\"$(MacBag)/../AlturaPorts/Fic/Source/SignalNets\"", + "\"$(MacBag)/../AlturaPorts/DSIPublicInterface/PublicHeaders\"", + "\"$(MacBag)/../DAEWin/Include\"", + "\"$(MacBag)/../AlturaPorts/DigiPublic/Interfaces\"", + "\"$(MacBag)/../AlturaPorts/DigiPublic\"", + "\"$(MacBag)/../AlturaPorts/NewFileLibs/DOA\"", + "\"$(MacBag)/../AlturaPorts/NewFileLibs/Cmn\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SignalProcessing/**\"", + "\"$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc\"", + "\"$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/utils\"", + ); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; + LIBRARY_STYLE = Bundle; + MacBag = /Users/jules/stuff/PT_73_SDK/MacBag; + OTHER_LDFLAGS = "-bundle"; + OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Examples/CoreAudio/AudioUnits/AUPublic/AUBase\""; + PRODUCT_NAME = JuceDemoPlugin; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = component; + }; + name = Debug; + }; + 3E4BA245089833B7007656EC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GENERATE_PKGINFO_FILE = YES; + HEADER_SEARCH_PATHS = ( + /Developer/Headers/FlatCarbon, + "~/stuff/vstsdk2.4", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/PlugInLibrary/**\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/DSPManager/**\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/common\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/common/PI_LibInterface\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/PACEProtection/**\"", + "\"$(MacBag)/../AlturaPorts/OMS/Headers\"", + "\"$(MacBag)/../AlturaPorts/Fic/Interfaces/**\"", + "\"$(MacBag)/../AlturaPorts/Fic/Source/SignalNets\"", + "\"$(MacBag)/../AlturaPorts/DSIPublicInterface/PublicHeaders\"", + "\"$(MacBag)/../DAEWin/Include\"", + "\"$(MacBag)/../AlturaPorts/DigiPublic/Interfaces\"", + "\"$(MacBag)/../AlturaPorts/DigiPublic\"", + "\"$(MacBag)/../AlturaPorts/NewFileLibs/DOA\"", + "\"$(MacBag)/../AlturaPorts/NewFileLibs/Cmn\"", + "\"$(MacBag)/../AlturaPorts/TDMPlugIns/SignalProcessing/**\"", + "\"$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc\"", + "\"$(MacBag)/../AvidCode/AVX2sdk/AVX/avx2/avx2sdk/utils\"", + ); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; + LIBRARY_STYLE = Bundle; + OTHER_LDFLAGS = "-bundle"; + OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Examples/CoreAudio/AudioUnits/AUPublic/AUBase\""; + PRODUCT_NAME = JuceDemoPlugin; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = component; + }; + name = Release; + }; + 3E4BA248089833B7007656EC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 843796F40EFC0102002A2725 /* CommonDebugSettings.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_C_LANGUAGE_STANDARD = c99; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx10.5; + }; + name = Debug; + }; + 3E4BA249089833B7007656EC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 843796F50EFC0102002A2725 /* CommonReleaseSettings.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_C_LANGUAGE_STANDARD = c99; + SDKROOT = macosx10.5; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3E4BA243089833B7007656EC /* Build configuration list for PBXNativeTarget "JuceDemoPlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3E4BA244089833B7007656EC /* Debug */, + 3E4BA245089833B7007656EC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 3E4BA247089833B7007656EC /* Build configuration list for PBXProject "JuceDemoPlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3E4BA248089833B7007656EC /* Debug */, + 3E4BA249089833B7007656EC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 089C1669FE841209C02AAC07 /* Project object */; +} diff --git a/extras/audio plugins/demo/build/win32/JuceDemoPlugin.sln b/extras/audio plugins/demo/build/win32/JuceDemoPlugin.sln new file mode 100644 index 0000000000..96a6517390 --- /dev/null +++ b/extras/audio plugins/demo/build/win32/JuceDemoPlugin.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JuceDemoPlugin", "JuceDemoPlugin.vcproj", "{39DADE4E-B715-4809-AD10-2F5A4213D633}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {39DADE4E-B715-4809-AD10-2F5A4213D633}.Debug|Win32.ActiveCfg = Debug|Win32 + {39DADE4E-B715-4809-AD10-2F5A4213D633}.Debug|Win32.Build.0 = Debug|Win32 + {39DADE4E-B715-4809-AD10-2F5A4213D633}.Release|Win32.ActiveCfg = Release|Win32 + {39DADE4E-B715-4809-AD10-2F5A4213D633}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extras/audio plugins/demo/build/win32/JuceDemoPlugin.vcproj b/extras/audio plugins/demo/build/win32/JuceDemoPlugin.vcproj new file mode 100644 index 0000000000..661e357003 --- /dev/null +++ b/extras/audio plugins/demo/build/win32/JuceDemoPlugin.vcproj @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/audio plugins/demo/src/JucePluginCharacteristics.h b/extras/audio plugins/demo/src/JucePluginCharacteristics.h index e8dc81601e..08db649a94 100644 --- a/extras/audio plugins/demo/src/JucePluginCharacteristics.h +++ b/extras/audio plugins/demo/src/JucePluginCharacteristics.h @@ -1,270 +1,285 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PLUGIN_CHARACTERISTICS_H__ -#define __JUCE_PLUGIN_CHARACTERISTICS_H__ - - -//============================================================================== -/* All of the following settings need to be defined for your plugin. - - Go through each of these definitions and check that it's correctly - set-up before trying to do a build. -*/ - -//============================================================================== -/* Generic settings */ - -/** The name of your plugin. (Try to keep this as short as possible) -*/ -#define JucePlugin_Name "Juce Demo Plugin" - -/** A longer decription of your plugin. -*/ -#define JucePlugin_Desc "A Demo Plugin demonstrating Juce" - -/** The name of your company. (Try to keep this as short as possible) -*/ -#define JucePlugin_Manufacturer "Raw Material Software" - -/** A four-character code for your company. - Use single quotes - this isn't a string! -*/ -#define JucePlugin_ManufacturerCode 'RawM' - -/** A unique four-character code for your plugin. - Use single quotes - this isn't a string! - - Note that for AU compatibility, this must contain at least one - upper-case letter. -*/ -#define JucePlugin_PluginCode 'JcDm' - -//============================================================================== -/** The maximum number of channels of audio input that the plugin can handle. - - The actual number of channels supplied may be less than this, depending on the host. - For VSTs, you specify a maximum number of channels, for AUs and RTAS a set - of channel configurations is specified in JucePlugin_PreferredChannelConfigurations - and the host will choose one of these, but you should still set the max number of - channels correctly. - - As soon as a plugin's prepareToPlay() method is called, you can find out the actual - number of channels that will be used with the AudioProcessor::getNumInputChannels() - method. -*/ -#define JucePlugin_MaxNumInputChannels 2 - -/** The maximum number of channels of audio output that the plugin can handle. - - The actual number of channels supplied may be less than this, depending on the host. - For VSTs, you specify a maximum number of channels, for AUs and RTAS a set - of channel configurations is specified in JucePlugin_PreferredChannelConfigurations - and the host will choose one of these, but you should still set the max number of - channels correctly. - - As soon as a plugin's prepareToPlay() method is called, you can find out the actual - number of channels that will be used with the AudioProcessor::getNumOutputChannels() - method. -*/ -#define JucePlugin_MaxNumOutputChannels 2 - -/** This allows the plugin to specify the configurations of input/output channels that - they can support. - - AU and RTAS hosts will use this information, although VSTs only have a concept of - a maximum number of channels. - - The list is a set of pairs of values in the form { numInputs, numOutputs }, and each - pair indicates a valid configuration that the plugin can handle. - - So for example, {1, 1}, {2, 2} means that the plugin can be used in just two - configurations: either with 1 input and 1 output, or with 2 inputs and 2 outputs. If - you used this in Pro-Tools, the plugin could be placed on a mono or stereo track. - If the list was just {1, 1}, then Pro-Tools would only allow it to be used as a mono - plugin. - - As soon as a plugin's prepareToPlay() method is called, you can find out the actual - number of channels that the host has connected to the plugin by using the - AudioProcessor::getNumOutputChannels() and AudioFilterBase::getNumInputChannels() - methods. -*/ -#define JucePlugin_PreferredChannelConfigurations { 1, 1 }, { 2, 2 } - -//============================================================================== -/** Set this value to 1 if your plugin is a synth, or 0 if it isn't. -*/ -#define JucePlugin_IsSynth 0 - -/** Set this to 1 if your plugin needs to receive midi messages, or 0 if - it doesn't. -*/ -#define JucePlugin_WantsMidiInput 1 - -/** Set this to 1 if your plugin wants to output midi messages, or 0 if - it doesn't. -*/ -#define JucePlugin_ProducesMidiOutput 1 - -/** If this is 1, it means that when the plugins input buffers are - silent, it's output will be too. - - Some hosts may use this to avoid calling the plugin when no audio - would be produced. -*/ -#define JucePlugin_SilenceInProducesSilenceOut 0 - -/** If set to 1, this hints that the host should ignore any keys that are pressed - when the plugin has keyboard focus. If 0, then the host should still execute - any shortcut keys that are pressed, even if the plugin does have focus. - - Various hosts/platforms may deal with this differently, or ignore it. -*/ -#define JucePlugin_EditorRequiresKeyboardFocus 1 - - -//============================================================================== -/** A version number -*/ -#define JucePlugin_VersionCode 0x00010100 - -#define JucePlugin_VersionString "1.1" - - -//============================================================================== -/* VST settings */ - -/** For VSTs, if you're compiling against the V2.3 SDK, set this to zero. If - you're using V2.4 or later, make sure it's set to 1. -*/ -#define JUCE_USE_VSTSDK_2_4 1 - -/** Defines a UID for your VST plugin. - The default setting here is probably fine, unless you specifically need - a custom value. It's passed to the setUniqueID() method of the plugin class. -*/ -#define JucePlugin_VSTUniqueID JucePlugin_PluginCode - -/** Defines the type of plugin. For most pursposes, you don't need to change this - setting. -*/ -#if JucePlugin_IsSynth - #define JucePlugin_VSTCategory kPlugCategSynth -#else - #define JucePlugin_VSTCategory kPlugCategEffect -#endif - -//============================================================================== -/* AudioUnit settings */ - -/** Defines the major type of plugin - see AUComponent.h for the available options. - If it's an effect, you should use kAudioUnitType_Effect. For a synth, you'll - need to use kAudioUnitType_MusicEffect or kAudioUnitType_MusicDevice. -*/ -#if JucePlugin_IsSynth - #define JucePlugin_AUMainType kAudioUnitType_MusicDevice -#else - #define JucePlugin_AUMainType kAudioUnitType_Effect -#endif - -/** A 4-character plugin ID code that should be unique. - - You can leave this using the generic value JucePlugin_PluginCode, or - override it if necessary. - - Note that for AU, this must contain at least one upper-case letter. -*/ -#define JucePlugin_AUSubType JucePlugin_PluginCode - -/** A prefix for the names of exported entry-point functions that the component exposes. - - It's very important that your plugin's .exp file contains two entries that correspond to - this name. So for example if you set the prefix to "abc" then your exports - file must contain: - - _abcEntry - _abcViewEntry -*/ -#define JucePlugin_AUExportPrefix JuceDemoAU - -/** This is the same as JucePlugin_AUExportPrefix, but in quotes - (needed for the resource compiler...) -*/ -#define JucePlugin_AUExportPrefixQuoted "JuceDemoAU" - -/** A 4-character manufacturer code - this is your company name. - You can leave this using the generic value JucePlugin_ManufacturerCode, or - override it if necessary. -*/ -#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode - -/** If you define this value to be the same as the CFBundleIdentifier in your - plugin's plist, it allows the plugin to work out its own path, which is - needed if you want to use File::getSpecialLocation (currentExecutableFile) -*/ -#define JucePlugin_CFBundleIdentifier "com.rawmaterialsoftware.JuceDemo" - -//============================================================================== -/* RTAS settings */ - -/** How to categorise this plugin. - - For a synth you probably want to set this to ePlugInCategory_SWGenerators. - For an effect, you could choose one of: - ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, - ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, - ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, - ePlugInCategory_Dither, ePlugInCategory_SoundField - - (All values are listed in FicPluginEnums.h) -*/ -#if JucePlugin_IsSynth - #define JucePlugin_RTASCategory ePlugInCategory_SWGenerators -#else - #define JucePlugin_RTASCategory ePlugInCategory_None -#endif - -/** A 4-character manufacturer code - this is your company name. - You can leave this using the generic value JucePlugin_ManufacturerCode, or - override it if necessary. -*/ -#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode - -/** A 4-character plugin ID code that should be unique. - You can leave this using the generic value JucePlugin_PluginCode, or - override it if necessary. -*/ -#define JucePlugin_RTASProductId JucePlugin_PluginCode - - -//============================================================================== - -#endif +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_PLUGIN_CHARACTERISTICS_H__ +#define __JUCE_PLUGIN_CHARACTERISTICS_H__ + + +//============================================================================== +/* All of the following settings need to be defined for your plugin. + + Go through each of these definitions and check that it's correctly + set-up before trying to do a build. +*/ + + +//============================================================================== +/* Plugin Formats to build */ + +#define JucePlugin_Build_VST 1 +#define JucePlugin_Build_RTAS 0 +#define JucePlugin_Build_AU 1 + + +//============================================================================== +/* Generic settings */ + +/** The name of your plugin. (Try to keep this as short as possible) +*/ +#define JucePlugin_Name "Juce Demo Plugin" + +/** A longer decription of your plugin. +*/ +#define JucePlugin_Desc "A Demo Plugin demonstrating Juce" + +/** The name of your company. (Try to keep this as short as possible) +*/ +#define JucePlugin_Manufacturer "Raw Material Software" + +/** A four-character code for your company. + Use single quotes - this isn't a string! +*/ +#define JucePlugin_ManufacturerCode 'RawM' + +/** A unique four-character code for your plugin. + Use single quotes - this isn't a string! + + Note that for AU compatibility, this must contain at least one + upper-case letter. +*/ +#define JucePlugin_PluginCode 'JcDm' + +//============================================================================== +/** The maximum number of channels of audio input that the plugin can handle. + + The actual number of channels supplied may be less than this, depending on the host. + For VSTs, you specify a maximum number of channels, for AUs and RTAS a set + of channel configurations is specified in JucePlugin_PreferredChannelConfigurations + and the host will choose one of these, but you should still set the max number of + channels correctly. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that will be used with the AudioProcessor::getNumInputChannels() + method. +*/ +#define JucePlugin_MaxNumInputChannels 2 + +/** The maximum number of channels of audio output that the plugin can handle. + + The actual number of channels supplied may be less than this, depending on the host. + For VSTs, you specify a maximum number of channels, for AUs and RTAS a set + of channel configurations is specified in JucePlugin_PreferredChannelConfigurations + and the host will choose one of these, but you should still set the max number of + channels correctly. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that will be used with the AudioProcessor::getNumOutputChannels() + method. +*/ +#define JucePlugin_MaxNumOutputChannels 2 + +/** This allows the plugin to specify the configurations of input/output channels that + they can support. + + AU and RTAS hosts will use this information, although VSTs only have a concept of + a maximum number of channels. + + The list is a set of pairs of values in the form { numInputs, numOutputs }, and each + pair indicates a valid configuration that the plugin can handle. + + So for example, {1, 1}, {2, 2} means that the plugin can be used in just two + configurations: either with 1 input and 1 output, or with 2 inputs and 2 outputs. If + you used this in Pro-Tools, the plugin could be placed on a mono or stereo track. + If the list was just {1, 1}, then Pro-Tools would only allow it to be used as a mono + plugin. + + As soon as a plugin's prepareToPlay() method is called, you can find out the actual + number of channels that the host has connected to the plugin by using the + AudioProcessor::getNumOutputChannels() and AudioFilterBase::getNumInputChannels() + methods. +*/ +#define JucePlugin_PreferredChannelConfigurations { 1, 1 }, { 2, 2 } + +//============================================================================== +/** Set this value to 1 if your plugin is a synth, or 0 if it isn't. +*/ +#define JucePlugin_IsSynth 0 + +/** Set this to 1 if your plugin needs to receive midi messages, or 0 if + it doesn't. +*/ +#define JucePlugin_WantsMidiInput 1 + +/** Set this to 1 if your plugin wants to output midi messages, or 0 if + it doesn't. +*/ +#define JucePlugin_ProducesMidiOutput 1 + +/** If this is 1, it means that when the plugins input buffers are + silent, it's output will be too. + + Some hosts may use this to avoid calling the plugin when no audio + would be produced. +*/ +#define JucePlugin_SilenceInProducesSilenceOut 0 + +/** If set to 1, this hints that the host should ignore any keys that are pressed + when the plugin has keyboard focus. If 0, then the host should still execute + any shortcut keys that are pressed, even if the plugin does have focus. + + Various hosts/platforms may deal with this differently, or ignore it. +*/ +#define JucePlugin_EditorRequiresKeyboardFocus 1 + + +//============================================================================== +/** A version number +*/ +#define JucePlugin_VersionCode 0x00010100 + +#define JucePlugin_VersionString "1.1" + + +//============================================================================== +/* VST settings */ + +/** For VSTs, if you're compiling against the V2.3 SDK, set this to zero. If + you're using V2.4 or later, make sure it's set to 1. +*/ +#define JUCE_USE_VSTSDK_2_4 1 + +/** Defines a UID for your VST plugin. + The default setting here is probably fine, unless you specifically need + a custom value. It's passed to the setUniqueID() method of the plugin class. +*/ +#define JucePlugin_VSTUniqueID JucePlugin_PluginCode + +/** Defines the type of plugin. For most pursposes, you don't need to change this + setting. +*/ +#if JucePlugin_IsSynth + #define JucePlugin_VSTCategory kPlugCategSynth +#else + #define JucePlugin_VSTCategory kPlugCategEffect +#endif + +//============================================================================== +/* AudioUnit settings */ + +/** Defines the major type of plugin - see AUComponent.h for the available options. + If it's an effect, you should use kAudioUnitType_Effect. For a synth, you'll + need to use kAudioUnitType_MusicEffect or kAudioUnitType_MusicDevice. +*/ +#if JucePlugin_IsSynth + #define JucePlugin_AUMainType kAudioUnitType_MusicDevice +#else + #define JucePlugin_AUMainType kAudioUnitType_Effect +#endif + +/** A 4-character plugin ID code that should be unique. + + You can leave this using the generic value JucePlugin_PluginCode, or + override it if necessary. + + Note that for AU, this must contain at least one upper-case letter. +*/ +#define JucePlugin_AUSubType JucePlugin_PluginCode + +/** A prefix for the names of exported entry-point functions that the component exposes. + + It's very important that your plugin's .exp file contains two entries that correspond to + this name. So for example if you set the prefix to "abc" then your exports + file must contain: + + _abcEntry + _abcViewEntry +*/ +#define JucePlugin_AUExportPrefix JuceDemoAU + +/** This is the same as JucePlugin_AUExportPrefix, but in quotes + (needed for the resource compiler...) +*/ +#define JucePlugin_AUExportPrefixQuoted "JuceDemoAU" + +/** A 4-character manufacturer code - this is your company name. + You can leave this using the generic value JucePlugin_ManufacturerCode, or + override it if necessary. +*/ +#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode + +/** If you define this value to be the same as the CFBundleIdentifier in your + plugin's plist, it allows the plugin to work out its own path, which is + needed if you want to use File::getSpecialLocation (currentExecutableFile) +*/ +#define JucePlugin_CFBundleIdentifier "com.rawmaterialsoftware.JuceDemo" + +//============================================================================== +/* RTAS settings */ + +/** How to categorise this plugin. + + For a synth you probably want to set this to ePlugInCategory_SWGenerators. + For an effect, you could choose one of: + ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, + ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, + ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, + ePlugInCategory_Dither, ePlugInCategory_SoundField + + (All values are listed in FicPluginEnums.h) +*/ +#if JucePlugin_IsSynth + #define JucePlugin_RTASCategory ePlugInCategory_SWGenerators +#else + #define JucePlugin_RTASCategory ePlugInCategory_None +#endif + +/** A 4-character manufacturer code - this is your company name. + You can leave this using the generic value JucePlugin_ManufacturerCode, or + override it if necessary. +*/ +#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode + +/** A 4-character plugin ID code that should be unique. + You can leave this using the generic value JucePlugin_PluginCode, or + override it if necessary. +*/ +#define JucePlugin_RTASProductId JucePlugin_PluginCode + +/** You need to set this path to point to the location of the Digidesign WinBag + directory on your machine. (Only needed for Windows builds). Make sure you + don't put a slash on the end. +*/ +#define JucePlugin_WinBag_path "C:\\essentials\\PT_73_SDK\\WinBag" + + +//============================================================================== + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp b/extras/audio plugins/demo/src/juce_AppConfig.h similarity index 60% rename from extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp rename to extras/audio plugins/demo/src/juce_AppConfig.h index 2dfa8561b9..8cc549b973 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcess.cpp +++ b/extras/audio plugins/demo/src/juce_AppConfig.h @@ -29,16 +29,29 @@ ============================================================================== */ -#include "juce_Wrapper_Header.h" - /* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths + This file contains settings that you might want to explicitly apply to + the your build. - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp + Most of these are turned on or off by default, but you can override + that setting here by un-commenting it and giving it a 1 or 0 value. */ -#include "CEffectProcess.cpp" + +#define JUCE_QUICKTIME 0 +//#define JUCE_PLUGINHOST_VST 1 +//#define JUCE_PLUGINHOST_AU 1 +//#define JUCE_ONLY_BUILD_CORE_LIBRARY 1 +//#define JUCE_FORCE_DEBUG 1 +//#define JUCE_LOG_ASSERTIONS 1 +//#define JUCE_ASIO 1 +//#define JUCE_ALSA 1 +//#define JUCE_OPENGL 1 +//#define JUCE_USE_FLAC 1 +//#define JUCE_USE_OGGVORBIS 1 +//#define JUCE_USE_CDBURNER 1 +//#define JUCE_ENABLE_REPAINT_DEBUGGING 1 +//#define JUCE_USE_XINERAMA 1 +//#define JUCE_USE_XSHM 1 +//#define JUCE_CHECK_MEMORY_LEAKS 1 +//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 +//#define JUCE_STRINGS_ARE_UNICODE 1 diff --git a/extras/audio plugins/demo/src/juce_LibrarySource.cpp b/extras/audio plugins/demo/src/juce_LibrarySource.cpp new file mode 100644 index 0000000000..37f1b22b2b --- /dev/null +++ b/extras/audio plugins/demo/src/juce_LibrarySource.cpp @@ -0,0 +1,12 @@ + +/* + This file includes the entire juce source tree via the amalgamated file. + + You could add the amalgamated file directly to your project, but doing it + like this allows you to put your app's config settings in the + juce_AppConfig.h file and have them applied to both the juce headers and + the source code. +*/ + +#include "juce_AppConfig.h" +#include "../../../../juce_amalgamated.cpp" diff --git a/extras/audio plugins/demo/src/juce_LibrarySource.mm b/extras/audio plugins/demo/src/juce_LibrarySource.mm new file mode 100644 index 0000000000..f6af73081b --- /dev/null +++ b/extras/audio plugins/demo/src/juce_LibrarySource.mm @@ -0,0 +1,12 @@ + +/* + This file includes the entire juce source tree via the amalgamated file. + + You could add the amalgamated file directly to your project, but doing it + like this allows you to put your app's config settings in the + juce_AppConfig.h file and have them applied to both the juce headers and + the source code. +*/ + +#include "juce_AppConfig.h" +#include "../../../../juce_amalgamated.mm" diff --git a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r b/extras/audio plugins/wrapper/AU/juce_AU_Resources.r similarity index 94% rename from extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r rename to extras/audio plugins/wrapper/AU/juce_AU_Resources.r index ebc3783f78..3b5b0799a6 100644 --- a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.r +++ b/extras/audio plugins/wrapper/AU/juce_AU_Resources.r @@ -1,57 +1,57 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include - -//============================================================================== -/* The JucePluginCharacteristics.h file is supposed to live in your plugin-specific - project directory, and has to contain info describing its name, type, etc. For - more info, see the JucePluginCharacteristics.h that is included in the demo plugin. - - You may need to adjust the include path of your project to make sure it can be - found by this include statement. (Don't hack this file to change the include path) -*/ -#include "JucePluginCharacteristics.h" - - -//============================================================================== -// component resources for Audio Unit -#define RES_ID 1000 -#define COMP_TYPE JucePlugin_AUMainType -#define COMP_SUBTYPE JucePlugin_AUSubType -#define COMP_MANUF JucePlugin_AUManufacturerCode -#define VERSION JucePlugin_VersionCode -#define NAME JucePlugin_Manufacturer ": " JucePlugin_Name -#define DESCRIPTION JucePlugin_Desc -#define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" - -#include "/Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r" - +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include + +//============================================================================== +/* The JucePluginCharacteristics.h file is supposed to live in your plugin-specific + project directory, and has to contain info describing its name, type, etc. For + more info, see the JucePluginCharacteristics.h that is included in the demo plugin. + + You may need to adjust the include path of your project to make sure it can be + found by this include statement. (Don't hack this file to change the include path) +*/ +#include "JucePluginCharacteristics.h" + + +//============================================================================== +// component resources for Audio Unit +#define RES_ID 1000 +#define COMP_TYPE JucePlugin_AUMainType +#define COMP_SUBTYPE JucePlugin_AUSubType +#define COMP_MANUF JucePlugin_AUManufacturerCode +#define VERSION JucePlugin_VersionCode +#define NAME JucePlugin_Manufacturer ": " JucePlugin_Name +#define DESCRIPTION JucePlugin_Desc +#define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" + +#include "AUResources.r" + diff --git a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.mm b/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm similarity index 95% rename from extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.mm rename to extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm index 1b74622606..3812ee0a98 100644 --- a/extras/audio plugins/wrapper/formats/AudioUnit/juce_AudioUnitWrapper.mm +++ b/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm @@ -35,9 +35,9 @@ #include #include "AUMIDIEffectBase.h" #include "MusicDeviceBase.h" -#include "../../juce_IncludeCharacteristics.h" -#include "../../../../../juce_amalgamated.h" -//#include "../../../../../juce.h" +#include "../juce_PluginHeaders.h" + +#if JucePlugin_Build_AU //============================================================================== #define juceFilterObjectPropertyID 0x1a45ffe9 @@ -849,10 +849,14 @@ protected: void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) { - if (wasResized) + //if (wasResized) { NSView* view = (NSView*) component.getWindowHandle(); - [[view superview] setFrameSize: NSMakeSize (component.getWidth(), component.getHeight())]; + NSRect r = [[view superview] frame]; + r.origin.y = r.origin.y + r.size.height - component.getHeight(); + r.size.width = component.getWidth(); + r.size.height = component.getHeight(); + [[view superview] setFrame: r]; [view setFrame: NSMakeRect (0, 0, component.getWidth(), component.getHeight())]; [view setNeedsDisplay: YES]; } @@ -987,8 +991,6 @@ private: if (editorComp == 0) return 0; -DBG (String (inPreferredSize.width) + " " + String (inPreferredSize.height)); -DBG (String (editorComp->getWidth()) + " " + String (editorComp->getHeight())); return [[[JuceUIViewClass alloc] initWithFilter: filter withAU: au @@ -1008,3 +1010,5 @@ extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix JUCE_COMPONENT_ENTRY (JuceAU, JucePlugin_AUExportPrefix, Entry) //JUCE_COMPONENT_ENTRY (JuceAUView, JucePlugin_AUExportPrefix, ViewEntry) + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode1.cpp similarity index 51% rename from extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode1.cpp index a9a948b281..33a3bac12e 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectMIDIUtils.cpp +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode1.cpp @@ -29,16 +29,37 @@ ============================================================================== */ -#include "juce_Wrapper_Header.h" +#include "juce_RTAS_DigiCode_Header.h" + +#if JucePlugin_Build_RTAS /* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. + This file is used to include and build the required digidesign CPP files without your project + needing to reference the files directly. Because these files will be found via your include path, + this means that the project doesn't have to change to cope with people's SDKs being in different + locations. - Note about include paths + Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and + the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". + If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's + going on... All the other files in your project can be set to use the normal __cdecl convention. - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp + If you get an error building the includes statements below, check your paths - there's a full + list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp */ + +#if WINDOWS_VERSION + #undef _UNICODE + #undef UNICODE +#endif + +#include "CEffectGroup.cpp" +#include "CEffectGroupMIDI.cpp" #include "CEffectMIDIUtils.cpp" +#include "CEffectProcess.cpp" +#include "CEffectProcessAS.cpp" +#include "CEffectType.cpp" +#include "CEffectTypeRTAS.cpp" +#include "ChunkDataParser.cpp" + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode2.cpp similarity index 56% rename from extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode2.cpp index 24313d8492..7359f2ba1c 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessMIDI.cpp +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode2.cpp @@ -29,16 +29,26 @@ ============================================================================== */ -#include "juce_Wrapper_Header.h" +#include "juce_RTAS_DigiCode_Header.h" -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths +#if JucePlugin_Build_RTAS - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp +/* + This file is used to include and build the required digidesign CPP files without your project + needing to reference the files directly. Because these files will be found via your include path, + this means that the project doesn't have to change to cope with people's SDKs being in different + locations. + + Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and + the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". + If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's + going on... All the other files in your project can be set to use the normal __cdecl convention. + + If you get an error building the includes statements below, check your paths - there's a full + list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp */ + #include "CEffectProcessMIDI.cpp" +#include "PlugInUtils.cpp" + +#endif diff --git a/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode3.cpp b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode3.cpp new file mode 100644 index 0000000000..7e794b6505 --- /dev/null +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode3.cpp @@ -0,0 +1,95 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_RTAS_DigiCode_Header.h" + +/* + This file is used to include and build the required digidesign CPP files without your project + needing to reference the files directly. Because these files will be found via your include path, + this means that the project doesn't have to change to cope with people's SDKs being in different + locations. + + Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and + the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". + If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's + going on... All the other files in your project can be set to use the normal __cdecl convention. + + If you get an error building the includes statements below, check your paths - there's a full + list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp +*/ + +#if JucePlugin_Build_RTAS + + +#if WINDOWS_VERSION +//============================================================================== + + #undef _UNICODE + #undef UNICODE + + #if JucePlugin_Build_VST + + #define DllMain DllMainRTAS + #include "DLLMain.cpp" + #undef DllMain + + extern BOOL WINAPI DllMainVST (HINSTANCE instance, DWORD dwReason, LPVOID); + + // This overloaded DllMain can work as either an RTAS or a VST.. + extern "C" BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved) + { + if (GetModuleHandle ("DAE.DLL") != 0) + return DllMainRTAS (hInstance, ul_reason_for_call, lpReserved); + else + return DllMainVST (hInstance, ul_reason_for_call, lpReserved); + } + #else + #include "DLLMain.cpp" + #endif + + #include "DefaultSwap.cpp" + +#else + //============================================================================== + #include "PlugInInitialize.cpp" + #include "Dispatcher.cpp" +#endif + +#else + +#if _MSC_VER + // (defining these stubs just makes it easier to quickly turn off the RTAS build without removing + // the exports table from your project settings) + short __stdcall NewPlugIn (void*) { return 0; } + short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } +#endif + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode_Header.h similarity index 79% rename from extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode_Header.h index 2427003106..58c853ab32 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASCompileFlags.h +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode_Header.h @@ -29,9 +29,12 @@ ============================================================================== */ -#ifndef __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ -#define __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ +#ifndef __JUCE_RTAS_DIGICODE_HEADER_JUCEHEADER__ +#define __JUCE_RTAS_DIGICODE_HEADER_JUCEHEADER__ +#include "../juce_IncludeCharacteristics.h" + +//============================================================================== #ifdef _MSC_VER #define kCompileAsCodeResource 0 @@ -46,6 +49,12 @@ #define PLUGIN_SDK_BUILD 1 #define PLUGIN_SDK_DIRECTMIDI 1 + // the Digidesign projects all use a struct alignment of 2.. + #pragma pack (2) + #pragma warning (disable: 4267 4996 4311 4312 4103) + + #include "ForcedInclude.h" + #else #define kCompileAsCodeResource 0 @@ -60,4 +69,5 @@ #endif -#endif // __JUCE_RTASCOMPILEFLAGS_JUCEHEADER__ + +#endif // __JUCE_RTAS_DIGICODE_HEADER_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacResources.r b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacResources.r new file mode 100644 index 0000000000..a40e1f397e --- /dev/null +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacResources.r @@ -0,0 +1,6 @@ + +/* + This dummy file is added to the resources section of the project to + force XCode to create some resources for the dpm. If there aren't any + resources, PT will refuse to load the plugin.. +*/ diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.mm b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm similarity index 85% rename from extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.mm rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm index 8f59313720..e6f76ab9e5 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.mm +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm @@ -1,82 +1,101 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include -#include "../../../../../juce_amalgamated.h" - -//============================================================================== -void* attachSubWindow (void* hostWindowRef, Component* comp) -{ - const ScopedAutoReleasePool pool; - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; - [hostWindow retain]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - f.size.width = comp->getWidth(); - f.size.height = comp->getHeight(); - [content setFrame: f]; - - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); - - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - -#if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); -#else - comp->addToDesktop (ComponentPeer::windowIsTemporary); -#endif - - comp->setVisible (true); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - return hostWindow; -} - -void removeSubWindow (void* nsWindow, Component* comp) -{ - const ScopedAutoReleasePool pool; - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - [hostWindow release]; -} +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +// If you get an error here, you might need to make sure that +// your build config files don't specify "C++" as one of the +// flags in OTHER_CFLAGS, because that stops the compiler building +// obj-c files correctly. +@class dummyclassname; + +#include +#include "../juce_PluginHeaders.h" + +#if JucePlugin_Build_RTAS + + +//============================================================================== +void initialiseMacRTAS() +{ + NSApplicationLoad(); +} + +void* attachSubWindow (void* hostWindowRef, Component* comp) +{ + const ScopedAutoReleasePool pool; + + NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; + [hostWindow retain]; + [hostWindow setCanHide: YES]; + [hostWindow setReleasedWhenClosed: YES]; + + NSView* content = [hostWindow contentView]; + NSRect f = [content frame]; + f.size.width = comp->getWidth(); + f.size.height = comp->getHeight(); + [content setFrame: f]; + + NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; + windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); + + comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); + +#if ! JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); +#else + comp->addToDesktop (ComponentPeer::windowIsTemporary); +#endif + + comp->setVisible (true); + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow addChildWindow: pluginWindow + ordered: NSWindowAbove]; + [hostWindow orderFront: nil]; + [pluginWindow orderFront: nil]; + return hostWindow; +} + +void removeSubWindow (void* nsWindow, Component* comp) +{ + const ScopedAutoReleasePool pool; + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* hostWindow = (NSWindow*) nsWindow; + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow removeChildWindow: pluginWindow]; + comp->removeFromDesktop(); + [hostWindow release]; +} + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def b/extras/audio plugins/wrapper/RTAS/juce_RTAS_WinExports.def similarity index 100% rename from extras/audio plugins/wrapper/formats/RTAS/juce_RTAS_dlldefs.def rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_WinExports.def diff --git a/extras/audio plugins/wrapper/formats/RTAS/DefaultResourceFile b/extras/audio plugins/wrapper/RTAS/juce_RTAS_WinResources.rsr similarity index 100% rename from extras/audio plugins/wrapper/formats/RTAS/DefaultResourceFile rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_WinResources.rsr diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp b/extras/audio plugins/wrapper/RTAS/juce_RTAS_WinUtilities.cpp similarity index 93% rename from extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_WinUtilities.cpp index 9faa03d82a..e7801df102 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASUtilities.cpp +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_WinUtilities.cpp @@ -31,7 +31,7 @@ #if _MSC_VER -// (these functions are in a separate file because of problems including windows.h +// (these functions are in their own file because of problems including windows.h // at the same time as the Digi headers) #include @@ -40,12 +40,13 @@ #pragma pack (push, 8) #endif -#include "../../../../../juce_amalgamated.h" +#include "../juce_PluginHeaders.h" #ifdef _MSC_VER #pragma pack (pop) #endif +#if JucePlugin_Build_RTAS //============================================================================== void JUCE_CALLTYPE attachSubWindow (void* hostWindow, @@ -138,5 +139,5 @@ void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow) } #endif - +#endif #endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp b/extras/audio plugins/wrapper/RTAS/juce_RTAS_Wrapper.cpp similarity index 96% rename from extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp rename to extras/audio plugins/wrapper/RTAS/juce_RTAS_Wrapper.cpp index 70a3769efd..700027f079 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/juce_RTASWrapper.cpp +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_Wrapper.cpp @@ -1,979 +1,991 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_RTASCompileFlags.h" - -#ifdef _MSC_VER - // the Digidesign projects all use a struct alignment of 2.. - #pragma pack (2) - #pragma warning (disable: 4267) - - #include "ForcedInclude.h" - #include "Mac2Win.H" -#endif - -/* Note about include paths - ------------------------ - - To be able to include all the Digidesign headers correctly, you'll need to add this - lot to your include path: - - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common\Platform - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public - c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces - c:\yourdirectory\PT_711_SDK\AlturaPorts\SADriver\Interfaces - c:\yourdirectory\PT_711_SDK\AlturaPorts\DigiPublic\Interfaces - c:\yourdirectory\PT_711_SDK\AlturaPorts\Fic\Interfaces\DAEClient - c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\Cmn - c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\DOA - c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\PPC_H - c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\AppSupport - - NB. If you hit a huge pile of bugs around here, make sure that you've not got the - Apple QuickTime headers before the PT headers in your path, because there are - some filename clashes between them. - -*/ -#include "CEffectGroupMIDI.h" -#include "CEffectProcessMIDI.h" -#include "CEffectProcessRTAS.h" -#include "CCustomView.h" -#include "CEffectTypeRTAS.h" -#include "CPluginControl.h" -#include "CPluginControl_OnOff.h" -#include "FicProcessTokens.h" - -//============================================================================== -#ifdef _MSC_VER - #pragma pack (push, 8) -#endif - -#include "../../../../../juce_amalgamated.h" -#include "../../juce_IncludeCharacteristics.h" - -#ifdef _MSC_VER - #pragma pack (pop) -#endif - -#undef Component -#undef MemoryBlock - -//============================================================================== -#if JUCE_WIN32 - extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, JUCE_NAMESPACE::Component* comp); - extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, JUCE_NAMESPACE::Component* comp); - #if ! JucePlugin_EditorRequiresKeyboardFocus - extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); - #endif -#else - extern void* attachSubWindow (void* hostWindowRef, JUCE_NAMESPACE::Component* comp); - extern void removeSubWindow (void* nsWindow, JUCE_NAMESPACE::Component* comp); -#endif - -const int midiBufferSize = 1024; -const OSType juceChunkType = 'juce'; -static const int bypassControlIndex = 1; - -//============================================================================== -/** Somewhere in the codebase of your plugin, you need to implement this function - and make it return a new instance of the filter subclass that you're building. -*/ -extern AudioProcessor* JUCE_CALLTYPE createPluginFilter(); - - -//============================================================================== -static float longToFloat (const long n) throw() -{ - return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); -} - -static long floatToLong (const float n) throw() -{ - return roundDoubleToInt (jlimit (-(double) 0x80000000, - (double) 0x7fffffff, - n * (double) 0xffffffff - (double) 0x80000000)); -} - -static int numInstances = 0; - -//============================================================================== -class JucePlugInProcess : public CEffectProcessMIDI, - public CEffectProcessRTAS, - public AudioProcessorListener, - public AudioPlayHead, - public AsyncUpdater -{ -public: - //============================================================================== - JucePlugInProcess() - : midiBufferNode (0), - midiTransport (0), - channels (0), - prepared (false), - sampleRate (44100.0) - { - juceFilter = createPluginFilter(); - jassert (juceFilter != 0); - - AddChunk (juceChunkType, "Juce Audio Plugin Data"); - - ++numInstances; - } - - ~JucePlugInProcess() - { - if (mLoggedIn) - MIDILogOut(); - - deleteAndZero (midiBufferNode); - deleteAndZero (midiTransport); - - if (prepared) - juceFilter->releaseResources(); - - delete juceFilter; - juce_free (channels); - - if (--numInstances == 0) - shutdownJuce_GUI(); - } - - //============================================================================== - class JuceCustomUIView : public CCustomView, - public Timer - { - public: - //============================================================================== - JuceCustomUIView (AudioProcessor* const filter_, - JucePlugInProcess* const process_) - : filter (filter_), - process (process_), - wrapper (0), - editorComp (0) - { - // setting the size in here crashes PT for some reason, so keep it simple.. - } - - ~JuceCustomUIView() - { - deleteEditorComp(); - } - - //============================================================================== - void updateSize() - { - if (editorComp == 0) - { - editorComp = filter->createEditorIfNeeded(); - jassert (editorComp != 0); - } - - Rect oldRect; - GetRect (&oldRect); - - Rect r; - r.left = 0; - r.top = 0; - r.right = editorComp->getWidth(); - r.bottom = editorComp->getHeight(); - SetRect (&r); - - if ((oldRect.right != r.right) || (oldRect.bottom != r.bottom)) - startTimer (50); - } - - void timerCallback() - { - if (! JUCE_NAMESPACE::Component::isMouseButtonDownAnywhere()) - { - stopTimer(); - - // Send a token to the host to tell it about the resize - SSetProcessWindowResizeToken token (process->fRootNameId, process->fRootNameId); - FicSDSDispatchToken (&token); - } - } - - void attachToWindow (GrafPtr port) - { - if (port != 0) - { - updateSize(); - -#if JUCE_WIN32 - void* const hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); -#else - void* const hostWindow = (void*) GetWindowFromPort (port); -#endif - deleteAndZero (wrapper); - - wrapper = new EditorCompWrapper (hostWindow, editorComp, this); - } - else - { - deleteEditorComp(); - } - } - - void DrawContents (Rect*) - { -#if JUCE_WIN32 - if (wrapper != 0) - { - ComponentPeer* const peer = wrapper->getPeer(); - - if (peer != 0) - { - // (seems to be required in PT6.4, but not in 7.x) - peer->repaint (0, 0, wrapper->getWidth(), wrapper->getHeight()); - } - } -#endif - } - - void DrawBackground (Rect*) {} - - //============================================================================== - private: - AudioProcessor* const filter; - JucePlugInProcess* const process; - JUCE_NAMESPACE::Component* wrapper; - AudioProcessorEditor* editorComp; - - void deleteEditorComp() - { - if (editorComp != 0 || wrapper != 0) - { -#if JUCE_MAC - const ScopedAutoReleasePool pool; -#endif - PopupMenu::dismissAllActiveMenus(); - - JUCE_NAMESPACE::Component* const modalComponent = JUCE_NAMESPACE::Component::getCurrentlyModalComponent(); - if (modalComponent != 0) - modalComponent->exitModalState (0); - - filter->editorBeingDeleted (editorComp); - - deleteAndZero (editorComp); - deleteAndZero (wrapper); - } - } - - //============================================================================== - // A component to hold the AudioProcessorEditor, and cope with some housekeeping - // chores when it changes or repaints. - class EditorCompWrapper : public JUCE_NAMESPACE::Component -#if ! JUCE_MAC - , public FocusChangeListener -#endif - { - public: - EditorCompWrapper (void* const hostWindow_, - Component* const editorComp, - JuceCustomUIView* const owner_) - : hostWindow (hostWindow_), - owner (owner_), - titleW (0), - titleH (0) - { -#if JucePlugin_EditorRequiresKeyboardFocus - setWantsKeyboardFocus (true); -#else - setWantsKeyboardFocus (false); -#endif - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - setBounds (editorComp->getBounds()); - editorComp->setTopLeftPosition (0, 0); - addAndMakeVisible (editorComp); - -#if JUCE_WIN32 - attachSubWindow (hostWindow, titleW, titleH, this); -#else - nsWindow = attachSubWindow (hostWindow, this); -#endif - setVisible (true); - -#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().addFocusChangeListener (this); -#endif - } - - ~EditorCompWrapper() - { -#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().removeFocusChangeListener (this); -#endif - -#if JUCE_MAC - removeSubWindow (nsWindow, this); -#endif - } - - void paint (Graphics&) - { - } - - void resized() - { - JUCE_NAMESPACE::Component* const c = getChildComponent (0); - - if (c != 0) - c->setBounds (0, 0, getWidth(), getHeight()); - - repaint(); - } - -#if JUCE_WIN32 - void globalFocusChanged (JUCE_NAMESPACE::Component*) - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - if (hasKeyboardFocus (true)) - passFocusToHostWindow (hostWindow); - #endif - } -#endif - - void childBoundsChanged (JUCE_NAMESPACE::Component* child) - { - setSize (child->getWidth(), child->getHeight()); - child->setTopLeftPosition (0, 0); - -#if JUCE_WIN32 - resizeHostWindow (hostWindow, titleW, titleH, this); -#endif - owner->updateSize(); - } - - void userTriedToCloseWindow() - { - } - - //============================================================================== - juce_UseDebuggingNewOperator - - private: - void* const hostWindow; - void* nsWindow; - JuceCustomUIView* const owner; - int titleW, titleH; - }; - }; - - JuceCustomUIView* getView() const - { - return dynamic_cast (fOurPlugInView); - } - - void GetViewRect (Rect* size) - { - if (getView() != 0) - getView()->updateSize(); - - CEffectProcessRTAS::GetViewRect (size); - } - - CPlugInView* CreateCPlugInView() - { - return new JuceCustomUIView (juceFilter, this); - } - - void SetViewPort (GrafPtr port) - { - CEffectProcessRTAS::SetViewPort (port); - - if (getView() != 0) - getView()->attachToWindow (port); - } - - //============================================================================== -protected: - ComponentResult GetDelaySamplesLong (long* aNumSamples) - { - if (aNumSamples != 0) - *aNumSamples = juceFilter != 0 ? juceFilter->getLatencySamples() : 0; - - return noErr; - } - - //============================================================================== - void EffectInit() - { - SFicPlugInStemFormats stems; - GetProcessType()->GetStemFormats (&stems); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, - juceFilter->getSampleRate(), juceFilter->getBlockSize()); - - AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); - DefineMasterBypassControlIndex (bypassControlIndex); - - for (int i = 0; i < juceFilter->getNumParameters(); ++i) - AddControl (new JucePluginControl (juceFilter, i)); - - // we need to do this midi log-in to get timecode, regardless of whether - // the plugin actually uses midi... - if (MIDILogIn() == noErr) - { -#if JucePlugin_WantsMidiInput - CEffectType* const type = dynamic_cast (this->GetProcessType()); - - if (type != 0) - { - char nodeName [64]; - type->GetProcessTypeName (63, nodeName); - p2cstrcpy (nodeName, reinterpret_cast (nodeName)); - - midiBufferNode = new CEffectMIDIOtherBufferedNode (&mMIDIWorld, - 8192, - eLocalNode, - nodeName, - midiBuffer); - - midiBufferNode->Initialize (1, true); - } -#endif - } - - midiTransport = new CEffectMIDITransport (&mMIDIWorld); - - juceFilter->setPlayHead (this); - juceFilter->addListener (this); - } - - void handleAsyncUpdate() - { - if (! prepared) - { - sampleRate = gProcessGroup->GetSampleRate(); - jassert (sampleRate > 0); - - juce_free (channels); - channels = (float**) juce_calloc (sizeof (float*) * jmax (juceFilter->getNumInputChannels(), - juceFilter->getNumOutputChannels())); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, - sampleRate, mRTGlobals->mHWBufferSizeInSamples); - - juceFilter->prepareToPlay (sampleRate, - mRTGlobals->mHWBufferSizeInSamples); - - prepared = true; - } - } - - void RenderAudio (float** inputs, float** outputs, long numSamples) - { - if (! prepared) - { - triggerAsyncUpdate(); - bypassBuffers (inputs, outputs, numSamples); - return; - } - - if (mBypassed) - { - bypassBuffers (inputs, outputs, numSamples); - return; - } - -#if JucePlugin_WantsMidiInput - midiEvents.clear(); - - const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; - - if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) - midiBufferNode->SetAdvanceScheduleTime (bufferSize); - - if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) - { - jassert (midiBufferNode->GetBufferPtr() != 0); - const int numMidiEvents = midiBufferNode->GetBufferSize(); - - for (int i = 0; i < numMidiEvents; ++i) - { - const DirectMidiPacket& m = midiBuffer[i]; - - jassert ((int) m.mTimestamp < numSamples); - - midiEvents.addEvent (m.mData, m.mLength, - jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); - } - } -#endif - -#if defined (JUCE_DEBUG) || JUCE_LOG_ASSERTIONS - const int numMidiEventsComingIn = midiEvents.getNumEvents(); - (void) numMidiEventsComingIn; -#endif - - { - const ScopedLock sl (juceFilter->getCallbackLock()); - - const int numIn = juceFilter->getNumInputChannels(); - const int numOut = juceFilter->getNumOutputChannels(); - const int totalChans = jmax (numIn, numOut); - - if (juceFilter->isSuspended()) - { - for (int i = 0; i < numOut; ++i) - zeromem (outputs [i], sizeof (float) * numSamples); - } - else - { - { - int i; - for (i = 0; i < numOut; ++i) - { - channels[i] = outputs [i]; - - if (i < numIn && inputs != outputs) - memcpy (outputs [i], inputs[i], sizeof (float) * numSamples); - } - - for (; i < numIn; ++i) - channels [i] = inputs [i]; - } - - AudioSampleBuffer chans (channels, totalChans, numSamples); - - juceFilter->processBlock (chans, midiEvents); - } - } - - if (! midiEvents.isEmpty()) - { -#if JucePlugin_ProducesMidiOutput - const juce::uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiEvents); - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { -// jassert (midiEventPosition >= 0 && midiEventPosition < (int) numSamples); - - //xxx - } -#else - // if your plugin creates midi messages, you'll need to set - // the JucePlugin_ProducesMidiOutput macro to 1 in your - // JucePluginCharacteristics.h file - jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); -#endif - - midiEvents.clear(); - } - } - - //============================================================================== - ComponentResult GetChunkSize (OSType chunkID, long* size) - { - if (chunkID == juceChunkType) - { - tempFilterData.setSize (0); - juceFilter->getStateInformation (tempFilterData); - - *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - return noErr; - } - - return CEffectProcessMIDI::GetChunkSize (chunkID, size); - } - - ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) - { - if (chunkID == juceChunkType) - { - if (tempFilterData.getSize() == 0) - juceFilter->getStateInformation (tempFilterData); - - chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); - - tempFilterData.setSize (0); - - return noErr; - } - - return CEffectProcessMIDI::GetChunk (chunkID, chunk); - } - - ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) - { - if (chunkID == juceChunkType) - { - tempFilterData.setSize (0); - - if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) - { - juceFilter->setStateInformation ((void*) chunk->fData, - chunk->fSize - sizeof (SFicPlugInChunkHeader)); - } - - return noErr; - } - - return CEffectProcessMIDI::SetChunk (chunkID, chunk); - } - - //============================================================================== - ComponentResult UpdateControlValue (long controlIndex, long value) - { - if (controlIndex != bypassControlIndex) - juceFilter->setParameter (controlIndex - 2, longToFloat (value)); - else - mBypassed = (value > 0); - - return CProcess::UpdateControlValue (controlIndex, value); - } - - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) - { - // this method can only be called while the plugin is running - jassert (prepared); - - Cmn_Float64 bpm = 120.0; - Cmn_Int32 num = 4, denom = 4; - Cmn_Int64 ticks = 0; - Cmn_Bool isPlaying = false; - - if (midiTransport != 0) - { - midiTransport->GetCurrentTempo (&bpm); - midiTransport->IsTransportPlaying (&isPlaying); - midiTransport->GetCurrentMeter (&num, &denom); - midiTransport->GetCurrentTickPosition (&ticks); - } - - info.bpm = bpm; - info.timeSigNumerator = num; - info.timeSigDenominator = denom; - info.isPlaying = isPlaying; - info.isRecording = false; - info.ppqPosition = ticks / 960000.0; - info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. - - // xxx incorrect if there are tempo changes, but there's no - // other way of getting this info.. - info.timeInSeconds = ticks * (60.0 / 960000.0) / bpm; - - double framesPerSec = 24.0; - - switch (fTimeCodeInfo.mFrameRate) - { - case ficFrameRate_24Frame: - info.frameRate = AudioPlayHead::fps24; - break; - - case ficFrameRate_25Frame: - info.frameRate = AudioPlayHead::fps25; - framesPerSec = 25.0; - break; - - case ficFrameRate_2997NonDrop: - info.frameRate = AudioPlayHead::fps2997; - framesPerSec = 29.97002997; - break; - - case ficFrameRate_2997DropFrame: - info.frameRate = AudioPlayHead::fps2997drop; - framesPerSec = 29.97002997; - break; - - case ficFrameRate_30NonDrop: - info.frameRate = AudioPlayHead::fps30; - framesPerSec = 30.0; - break; - - case ficFrameRate_30DropFrame: - info.frameRate = AudioPlayHead::fps30drop; - framesPerSec = 30.0; - break; - - case ficFrameRate_23976: - // xxx not strictly true.. - info.frameRate = AudioPlayHead::fps24; - framesPerSec = 23.976; - break; - - default: - info.frameRate = AudioPlayHead::fpsUnknown; - break; - } - - info.editOriginTime = fTimeCodeInfo.mFrameOffset / framesPerSec; - - return true; - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) - { - SetControlValue (index + 2, floatToLong (newValue)); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) - { - TouchControl (index + 2); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) - { - ReleaseControl (index + 2); - } - - void audioProcessorChanged (AudioProcessor*) - { - // xxx is there an RTAS equivalent? - } - - //============================================================================== -private: - AudioProcessor* juceFilter; - MidiBuffer midiEvents; - CEffectMIDIOtherBufferedNode* midiBufferNode; - CEffectMIDITransport* midiTransport; - DirectMidiPacket midiBuffer [midiBufferSize]; - - JUCE_NAMESPACE::MemoryBlock tempFilterData; - float** channels; - bool prepared; - double sampleRate; - - void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const - { - for (int i = fNumOutputs; --i >= 0;) - { - if (i < fNumInputs) - memcpy (outputs[i], inputs[i], numSamples * sizeof (float)); - else - zeromem (outputs[i], numSamples * sizeof (float)); - } - } - - //============================================================================== - class JucePluginControl : public CPluginControl - { - public: - //============================================================================== - JucePluginControl (AudioProcessor* const juceFilter_, const int index_) - : juceFilter (juceFilter_), - index (index_) - { - } - - ~JucePluginControl() - { - } - - //============================================================================== - OSType GetID() const { return index + 1; } - long GetDefaultValue() const { return floatToLong (0); } - void SetDefaultValue (long) {} - long GetNumSteps() const { return 0xffffffff; } - - long ConvertStringToValue (const char* valueString) const - { - return floatToLong (String (valueString).getFloatValue()); - } - - Cmn_Bool IsKeyValid (long key) const { return true; } - - void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const - { - juceFilter->getParameterName (index).copyToBuffer (name, maxLength); - } - - long GetPriority() const { return kFicCooperativeTaskPriority; } - - long GetOrientation() const - { - return kDAE_LeftMinRightMax | kDAE_BottomMinTopMax - | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; - } - - long GetControlType() const { return kDAE_ContinuousValues; } - - void GetValueString (char* valueString, int maxLength, long value) const - { - juceFilter->getParameterText (index).copyToBuffer (valueString, maxLength); - } - - Cmn_Bool IsAutomatable() const - { - return juceFilter->isParameterAutomatable (index); - } - - private: - //============================================================================== - AudioProcessor* const juceFilter; - const int index; - - JucePluginControl (const JucePluginControl&); - const JucePluginControl& operator= (const JucePluginControl&); - }; -}; - - -//============================================================================== -class JucePlugInGroup : public CEffectGroupMIDI -{ -public: - //============================================================================== - JucePlugInGroup() - { - DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); - DefinePlugInNamesAndVersion (createRTASName(), JucePlugin_VersionCode); - -#ifndef JUCE_DEBUG - AddGestalt (pluginGestalt_IsCacheable); -#endif - } - - ~JucePlugInGroup() - { - shutdownJuce_GUI(); - shutdownJuce_NonGUI(); - } - - //============================================================================== - void CreateEffectTypes() - { - const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (channelConfigs); - - // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations - // value in your JucePluginCharacteristics.h file.. - jassert (numConfigs > 0); - - for (int i = 0; i < numConfigs; ++i) - { - CEffectType* const type - = new CEffectTypeRTAS ('jcaa' + i, - JucePlugin_RTASProductId, - JucePlugin_RTASCategory); - - type->DefineTypeNames (createRTASName()); - type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); - - type->DefineStemFormats (getFormatForChans (channelConfigs [i][0]), - getFormatForChans (channelConfigs [i][1])); - - type->AddGestalt (pluginGestalt_CanBypass); - type->AddGestalt (pluginGestalt_SupportsVariableQuanta); - type->AttachEffectProcessCreator (createNewProcess); - - AddEffectType (type); - } - } - - void Initialize() - { - CEffectGroupMIDI::Initialize(); - } - - //============================================================================== -private: - static CEffectProcess* createNewProcess() - { - // Juce setup -#if JUCE_WIN32 - PlatformUtilities::setCurrentModuleInstanceHandle (gThisModule); -#endif - initialiseJuce_GUI(); - - return new JucePlugInProcess(); - } - - static const String createRTASName() - { - return String (JucePlugin_Name) + T("\n") - + String (JucePlugin_Name).substring (0, 4); - } - - static EPlugIn_StemFormat getFormatForChans (const int numChans) throw() - { - switch (numChans) - { - case 0: - return ePlugIn_StemFormat_Generic; - - case 1: - return ePlugIn_StemFormat_Mono; - - case 2: - return ePlugIn_StemFormat_Stereo; - - case 3: - return ePlugIn_StemFormat_LCR; - - case 4: - return ePlugIn_StemFormat_Quad; - - case 5: - return ePlugIn_StemFormat_5dot0; - - case 6: - return ePlugIn_StemFormat_5dot1; - - case 7: - return ePlugIn_StemFormat_6dot1; - - case 8: - return ePlugIn_StemFormat_7dot1; - - default: - jassertfalse // hmm - not a valid number of chans for RTAS.. - break; - } - - return ePlugIn_StemFormat_Generic; - } -}; - -CProcessGroupInterface* CProcessGroup::CreateProcessGroup() -{ - initialiseJuce_NonGUI(); - return new JucePlugInGroup(); -} +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "juce_RTAS_DigiCode_Header.h" + +#if JucePlugin_Build_RTAS + +#ifdef _MSC_VER + #include "Mac2Win.H" +#endif + +/* Note about include paths + ------------------------ + + To be able to include all the Digidesign headers correctly, you'll need to add this + lot to your include path: + + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\common\Platform + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public + c:\yourdirectory\PT_711_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\SADriver\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\DigiPublic\Interfaces + c:\yourdirectory\PT_711_SDK\AlturaPorts\Fic\Interfaces\DAEClient + c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\Cmn + c:\yourdirectory\PT_711_SDK\AlturaPorts\NewFileLibs\DOA + c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\PPC_H + c:\yourdirectory\PT_711_SDK\AlturaPorts\AlturaSource\AppSupport + + NB. If you hit a huge pile of bugs around here, make sure that you've not got the + Apple QuickTime headers before the PT headers in your path, because there are + some filename clashes between them. + +*/ +#include "CEffectGroupMIDI.h" +#include "CEffectProcessMIDI.h" +#include "CEffectProcessRTAS.h" +#include "CCustomView.h" +#include "CEffectTypeRTAS.h" +#include "CPluginControl.h" +#include "CPluginControl_OnOff.h" +#include "FicProcessTokens.h" + +//============================================================================== +#ifdef _MSC_VER + #pragma pack (push, 8) +#endif + +#include "../juce_PluginHeaders.h" + +#ifdef _MSC_VER + #pragma pack (pop) + + #if JUCE_DEBUG + #define PT_LIB_PATH JucePlugin_WinBag_path "\\Debug\\lib\\" + #else + #define PT_LIB_PATH JucePlugin_WinBag_path "\\Release\\lib\\" + #endif + + #pragma comment(lib, PT_LIB_PATH "DAE.lib") + #pragma comment(lib, PT_LIB_PATH "DigiExt.lib") + #pragma comment(lib, PT_LIB_PATH "DSI.lib") + #pragma comment(lib, PT_LIB_PATH "PluginLib.lib") + +#endif + +#undef Component +#undef MemoryBlock + +//============================================================================== +#if JUCE_WIN32 + extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, JUCE_NAMESPACE::Component* comp); + extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, JUCE_NAMESPACE::Component* comp); + #if ! JucePlugin_EditorRequiresKeyboardFocus + extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); + #endif +#else + extern void* attachSubWindow (void* hostWindowRef, JUCE_NAMESPACE::Component* comp); + extern void removeSubWindow (void* nsWindow, JUCE_NAMESPACE::Component* comp); +#endif + +const int midiBufferSize = 1024; +const OSType juceChunkType = 'juce'; +static const int bypassControlIndex = 1; + +//============================================================================== +/** Somewhere in the codebase of your plugin, you need to implement this function + and make it return a new instance of the filter subclass that you're building. +*/ +extern AudioProcessor* JUCE_CALLTYPE createPluginFilter(); + + +//============================================================================== +static float longToFloat (const long n) throw() +{ + return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); +} + +static long floatToLong (const float n) throw() +{ + return roundDoubleToInt (jlimit (-(double) 0x80000000, + (double) 0x7fffffff, + n * (double) 0xffffffff - (double) 0x80000000)); +} + +static int numInstances = 0; + +//============================================================================== +class JucePlugInProcess : public CEffectProcessMIDI, + public CEffectProcessRTAS, + public AudioProcessorListener, + public AudioPlayHead, + public AsyncUpdater +{ +public: + //============================================================================== + JucePlugInProcess() + : midiBufferNode (0), + midiTransport (0), + channels (0), + prepared (false), + sampleRate (44100.0) + { + juceFilter = createPluginFilter(); + jassert (juceFilter != 0); + + AddChunk (juceChunkType, "Juce Audio Plugin Data"); + + ++numInstances; + } + + ~JucePlugInProcess() + { + if (mLoggedIn) + MIDILogOut(); + + deleteAndZero (midiBufferNode); + deleteAndZero (midiTransport); + + if (prepared) + juceFilter->releaseResources(); + + delete juceFilter; + juce_free (channels); + + if (--numInstances == 0) + shutdownJuce_GUI(); + } + + //============================================================================== + class JuceCustomUIView : public CCustomView, + public Timer + { + public: + //============================================================================== + JuceCustomUIView (AudioProcessor* const filter_, + JucePlugInProcess* const process_) + : filter (filter_), + process (process_), + wrapper (0), + editorComp (0) + { + // setting the size in here crashes PT for some reason, so keep it simple.. + } + + ~JuceCustomUIView() + { + deleteEditorComp(); + } + + //============================================================================== + void updateSize() + { + if (editorComp == 0) + { + editorComp = filter->createEditorIfNeeded(); + jassert (editorComp != 0); + } + + Rect oldRect; + GetRect (&oldRect); + + Rect r; + r.left = 0; + r.top = 0; + r.right = editorComp->getWidth(); + r.bottom = editorComp->getHeight(); + SetRect (&r); + + if ((oldRect.right != r.right) || (oldRect.bottom != r.bottom)) + startTimer (50); + } + + void timerCallback() + { + if (! JUCE_NAMESPACE::Component::isMouseButtonDownAnywhere()) + { + stopTimer(); + + // Send a token to the host to tell it about the resize + SSetProcessWindowResizeToken token (process->fRootNameId, process->fRootNameId); + FicSDSDispatchToken (&token); + } + } + + void attachToWindow (GrafPtr port) + { + if (port != 0) + { + updateSize(); + +#if JUCE_WIN32 + void* const hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); +#else + void* const hostWindow = (void*) GetWindowFromPort (port); +#endif + deleteAndZero (wrapper); + + wrapper = new EditorCompWrapper (hostWindow, editorComp, this); + } + else + { + deleteEditorComp(); + } + } + + void DrawContents (Rect*) + { +#if JUCE_WIN32 + if (wrapper != 0) + { + ComponentPeer* const peer = wrapper->getPeer(); + + if (peer != 0) + { + // (seems to be required in PT6.4, but not in 7.x) + peer->repaint (0, 0, wrapper->getWidth(), wrapper->getHeight()); + } + } +#endif + } + + void DrawBackground (Rect*) {} + + //============================================================================== + private: + AudioProcessor* const filter; + JucePlugInProcess* const process; + JUCE_NAMESPACE::Component* wrapper; + AudioProcessorEditor* editorComp; + + void deleteEditorComp() + { + if (editorComp != 0 || wrapper != 0) + { +#if JUCE_MAC + const ScopedAutoReleasePool pool; +#endif + PopupMenu::dismissAllActiveMenus(); + + JUCE_NAMESPACE::Component* const modalComponent = JUCE_NAMESPACE::Component::getCurrentlyModalComponent(); + if (modalComponent != 0) + modalComponent->exitModalState (0); + + filter->editorBeingDeleted (editorComp); + + deleteAndZero (editorComp); + deleteAndZero (wrapper); + } + } + + //============================================================================== + // A component to hold the AudioProcessorEditor, and cope with some housekeeping + // chores when it changes or repaints. + class EditorCompWrapper : public JUCE_NAMESPACE::Component +#if ! JUCE_MAC + , public FocusChangeListener +#endif + { + public: + EditorCompWrapper (void* const hostWindow_, + Component* const editorComp, + JuceCustomUIView* const owner_) + : hostWindow (hostWindow_), + owner (owner_), + titleW (0), + titleH (0) + { +#if JucePlugin_EditorRequiresKeyboardFocus + setWantsKeyboardFocus (true); +#else + setWantsKeyboardFocus (false); +#endif + setOpaque (true); + setBroughtToFrontOnMouseClick (true); + setBounds (editorComp->getBounds()); + editorComp->setTopLeftPosition (0, 0); + addAndMakeVisible (editorComp); + +#if JUCE_WIN32 + attachSubWindow (hostWindow, titleW, titleH, this); +#else + nsWindow = attachSubWindow (hostWindow, this); +#endif + setVisible (true); + +#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus + Desktop::getInstance().addFocusChangeListener (this); +#endif + } + + ~EditorCompWrapper() + { +#if JUCE_WIN32 && ! JucePlugin_EditorRequiresKeyboardFocus + Desktop::getInstance().removeFocusChangeListener (this); +#endif + +#if JUCE_MAC + removeSubWindow (nsWindow, this); +#endif + } + + void paint (Graphics&) + { + } + + void resized() + { + JUCE_NAMESPACE::Component* const c = getChildComponent (0); + + if (c != 0) + c->setBounds (0, 0, getWidth(), getHeight()); + + repaint(); + } + +#if JUCE_WIN32 + void globalFocusChanged (JUCE_NAMESPACE::Component*) + { + #if ! JucePlugin_EditorRequiresKeyboardFocus + if (hasKeyboardFocus (true)) + passFocusToHostWindow (hostWindow); + #endif + } +#endif + + void childBoundsChanged (JUCE_NAMESPACE::Component* child) + { + setSize (child->getWidth(), child->getHeight()); + child->setTopLeftPosition (0, 0); + +#if JUCE_WIN32 + resizeHostWindow (hostWindow, titleW, titleH, this); +#endif + owner->updateSize(); + } + + void userTriedToCloseWindow() + { + } + + //============================================================================== + juce_UseDebuggingNewOperator + + private: + void* const hostWindow; + void* nsWindow; + JuceCustomUIView* const owner; + int titleW, titleH; + }; + }; + + JuceCustomUIView* getView() const + { + return dynamic_cast (fOurPlugInView); + } + + void GetViewRect (Rect* size) + { + if (getView() != 0) + getView()->updateSize(); + + CEffectProcessRTAS::GetViewRect (size); + } + + CPlugInView* CreateCPlugInView() + { + return new JuceCustomUIView (juceFilter, this); + } + + void SetViewPort (GrafPtr port) + { + CEffectProcessRTAS::SetViewPort (port); + + if (getView() != 0) + getView()->attachToWindow (port); + } + + //============================================================================== +protected: + ComponentResult GetDelaySamplesLong (long* aNumSamples) + { + if (aNumSamples != 0) + *aNumSamples = juceFilter != 0 ? juceFilter->getLatencySamples() : 0; + + return noErr; + } + + //============================================================================== + void EffectInit() + { + SFicPlugInStemFormats stems; + GetProcessType()->GetStemFormats (&stems); + + juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, + juceFilter->getSampleRate(), juceFilter->getBlockSize()); + + AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); + DefineMasterBypassControlIndex (bypassControlIndex); + + for (int i = 0; i < juceFilter->getNumParameters(); ++i) + AddControl (new JucePluginControl (juceFilter, i)); + + // we need to do this midi log-in to get timecode, regardless of whether + // the plugin actually uses midi... + if (MIDILogIn() == noErr) + { +#if JucePlugin_WantsMidiInput + CEffectType* const type = dynamic_cast (this->GetProcessType()); + + if (type != 0) + { + char nodeName [64]; + type->GetProcessTypeName (63, nodeName); + p2cstrcpy (nodeName, reinterpret_cast (nodeName)); + + midiBufferNode = new CEffectMIDIOtherBufferedNode (&mMIDIWorld, + 8192, + eLocalNode, + nodeName, + midiBuffer); + + midiBufferNode->Initialize (1, true); + } +#endif + } + + midiTransport = new CEffectMIDITransport (&mMIDIWorld); + + juceFilter->setPlayHead (this); + juceFilter->addListener (this); + } + + void handleAsyncUpdate() + { + if (! prepared) + { + sampleRate = gProcessGroup->GetSampleRate(); + jassert (sampleRate > 0); + + juce_free (channels); + channels = (float**) juce_calloc (sizeof (float*) * jmax (juceFilter->getNumInputChannels(), + juceFilter->getNumOutputChannels())); + + juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, + sampleRate, mRTGlobals->mHWBufferSizeInSamples); + + juceFilter->prepareToPlay (sampleRate, + mRTGlobals->mHWBufferSizeInSamples); + + prepared = true; + } + } + + void RenderAudio (float** inputs, float** outputs, long numSamples) + { + if (! prepared) + { + triggerAsyncUpdate(); + bypassBuffers (inputs, outputs, numSamples); + return; + } + + if (mBypassed) + { + bypassBuffers (inputs, outputs, numSamples); + return; + } + +#if JucePlugin_WantsMidiInput + midiEvents.clear(); + + const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; + + if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) + midiBufferNode->SetAdvanceScheduleTime (bufferSize); + + if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) + { + jassert (midiBufferNode->GetBufferPtr() != 0); + const int numMidiEvents = midiBufferNode->GetBufferSize(); + + for (int i = 0; i < numMidiEvents; ++i) + { + const DirectMidiPacket& m = midiBuffer[i]; + + jassert ((int) m.mTimestamp < numSamples); + + midiEvents.addEvent (m.mData, m.mLength, + jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); + } + } +#endif + +#if defined (JUCE_DEBUG) || JUCE_LOG_ASSERTIONS + const int numMidiEventsComingIn = midiEvents.getNumEvents(); + (void) numMidiEventsComingIn; +#endif + + { + const ScopedLock sl (juceFilter->getCallbackLock()); + + const int numIn = juceFilter->getNumInputChannels(); + const int numOut = juceFilter->getNumOutputChannels(); + const int totalChans = jmax (numIn, numOut); + + if (juceFilter->isSuspended()) + { + for (int i = 0; i < numOut; ++i) + zeromem (outputs [i], sizeof (float) * numSamples); + } + else + { + { + int i; + for (i = 0; i < numOut; ++i) + { + channels[i] = outputs [i]; + + if (i < numIn && inputs != outputs) + memcpy (outputs [i], inputs[i], sizeof (float) * numSamples); + } + + for (; i < numIn; ++i) + channels [i] = inputs [i]; + } + + AudioSampleBuffer chans (channels, totalChans, numSamples); + + juceFilter->processBlock (chans, midiEvents); + } + } + + if (! midiEvents.isEmpty()) + { +#if JucePlugin_ProducesMidiOutput + const juce::uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiEvents); + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { +// jassert (midiEventPosition >= 0 && midiEventPosition < (int) numSamples); + + //xxx + } +#else + // if your plugin creates midi messages, you'll need to set + // the JucePlugin_ProducesMidiOutput macro to 1 in your + // JucePluginCharacteristics.h file + jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); +#endif + + midiEvents.clear(); + } + } + + //============================================================================== + ComponentResult GetChunkSize (OSType chunkID, long* size) + { + if (chunkID == juceChunkType) + { + tempFilterData.setSize (0); + juceFilter->getStateInformation (tempFilterData); + + *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); + return noErr; + } + + return CEffectProcessMIDI::GetChunkSize (chunkID, size); + } + + ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) + { + if (chunkID == juceChunkType) + { + if (tempFilterData.getSize() == 0) + juceFilter->getStateInformation (tempFilterData); + + chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); + tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); + + tempFilterData.setSize (0); + + return noErr; + } + + return CEffectProcessMIDI::GetChunk (chunkID, chunk); + } + + ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) + { + if (chunkID == juceChunkType) + { + tempFilterData.setSize (0); + + if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) + { + juceFilter->setStateInformation ((void*) chunk->fData, + chunk->fSize - sizeof (SFicPlugInChunkHeader)); + } + + return noErr; + } + + return CEffectProcessMIDI::SetChunk (chunkID, chunk); + } + + //============================================================================== + ComponentResult UpdateControlValue (long controlIndex, long value) + { + if (controlIndex != bypassControlIndex) + juceFilter->setParameter (controlIndex - 2, longToFloat (value)); + else + mBypassed = (value > 0); + + return CProcess::UpdateControlValue (controlIndex, value); + } + + //============================================================================== + bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) + { + // this method can only be called while the plugin is running + jassert (prepared); + + Cmn_Float64 bpm = 120.0; + Cmn_Int32 num = 4, denom = 4; + Cmn_Int64 ticks = 0; + Cmn_Bool isPlaying = false; + + if (midiTransport != 0) + { + midiTransport->GetCurrentTempo (&bpm); + midiTransport->IsTransportPlaying (&isPlaying); + midiTransport->GetCurrentMeter (&num, &denom); + midiTransport->GetCurrentTickPosition (&ticks); + } + + info.bpm = bpm; + info.timeSigNumerator = num; + info.timeSigDenominator = denom; + info.isPlaying = isPlaying; + info.isRecording = false; + info.ppqPosition = ticks / 960000.0; + info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. + + // xxx incorrect if there are tempo changes, but there's no + // other way of getting this info.. + info.timeInSeconds = ticks * (60.0 / 960000.0) / bpm; + + double framesPerSec = 24.0; + + switch (fTimeCodeInfo.mFrameRate) + { + case ficFrameRate_24Frame: + info.frameRate = AudioPlayHead::fps24; + break; + + case ficFrameRate_25Frame: + info.frameRate = AudioPlayHead::fps25; + framesPerSec = 25.0; + break; + + case ficFrameRate_2997NonDrop: + info.frameRate = AudioPlayHead::fps2997; + framesPerSec = 29.97002997; + break; + + case ficFrameRate_2997DropFrame: + info.frameRate = AudioPlayHead::fps2997drop; + framesPerSec = 29.97002997; + break; + + case ficFrameRate_30NonDrop: + info.frameRate = AudioPlayHead::fps30; + framesPerSec = 30.0; + break; + + case ficFrameRate_30DropFrame: + info.frameRate = AudioPlayHead::fps30drop; + framesPerSec = 30.0; + break; + + case ficFrameRate_23976: + // xxx not strictly true.. + info.frameRate = AudioPlayHead::fps24; + framesPerSec = 23.976; + break; + + default: + info.frameRate = AudioPlayHead::fpsUnknown; + break; + } + + info.editOriginTime = fTimeCodeInfo.mFrameOffset / framesPerSec; + + return true; + } + + void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) + { + SetControlValue (index + 2, floatToLong (newValue)); + } + + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) + { + TouchControl (index + 2); + } + + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) + { + ReleaseControl (index + 2); + } + + void audioProcessorChanged (AudioProcessor*) + { + // xxx is there an RTAS equivalent? + } + + //============================================================================== +private: + AudioProcessor* juceFilter; + MidiBuffer midiEvents; + CEffectMIDIOtherBufferedNode* midiBufferNode; + CEffectMIDITransport* midiTransport; + DirectMidiPacket midiBuffer [midiBufferSize]; + + JUCE_NAMESPACE::MemoryBlock tempFilterData; + float** channels; + bool prepared; + double sampleRate; + + void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const + { + for (int i = fNumOutputs; --i >= 0;) + { + if (i < fNumInputs) + memcpy (outputs[i], inputs[i], numSamples * sizeof (float)); + else + zeromem (outputs[i], numSamples * sizeof (float)); + } + } + + //============================================================================== + class JucePluginControl : public CPluginControl + { + public: + //============================================================================== + JucePluginControl (AudioProcessor* const juceFilter_, const int index_) + : juceFilter (juceFilter_), + index (index_) + { + } + + ~JucePluginControl() + { + } + + //============================================================================== + OSType GetID() const { return index + 1; } + long GetDefaultValue() const { return floatToLong (0); } + void SetDefaultValue (long) {} + long GetNumSteps() const { return 0xffffffff; } + + long ConvertStringToValue (const char* valueString) const + { + return floatToLong (String (valueString).getFloatValue()); + } + + Cmn_Bool IsKeyValid (long key) const { return true; } + + void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const + { + juceFilter->getParameterName (index).copyToBuffer (name, maxLength); + } + + long GetPriority() const { return kFicCooperativeTaskPriority; } + + long GetOrientation() const + { + return kDAE_LeftMinRightMax | kDAE_BottomMinTopMax + | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; + } + + long GetControlType() const { return kDAE_ContinuousValues; } + + void GetValueString (char* valueString, int maxLength, long value) const + { + juceFilter->getParameterText (index).copyToBuffer (valueString, maxLength); + } + + Cmn_Bool IsAutomatable() const + { + return juceFilter->isParameterAutomatable (index); + } + + private: + //============================================================================== + AudioProcessor* const juceFilter; + const int index; + + JucePluginControl (const JucePluginControl&); + const JucePluginControl& operator= (const JucePluginControl&); + }; +}; + +//============================================================================== +class JucePlugInGroup : public CEffectGroupMIDI +{ +public: + //============================================================================== + JucePlugInGroup() + { + DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); + DefinePlugInNamesAndVersion (createRTASName(), JucePlugin_VersionCode); + +#ifndef JUCE_DEBUG + AddGestalt (pluginGestalt_IsCacheable); +#endif + } + + ~JucePlugInGroup() + { + shutdownJuce_GUI(); + shutdownJuce_NonGUI(); + } + + //============================================================================== + void CreateEffectTypes() + { + const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; + const int numConfigs = numElementsInArray (channelConfigs); + + // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations + // value in your JucePluginCharacteristics.h file.. + jassert (numConfigs > 0); + + for (int i = 0; i < numConfigs; ++i) + { + CEffectType* const type + = new CEffectTypeRTAS ('jcaa' + i, + JucePlugin_RTASProductId, + JucePlugin_RTASCategory); + + type->DefineTypeNames (createRTASName()); + type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); + + type->DefineStemFormats (getFormatForChans (channelConfigs [i][0]), + getFormatForChans (channelConfigs [i][1])); + + type->AddGestalt (pluginGestalt_CanBypass); + type->AddGestalt (pluginGestalt_SupportsVariableQuanta); + type->AttachEffectProcessCreator (createNewProcess); + + AddEffectType (type); + } + } + + void Initialize() + { + CEffectGroupMIDI::Initialize(); + } + + //============================================================================== +private: + static CEffectProcess* createNewProcess() + { + // Juce setup +#if JUCE_WIN32 + PlatformUtilities::setCurrentModuleInstanceHandle (gThisModule); +#endif + initialiseJuce_GUI(); + + return new JucePlugInProcess(); + } + + static const String createRTASName() + { + return String (JucePlugin_Name) + T("\n") + + String (JucePlugin_Name).substring (0, 4); + } + + static EPlugIn_StemFormat getFormatForChans (const int numChans) throw() + { + switch (numChans) + { + case 0: + return ePlugIn_StemFormat_Generic; + + case 1: + return ePlugIn_StemFormat_Mono; + + case 2: + return ePlugIn_StemFormat_Stereo; + + case 3: + return ePlugIn_StemFormat_LCR; + + case 4: + return ePlugIn_StemFormat_Quad; + + case 5: + return ePlugIn_StemFormat_5dot0; + + case 6: + return ePlugIn_StemFormat_5dot1; + + case 7: + return ePlugIn_StemFormat_6dot1; + + case 8: + return ePlugIn_StemFormat_7dot1; + + default: + jassertfalse // hmm - not a valid number of chans for RTAS.. + break; + } + + return ePlugIn_StemFormat_Generic; + } +}; + +void initialiseMacRTAS(); + +CProcessGroupInterface* CProcessGroup::CreateProcessGroup() +{ + initialiseMacRTAS(); + initialiseJuce_NonGUI(); + return new JucePlugInGroup(); +} + +#endif diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp b/extras/audio plugins/wrapper/Standalone/juce_AudioFilterStreamer.cpp similarity index 100% rename from extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.cpp rename to extras/audio plugins/wrapper/Standalone/juce_AudioFilterStreamer.cpp diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h b/extras/audio plugins/wrapper/Standalone/juce_AudioFilterStreamer.h similarity index 96% rename from extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h rename to extras/audio plugins/wrapper/Standalone/juce_AudioFilterStreamer.h index 8b6f99182c..afbb9d547b 100644 --- a/extras/audio plugins/wrapper/formats/Standalone/juce_AudioFilterStreamer.h +++ b/extras/audio plugins/wrapper/Standalone/juce_AudioFilterStreamer.h @@ -32,7 +32,7 @@ #ifndef __JUCE_AUDIOFILTERSTREAMER_JUCEHEADER__ #define __JUCE_AUDIOFILTERSTREAMER_JUCEHEADER__ -#include "../../../../../juce_amalgamated.h" +#include "../juce_PluginHeaders.h" //============================================================================== diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp b/extras/audio plugins/wrapper/Standalone/juce_StandaloneFilterWindow.cpp similarity index 96% rename from extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp rename to extras/audio plugins/wrapper/Standalone/juce_StandaloneFilterWindow.cpp index a98a7764ab..e605d546d6 100644 --- a/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.cpp +++ b/extras/audio plugins/wrapper/Standalone/juce_StandaloneFilterWindow.cpp @@ -30,7 +30,7 @@ */ #include "juce_StandaloneFilterWindow.h" -#include "../../juce_IncludeCharacteristics.h" +#include "../juce_PluginHeaders.h" //============================================================================== /** Somewhere in the codebase of your plugin, you need to implement this function diff --git a/extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h b/extras/audio plugins/wrapper/Standalone/juce_StandaloneFilterWindow.h similarity index 100% rename from extras/audio plugins/wrapper/formats/Standalone/juce_StandaloneFilterWindow.h rename to extras/audio plugins/wrapper/Standalone/juce_StandaloneFilterWindow.h diff --git a/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp similarity index 94% rename from extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp rename to extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp index 4656cd318a..24866ee6e7 100644 --- a/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.cpp +++ b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp @@ -29,19 +29,6 @@ ============================================================================== */ -/* - *** DON'T EDIT THIS FILE!! *** - - The idea is that everyone's plugins should share this same wrapper - code, so if you start hacking around in here you're missing the point! - - If there's a bug or a function you need that can't be done without changing - some of the code in here, give me a shout so we can add it to the library, - rather than branching off and going it alone! -*/ - - -//============================================================================== #ifdef _MSC_VER #pragma warning (disable : 4996) #endif @@ -62,7 +49,9 @@ #define PRAGMA_ALIGN_SUPPORTED 1 #endif -#include "../../juce_IncludeCharacteristics.h" +#include "../juce_PluginHeaders.h" + +#if JucePlugin_Build_VST //============================================================================== /* These files come with the Steinberg VST SDK - to get them, you'll need to @@ -119,8 +108,7 @@ #pragma pack (push, 8) #endif -//#include "../../../../../juce_amalgamated.h" -#include "../../../../../juce.h" +#include "../juce_PluginHeaders.h" #ifdef _MSC_VER #pragma pack (pop) @@ -136,6 +124,7 @@ BEGIN_JUCE_NAMESPACE extern void juce_callAnyTimersSynchronously(); #if JUCE_MAC + extern void initialiseMac(); extern void juce_setCurrentExecutableFileNameFromBundleId (const String& bundleId) throw(); extern void* attachComponentToWindowRef (Component* component, void* windowRef); extern void detachComponentFromWindowRef (Component* component, void* nsWindow); @@ -626,8 +615,7 @@ public: filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); #if JUCE_WIN32 - if (GetThreadPriority (GetCurrentThread()) <= THREAD_PRIORITY_NORMAL - && GetThreadPriority (GetCurrentThread()) >= THREAD_PRIORITY_LOWEST) + if (GetThreadPriority (GetCurrentThread()) <= THREAD_PRIORITY_NORMAL) filter->setNonRealtime (true); #endif } @@ -1176,8 +1164,11 @@ public: } #if JUCE_MAC - detachComponentFromWindowRef (editorComp, hostWindow); - hostWindow = 0; + if (hostWindow != 0) + { + detachComponentFromWindowRef (editorComp, hostWindow); + hostWindow = 0; + } #endif filter->editorBeingDeleted (editorComp->getEditorComp()); @@ -1262,7 +1253,7 @@ public: *((ERect**) ptr) = &editorSize; - return (VstIntPtr) &editorSize; + return (VstIntPtr) (pointer_sized_int) &editorSize; } else { @@ -1495,11 +1486,13 @@ static AEffect* pluginEntryPoint (audioMasterCallback audioMaster) extern "C" __attribute__ ((visibility("default"))) AEffect* VSTPluginMain (audioMasterCallback audioMaster) { + initialiseMac(); return pluginEntryPoint (audioMaster); } extern "C" __attribute__ ((visibility("default"))) AEffect* main_macho (audioMasterCallback audioMaster) { + initialiseMac(); return pluginEntryPoint (audioMaster); } @@ -1541,12 +1534,14 @@ extern "C" __declspec (dllexport) AEffect* VSTPluginMain (audioMasterCallback au return pluginEntryPoint (audioMaster); } +#ifndef _WIN64 // (can't compile this on win64, but it's not needed anyway with VST2.4) extern "C" __declspec (dllexport) void* main (audioMasterCallback audioMaster) { return (void*) pluginEntryPoint (audioMaster); } +#endif -BOOL WINAPI DllMain (HINSTANCE instance, DWORD dwReason, LPVOID) +BOOL WINAPI DllMainVST (HINSTANCE instance, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) PlatformUtilities::setCurrentModuleInstanceHandle (instance); @@ -1555,3 +1550,5 @@ BOOL WINAPI DllMain (HINSTANCE instance, DWORD dwReason, LPVOID) } #endif + +#endif diff --git a/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.mm b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm similarity index 58% rename from extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.mm rename to extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm index 423950a0a4..33eb372bca 100644 --- a/extras/audio plugins/wrapper/formats/VST/juce_VstWrapper.mm +++ b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm @@ -1,111 +1,171 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -//============================================================================== -#include -#include "../../../../../juce.h" - - -BEGIN_JUCE_NAMESPACE - -void* attachComponentToWindowRef (Component* comp, void* windowRef) -{ - const ScopedAutoReleasePool pool; - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - -#if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); -#else - comp->addToDesktop (ComponentPeer::windowIsTemporary); -#endif - - comp->setVisible (true); - comp->toFront (false); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - [pluginWindow setExcludedFromWindowsMenu: YES]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - return hostWindow; -} - -void detachComponentFromWindowRef (Component* comp, void* nsWindow) -{ - NSWindow* hostWindow = (NSWindow*) nsWindow; - if (hostWindow != 0) - { - const ScopedAutoReleasePool pool; - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - - [hostWindow release]; - } -} - -void setNativeHostWindowSize (void* nsWindow, Component* component, int newWidth, int newHeight) -{ - NSWindow* hostWindow = (NSWindow*) nsWindow; - if (hostWindow != 0) - { - ScopedAutoReleasePool pool; - - NSRect f = [hostWindow frame]; - f.size.width += newWidth - component->getWidth(); - f.size.height += newHeight - component->getHeight(); - [hostWindow setFrame: f display: YES]; - } -} - -void checkWindowVisibility (void* nsWindow, Component* comp) -{ - NSWindow* hostWindow = (NSWindow*) nsWindow; - comp->setVisible ([hostWindow isVisible]); -} - -END_JUCE_NAMESPACE +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +//============================================================================== +#include "../juce_IncludeCharacteristics.h" + +#if JucePlugin_Build_VST + +#include + +#define ADD_CARBON_BODGE 1 // see note below.. + +#if ADD_CARBON_BODGE + #include +#endif + +#include "../juce_PluginHeaders.h" + +//============================================================================== +BEGIN_JUCE_NAMESPACE + +#if ADD_CARBON_BODGE +/* When you wrap a WindowRef as an NSWindow, it seems to bugger up the HideWindow + function, so when the host tries (and fails) to hide the window, this catches + the event and does the job properly. +*/ + +static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, void* user) +{ + NSWindow* hostWindow = (NSWindow*) user; + + switch (GetEventKind (e)) + { + case kEventWindowShown: + [hostWindow orderFront: nil]; + break; + case kEventWindowHidden: + [hostWindow orderOut: nil]; + break; + } + + return eventNotHandledErr; +} +#endif + +//============================================================================== +void initialiseMac() +{ + NSApplicationLoad(); +} + +void* attachComponentToWindowRef (Component* comp, void* windowRef) +{ + const ScopedAutoReleasePool pool; + + NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; + [hostWindow retain]; + [hostWindow setCanHide: YES]; + [hostWindow setReleasedWhenClosed: YES]; + + NSView* content = [hostWindow contentView]; + NSRect f = [content frame]; + NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; + windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); + comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); + +#if ! JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); +#else + comp->addToDesktop (ComponentPeer::windowIsTemporary); +#endif + + comp->setVisible (true); + comp->toFront (false); + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + [pluginWindow setExcludedFromWindowsMenu: YES]; + [pluginWindow setCanHide: YES]; + + [hostWindow addChildWindow: pluginWindow + ordered: NSWindowAbove]; + [hostWindow orderFront: nil]; + [pluginWindow orderFront: nil]; + +#if ADD_CARBON_BODGE + // Adds a callback bodge to work around some problems with wrapped + // carbon windows.. + const EventTypeSpec eventsToCatch[] = { + { kEventClassWindow, kEventWindowShown }, + { kEventClassWindow, kEventWindowHidden } + }; + + InstallWindowEventHandler ((WindowRef) windowRef, + NewEventHandlerUPP (windowVisibilityBodge), + GetEventTypeCount (eventsToCatch), eventsToCatch, + (void*) hostWindow, 0); +#endif + + return hostWindow; +} + +void detachComponentFromWindowRef (Component* comp, void* nsWindow) +{ + const ScopedAutoReleasePool pool; + + NSWindow* hostWindow = (NSWindow*) nsWindow; + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow removeChildWindow: pluginWindow]; + comp->removeFromDesktop(); + + [hostWindow release]; +} + +void setNativeHostWindowSize (void* nsWindow, Component* component, int newWidth, int newHeight) +{ + NSWindow* hostWindow = (NSWindow*) nsWindow; + if (hostWindow != 0) + { + ScopedAutoReleasePool pool; + + // Can't use the cocoa NSWindow resizing code, or it messes up in Live. + Rect r; + GetWindowBounds ((WindowRef) [hostWindow windowRef], kWindowContentRgn, &r); + r.right += newWidth - component->getWidth(); + r.bottom += newHeight - component->getHeight(); + SetWindowBounds ((WindowRef) [hostWindow windowRef], kWindowContentRgn, &r); + + [[hostWindow contentView] setNeedsDisplay: YES]; + } +} + +void checkWindowVisibility (void* nsWindow, Component* comp) +{ + NSWindow* hostWindow = (NSWindow*) nsWindow; + comp->setVisible ([hostWindow isVisible]); +} + +END_JUCE_NAMESPACE + +#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r b/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r deleted file mode 100644 index b607d8d1be..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/DummyResourceFile.r +++ /dev/null @@ -1,4 +0,0 @@ - -// This dummy file is added to the resources section of the project to -// force XCode to create some resources for the dpm. If there aren't any -// resources, PT would refuse to load the plugin.. \ No newline at end of file diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp deleted file mode 100644 index 2a938ae853..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroup.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "CEffectGroup.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp deleted file mode 100644 index 07aa7ee05c..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectGroupMIDI.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "CEffectGroupMIDI.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp deleted file mode 100644 index 70083d8da6..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectProcessAS.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "CEffectProcessAS.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp deleted file mode 100644 index 5c33164ea9..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectType.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "CEffectType.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp deleted file mode 100644 index 1464ee04d7..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_CEffectTypeRTAS.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "CEffectTypeRTAS.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp deleted file mode 100644 index 5f29659bd7..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_ChunkDataParser.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "ChunkDataParser.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp deleted file mode 100644 index fa1259df2d..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DLLMain.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#if WINDOWS_VERSION - #include "DLLMain.cpp" -#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp deleted file mode 100644 index 3cc54a6782..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_DefaultSwap.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#if WINDOWS_VERSION - #include "DefaultSwap.cpp" -#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp deleted file mode 100644 index d8b321ea65..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Dispatcher.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -/* This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. -*/ - -#include "juce_Wrapper_Header.h" -#if ! WINDOWS_VERSION - #include "Dispatcher.cpp" -#endif diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp deleted file mode 100644 index 19c8440f53..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PlugInUtils.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "juce_Wrapper_Header.h" - -/* - This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. - - Note about include paths - - If you get an error including this file, check your paths - there's a full list of - Digidesign paths in juce_RTASWrapper.cpp -*/ -#include "PlugInUtils.cpp" diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp b/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp deleted file mode 100644 index 80698eeff2..0000000000 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_PluginInitialize.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -/* This file is used to include and build a digidesign CPP file without your project needing to - reference the file directly. Because the file will be located via the include path, this means - that the project doesn't have to change to cope with people's SDKs being in different locations. -*/ - -#include "juce_Wrapper_Header.h" -#if ! WINDOWS_VERSION - #include "PlugInInitialize.cpp" -#endif diff --git a/extras/audio plugins/wrapper/formats/VST/MacExportedSymbols.txt b/extras/audio plugins/wrapper/formats/VST/MacExportedSymbols.txt deleted file mode 100644 index a71eebdde5..0000000000 --- a/extras/audio plugins/wrapper/formats/VST/MacExportedSymbols.txt +++ /dev/null @@ -1,12 +0,0 @@ -# -# This file contains a list of the symbols that your VST plugin needs to export. -# -# It's very important that you refer to this file in your linker settings, under -# the "Exported Symbols File" heading. If you don't specify that these are the -# only two symbols exported, the linker will also export all the Obj-C symbols in -# Juce, and this will create all sorts of dynamic link problems when you have -# more than one juce-linked module loaded at the same time. -# - -_VSTPluginMain -_main_macho diff --git a/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h b/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h index 1030d5fefb..8a06cadc7a 100644 --- a/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h +++ b/extras/audio plugins/wrapper/juce_IncludeCharacteristics.h @@ -91,8 +91,16 @@ #error "You need to define the JucePlugin_EditorRequiresKeyboardFocus value in your JucePluginCharacteristics.h file!" #endif -#if JUCE_USE_VSTSDK_2_4 != 0 && JUCE_USE_VSTSDK_2_4 != 1 +#if ! (JucePlugin_Build_VST || JucePlugin_Build_AU || JucePlugin_Build_RTAS) + #error "You need to define at least one plugin format value in your JucePluginCharacteristics.h file!" +#endif + +#if JucePlugin_Build_VST && (JUCE_USE_VSTSDK_2_4 != 0 && JUCE_USE_VSTSDK_2_4 != 1) #error "You need to define the JUCE_USE_VSTSDK_2_4 value in your JucePluginCharacteristics.h file!" #endif +#if JucePlugin_Build_RTAS && _MSC_VER && ! defined (JucePlugin_WinBag_path) + #error "You need to define the JucePlugin_WinBag_path value in your JucePluginCharacteristics.h file!" +#endif + #endif // __JUCE_INCLUDECHARACTERISTICS_JUCEHEADER__ diff --git a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h b/extras/audio plugins/wrapper/juce_PluginHeaders.h similarity index 76% rename from extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h rename to extras/audio plugins/wrapper/juce_PluginHeaders.h index f746288711..84b4ea43f6 100644 --- a/extras/audio plugins/wrapper/formats/RTAS/wrappers/juce_Wrapper_Header.h +++ b/extras/audio plugins/wrapper/juce_PluginHeaders.h @@ -29,17 +29,5 @@ ============================================================================== */ -#ifndef __JUCE_WRAPPER_HEADER_JUCEHEADER__ -#define __JUCE_WRAPPER_HEADER_JUCEHEADER__ - -#include "../juce_RTASCompileFlags.h" - -#ifdef _MSC_VER - // the Digidesign projects all use a struct alignment of 2.. - #pragma pack (2) - #pragma warning (disable: 4267 4996 4311 4312 4103) - - #include "ForcedInclude.h" -#endif - -#endif // __JUCE_WRAPPER_HEADER_JUCEHEADER__ +#include "juce_IncludeCharacteristics.h" +#include "../../../juce_amalgamated.h"