├── .appveyor.yml ├── .clang-format ├── .gitignore ├── .gitmodules ├── .travis.yml ├── CMakeLists.txt ├── LICENSE ├── README.md ├── cmake ├── FindGTK3.cmake ├── FindLibSoup.cmake ├── FindWebKitGTK.cmake ├── JUCE.cmake ├── ci.cmake ├── colors.cmake └── hex-util.cmake ├── src ├── GainGUI.cpp ├── GainGUI.h ├── PluginAudioProcessor.cpp ├── PluginAudioProcessor.h ├── PluginAudioProcessorEditor.cpp ├── PluginAudioProcessorEditor.h ├── resources │ └── GainGUI.cpp └── ui │ ├── GraphicKnob.cpp │ └── GraphicKnob.h └── support ├── AppConfig.h.in ├── JuceHeader.h.in ├── JuceLibraryCode ├── ReadMe.txt ├── juce_audio_basics.cpp ├── juce_audio_basics.mm ├── juce_audio_devices.cpp ├── juce_audio_devices.mm ├── juce_audio_formats.cpp ├── juce_audio_formats.mm ├── juce_audio_plugin_client_AAX.cpp ├── juce_audio_plugin_client_AAX.mm ├── juce_audio_plugin_client_AU_1.mm ├── juce_audio_plugin_client_AU_2.mm ├── juce_audio_plugin_client_AUv3.mm ├── juce_audio_plugin_client_RTAS_1.cpp ├── juce_audio_plugin_client_RTAS_2.cpp ├── juce_audio_plugin_client_RTAS_3.cpp ├── juce_audio_plugin_client_RTAS_4.cpp ├── juce_audio_plugin_client_RTAS_utils.cpp ├── juce_audio_plugin_client_RTAS_utils.mm ├── juce_audio_plugin_client_Standalone.cpp ├── juce_audio_plugin_client_VST2.cpp ├── juce_audio_plugin_client_VST3.cpp ├── juce_audio_plugin_client_VST_utils.mm ├── juce_audio_plugin_client_utils.cpp ├── juce_audio_processors.cpp ├── juce_audio_processors.mm ├── juce_audio_utils.cpp ├── juce_audio_utils.mm ├── juce_core.cpp ├── juce_core.mm ├── juce_cryptography.cpp ├── juce_cryptography.mm ├── juce_data_structures.cpp ├── juce_data_structures.mm ├── juce_events.cpp ├── juce_events.mm ├── juce_graphics.cpp ├── juce_graphics.mm ├── juce_gui_basics.cpp ├── juce_gui_basics.mm ├── juce_gui_extra.cpp ├── juce_gui_extra.mm ├── juce_opengl.cpp ├── juce_opengl.mm ├── juce_video.cpp └── juce_video.mm ├── images └── screenshot.png ├── osx ├── Info-AU.plist.in └── Info-VSTx.plist.in └── project-config.h.in /.appveyor.yml: -------------------------------------------------------------------------------- 1 | version: configuring.{build} 2 | configuration: 3 | - Debug 4 | - Release 5 | platform: 6 | - Win32 7 | - x64 8 | clone_folder: c:\SLBuild\audio-plugin-project-template 9 | init: 10 | - cmd: >- 11 | cd c:\SLBuild\ 12 | 13 | cd audio-plugin-project-template 14 | 15 | build_script: 16 | - cmd: >- 17 | echo Running cmake... 18 | 19 | echo Building %CONFIGURATION% - %PLATFORM% 20 | 21 | c: 22 | 23 | cd c:\SLBuild\audio-plugin-project-template 24 | 25 | git submodule update --init --recursive 26 | 27 | mkdir build-%PLATFORM% 28 | 29 | pushd build-%PLATFORM% 30 | 31 | if %PLATFORM% == x64 (set GENERATOR="Visual Studio 14 2015 Win64") else (set GENERATOR="Visual Studio 14 2015") 32 | 33 | cmake -G %GENERATOR% -DCMAKE_BUILD_TYPE=%CONFIGURATION% .. 34 | 35 | cd .. 36 | 37 | cmake --build build-%PLATFORM% --config %CONFIGURATION% 38 | 39 | mkdir artifacts-%CONFIGURATION% 40 | 41 | cd build-%PLATFORM%\%CONFIGURATION%\ 42 | 43 | 7z a -tzip win.zip -r *.dll 44 | 45 | move /y *.zip ..\..\artifacts-%CONFIGURATION% 46 | 47 | cd ..\..\ 48 | 49 | after_build: 50 | - cmd: >- 51 | cd c:\SLBuild\audio-plugin-project-template\artifacts-%CONFIGURATION% 52 | 53 | if %PLATFORM% == x64 (echo Preparing to deploy win-64.zip) else (echo Preparing to deploy win-32.zip) 54 | 55 | if %PLATFORM% == x64 (ren win.zip win-64.zip) else (ren win.zip win-32.zip) 56 | 57 | cd .. 58 | 59 | artifacts: 60 | - path: artifacts-Release/win-32.zip 61 | name: binary (32bit) 62 | - path: artifacts-Release/win-64.zip 63 | name: binary (64bit) 64 | 65 | deploy: 66 | provider: GitHub 67 | auth_token: 68 | secure: YdSaqN8QORm4y2pBT0D40ltSZ+2iL9A0bTh3s3JbqgH5scJKqPhpdrUDFdp6TNkW 69 | artifact: /win-.*\.zip/ 70 | force_update: true 71 | draft: false 72 | prerelease: false 73 | on: 74 | appveyor_repo_tag: true 75 | branch: master 76 | CONFIGURATION: Release 77 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | AccessModifierOffset: -2 4 | AlignAfterOpenBracket: false 5 | AlignEscapedNewlinesLeft: true 6 | AlignOperands: true 7 | AlignTrailingComments: true 8 | AllowAllParametersOfDeclarationOnNextLine: true 9 | AllowShortBlocksOnASingleLine: false 10 | AllowShortIfStatementsOnASingleLine: false 11 | AllowShortLoopsOnASingleLine: false 12 | AllowShortFunctionsOnASingleLine: false 13 | AlwaysBreakTemplateDeclarations: true 14 | AlwaysBreakBeforeMultilineStrings: false 15 | BreakBeforeBinaryOperators: true 16 | BreakBeforeTernaryOperators: true 17 | BreakConstructorInitializersBeforeComma: true 18 | BinPackArguments: false 19 | BinPackParameters: false 20 | BreakBeforeBraces: Allman 21 | ColumnLimit: 100 22 | CommentPragmas: '^!' 23 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 24 | ConstructorInitializerIndentWidth: 2 25 | ContinuationIndentWidth: 2 26 | Cpp11BracedListStyle: true 27 | DerivePointerAlignment: false 28 | DisableFormat: false 29 | ExperimentalAutoDetectBinPacking: false 30 | IndentCaseLabels: true 31 | IndentFunctionDeclarationAfterType: false 32 | IndentWrappedFunctionNames: false 33 | IndentWidth: 2 34 | KeepEmptyLinesAtTheStartOfBlocks: true 35 | MaxEmptyLinesToKeep: 2 36 | NamespaceIndentation: None 37 | PenaltyBreakBeforeFirstCallParameter: 19 38 | PenaltyBreakComment: 300 39 | PenaltyBreakString: 1000 40 | PenaltyBreakFirstLessLess: 120 41 | PenaltyExcessCharacter: 100 42 | PenaltyReturnTypeOnItsOwnLine: 600 43 | PointerAlignment: Left 44 | SpaceBeforeAssignmentOperators: true 45 | SpaceBeforeParens: ControlStatements 46 | SpaceInEmptyParentheses: false 47 | SpacesBeforeTrailingComments: 1 48 | SpacesInAngles: false 49 | SpacesInContainerLiterals: true 50 | SpacesInCStyleCastParentheses: false 51 | SpacesInParentheses: false 52 | Standard: Cpp11 53 | TabWidth: 2 54 | UseTab: Never 55 | ... 56 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build products 2 | build/ 3 | build-32/ 4 | build-64/ 5 | Builds/ 6 | Release/ 7 | Debug/ 8 | artifacts/ 9 | ipch/ 10 | .env/ 11 | cmake_install.cmake 12 | Makefile 13 | 14 | # Mac specific 15 | *.DS_Store 16 | xcuserdata/ 17 | project.xcworkspace/ 18 | *.pbxuser 19 | 20 | # Windows specific 21 | *.bak 22 | *.opt 23 | *.user 24 | *.suo 25 | *.sdf 26 | *.ncb 27 | *.opensdf 28 | 29 | # Temporary files 30 | *~ 31 | 32 | # Documentation 33 | docs/ 34 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "modules/vst3sdk"] 2 | path = modules/vst3sdk 3 | url = https://github.com/steinbergmedia/vst3sdk.git 4 | [submodule "modules/JUCE5"] 5 | path = modules/JUCE5 6 | url = https://github.com/WeAreROLI/JUCE.git 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: cpp 2 | sudo: false 3 | 4 | matrix: 5 | include: 6 | - os: linux 7 | addons: 8 | apt: 9 | sources: 10 | - ubuntu-toolchain-r-test 11 | - sourceline: 'ppa:webkit-team/ppa' 12 | packages: 13 | - g++-6 14 | - libasound2-dev 15 | - libxrandr-dev 16 | - libxinerama-dev 17 | - libx11-dev 18 | - mesa-common-dev 19 | - freeglut3-dev 20 | - libxcomposite-dev 21 | - libfreetype6-dev 22 | - libcurl4-gnutls-dev 23 | - libxcursor-dev 24 | - libgtk-3-dev 25 | - libgl1-mesa-dev 26 | - libwebkit2gtk-4.0-dev 27 | env: CXX_COMPILER='g++-6' C_COMPILER='gcc-6' Fortran_COMPILER='gfortran' BUILD_TYPE='Debug' 28 | - os: linux 29 | addons: 30 | apt: 31 | sources: 32 | - ubuntu-toolchain-r-test 33 | - sourceline: 'ppa:webkit-team/ppa' 34 | packages: 35 | - g++-6 36 | - libasound2-dev 37 | - libxrandr-dev 38 | - libxinerama-dev 39 | - libx11-dev 40 | - mesa-common-dev 41 | - freeglut3-dev 42 | - libxcomposite-dev 43 | - libfreetype6-dev 44 | - libcurl4-gnutls-dev 45 | - libxcursor-dev 46 | - libgtk-3-dev 47 | - libgl1-mesa-dev 48 | - libwebkit2gtk-4.0-dev 49 | env: CXX_COMPILER='g++-6' C_COMPILER='gcc-6' Fortran_COMPILER='gfortran' BUILD_TYPE='Release' 50 | - os: osx 51 | compiler: clang 52 | env: CXX_COMPILER='clang++' C_COMPILER='clang' Fortran_COMPILER='gfortran' GENERATOR='-G Xcode' BUILD_TYPE='Debug' 53 | - os: osx 54 | compiler: clang 55 | env: CXX_COMPILER='clang++' C_COMPILER='clang' Fortran_COMPILER='gfortran' GENERATOR='-G Xcode' BUILD_TYPE='Release' 56 | PROJECT_DEPLOY_TARGET="osx" 57 | install: 58 | - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps" 59 | - mkdir ${DEPS_DIR} && cd ${DEPS_DIR} 60 | before_script: 61 | - export CXX=${CXX_COMPILER} 62 | - export CC=${C_COMPILER} 63 | - export FC=${Fortran_COMPILER} 64 | - export PATH=$HOME/.local/bin:/usr/local/bin:/usr/bin:$PATH 65 | script: 66 | - cd ${TRAVIS_BUILD_DIR} 67 | - mkdir build 68 | - cd build 69 | - CXX=${CXX_COMPILER} CC=${C_COMPILER} FC=${Fortran_COMPILER} cmake $GENERATOR .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" 70 | - cd .. 71 | - cmake --build build --config $BUILD_TYPE 72 | after_success: 73 | - | 74 | if [ -n "${PROJECT_DEPLOY_TARGET+set}" ]; then 75 | echo "Deploying package $PROJECT_DEPLOY_TARGET" 76 | mkdir build/$PROJECT_DEPLOY_TARGET 77 | mkdir build/deploy 78 | cp -r build/$BUILD_TYPE/*.vst build/$PROJECT_DEPLOY_TARGET/. 79 | cp -r build/$BUILD_TYPE/*.vst3 build/$PROJECT_DEPLOY_TARGET/. 80 | cp -r build/$BUILD_TYPE/*.component build/$PROJECT_DEPLOY_TARGET/. 81 | cd build 82 | zip -r ${PROJECT_DEPLOY_TARGET}.zip $PROJECT_DEPLOY_TARGET 83 | mv ${PROJECT_DEPLOY_TARGET}.zip deploy 84 | cd .. 85 | fi 86 | before_deploy: 87 | - export FILE_TO_UPLOAD=$(ls build/deploy/*.zip) 88 | deploy: 89 | provider: releases 90 | api_key: 91 | secure: LH4bWTZxXA0HFJoHgjagTVdG6zu6+Xtwaui1kVljgcbVWZUQSVJlFtPvTTT9h6Ae0lq+qlpb33leOOY+qssWPTs5nn2Kmz/RcK42wNCLnyiMf9QSg5zQXce1Yhuqr0CPppGKfqKE/Pl3wI+J4o5QrMWkWKAsQaNlotVQE5wo4vN2Z4mYgMMrID6Xwz2TUM6LN7fBgFre7fjlImvB1F7sXc8CM2tu0rdQeqPhuPj+rlR98RZu4pWL50MYAwamhqvFOmaNXC+QAR+VSzSdtH5k6Ez9lTkN8gFjNVm4dLqomO2O7Lb1dL2qiAQXNhsr94FWrHWMBcXxrYBTvWzYWYaGcysNDwRla3WTg8IB//uzl37j/p7o8+YmPH6Frq7R3skLx3PQrYC5VpmG7qpSDNPFn8b9PMWekSivjY+uj8EmOso9X42Ev6M1iIakgkYUAwL7L9KpG/avnR1zrjH2dZKT8A4PPsaYvhffaaD/bjP6UGekSHQxTeiamIcsCBRfp6r76eQnVYdwVTxFlHKb2BjfPB6AZvVpkAKsVBu+igScJwMsBEEcWVGUZ+mxKEMM4mJpwhrSE5qZL688EPLlooJy64vnkSLuE2sT2avW02OVfBgYXVnOmSTj3HF1Cexig3CwnemdrqKAZ0+lxUjySysfxkk4WMi9uQG3i31rct1/q/Y= 92 | file_glob: true 93 | file: ${FILE_TO_UPLOAD} 94 | skip_cleanup: true 95 | overwrite: true 96 | on: 97 | branch: master 98 | condition: -n "${PROJECT_DEPLOY_TARGET+set}" 99 | tags: true 100 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com ####### 7 | 8 | cmake_minimum_required (VERSION 3.2.0) 9 | 10 | project (audio-plugin-project-template) 11 | 12 | set ( CMAKE_CXX_STANDARD 11 ) 13 | 14 | set( PROJECT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR} ) 15 | set( PROJECT_MODULES_DIR ${CMAKE_CURRENT_LIST_DIR}/modules ) 16 | set( PROJECT_SOURCE_DIR ${PROJECT_ROOT_DIR}/src ) 17 | 18 | set( VST_INCLUDE_PATH "${PROJECT_MODULES_DIR}/vst3sdk" ) 19 | 20 | list( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake" ) 21 | 22 | include( cmake/ci.cmake ) 23 | include( cmake/JUCE.cmake ) 24 | 25 | if(${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME}) 26 | include( cmake/colors.cmake ) 27 | endif() 28 | 29 | set_directory_properties( PROPERTIES 30 | COMPILE_DEFINITIONS NDEBUG 31 | COMPILE_DEFINITIONS_DEBUG DEBUG 32 | COMPILE_DEFINITIONS_RELEASE NDEBUG 33 | ) 34 | 35 | 36 | # Configuration ---------------------------------------------------------------------------------- # 37 | 38 | setupCI( 1 0 3 ) # version 39 | string( TIMESTAMP PROJECT_BUILD_DATE "%Y-%m-%d" ) 40 | 41 | set( JUCE_CONFIG_PLUGIN_NAME "gain" ) 42 | set( JUCE_CONFIG_PLUGIN_DESC "Simple gain control" ) 43 | set( JUCE_CONFIG_PLUGIN_MANUFACTURER "shaduzLABS" ) 44 | set( JUCE_CONFIG_PLUGIN_MANUFACTURER_URL "www.shaduzlabs.com" ) 45 | set( JUCE_CONFIG_PLUGIN_MANUFACTURER_EMAIL "shaduz@shaduzlabs.com" ) 46 | set( JUCE_CONFIG_PLUGIN_MANUFACTURER_CODE_STRING "SLBS" ) 47 | set( JUCE_CONFIG_PLUGIN_MANUFACTURER_CODE 0x534c4253 ) # 'SLBS' 48 | set( JUCE_CONFIG_PLUGIN_CODE_STRING "SLGC" ) 49 | set( JUCE_CONFIG_PLUGIN_CODE 0x534c4743 ) # 'SLGC' 50 | 51 | set( JUCE_CONFIG_IS_SYNTH 0 ) 52 | set( JUCE_CONFIG_WANTS_MIDI 0 ) 53 | set( JUCE_CONFIG_PRODUCES_MIDI 0 ) 54 | set( JUCE_CONFIG_IS_MIDI_EFFECT 0 ) 55 | set( JUCE_CONFIG_EDITOR_REQUIRES_KEYBOARD_FOCUS 0 ) 56 | set( JUCE_CONFIG_MAX_IN_CHANNELS 2 ) 57 | set( JUCE_CONFIG_MAX_OUT_CHANNELS 2 ) 58 | set( JUCE_CONFIG_PREFERRED_CHANNELS_CFG "{1,1,},{2,2}") 59 | 60 | if( JUCE_CONFIG_IS_SYNTH EQUAL 1) 61 | set( JUCE_CONFIG_PLUGIN_VST_TYPE "kPlugCategSynth" ) 62 | set( JUCE_CONFIG_PLUGIN_AU_TYPE "aumu" ) # Synth: "aumu", FX: "aufx" 63 | else() 64 | set( JUCE_CONFIG_PLUGIN_VST_TYPE "kPlugCategEffect" ) 65 | set( JUCE_CONFIG_PLUGIN_AU_TYPE "aufx" ) # Synth: "aumu", FX: "aufx" 66 | endif() 67 | 68 | configure_file ( 69 | "${PROJECT_ROOT_DIR}/support/JuceHeader.h.in" 70 | "${PROJECT_BINARY_DIR}/JuceHeader.h" 71 | ) 72 | 73 | configure_file ( 74 | "${PROJECT_ROOT_DIR}/support/AppConfig.h.in" 75 | "${PROJECT_BINARY_DIR}/AppConfig.h" 76 | ) 77 | 78 | MESSAGE( " ") 79 | MESSAGE( " ") 80 | MESSAGE( "${BoldYellow}${JUCE_CONFIG_PLUGIN_NAME} - ${JUCE_CONFIG_PLUGIN_DESC}${ColorReset}") 81 | message( "[${PROJECT_BUILD_DATE}] v. ${PROJECT_VERSION_STRING} / ${PROJECT_BUILD_DESCRIPTION} ") 82 | MESSAGE( " ") 83 | MESSAGE( " ") 84 | 85 | # Sources ---------------------------------------------------------------------------------------- # 86 | 87 | set( UI_SOURCES 88 | ${PROJECT_SOURCE_DIR}/ui/GraphicKnob.cpp 89 | ${PROJECT_SOURCE_DIR}/ui/GraphicKnob.h 90 | ) 91 | set( PLUGIN_SOURCES 92 | ${PROJECT_SOURCE_DIR}/GainGUI.cpp 93 | ${PROJECT_SOURCE_DIR}/GainGUI.h 94 | ${PROJECT_SOURCE_DIR}/PluginAudioProcessor.cpp 95 | ${PROJECT_SOURCE_DIR}/PluginAudioProcessor.h 96 | ${PROJECT_SOURCE_DIR}/PluginAudioProcessorEditor.cpp 97 | ${PROJECT_SOURCE_DIR}/PluginAudioProcessorEditor.h 98 | ) 99 | 100 | source_group( "src\\ui" FILES ${UI_SOURCES} ) 101 | source_group( "src" FILES ${PLUGIN_SOURCES} ) 102 | 103 | include_directories( 104 | ${PROJECT_BINARY_DIR} 105 | ${PROJECT_SOURCE_DIR} 106 | ${PROJECT_ROOT_DIR}/support/JuceLibraryCode 107 | ) 108 | 109 | set( ALL_SOURCES ${UI_SOURCES} ${PLUGIN_SOURCES} ) 110 | 111 | 112 | # Targets ---------------------------------------------------------------------------------------- # 113 | 114 | addJUCEPlugins( ${JUCE_CONFIG_PLUGIN_NAME} "${ALL_SOURCES}" ) 115 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Vincenzo Pacella 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # audio-plugin-project-template # 2 | [![Build Status](https://travis-ci.org/shaduzlabs/audio-plugin-project-template.svg?branch=master)](https://travis-ci.org/shaduzlabs/audio-plugin-project-template) [![Build status](https://ci.appveyor.com/api/projects/status/i0wh7uibh7m9uem9/branch/master?svg=true)](https://ci.appveyor.com/project/shaduzlabs/audio-plugin-project-template/branch/master) 3 | 4 | This project provides configuration files and some cmake utilities to speed-up the development of [JUCE][55017f87]-based audio plugins. What you'll get: 5 | - [Travis CI][f595581b] integration (OS X builds) 6 | - [Appveyor][13860100] integration (Windows builds) 7 | - Automatic deployment of release binaries using GitHub releases 8 | - JUCE and VST3 sdk as submodules 9 | - JUCE/cmake integration 10 | - A simple example (a gain control plugin) 11 | 12 | ![The plugin UI](support/images/screenshot.png) 13 | 14 | ## Configure Appveyor ## 15 | - Authorize access for Appveyor to your GitHub profile and add the plugin project 16 | - Create a GitHub access token with a name like "Appveyor token for deployment" and select only `public_repo` 17 | - Encrypt the token using [this form][95921ad4] 18 | - Replace the content of `deploy.auth_token.secure` in `.appveyor.yml` with the encrypted string generated by the form 19 | 20 | ## Configure Travis CI ## 21 | - Authorize access for Travis CI to your GitHub profile and add the plugin project 22 | - Create a GitHub access token with a name like "Travis CI token for deployment" and select only `public_repo` 23 | - Encrypt the token using the [command line utility][feb7d597] 24 | - Replace the content of `deploy.api_key.secure` in `.travis.yml` with the encrypted string generated by the utility 25 | 26 | ## Release ## 27 | - The creation of a new release on GitHub will trigger new builds (and automatic deployments, once the builds are succesfully completed) on Appveyor and Travis CI 28 | - As an alternative, you can manually add a tag to the `master` branch: `git tag vX.Y.Z` and then push it `git push --tags` 29 | 30 | ## Building on OS X ## 31 | - Make sure cmake, git and Xcode are installed (if not, the first two can be installed via [brew][dbaaa0fa], while Xcode can be downloaded from the App Store) 32 | - From the terminal, run: 33 | - `git clone https://github.com/shaduzlabs/audio-plugin-project-template.git` --recursive 34 | - `cd audio-plugin-project-template` 35 | - `mkdir build` 36 | - `cd build` 37 | - `cmake -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" -G Xcode ..` 38 | - `cmake --build . --config Release` 39 | - Now you should have the following bundles: 40 | - `build/Release/gain.vst` 41 | - `build/Release/gain.vst3` 42 | - `build/Release/gain.component` 43 | 44 | ## Building on Windows ## 45 | - Make sure cmake, git and Visual Studio 2015 are installed 46 | - From the command prompt, run: 47 | - `git clone https://github.com/shaduzlabs/audio-plugin-project-template.git` --recursive 48 | - `cd audio-plugin-project-template` 49 | - `mkdir build` 50 | - `cd build` 51 | - `cmake -G "Visual Studio 14 2015 Win64" ..` to build the 64 bit version or `cmake -G "Visual Studio 14 2015" ..` to build the 32 bit version 52 | - `cmake --build . --config Release` 53 | - Now you should have the following bundles: 54 | - `build/Release/gain.dll` 55 | - `build/Release/gain-vst3.dll` 56 | 57 | 58 | [55017f87]: http://juce.com "The JUCE framework" 59 | [f595581b]: http://travis-ci.org/ "Travis CI" 60 | [13860100]: https://www.appveyor.com "Appveyor" 61 | [95921ad4]: https://ci.appveyor.com/tools/encrypt "Encrypt access token" 62 | [feb7d597]: http://docs.travis-ci.com/user/encryption-keys "How to encrypt strings for Travis CI" 63 | [dbaaa0fa]: https://brew.sh "Install brew" 64 | -------------------------------------------------------------------------------- /cmake/FindGTK3.cmake: -------------------------------------------------------------------------------- 1 | # - FindGTK3.cmake 2 | # This module can find the GTK3 widget libraries and several of its other 3 | # optional components like gtkmm, glade, and glademm. 4 | # 5 | # NOTE: If you intend to use version checking, CMake 2.6.2 or later is 6 | # required. 7 | # 8 | # Specify one or more of the following components 9 | # as you call this find module. See example below. 10 | # 11 | # gtk 12 | # gtkmm 13 | # glade 14 | # glademm 15 | # 16 | # The following variables will be defined for your use 17 | # 18 | # GTK3_FOUND - Were all of your specified components found? 19 | # GTK3_INCLUDE_DIRS - All include directories 20 | # GTK3_LIBRARIES - All libraries 21 | # 22 | # GTK3_VERSION - The version of GTK3 found (x.y.z) 23 | # GTK3_MAJOR_VERSION - The major version of GTK3 24 | # GTK3_MINOR_VERSION - The minor version of GTK3 25 | # GTK3_PATCH_VERSION - The patch version of GTK3 26 | # 27 | # Optional variables you can define prior to calling this module: 28 | # 29 | # GTK3_DEBUG - Enables verbose debugging of the module 30 | # GTK3_SKIP_MARK_AS_ADVANCED - Disable marking cache variables as advanced 31 | # GTK3_ADDITIONAL_SUFFIXES - Allows defining additional directories to 32 | # search for include files 33 | # 34 | #================= 35 | # Example Usage: 36 | # 37 | # Call find_package() once, here are some examples to pick from: 38 | # 39 | # Require GTK 3.0 or later 40 | # find_package(GTK3 3.0 REQUIRED gtk) 41 | # 42 | # if(GTK3_FOUND) 43 | # include_directories(${GTK3_INCLUDE_DIRS}) 44 | # add_executable(mygui mygui.cc) 45 | # target_link_libraries(mygui ${GTK3_LIBRARIES}) 46 | # endif() 47 | # 48 | 49 | #============================================================================= 50 | # Copyright 2009 Kitware, Inc. 51 | # Copyright 2008-2009 Philip Lowman 52 | # 53 | # Distributed under the OSI-approved BSD License (the "License"); 54 | # see accompanying file Copyright.txt for details. 55 | # 56 | # This software is distributed WITHOUT ANY WARRANTY; without even the 57 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 58 | # See the License for more information. 59 | #============================================================================= 60 | # (To distribute this file outside of CMake, substitute the full 61 | # License text for the above reference.) 62 | 63 | 64 | # Version 0.1 (5/13/2011) 65 | # * First cut at a GTK3 version (Heavily derived from 66 | # FindGTK2.cmake) 67 | 68 | 69 | #============================================================= 70 | # _GTK3_GET_VERSION 71 | # Internal function to parse the version number in gtkversion.h 72 | # _OUT_major = Major version number 73 | # _OUT_minor = Minor version number 74 | # _OUT_micro = Micro version number 75 | # _gtkversion_hdr = Header file to parse 76 | #============================================================= 77 | function(_GTK3_GET_VERSION _OUT_major _OUT_minor _OUT_micro _gtkversion_hdr) 78 | file(READ ${_gtkversion_hdr} _contents) 79 | if(_contents) 80 | string(REGEX REPLACE ".*#define GTK_MAJOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_major} "${_contents}") 81 | string(REGEX REPLACE ".*#define GTK_MINOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_minor} "${_contents}") 82 | string(REGEX REPLACE ".*#define GTK_MICRO_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_micro} "${_contents}") 83 | 84 | if(NOT ${_OUT_major} MATCHES "[0-9]+") 85 | message(FATAL_ERROR "Version parsing failed for GTK3_MAJOR_VERSION!") 86 | endif() 87 | if(NOT ${_OUT_minor} MATCHES "[0-9]+") 88 | message(FATAL_ERROR "Version parsing failed for GTK3_MINOR_VERSION!") 89 | endif() 90 | if(NOT ${_OUT_micro} MATCHES "[0-9]+") 91 | message(FATAL_ERROR "Version parsing failed for GTK3_MICRO_VERSION!") 92 | endif() 93 | 94 | set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE) 95 | set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE) 96 | set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE) 97 | else() 98 | message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist") 99 | endif() 100 | endfunction() 101 | 102 | #============================================================= 103 | # _GTK3_FIND_INCLUDE_DIR 104 | # Internal function to find the GTK include directories 105 | # _var = variable to set 106 | # _hdr = header file to look for 107 | #============================================================= 108 | function(_GTK3_FIND_INCLUDE_DIR _var _hdr) 109 | 110 | if(GTK3_DEBUG) 111 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 112 | "_GTK3_FIND_INCLUDE_DIR( ${_var} ${_hdr} )") 113 | endif() 114 | 115 | set(_relatives 116 | # If these ever change, things will break. 117 | ${GTK3_ADDITIONAL_SUFFIXES} 118 | glibmm-2.0 119 | glib-2.0 120 | atk-1.0 121 | atkmm-1.0 122 | cairo 123 | cairomm-1.0 124 | gdk-pixbuf-2.0 125 | gdkmm-2.4 126 | giomm-2.4 127 | gtk-3.0 128 | gtkmm-2.4 129 | libglade-2.0 130 | libglademm-2.4 131 | pango-1.0 132 | pangomm-1.4 133 | sigc++-2.2 134 | gtk-unix-print-2.0 135 | ) 136 | 137 | set(_suffixes) 138 | foreach(_d ${_relatives}) 139 | list(APPEND _suffixes ${_d}) 140 | list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include 141 | endforeach() 142 | 143 | if(GTK3_DEBUG) 144 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 145 | "include suffixes = ${_suffixes}") 146 | endif() 147 | 148 | find_path(${_var} ${_hdr} 149 | PATHS 150 | /usr/local/lib64 151 | /usr/local/lib 152 | # fix for Ubuntu == 11.04 (Natty Narwhal) 153 | /usr/lib/i386-linux-gnu/ 154 | /usr/lib/x86_64-linux-gnu/ 155 | # end 156 | # fix for Ubuntu >= 11.10 (Oneiric Ocelot) 157 | /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} 158 | # end 159 | /usr/lib64 160 | /usr/lib 161 | /opt/gnome/include 162 | /opt/gnome/lib 163 | /opt/openwin/include 164 | /usr/openwin/lib 165 | /sw/include 166 | /sw/lib 167 | /opt/local/include 168 | /opt/local/lib 169 | $ENV{GTKMM_BASEPATH}/include 170 | $ENV{GTKMM_BASEPATH}/lib 171 | [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/include 172 | [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 173 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include 174 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 175 | PATH_SUFFIXES 176 | ${_suffixes} 177 | ) 178 | 179 | if(${_var}) 180 | set(GTK3_INCLUDE_DIRS ${GTK3_INCLUDE_DIRS} ${${_var}} PARENT_SCOPE) 181 | if(NOT GTK3_SKIP_MARK_AS_ADVANCED) 182 | mark_as_advanced(${_var}) 183 | endif() 184 | endif() 185 | 186 | endfunction(_GTK3_FIND_INCLUDE_DIR) 187 | 188 | #============================================================= 189 | # _GTK3_FIND_LIBRARY 190 | # Internal function to find libraries packaged with GTK3 191 | # _var = library variable to create 192 | #============================================================= 193 | function(_GTK3_FIND_LIBRARY _var _lib _expand_vc _append_version) 194 | 195 | if(GTK3_DEBUG) 196 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 197 | "_GTK3_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )") 198 | endif() 199 | 200 | # Not GTK versions per se but the versions encoded into Windows 201 | # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example) 202 | # Also the MSVC libraries use _ for . (this is handled below) 203 | # ********* SOMEONE WITH WINDOWS NEEDS TO CHECK THIS BIT FOR V3 ********* 204 | # ********* the plain 3 is needed to get Debian Sid to find the libraries 205 | set(_versions 3.0 3 2.20 2.18 2.16 2.14 2.12 206 | 2.10 2.8 2.6 2.4 2.2 2.0 207 | 1.20 1.18 1.16 1.14 1.12 208 | 1.10 1.8 1.6 1.4 1.2 1.0) 209 | 210 | set(_library) 211 | set(_library_d) 212 | 213 | set(_library ${_lib}) 214 | 215 | if(_expand_vc AND MSVC) 216 | # Add vc80/vc90/vc100 midfixes 217 | if(MSVC80) 218 | set(_library ${_library}-vc80) 219 | elseif(MSVC90) 220 | set(_library ${_library}-vc90) 221 | elseif(MSVC10) 222 | set(_library ${_library}-vc100) 223 | endif() 224 | set(_library_d ${_library}-d) 225 | endif() 226 | 227 | if(GTK3_DEBUG) 228 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 229 | "After midfix addition = ${_library} and ${_library_d}") 230 | endif() 231 | 232 | set(_lib_list) 233 | set(_libd_list) 234 | if(_append_version) 235 | foreach(_ver ${_versions}) 236 | list(APPEND _lib_list "${_library}-${_ver}") 237 | list(APPEND _libd_list "${_library_d}-${_ver}") 238 | endforeach() 239 | else() 240 | set(_lib_list ${_library}) 241 | set(_libd_list ${_library_d}) 242 | endif() 243 | 244 | if(GTK3_DEBUG) 245 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 246 | "library list = ${_lib_list} and library debug list = ${_libd_list}") 247 | endif() 248 | 249 | # For some silly reason the MSVC libraries use _ instead of . 250 | # in the version fields 251 | if(_expand_vc AND MSVC) 252 | set(_no_dots_lib_list) 253 | set(_no_dots_libd_list) 254 | foreach(_l ${_lib_list}) 255 | string(REPLACE "." "_" _no_dots_library ${_l}) 256 | list(APPEND _no_dots_lib_list ${_no_dots_library}) 257 | endforeach() 258 | # And for debug 259 | set(_no_dots_libsd_list) 260 | foreach(_l ${_libd_list}) 261 | string(REPLACE "." "_" _no_dots_libraryd ${_l}) 262 | list(APPEND _no_dots_libd_list ${_no_dots_libraryd}) 263 | endforeach() 264 | 265 | # Copy list back to original names 266 | set(_lib_list ${_no_dots_lib_list}) 267 | set(_libd_list ${_no_dots_libd_list}) 268 | endif() 269 | 270 | if(GTK3_DEBUG) 271 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 272 | "While searching for ${_var}, our proposed library list is ${_lib_list}") 273 | endif() 274 | 275 | find_library(${_var} 276 | NAMES ${_lib_list} 277 | PATHS 278 | /opt/gnome/lib 279 | /opt/gnome/lib64 280 | /usr/openwin/lib 281 | /usr/openwin/lib64 282 | /sw/lib 283 | $ENV{GTKMM_BASEPATH}/lib 284 | [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 285 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 286 | ) 287 | 288 | if(_expand_vc AND MSVC) 289 | if(GTK3_DEBUG) 290 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 291 | "While searching for ${_var}_DEBUG our proposed library list is ${_libd_list}") 292 | endif() 293 | 294 | find_library(${_var}_DEBUG 295 | NAMES ${_libd_list} 296 | PATHS 297 | $ENV{GTKMM_BASEPATH}/lib 298 | [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 299 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 300 | ) 301 | 302 | if(${_var} AND ${_var}_DEBUG) 303 | if(NOT GTK3_SKIP_MARK_AS_ADVANCED) 304 | mark_as_advanced(${_var}_DEBUG) 305 | endif() 306 | set(GTK3_LIBRARIES ${GTK3_LIBRARIES} optimized ${${_var}} debug ${${_var}_DEBUG}) 307 | set(GTK3_LIBRARIES ${GTK3_LIBRARIES} PARENT_SCOPE) 308 | endif() 309 | else() 310 | if(NOT GTK3_SKIP_MARK_AS_ADVANCED) 311 | mark_as_advanced(${_var}) 312 | endif() 313 | set(GTK3_LIBRARIES ${GTK3_LIBRARIES} ${${_var}}) 314 | set(GTK3_LIBRARIES ${GTK3_LIBRARIES} PARENT_SCOPE) 315 | # Set debug to release 316 | set(${_var}_DEBUG ${${_var}}) 317 | set(${_var}_DEBUG ${${_var}} PARENT_SCOPE) 318 | endif() 319 | endfunction(_GTK3_FIND_LIBRARY) 320 | 321 | #============================================================= 322 | 323 | # 324 | # main() 325 | # 326 | 327 | set(GTK3_FOUND) 328 | set(GTK3_INCLUDE_DIRS) 329 | set(GTK3_LIBRARIES) 330 | 331 | if(NOT GTK3_FIND_COMPONENTS) 332 | # Assume they only want GTK 333 | set(GTK3_FIND_COMPONENTS gtk) 334 | endif() 335 | 336 | # 337 | # If specified, enforce version number 338 | # 339 | if(GTK3_FIND_VERSION) 340 | cmake_minimum_required(VERSION 2.6.2) 341 | set(GTK3_FAILED_VERSION_CHECK true) 342 | if(GTK3_DEBUG) 343 | message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] " 344 | "Searching for version ${GTK3_FIND_VERSION}") 345 | endif() 346 | _GTK3_FIND_INCLUDE_DIR(GTK3_GTK_INCLUDE_DIR gtk/gtk.h) 347 | if(GTK3_GTK_INCLUDE_DIR) 348 | _GTK3_GET_VERSION(GTK3_MAJOR_VERSION 349 | GTK3_MINOR_VERSION 350 | GTK3_PATCH_VERSION 351 | ${GTK3_GTK_INCLUDE_DIR}/gtk/gtkversion.h) 352 | set(GTK3_VERSION 353 | ${GTK3_MAJOR_VERSION}.${GTK3_MINOR_VERSION}.${GTK3_PATCH_VERSION}) 354 | if(GTK3_FIND_VERSION_EXACT) 355 | if(GTK3_VERSION VERSION_EQUAL GTK3_FIND_VERSION) 356 | set(GTK3_FAILED_VERSION_CHECK false) 357 | endif() 358 | else() 359 | if(GTK3_VERSION VERSION_EQUAL GTK3_FIND_VERSION OR 360 | GTK3_VERSION VERSION_GREATER GTK3_FIND_VERSION) 361 | set(GTK3_FAILED_VERSION_CHECK false) 362 | endif() 363 | endif() 364 | else() 365 | # If we can't find the GTK include dir, we can't do version checking 366 | if(GTK3_FIND_REQUIRED AND NOT GTK3_FIND_QUIETLY) 367 | message(FATAL_ERROR "Could not find GTK3 include directory") 368 | endif() 369 | return() 370 | endif() 371 | 372 | if(GTK3_FAILED_VERSION_CHECK) 373 | if(GTK3_FIND_REQUIRED AND NOT GTK3_FIND_QUIETLY) 374 | if(GTK3_FIND_VERSION_EXACT) 375 | message(FATAL_ERROR "GTK3 version check failed. Version ${GTK3_VERSION} was found, version ${GTK3_FIND_VERSION} is needed exactly.") 376 | else() 377 | message(FATAL_ERROR "GTK3 version check failed. Version ${GTK3_VERSION} was found, at least version ${GTK3_FIND_VERSION} is required") 378 | endif() 379 | endif() 380 | 381 | # If the version check fails, exit out of the module here 382 | return() 383 | endif() 384 | endif() 385 | 386 | # 387 | # Find all components 388 | # 389 | 390 | find_package(Freetype) 391 | list(APPEND GTK3_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS}) 392 | list(APPEND GTK3_LIBRARIES ${FREETYPE_LIBRARIES}) 393 | 394 | foreach(_GTK3_component ${GTK3_FIND_COMPONENTS}) 395 | if(_GTK3_component STREQUAL "gtk") 396 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLIB_INCLUDE_DIR glib.h) 397 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLIBCONFIG_INCLUDE_DIR glibconfig.h) 398 | _GTK3_FIND_LIBRARY (GTK3_GLIB_LIBRARY glib false true) 399 | 400 | _GTK3_FIND_INCLUDE_DIR(GTK3_GOBJECT_INCLUDE_DIR gobject/gobject.h) 401 | _GTK3_FIND_LIBRARY (GTK3_GOBJECT_LIBRARY gobject false true) 402 | 403 | _GTK3_FIND_INCLUDE_DIR(GTK3_GDK_PIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h) 404 | _GTK3_FIND_LIBRARY (GTK3_GDK_PIXBUF_LIBRARY gdk_pixbuf false true) 405 | 406 | _GTK3_FIND_INCLUDE_DIR(GTK3_GDK_INCLUDE_DIR gdk/gdk.h) 407 | _GTK3_FIND_INCLUDE_DIR(GTK3_GDKCONFIG_INCLUDE_DIR gdk/gdkconfig.h) 408 | _GTK3_FIND_INCLUDE_DIR(GTK3_GTK_INCLUDE_DIR gtk/gtk.h) 409 | 410 | # ********* At least on Debian the gdk & gtk libraries 411 | # ********* don't have the -x11 suffix. 412 | if(UNIX) 413 | _GTK3_FIND_LIBRARY (GTK3_GDK_LIBRARY gdk false true) 414 | _GTK3_FIND_LIBRARY (GTK3_GTK_LIBRARY gtk false true) 415 | else() 416 | _GTK3_FIND_LIBRARY (GTK3_GDK_LIBRARY gdk-win32 false true) 417 | _GTK3_FIND_LIBRARY (GTK3_GTK_LIBRARY gtk-win32 false true) 418 | endif() 419 | 420 | _GTK3_FIND_INCLUDE_DIR(GTK3_CAIRO_INCLUDE_DIR cairo.h) 421 | _GTK3_FIND_LIBRARY (GTK3_CAIRO_LIBRARY cairo false false) 422 | 423 | _GTK3_FIND_INCLUDE_DIR(GTK3_FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h) 424 | 425 | _GTK3_FIND_INCLUDE_DIR(GTK3_PANGO_INCLUDE_DIR pango/pango.h) 426 | _GTK3_FIND_LIBRARY (GTK3_PANGO_LIBRARY pango false true) 427 | 428 | _GTK3_FIND_INCLUDE_DIR(GTK3_ATK_INCLUDE_DIR atk/atk.h) 429 | _GTK3_FIND_LIBRARY (GTK3_ATK_LIBRARY atk false true) 430 | 431 | 432 | elseif(_GTK3_component STREQUAL "gtkmm") 433 | 434 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLIBMM_INCLUDE_DIR glibmm.h) 435 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLIBMMCONFIG_INCLUDE_DIR glibmmconfig.h) 436 | _GTK3_FIND_LIBRARY (GTK3_GLIBMM_LIBRARY glibmm true true) 437 | 438 | _GTK3_FIND_INCLUDE_DIR(GTK3_GDKMM_INCLUDE_DIR gdkmm.h) 439 | _GTK3_FIND_INCLUDE_DIR(GTK3_GDKMMCONFIG_INCLUDE_DIR gdkmmconfig.h) 440 | _GTK3_FIND_LIBRARY (GTK3_GDKMM_LIBRARY gdkmm true true) 441 | 442 | _GTK3_FIND_INCLUDE_DIR(GTK3_GTKMM_INCLUDE_DIR gtkmm.h) 443 | _GTK3_FIND_INCLUDE_DIR(GTK3_GTKMMCONFIG_INCLUDE_DIR gtkmmconfig.h) 444 | _GTK3_FIND_LIBRARY (GTK3_GTKMM_LIBRARY gtkmm true true) 445 | 446 | _GTK3_FIND_INCLUDE_DIR(GTK3_CAIROMM_INCLUDE_DIR cairomm/cairomm.h) 447 | _GTK3_FIND_LIBRARY (GTK3_CAIROMM_LIBRARY cairomm true true) 448 | 449 | _GTK3_FIND_INCLUDE_DIR(GTK3_PANGOMM_INCLUDE_DIR pangomm.h) 450 | _GTK3_FIND_INCLUDE_DIR(GTK3_PANGOMMCONFIG_INCLUDE_DIR pangommconfig.h) 451 | _GTK3_FIND_LIBRARY (GTK3_PANGOMM_LIBRARY pangomm true true) 452 | 453 | _GTK3_FIND_INCLUDE_DIR(GTK3_SIGC++_INCLUDE_DIR sigc++/sigc++.h) 454 | _GTK3_FIND_INCLUDE_DIR(GTK3_SIGC++CONFIG_INCLUDE_DIR sigc++config.h) 455 | _GTK3_FIND_LIBRARY (GTK3_SIGC++_LIBRARY sigc true true) 456 | 457 | _GTK3_FIND_INCLUDE_DIR(GTK3_GIOMM_INCLUDE_DIR giomm.h) 458 | _GTK3_FIND_INCLUDE_DIR(GTK3_GIOMMCONFIG_INCLUDE_DIR giommconfig.h) 459 | _GTK3_FIND_LIBRARY (GTK3_GIOMM_LIBRARY giomm true true) 460 | 461 | _GTK3_FIND_INCLUDE_DIR(GTK3_ATKMM_INCLUDE_DIR atkmm.h) 462 | _GTK3_FIND_LIBRARY (GTK3_ATKMM_LIBRARY atkmm true true) 463 | 464 | elseif(_GTK3_component STREQUAL "glade") 465 | 466 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLADE_INCLUDE_DIR glade/glade.h) 467 | _GTK3_FIND_LIBRARY (GTK3_GLADE_LIBRARY glade false true) 468 | 469 | elseif(_GTK3_component STREQUAL "glademm") 470 | 471 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLADEMM_INCLUDE_DIR libglademm.h) 472 | _GTK3_FIND_INCLUDE_DIR(GTK3_GLADEMMCONFIG_INCLUDE_DIR libglademmconfig.h) 473 | _GTK3_FIND_LIBRARY (GTK3_GLADEMM_LIBRARY glademm true true) 474 | 475 | else() 476 | message(FATAL_ERROR "Unknown GTK3 component ${_component}") 477 | endif() 478 | endforeach() 479 | 480 | # 481 | # Solve for the GTK3 version if we haven't already 482 | # 483 | if(NOT GTK3_FIND_VERSION AND GTK3_GTK_INCLUDE_DIR) 484 | _GTK3_GET_VERSION(GTK3_MAJOR_VERSION 485 | GTK3_MINOR_VERSION 486 | GTK3_PATCH_VERSION 487 | ${GTK3_GTK_INCLUDE_DIR}/gtk/gtkversion.h) 488 | set(GTK3_VERSION ${GTK3_MAJOR_VERSION}.${GTK3_MINOR_VERSION}.${GTK3_PATCH_VERSION}) 489 | endif() 490 | 491 | # 492 | # Try to enforce components 493 | # 494 | 495 | set(_GTK3_did_we_find_everything true) # This gets set to GTK3_FOUND 496 | 497 | include(FindPackageHandleStandardArgs) 498 | #include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 499 | 500 | foreach(_GTK3_component ${GTK3_FIND_COMPONENTS}) 501 | string(TOUPPER ${_GTK3_component} _COMPONENT_UPPER) 502 | 503 | if(_GTK3_component STREQUAL "gtk") 504 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found." 505 | GTK3_GTK_LIBRARY 506 | GTK3_GTK_INCLUDE_DIR 507 | 508 | GTK3_GLIB_INCLUDE_DIR 509 | GTK3_GLIBCONFIG_INCLUDE_DIR 510 | GTK3_GLIB_LIBRARY 511 | 512 | GTK3_GDK_INCLUDE_DIR 513 | GTK3_GDKCONFIG_INCLUDE_DIR 514 | GTK3_GDK_LIBRARY 515 | ) 516 | elseif(_GTK3_component STREQUAL "gtkmm") 517 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found." 518 | GTK3_GTKMM_LIBRARY 519 | GTK3_GTKMM_INCLUDE_DIR 520 | GTK3_GTKMMCONFIG_INCLUDE_DIR 521 | 522 | GTK3_GLIBMM_INCLUDE_DIR 523 | GTK3_GLIBMMCONFIG_INCLUDE_DIR 524 | GTK3_GLIBMM_LIBRARY 525 | 526 | GTK3_GDKMM_INCLUDE_DIR 527 | GTK3_GDKMMCONFIG_INCLUDE_DIR 528 | GTK3_GDKMM_LIBRARY 529 | ) 530 | elseif(_GTK3_component STREQUAL "glade") 531 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3_${_COMPONENT_UPPER} "The glade library was not found." 532 | GTK3_GLADE_LIBRARY 533 | GTK3_GLADE_INCLUDE_DIR 534 | ) 535 | elseif(_GTK3_component STREQUAL "glademm") 536 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3_${_COMPONENT_UPPER} "The glademm library was not found." 537 | GTK3_GLADEMM_LIBRARY 538 | GTK3_GLADEMM_INCLUDE_DIR 539 | GTK3_GLADEMMCONFIG_INCLUDE_DIR 540 | ) 541 | endif() 542 | 543 | if(NOT GTK3_${_COMPONENT_UPPER}_FOUND) 544 | set(_GTK3_did_we_find_everything false) 545 | endif() 546 | endforeach() 547 | 548 | if(_GTK3_did_we_find_everything AND NOT GTK3_VERSION_CHECK_FAILED) 549 | set(GTK3_FOUND true) 550 | else() 551 | # Unset our variables. 552 | set(GTK3_FOUND false) 553 | set(GTK3_VERSION) 554 | set(GTK3_VERSION_MAJOR) 555 | set(GTK3_VERSION_MINOR) 556 | set(GTK3_VERSION_PATCH) 557 | set(GTK3_INCLUDE_DIRS) 558 | set(GTK3_LIBRARIES) 559 | endif() 560 | 561 | if(GTK3_INCLUDE_DIRS) 562 | list(REMOVE_DUPLICATES GTK3_INCLUDE_DIRS) 563 | endif() 564 | -------------------------------------------------------------------------------- /cmake/FindLibSoup.cmake: -------------------------------------------------------------------------------- 1 | message (STATUS "Checking for LibSoup...") 2 | 3 | FIND_PATH(LIBSOUP_INCLUDE_DIRS 4 | NAMES libsoup/soup.h 5 | PATH_SUFFIXES libsoup-2.4 6 | ) 7 | FIND_LIBRARY(LIBSOUP_LIBRARIES 8 | NAMES soup-2.4 9 | ) 10 | 11 | if(LIBSOUP_LIBRARIES) 12 | mark_as_advanced(LIBSOUP_LIBRARIES LIBSOUP_INCLUDE_DIRS) 13 | set(LIBSOUP_FOUND true) 14 | message (STATUS "Found: LibSoup") 15 | message(STATUS " - Includes: ${LIBSOUP_INCLUDE_DIRS}") 16 | message(STATUS " - Libraries: ${LIBSOUP_LIBRARIES}") 17 | else() 18 | set(LIBSOUP_FOUND false) 19 | message (FATAL_ERROR "NOT Found: LibSoup") 20 | endif() 21 | -------------------------------------------------------------------------------- /cmake/FindWebKitGTK.cmake: -------------------------------------------------------------------------------- 1 | message (STATUS "Checking for WebKitGTK...") 2 | 3 | find_path(WEBKITGTK_INCLUDE_DIRS webkit2/webkit2.h PATH_SUFFIXES webkitgtk-4.0) 4 | find_library(WEBKITGTK_LIBRARIES NAMES webkit2gtk-4.0) 5 | 6 | if(WEBKITGTK_LIBRARIES) 7 | mark_as_advanced(WEBKITGTK_LIBRARIES WEBKITGTK_INCLUDE_DIRS) 8 | set(WEBKITGTK_FOUND true) 9 | message (STATUS "Found: WebKitGTK") 10 | message(STATUS " - Includes: ${WEBKITGTK_INCLUDE_DIRS}") 11 | message(STATUS " - Libraries: ${WEBKITGTK_LIBRARIES}") 12 | else() 13 | set(WEBKITGTK_FOUND false) 14 | message (FATAL_ERROR "NOT Found: WebKitGTK") 15 | endif() 16 | -------------------------------------------------------------------------------- /cmake/JUCE.cmake: -------------------------------------------------------------------------------- 1 | 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com ####### 7 | 8 | set(SUBMODULES_DIR ${CMAKE_SOURCE_DIR}/modules) 9 | set(JUCE_LIBRARY_CODE_DIR ${CMAKE_SOURCE_DIR}/support/JuceLibraryCode/) 10 | 11 | if(UNIX AND NOT APPLE) 12 | set(LINUX TRUE) 13 | endif() 14 | 15 | # -------------------------------------------------------------------------------------------------- 16 | 17 | function( addJUCE target_ ) 18 | 19 | if(APPLE) 20 | find_package( OpenGL REQUIRED ) 21 | elseif(LINUX) 22 | find_package( ALSA REQUIRED ) 23 | find_package( Freetype REQUIRED ) 24 | find_package( X11 REQUIRED ) 25 | find_package( OpenGL REQUIRED ) 26 | find_package( GTK3 REQUIRED) 27 | find_package( WebKitGTK REQUIRED) 28 | find_package( LibSoup REQUIRED) 29 | endif() 30 | 31 | target_compile_definitions( ${CURRENT_TARGET} PRIVATE 32 | JUCE_SHARED_CODE=1 33 | JucePlugin_Build_VST=0 34 | JucePlugin_Build_VST3=0 35 | JucePlugin_Build_AU=0 36 | JucePlugin_Build_AUv3=0 37 | JucePlugin_Build_RTAS=0 38 | JucePlugin_Build_AAX=0 39 | JucePlugin_Build_Standalone=0 40 | ) 41 | 42 | set(juce_library 43 | ${JUCE_LIBRARY_CODE_DIR}/juce_core.cpp 44 | ${JUCE_LIBRARY_CODE_DIR}/juce_cryptography.cpp 45 | ${JUCE_LIBRARY_CODE_DIR}/juce_data_structures.cpp 46 | ${JUCE_LIBRARY_CODE_DIR}/juce_events.cpp 47 | ${JUCE_LIBRARY_CODE_DIR}/juce_graphics.cpp 48 | ${JUCE_LIBRARY_CODE_DIR}/juce_gui_basics.cpp 49 | ${JUCE_LIBRARY_CODE_DIR}/juce_gui_extra.cpp 50 | ${JUCE_LIBRARY_CODE_DIR}/juce_opengl.cpp 51 | ${JUCE_LIBRARY_CODE_DIR}/juce_video.cpp 52 | ) 53 | 54 | set(juce_library_audio 55 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_basics.cpp 56 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_devices.cpp 57 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_formats.cpp 58 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_processors.cpp 59 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_utils.cpp 60 | ) 61 | 62 | set(juce_library_audio_plugin_client 63 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_utils.cpp 64 | ) 65 | 66 | set(juce_library_audio_plugin_client_aax 67 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_AAX.cpp 68 | ) 69 | 70 | set(juce_library_audio_plugin_client_aax_osx 71 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_AAX.mm 72 | ) 73 | 74 | set(juce_library_audio_plugin_client_standalone 75 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_Standalone.cpp 76 | ) 77 | 78 | target_sources( ${CURRENT_TARGET} PRIVATE ${juce_library} ) 79 | target_sources( ${CURRENT_TARGET} PRIVATE ${juce_library_audio} ) 80 | target_sources( ${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client} ) 81 | 82 | source_group( "JUCE" FILES ${juce_library} ) 83 | source_group( "JUCE\\audio" FILES ${juce_library_audio} ) 84 | source_group( "JUCE\\audio" FILES ${juce_library_audio_plugin_client} ) 85 | 86 | target_include_directories( ${CURRENT_TARGET} PUBLIC 87 | ${JUCE_LIBRARY_CODE_DIR} 88 | ${CMAKE_SOURCE_DIR}/modules/JUCE5/modules 89 | ) 90 | 91 | set_target_properties(${CURRENT_TARGET} PROPERTIES 92 | COMPILE_DEFINITIONS NDEBUG 93 | COMPILE_DEFINITIONS_DEBUG DEBUG 94 | COMPILE_DEFINITIONS_RELEASE NDEBUG 95 | ) 96 | 97 | if( APPLE ) 98 | 99 | set_target_properties( ${CURRENT_TARGET} PROPERTIES 100 | COMPILE_FLAGS "${COMPILE_FLAGS} -x objective-c++" 101 | ) 102 | target_link_libraries( ${CURRENT_TARGET} PRIVATE ${OPENGL_gl_LIBRARY} ) 103 | target_link_libraries( ${CURRENT_TARGET} PUBLIC 104 | "-framework AudioUnit" 105 | "-framework AudioToolbox" 106 | "-framework AVFoundation" 107 | "-framework AVKit" 108 | "-framework Carbon" 109 | "-framework Cocoa" 110 | "-framework CoreAudio" 111 | "-framework CoreFoundation" 112 | "-framework CoreMedia" 113 | "-framework CoreMidi" 114 | "-framework QuartzCore" 115 | "-framework IOKit" 116 | "-framework AGL" 117 | "-framework Accelerate" 118 | "-framework WebKit" 119 | "-lobjc" 120 | ) 121 | 122 | elseif(WIN32) 123 | 124 | target_link_libraries(${CURRENT_TARGET} PUBLIC 125 | advapi32.lib 126 | comdlg32.lib 127 | gdi32.lib 128 | GlU32.Lib 129 | kernel32.lib 130 | ole32.lib 131 | OpenGL32.Lib 132 | rpcrt4.lib 133 | shell32.lib 134 | user32.lib 135 | vfw32.lib 136 | wininet.lib 137 | winmm.lib 138 | ws2_32.lib 139 | ) 140 | 141 | elseif(LINUX) 142 | 143 | target_include_directories(${CURRENT_TARGET} PRIVATE 144 | ${FREETYPE_INCLUDE_DIRS} 145 | ${GTK3_INCLUDE_DIRS} 146 | ${WEBKITGTK_INCLUDE_DIRS} 147 | ${LIBSOUP_INCLUDE_DIRS} 148 | ) 149 | 150 | target_link_libraries(${CURRENT_TARGET} PRIVATE 151 | ${ALSA_LIBRARIES} 152 | ${FREETYPE_LIBRARIES} 153 | ${OPENGL_LIBRARIES} 154 | ${X11_LIBRARIES} 155 | ${GTK3_LIBRARIES} 156 | ${WEBKIT_LIBRARIES} 157 | ${LIBSOUP_LIBRARIES} 158 | ) 159 | 160 | endif() 161 | 162 | endfunction(addJUCE) 163 | 164 | # -------------------------------------------------------------------------------------------------- 165 | 166 | function( addJUCE_VST name_ sources_ ) 167 | 168 | set( CURRENT_TARGET "${name_}VST" ) 169 | 170 | add_library( ${CURRENT_TARGET} MODULE ${sources_} ) 171 | addJUCE( ${CURRENT_TARGET} ) 172 | 173 | target_compile_definitions( ${CURRENT_TARGET} PRIVATE JucePlugin_Build_VST=1 ) 174 | 175 | set(juce_library_audio_plugin_client_vst 176 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_VST2.cpp 177 | ) 178 | 179 | source_group( "JUCE\\audio\\vst" FILES ${juce_library_audio_plugin_client_vst} ) 180 | 181 | target_include_directories( ${CURRENT_TARGET} PUBLIC ${VST_INCLUDE_PATH} ) 182 | target_sources(${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_vst}) 183 | 184 | if(APPLE) 185 | configure_file ( 186 | "${PROJECT_ROOT_DIR}/support/osx/Info-VSTx.plist.in" 187 | "${PROJECT_BINARY_DIR}/plists/Info-VST.plist" 188 | ) 189 | set(juce_library_audio_plugin_client_vst_osx 190 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_VST_utils.mm 191 | ) 192 | target_sources(${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_vst_osx}) 193 | endif() 194 | 195 | set_target_properties(${CURRENT_TARGET} PROPERTIES 196 | BUNDLE true 197 | OUTPUT_NAME ${name_} 198 | BUNDLE_EXTENSION "vst" 199 | XCODE_ATTRIBUTE_WRAPPER_EXTENSION "vst" 200 | MACOSX_BUNDLE_INFO_PLIST "${PROJECT_BINARY_DIR}/plists/Info-VST.plist" 201 | ) 202 | 203 | if(APPLE) 204 | install( TARGETS ${CURRENT_TARGET} DESTINATION "$ENV{HOME}/Library/Audio/Plug-Ins/VST" ) 205 | endif() 206 | 207 | endfunction( addJUCE_VST ) 208 | 209 | # -------------------------------------------------------------------------------------------------- 210 | 211 | function( addJUCE_VST3 name_ sources_ ) 212 | 213 | set( CURRENT_TARGET "${name_}VST3" ) 214 | 215 | add_library ( ${CURRENT_TARGET} MODULE ${sources_} ) 216 | addJUCE(${CURRENT_TARGET}) 217 | 218 | target_compile_definitions( ${CURRENT_TARGET} PRIVATE JucePlugin_Build_VST3=1 ) 219 | 220 | set(juce_library_audio_plugin_client_vst 221 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_VST2.cpp 222 | ) 223 | 224 | set(juce_library_audio_plugin_client_vst3 225 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_VST3.cpp 226 | ) 227 | 228 | source_group( "JUCE\\audio\\vst" FILES ${juce_library_audio_plugin_client_vst} ) 229 | source_group( "JUCE\\audio\\vst3" FILES ${juce_library_audio_plugin_client_vst3} ) 230 | 231 | target_include_directories( ${CURRENT_TARGET} PUBLIC ${VST_INCLUDE_PATH} ) 232 | target_sources(${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_vst}) 233 | target_sources(${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_vst3}) 234 | if(APPLE) 235 | configure_file ( 236 | "${PROJECT_ROOT_DIR}/support/osx/Info-VSTx.plist.in" 237 | "${PROJECT_BINARY_DIR}/plists/Info-VST3.plist" 238 | ) 239 | set(juce_library_audio_plugin_client_vst_osx 240 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_VST_utils.mm 241 | ) 242 | source_group( "JUCE\\audio\\vst\\osx" FILES ${juce_library_audio_plugin_client_vst_osx} ) 243 | 244 | target_sources(${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_vst_osx}) 245 | endif() 246 | 247 | set( PLUGIN_OUTPUT_NAME ${name_} ) 248 | if( WIN32 OR LINUX ) 249 | set( PLUGIN_OUTPUT_NAME ${name_}-vst3 ) 250 | endif() 251 | 252 | set_target_properties(${CURRENT_TARGET} PROPERTIES 253 | BUNDLE true 254 | OUTPUT_NAME ${PLUGIN_OUTPUT_NAME} 255 | BUNDLE_EXTENSION "vst3" 256 | XCODE_ATTRIBUTE_WRAPPER_EXTENSION "vst3" 257 | MACOSX_BUNDLE_INFO_PLIST "${PROJECT_BINARY_DIR}/plists/Info-VST3.plist" 258 | ) 259 | 260 | if(APPLE) 261 | install( TARGETS ${CURRENT_TARGET} DESTINATION "$ENV{HOME}/Library/Audio/Plug-Ins/VST3" ) 262 | endif() 263 | 264 | endfunction( addJUCE_VST3 ) 265 | 266 | # -------------------------------------------------------------------------------------------------- 267 | 268 | function( addJUCE_AU name_ sources_) 269 | if(APPLE) 270 | 271 | set( CURRENT_TARGET "${name_}AU" ) 272 | add_library ( ${CURRENT_TARGET} MODULE ${sources_} ) 273 | addJUCE( ${CURRENT_TARGET} ) 274 | 275 | configure_file ( 276 | "${PROJECT_ROOT_DIR}/support/osx/Info-AU.plist.in" 277 | "${PROJECT_BINARY_DIR}/plists/Info-AU.plist" 278 | ) 279 | 280 | target_compile_definitions( ${CURRENT_TARGET} PRIVATE JucePlugin_Build_AU=1 ) 281 | 282 | set(juce_library_audio_plugin_client_au 283 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_AU_1.mm 284 | ${JUCE_LIBRARY_CODE_DIR}/juce_audio_plugin_client_AU_2.mm 285 | ) 286 | source_group( "JUCE\\audio\\au" FILES ${juce_library_audio_plugin_client_au} ) 287 | 288 | target_sources( ${CURRENT_TARGET} PRIVATE ${juce_library_audio_plugin_client_au} ) 289 | 290 | set_target_properties( ${CURRENT_TARGET} PROPERTIES 291 | BUNDLE true 292 | OUTPUT_NAME ${name_} 293 | BUNDLE_EXTENSION "component" 294 | XCODE_ATTRIBUTE_WRAPPER_EXTENSION "component" 295 | MACOSX_BUNDLE_INFO_PLIST "${PROJECT_BINARY_DIR}/plists/Info-AU.plist" 296 | ) 297 | 298 | install( TARGETS ${CURRENT_TARGET} DESTINATION "$ENV{HOME}/Library/Audio/Plug-Ins/Components" ) 299 | endif() 300 | endfunction(addJUCE_AU) 301 | 302 | # -------------------------------------------------------------------------------------------------- 303 | 304 | function( addJUCEPlugins name_ sources_ ) 305 | 306 | if( APPLE ) 307 | addJUCE_AU( ${name_} "${sources_}" ) 308 | endif( APPLE ) 309 | 310 | addJUCE_VST( ${name_} "${sources_}" ) 311 | addJUCE_VST3( ${name_} "${sources_}" ) 312 | 313 | endfunction( addJUCEPlugins ) 314 | -------------------------------------------------------------------------------- /cmake/ci.cmake: -------------------------------------------------------------------------------- 1 | 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com ####### 7 | 8 | include( cmake/hex-util.cmake ) 9 | 10 | # -------------------------------------------------------------------------------------------------- 11 | 12 | function( setupCI versionMajor_ versionMinor_ versionMicro_ ) 13 | 14 | #versionHex 15 | dec2hex( VERSION_MAJOR_HEX ${versionMajor_}) 16 | string(LENGTH ${VERSION_MAJOR_HEX} VERSION_MAJOR_HEX_LEN) 17 | if(${VERSION_MAJOR_HEX_LEN} EQUAL 1) 18 | set(VERSION_HEX "0x0${VERSION_MAJOR_HEX}") 19 | else() 20 | set(VERSION_HEX "0x${VERSION_MAJOR_HEX}") 21 | endif() 22 | 23 | dec2hex( VERSION_MINOR_HEX ${versionMinor_}) 24 | string(LENGTH ${VERSION_MINOR_HEX} VERSION_MINOR_HEX_LEN) 25 | if(${VERSION_MINOR_HEX_LEN} EQUAL 1) 26 | set(VERSION_HEX "${VERSION_HEX}0${VERSION_MINOR_HEX}") 27 | else() 28 | set(VERSION_HEX "${VERSION_HEX}${VERSION_MINOR_HEX}") 29 | endif() 30 | 31 | dec2hex( VERSION_MICRO_HEX ${versionMicro_}) 32 | string(LENGTH ${VERSION_MICRO_HEX} VERSION_MICRO_HEX_LEN) 33 | if(${VERSION_MICRO_HEX_LEN} EQUAL 1) 34 | set(VERSION_HEX "${VERSION_HEX}0${VERSION_MICRO_HEX}") 35 | else() 36 | set(VERSION_HEX "${VERSION_HEX}${VERSION_MICRO_HEX}") 37 | endif() 38 | 39 | set( PROJECT_VERSION_STRING "${versionMajor_}.${versionMinor_}.${versionMicro_}" ) 40 | set( PROJECT_VERSION_STRING "${versionMajor_}.${versionMinor_}.${versionMicro_}" PARENT_SCOPE) 41 | 42 | set( JUCE_CONFIG_VERSION ${versionMajor_}.${versionMinor_}.${versionMicro_} PARENT_SCOPE ) 43 | math(EXPR 44 | PROJECT_VERSION_INTEGER 45 | "( ${versionMajor_} * 65536 ) + ( ${versionMinor_} * 256 ) + ${versionMicro_}" 46 | ) 47 | set( JUCE_CONFIG_VERSION_INTEGER ${PROJECT_VERSION_INTEGER} PARENT_SCOPE ) 48 | set( JUCE_CONFIG_VERSION_HEX ${VERSION_HEX} PARENT_SCOPE) 49 | set( JUCE_CONFIG_VERSION_STRING ${PROJECT_VERSION_STRING} PARENT_SCOPE) 50 | 51 | if($ENV{APPVEYOR}) 52 | set (PRJ_BUILD_HOST "Appveyor") 53 | set (PRJ_BUILD_NUMBER ".$ENV{APPVEYOR_BUILD_NUMBER}") 54 | set (PRJ_GIT_BRANCH $ENV{APPVEYOR_REPO_BRANCH}) 55 | execute_process(COMMAND appveyor UpdateBuild -Version ${PROJECT_VERSION_STRING}) 56 | elseif($ENV{TRAVIS}) 57 | set (PRJ_BUILD_HOST "Travis-CI") 58 | set (PRJ_BUILD_NUMBER ".$ENV{TRAVIS_BUILD_NUMBER}") 59 | set (PRJ_GIT_BRANCH $ENV{TRAVIS_BRANCH}) 60 | else() 61 | set (PRJ_BUILD_HOST "a local machine") 62 | set (PRJ_BUILD_NUMBER "") 63 | execute_process( 64 | COMMAND git rev-parse --abbrev-ref HEAD 65 | WORKING_DIRECTORY ${PROJECT_ROOT_DIR} 66 | OUTPUT_VARIABLE PRJ_GIT_BRANCH 67 | OUTPUT_STRIP_TRAILING_WHITESPACE 68 | ) 69 | endif() 70 | 71 | if(${PRJ_GIT_BRANCH} STREQUAL "master") 72 | set(PRJ_BUILD_TYPE "release version") 73 | set (PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}${PRJ_BUILD_NUMBER}") 74 | elseif(${PRJ_GIT_BRANCH} STREQUAL "develop") 75 | set(PRJ_BUILD_TYPE "development version") 76 | set (PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}${PRJ_BUILD_NUMBER}-dev") 77 | else() 78 | set(PRJ_BUILD_TYPE "development version from feature branch: ${GIT_BRANCH}") 79 | set (PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}${PRJ_BUILD_NUMBER}-fb") 80 | endif() 81 | 82 | configure_file ( 83 | "${PROJECT_ROOT_DIR}/support/project-config.h.in" 84 | "${PROJECT_BINARY_DIR}/project-config.h" 85 | ) 86 | 87 | set(ENV{PROJECT_VERSION} "${PROJECT_VERSION_STRING}") 88 | 89 | if($ENV{APPVEYOR}) 90 | execute_process(COMMAND appveyor UpdateBuild -Version ${PROJECT_VERSION_STRING}) 91 | set(ENV{APPVEYOR_BUILD_VERSION} "${PROJECT_VERSION_STRING}") 92 | elseif($ENV{TRAVIS}) 93 | set(PRJ_DEPLOY_TARGET $ENV{PRJ_DEPLOY_TARGET}) 94 | endif() 95 | 96 | set( PROJECT_BUILD_DESCRIPTION "${PRJ_BUILD_TYPE} built on ${PRJ_BUILD_HOST}" PARENT_SCOPE ) 97 | endfunction( setupCI ) 98 | -------------------------------------------------------------------------------- /cmake/colors.cmake: -------------------------------------------------------------------------------- 1 | # from http://stackoverflow.com/questions/18968979/how-to-get-colorized-output-with-cmake 2 | 3 | if(NOT WIN32) 4 | string(ASCII 27 Esc) 5 | set(ColorReset "${Esc}[m") 6 | set(ColorBold "${Esc}[1m") 7 | set(Red "${Esc}[31m") 8 | set(Green "${Esc}[32m") 9 | set(Yellow "${Esc}[33m") 10 | set(Blue "${Esc}[34m") 11 | set(Magenta "${Esc}[35m") 12 | set(Cyan "${Esc}[36m") 13 | set(White "${Esc}[37m") 14 | set(BoldRed "${Esc}[1;31m") 15 | set(BoldGreen "${Esc}[1;32m") 16 | set(BoldYellow "${Esc}[1;33m") 17 | set(BoldBlue "${Esc}[1;34m") 18 | set(BoldMagenta "${Esc}[1;35m") 19 | set(BoldCyan "${Esc}[1;36m") 20 | set(BoldWhite "${Esc}[1;37m") 21 | 22 | function(message) 23 | list(GET ARGV 0 MessageType) 24 | if(MessageType STREQUAL FATAL_ERROR OR MessageType STREQUAL SEND_ERROR) 25 | list(REMOVE_AT ARGV 0) 26 | _message(${MessageType} "${BoldRed}${ARGV}${ColorReset}") 27 | elseif(MessageType STREQUAL WARNING) 28 | list(REMOVE_AT ARGV 0) 29 | _message(${MessageType} "${BoldYellow}${ARGV}${ColorReset}") 30 | elseif(MessageType STREQUAL AUTHOR_WARNING) 31 | list(REMOVE_AT ARGV 0) 32 | _message(${MessageType} "${BoldCyan}${ARGV}${ColorReset}") 33 | elseif(MessageType STREQUAL STATUS) 34 | list(REMOVE_AT ARGV 0) 35 | _message(${MessageType} "${Green}${ARGV}${ColorReset}") 36 | else() 37 | _message("${ARGV}") 38 | endif() 39 | endfunction() 40 | 41 | endif() 42 | -------------------------------------------------------------------------------- /cmake/hex-util.cmake: -------------------------------------------------------------------------------- 1 | 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com ####### 7 | 8 | # http://stackoverflow.com/questions/26182289/convert-from-decimal-to-hexadecimal-in-cmake 9 | 10 | # -------------------------------------------------------------------------------------------------- 11 | 12 | macro(hexChar2dec VAR VAL) 13 | if (${VAL} MATCHES "[0-9]") 14 | set(${VAR} ${VAL}) 15 | elseif(${VAL} MATCHES "[aA]") 16 | set(${VAR} 10) 17 | elseif(${VAL} MATCHES "[bB]") 18 | set(${VAR} 11) 19 | elseif(${VAL} MATCHES "[cC]") 20 | set(${VAR} 12) 21 | elseif(${VAL} MATCHES "[dD]") 22 | set(${VAR} 13) 23 | elseif(${VAL} MATCHES "[eE]") 24 | set(${VAR} 14) 25 | elseif(${VAL} MATCHES "[fF]") 26 | set(${VAR} 15) 27 | else() 28 | message(FATAL_ERROR "Invalid format for hexidecimal character") 29 | endif() 30 | endmacro(hexChar2dec) 31 | 32 | # -------------------------------------------------------------------------------------------------- 33 | 34 | macro(hex2dec VAR VAL) 35 | if (${VAL} EQUAL 0) 36 | set(${VAR} 0) 37 | else() 38 | 39 | set(CURINDEX 0) 40 | string(LENGTH "${VAL}" CURLENGTH) 41 | 42 | set(${VAR} 0) 43 | 44 | while (CURINDEX LESS CURLENGTH) 45 | 46 | string(SUBSTRING "${VAL}" ${CURINDEX} 1 CHAR) 47 | 48 | hexChar2dec(CHAR ${CHAR}) 49 | 50 | math(EXPR POWAH "(1<<((${CURLENGTH}-${CURINDEX}-1)*4))") 51 | math(EXPR CHAR "(${CHAR}*${POWAH})") 52 | math(EXPR ${VAR} "${${VAR}}+${CHAR}") 53 | math(EXPR CURINDEX "${CURINDEX}+1") 54 | endwhile() 55 | endif() 56 | endmacro(hex2dec) 57 | 58 | # -------------------------------------------------------------------------------------------------- 59 | 60 | macro(decChar2hex VAR VAL) 61 | if (${VAL} LESS 10) 62 | set(${VAR} ${VAL}) 63 | elseif(${VAL} EQUAL 10) 64 | set(${VAR} "A") 65 | elseif(${VAL} EQUAL 11) 66 | set(${VAR} "B") 67 | elseif(${VAL} EQUAL 12) 68 | set(${VAR} "C") 69 | elseif(${VAL} EQUAL 13) 70 | set(${VAR} "D") 71 | elseif(${VAL} EQUAL 14) 72 | set(${VAR} "E") 73 | elseif(${VAL} EQUAL 15) 74 | set(${VAR} "F") 75 | else() 76 | message(FATAL_ERROR "Invalid format for hexidecimal character") 77 | endif() 78 | endmacro(decChar2hex) 79 | 80 | # -------------------------------------------------------------------------------------------------- 81 | 82 | macro(dec2hex VAR VAL) 83 | if (${VAL} EQUAL 0) 84 | set(${VAR} 0) 85 | else() 86 | set(VAL2 ${VAL}) 87 | set(${VAR} "") 88 | 89 | while (${VAL2} GREATER 0) 90 | math(EXPR VALCHAR "(${VAL2}&15)") 91 | decChar2hex(VALCHAR ${VALCHAR}) 92 | set(${VAR} "${VALCHAR}${${VAR}}") 93 | math(EXPR VAL2 "${VAL2} >> 4") 94 | endwhile() 95 | endif() 96 | endmacro(dec2hex) 97 | -------------------------------------------------------------------------------- /src/GainGUI.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com #####*/ 7 | 8 | #include "GainGUI.h" 9 | 10 | #include "resources/GainGUI.cpp" 11 | 12 | #include 13 | #include 14 | 15 | //-------------------------------------------------------------------------------------------------- 16 | 17 | GainGUI::GainGUI(PluginAudioProcessor& ap_) : m_audioProcessor(ap_) 18 | { 19 | m_knobStrip = ImageCache::getFromMemory(::knobstrip_png, ::knobstrip_pngSize); 20 | m_knobStripHover = ImageCache::getFromMemory(::knobhover_png, ::knobhover_pngSize); 21 | 22 | addAndMakeVisible(m_knob = new GraphicKnob(m_knobStrip, 128, false)); 23 | addAndMakeVisible(m_lblGain = new Label("Value", TRANS("1.0"))); 24 | m_lblGain->setFont(Font(11.20f, Font::plain)); 25 | m_lblGain->setJustificationType(Justification::centred); 26 | m_lblGain->setEditable(false, false, false); 27 | m_lblGain->setColour(Label::textColourId, Colour(0x8dffffff)); 28 | m_lblGain->setColour(TextEditor::textColourId, Colours::black); 29 | m_lblGain->setColour(TextEditor::backgroundColourId, Colour(0x00000000)); 30 | 31 | m_backgroundImage = ImageCache::getFromMemory(background_png, background_pngSize); 32 | 33 | m_knob->setRange(0., 2.0); 34 | m_knob->setValue(static_cast(m_audioProcessor.getParameter(0))); 35 | m_knob->setImageBackgroundHover(&m_knobStripHover); 36 | m_knob->addListener(this); 37 | 38 | setSize(150, 180); 39 | } 40 | 41 | GainGUI::~GainGUI() 42 | { 43 | m_knob = nullptr; 44 | m_lblGain = nullptr; 45 | } 46 | 47 | //-------------------------------------------------------------------------------------------------- 48 | 49 | void GainGUI::paint(Graphics& g) 50 | { 51 | 52 | auto gainValue = m_audioProcessor.gain(); 53 | if (static_cast(gainValue) != m_knob->getValue()) 54 | { 55 | m_knob->setValue(static_cast(gainValue), NotificationType::dontSendNotification); 56 | 57 | std::stringstream ss; 58 | ss << std::setprecision(3) << gainValue; 59 | m_lblGain->setText(ss.str(), NotificationType::dontSendNotification); 60 | } 61 | 62 | g.fillAll(Colours::white); 63 | 64 | g.setColour(Colours::black); 65 | g.drawImageWithin(m_backgroundImage, 0, 0, 150, 180, RectanglePlacement::centred, false); 66 | } 67 | 68 | //-------------------------------------------------------------------------------------------------- 69 | 70 | void GainGUI::resized() 71 | { 72 | m_knob->setBounds(35, 67, 80, 80); 73 | m_lblGain->setBounds(35, 145, 80, 24); 74 | } 75 | 76 | //-------------------------------------------------------------------------------------------------- 77 | 78 | void GainGUI::sliderValueChanged(Slider* sliderThatWasMoved) 79 | { 80 | if (sliderThatWasMoved == m_knob) 81 | { 82 | auto gainValue = m_audioProcessor.gain(); 83 | std::stringstream ss; 84 | ss << std::setprecision(3) << gainValue; 85 | m_audioProcessor.setParameterNotifyingHost( 86 | 0, static_cast(sliderThatWasMoved->getValue())); 87 | m_lblGain->setText(ss.str(), NotificationType::dontSendNotification); 88 | } 89 | } 90 | 91 | //-------------------------------------------------------------------------------------------------- 92 | -------------------------------------------------------------------------------- /src/GainGUI.h: -------------------------------------------------------------------------------- 1 | /* 2 | ########## Copyright (C) 2017 Vincenzo Pacella 3 | ## ## Distributed under MIT license, see file LICENSE 4 | ## ## or 5 | ## ## 6 | ########## ############################################################# shaduzlabs.com #####*/ 7 | 8 | #pragma once 9 | 10 | #include "JuceHeader.h" 11 | #include "PluginAudioProcessor.h" 12 | 13 | #include "ui/GraphicKnob.h" 14 | 15 | //-------------------------------------------------------------------------------------------------- 16 | 17 | class GainGUI final : public Component, public Slider::Listener 18 | { 19 | public: 20 | GainGUI(PluginAudioProcessor& ap_); 21 | ~GainGUI(); 22 | 23 | void sliderValueChanged(Slider* sliderThatWasMoved) override; 24 | 25 | void paint(Graphics& g) override; 26 | void resized() override; 27 | 28 | private: 29 | PluginAudioProcessor& m_audioProcessor; 30 | Image m_knobStrip; 31 | Image m_knobStripHover; 32 | 33 | ScopedPointer m_knob; 34 | ScopedPointer