Preliminary AU support

pull/1/head
asb2m10 9 years ago
parent 32c5f0bb77
commit 0d382416c3
  1. 8
      Builds/Linux/Makefile
  2. 5006
      Builds/MacOSX/Dexed.xcodeproj/project.pbxproj
  3. BIN
      Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate
  4. 23
      Builds/MacOSX/Info.plist
  5. 10
      Builds/VisualStudio2012/Dexed.vcxproj
  6. 18
      Builds/VisualStudio2012/Dexed.vcxproj.filters
  7. 6
      Builds/VisualStudio2012/resources.rc
  8. 10
      Builds/VisualStudio2013/Dexed.vcxproj
  9. 18
      Builds/VisualStudio2013/Dexed.vcxproj.filters
  10. 6
      Builds/VisualStudio2013/resources.rc
  11. 10
      Dexed.jucer
  12. 20
      JuceLibraryCode/AppConfig.h
  13. 4
      JuceLibraryCode/JuceHeader.h
  14. 2
      JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp
  15. 2
      JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp
  16. 7
      JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp
  17. 6
      JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h
  18. 2
      JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp
  19. 2
      JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp
  20. 4
      JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
  21. 8
      JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm
  22. 4
      JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
  23. 12
      JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
  24. 1
      JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h
  25. 182
      JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
  26. 23
      JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h
  27. 2
      JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h
  28. 7
      JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp
  29. 7
      JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h
  30. 2
      JuceLibraryCode/modules/juce_core/juce_core.h
  31. 2
      JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h
  32. 46
      JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp
  33. 10
      JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp
  34. 108
      JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h
  35. 1
      JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h
  36. 2
      JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp
  37. 1
      JuceLibraryCode/modules/juce_events/juce_events.h
  38. 3
      JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp
  39. 2
      JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h
  40. 51
      JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm
  41. 1
      JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h
  42. 27
      JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp
  43. 2
      JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp
  44. 12
      JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp
  45. 3
      JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h
  46. 25
      JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp
  47. 2
      JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
  48. 12
      JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
  49. 7
      JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp
  50. 2
      JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp
  51. 2
      JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp
  52. 12
      JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp
  53. 11
      JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h
  54. 5
      JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm
  55. 12
      Source/PluginFx.cpp
  56. 1
      Source/PluginFx.h
  57. 2
      Source/PluginParam.cpp
  58. 11
      Source/PluginProcessor.cpp

@ -18,12 +18,12 @@ ifeq ($(CONFIG),Debug)
TARGET_ARCH := -march=native
endif
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.8.1" -D "JUCE_APP_VERSION_HEX=0x801" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0
CXXFLAGS += $(CFLAGS)
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt
LDDEPS :=
RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.8.1" -D "JUCE_APP_VERSION_HEX=0x801" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
TARGET := Dexed.so
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
@ -39,12 +39,12 @@ ifeq ($(CONFIG),Release)
TARGET_ARCH := -march=native
endif
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.8.1" -D "JUCE_APP_VERSION_HEX=0x801" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -Os
CXXFLAGS += $(CFLAGS)
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt
LDDEPS :=
RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.8.1" -D "JUCE_APP_VERSION_HEX=0x801" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
TARGET := Dexed.so
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)

File diff suppressed because it is too large Load Diff

@ -16,12 +16,31 @@
<key>CFBundleSignature</key>
<string>PTul</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<string>0.8.1</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<string>0.8.1</string>
<key>NSHumanReadableCopyright</key>
<string>Digital Suburban</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>AudioComponents</key>
<array>
<dict>
<key>name</key>
<string>Digital Suburban: Dexed</string>
<key>description</key>
<string>Dexed FM Synth</string>
<key>factoryFunction</key>
<string>DexedAUFactory</string>
<key>manufacturer</key>
<string>DGSB</string>
<key>type</key>
<string>aumu</string>
<key>subtype</key>
<string>Dexd</string>
<key>version</key>
<integer>2049</integer>
</dict>
</array>
</dict>
</plist>

@ -58,7 +58,7 @@
<Optimization>Disabled</Optimization>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.8.1;JUCE_APP_VERSION_HEX=0x801;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader/>
@ -100,7 +100,7 @@
<ClCompile>
<Optimization>MinSpace</Optimization>
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.8.1;JUCE_APP_VERSION_HEX=0x801;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader/>
@ -1173,6 +1173,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>
@ -1212,6 +1213,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_NormalisableRange.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h"/>
@ -1285,6 +1287,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_CompilerSupport.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h"/>
@ -1320,6 +1323,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MountedVolumeListChangeDetector.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h"/>
@ -1542,6 +1546,8 @@
<None Include="..\..\Resources\ui\NotoSans-Bold.ttf"/>
<None Include="..\..\Resources\builtin_pgm.zip"/>
<None Include="..\..\Resources\about.png"/>
<None Include="..\..\Resources\ui\GlobalEditor_864x144.png"/>
<None Include="..\..\Resources\ui\OperatorEditor_287x218.png"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_plugin_client\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info"/>

@ -1605,6 +1605,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
@ -1722,6 +1725,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_NormalisableRange.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
@ -1941,6 +1947,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h">
<Filter>Juce Modules\juce_core\logging</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_CompilerSupport.h">
<Filter>Juce Modules\juce_core\system</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h">
<Filter>Juce Modules\juce_core\system</Filter>
</ClInclude>
@ -2046,6 +2055,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MountedVolumeListChangeDetector.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
@ -2708,6 +2720,12 @@
<None Include="..\..\Resources\about.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\Resources\ui\GlobalEditor_864x144.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\Resources\ui\OperatorEditor_287x218.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info">
<Filter>Juce Modules\juce_audio_basics</Filter>
</None>

@ -7,7 +7,7 @@
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
FILEVERSION 0,8,1,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
@ -15,9 +15,9 @@ BEGIN
BEGIN
VALUE "CompanyName", "Digital Suburban\0"
VALUE "FileDescription", "Dexed\0"
VALUE "FileVersion", "1.0.0\0"
VALUE "FileVersion", "0.8.1\0"
VALUE "ProductName", "Dexed\0"
VALUE "ProductVersion", "1.0.0\0"
VALUE "ProductVersion", "0.8.1\0"
END
END

@ -60,7 +60,7 @@
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=0.8.1;JUCE_APP_VERSION_HEX=0x801;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader/>
@ -100,7 +100,7 @@
<ClCompile>
<Optimization>MinSpace</Optimization>
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=0.8.1;JUCE_APP_VERSION_HEX=0x801;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader/>
@ -1172,6 +1172,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>
@ -1211,6 +1212,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_NormalisableRange.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h"/>
@ -1284,6 +1286,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_CompilerSupport.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h"/>
@ -1319,6 +1322,7 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MountedVolumeListChangeDetector.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h"/>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h"/>
@ -1541,6 +1545,8 @@
<None Include="..\..\Resources\ui\NotoSans-Bold.ttf"/>
<None Include="..\..\Resources\builtin_pgm.zip"/>
<None Include="..\..\Resources\about.png"/>
<None Include="..\..\Resources\ui\GlobalEditor_864x144.png"/>
<None Include="..\..\Resources\ui\OperatorEditor_287x218.png"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_plugin_client\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info"/>

@ -1605,6 +1605,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">
<Filter>Juce Modules\juce_audio_processors\processors</Filter>
</ClInclude>
@ -1722,6 +1725,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_NormalisableRange.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h">
<Filter>Juce Modules\juce_core\maths</Filter>
</ClInclude>
@ -1941,6 +1947,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h">
<Filter>Juce Modules\juce_core\logging</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_CompilerSupport.h">
<Filter>Juce Modules\juce_core\system</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h">
<Filter>Juce Modules\juce_core\system</Filter>
</ClInclude>
@ -2046,6 +2055,9 @@
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MountedVolumeListChangeDetector.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
<ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h">
<Filter>Juce Modules\juce_events\messages</Filter>
</ClInclude>
@ -2708,6 +2720,12 @@
<None Include="..\..\Resources\about.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\Resources\ui\GlobalEditor_864x144.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\Resources\ui\OperatorEditor_287x218.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info">
<Filter>Juce Modules\juce_audio_basics</Filter>
</None>

@ -7,7 +7,7 @@
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
FILEVERSION 0,8,1,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
@ -15,9 +15,9 @@ BEGIN
BEGIN
VALUE "CompanyName", "Digital Suburban\0"
VALUE "FileDescription", "Dexed\0"
VALUE "FileVersion", "1.0.0\0"
VALUE "FileVersion", "0.8.1\0"
VALUE "ProductName", "Dexed\0"
VALUE "ProductVersion", "1.0.0\0"
VALUE "ProductVersion", "0.8.1\0"
END
END

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<JUCERPROJECT id="ryFHHI" name="Dexed" projectType="audioplug" version="1.0.0"
<JUCERPROJECT id="ryFHHI" name="Dexed" projectType="audioplug" version="0.8.1"
bundleIdentifier="com.digitalsuburban.Dexed" includeBinaryInAppConfig="1"
buildVST="1" buildAU="0" pluginName="Dexed" pluginDesc="Dexed"
pluginManufacturer="Digital Suburban" pluginManufacturerCode="Manu"
pluginCode="Plug" pluginChannelConfigs="{1, 1}, {2, 2}" pluginIsSynth="1"
pluginWantsMidiIn="1" pluginProducesMidiOut="1" pluginSilenceInIsSilenceOut="0"
buildVST="1" buildAU="1" pluginName="Dexed" pluginDesc="Dexed FM Synth"
pluginManufacturer="Digital Suburban" pluginManufacturerCode="DGSB"
pluginCode="Dexd" pluginChannelConfigs="{0, 2}" pluginIsSynth="1"
pluginWantsMidiIn="1" pluginProducesMidiOut="0" pluginSilenceInIsSilenceOut="0"
pluginEditorRequiresKeys="0" pluginAUExportPrefix="DexedAU" pluginRTASCategory=""
aaxIdentifier="com.yourcompany.Dexed" pluginAAXCategory="AAX_ePlugInCategory_Dynamics"
jucerVersion="3.1.0" companyName="Digital Suburban" buildVST3="0"

@ -183,7 +183,7 @@
#define JucePlugin_Build_VST3 0
#endif
#ifndef JucePlugin_Build_AU
#define JucePlugin_Build_AU 0
#define JucePlugin_Build_AU 1
#endif
#ifndef JucePlugin_Build_RTAS
#define JucePlugin_Build_RTAS 0
@ -195,7 +195,7 @@
#define JucePlugin_Name "Dexed"
#endif
#ifndef JucePlugin_Desc
#define JucePlugin_Desc "Dexed"
#define JucePlugin_Desc "Dexed FM Synth"
#endif
#ifndef JucePlugin_Manufacturer
#define JucePlugin_Manufacturer "Digital Suburban"
@ -207,19 +207,19 @@
#define JucePlugin_ManufacturerEmail ""
#endif
#ifndef JucePlugin_ManufacturerCode
#define JucePlugin_ManufacturerCode 'Manu'
#define JucePlugin_ManufacturerCode 'DGSB'
#endif
#ifndef JucePlugin_PluginCode
#define JucePlugin_PluginCode 'Plug'
#define JucePlugin_PluginCode 'Dexd'
#endif
#ifndef JucePlugin_MaxNumInputChannels
#define JucePlugin_MaxNumInputChannels 2
#define JucePlugin_MaxNumInputChannels 0
#endif
#ifndef JucePlugin_MaxNumOutputChannels
#define JucePlugin_MaxNumOutputChannels 2
#endif
#ifndef JucePlugin_PreferredChannelConfigurations
#define JucePlugin_PreferredChannelConfigurations {1, 1}, {2, 2}
#define JucePlugin_PreferredChannelConfigurations {0, 2}
#endif
#ifndef JucePlugin_IsSynth
#define JucePlugin_IsSynth 1
@ -228,7 +228,7 @@
#define JucePlugin_WantsMidiInput 1
#endif
#ifndef JucePlugin_ProducesMidiOutput
#define JucePlugin_ProducesMidiOutput 1
#define JucePlugin_ProducesMidiOutput 0
#endif
#ifndef JucePlugin_SilenceInProducesSilenceOut
#define JucePlugin_SilenceInProducesSilenceOut 0
@ -237,13 +237,13 @@
#define JucePlugin_EditorRequiresKeyboardFocus 0
#endif
#ifndef JucePlugin_Version
#define JucePlugin_Version 1.0.0
#define JucePlugin_Version 0.8.1
#endif
#ifndef JucePlugin_VersionCode
#define JucePlugin_VersionCode 0x10000
#define JucePlugin_VersionCode 0x801
#endif
#ifndef JucePlugin_VersionString
#define JucePlugin_VersionString "1.0.0"
#define JucePlugin_VersionString "0.8.1"
#endif
#ifndef JucePlugin_VSTUniqueID
#define JucePlugin_VSTUniqueID JucePlugin_PluginCode

@ -38,8 +38,8 @@
namespace ProjectInfo
{
const char* const projectName = "Dexed";
const char* const versionString = "1.0.0";
const int versionNumber = 0x10000;
const char* const versionString = "0.8.1";
const int versionNumber = 0x801;
}
#endif

@ -57,7 +57,9 @@
#endif
#if (JUCE_MAC || JUCE_IOS) && JUCE_USE_VDSP_FRAMEWORK
#define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers)
#include <Accelerate/Accelerate.h>
#undef Point
#else
#undef JUCE_USE_VDSP_FRAMEWORK
#endif

@ -661,7 +661,7 @@ String MidiMessage::getTextFromTextMetaEvent() const
MidiMessage MidiMessage::textMetaEvent (int type, StringRef text)
{
jassert (type > 0 && type < 16)
jassert (type > 0 && type < 16);
MidiMessage result;

@ -50,6 +50,11 @@ void SynthesiserVoice::setCurrentPlaybackSampleRate (const double newRate)
currentSampleRate = newRate;
}
bool SynthesiserVoice::isVoiceActive() const
{
return getCurrentlyPlayingNote() >= 0;
}
void SynthesiserVoice::clearCurrentNote()
{
currentlyPlayingNote = -1;
@ -426,7 +431,7 @@ SynthesiserVoice* Synthesiser::findFreeVoice (SynthesiserSound* soundToPlay,
{
SynthesiserVoice* const voice = voices.getUnchecked (i);
if (voice->getCurrentlyPlayingNote() < 0 && voice->canPlaySound (soundToPlay))
if ((! voice->isVoiceActive()) && voice->canPlaySound (soundToPlay))
return voice;
}

@ -140,6 +140,12 @@ public:
*/
virtual void stopNote (float velocity, bool allowTailOff) = 0;
/** Returns true if this voice is currently busy playing a sound.
By default this just checks the getCurrentlyPlayingNote() value, but can
be overridden for more advanced checking.
*/
virtual bool isVoiceActive() const;
/** Called to let the voice know that the pitch wheel has been moved.
This will be called during the rendering callback, so must be fast and thread-safe.
*/

@ -1255,7 +1255,7 @@ private:
DSoundDeviceList deviceList;
bool hasScanned;
void systemDeviceChanged()
void systemDeviceChanged() override
{
DSoundDeviceList newList;
newList.scan();

@ -1418,7 +1418,7 @@ private:
}
//==============================================================================
void systemDeviceChanged()
void systemDeviceChanged() override
{
StringArray newOutNames, newInNames, newOutIds, newInIds;
scan (newOutNames, newInNames, newOutIds, newInIds);

@ -624,8 +624,12 @@ struct AAXClasses
AAX_Result GetParameterDefaultNormalizedValue (AAX_CParamID paramID, double* result) const override
{
if (! isBypassParam (paramID))
{
*result = (double) pluginInstance->getParameterDefaultValue (getParamIndexFromID (paramID));
jassert (*result >= 0 && *result <= 1.0f);
}
return AAX_SUCCESS;
}

@ -482,6 +482,8 @@ public:
outParameterInfo.minValue = 0.0f;
outParameterInfo.maxValue = 1.0f;
outParameterInfo.defaultValue = juceFilter->getParameterDefaultValue (index);
jassert (outParameterInfo.defaultValue >= outParameterInfo.minValue
&& outParameterInfo.defaultValue <= outParameterInfo.maxValue);
outParameterInfo.unit = kAudioUnitParameterUnit_Generic;
return noErr;
@ -561,7 +563,6 @@ public:
info.editOriginTime = 0;
info.ppqPositionOfLastBarStart = 0;
info.isRecording = false;
info.isLooping = false;
info.ppqLoopStart = 0;
info.ppqLoopEnd = 0;
@ -598,7 +599,7 @@ public:
}
double outCurrentSampleInTimeLine, outCycleStartBeat, outCycleEndBeat;
Boolean playing = false, playchanged, looping;
Boolean playing = false, looping = false, playchanged;
if (CallHostTransportState (&playing,
&playchanged,
@ -614,6 +615,7 @@ public:
info.isPlaying = playing;
info.timeInSamples = (int64) (outCurrentSampleInTimeLine + 0.5);
info.timeInSeconds = info.timeInSamples / getSampleRate();
info.isLooping = looping;
return true;
}
@ -1330,7 +1332,7 @@ public:
}
else
{
jassertfalse // can't get a pointer to our effect
jassertfalse; // can't get a pointer to our effect
}
}

@ -174,6 +174,7 @@ public:
const int numSteps = p.getParameterNumSteps (index);
info.stepCount = (Steinberg::int32) (numSteps > 0 && numSteps < 0x7fffffff ? numSteps - 1 : 0);
info.defaultNormalizedValue = p.getParameterDefaultValue (index);
jassert (info.defaultNormalizedValue >= 0 && info.defaultNormalizedValue <= 1.0f);
info.unitId = Vst::kRootUnitId;
info.flags = p.isParameterAutomatable (index) ? Vst::ParameterInfo::kCanAutomate : 0;
}
@ -352,6 +353,9 @@ private:
if (parent == nullptr || isPlatformTypeSupported (type) == kResultFalse)
return kResultFalse;
if (component == nullptr)
component = new ContentWrapperComponent (*this, pluginInstance);
#if JUCE_WINDOWS
component->addToDesktop (0, parent);
component->setOpaque (true);

@ -345,11 +345,21 @@ public:
refreshParameterList();
updateNumChannels();
producesMidiMessages = canProduceMidiOutput();
setPluginCallbacks();
setPlayConfigDetails (numInputBusChannels * numInputBusses,
numOutputBusChannels * numOutputBusses,
rate, blockSize);
setLatencySamples (0);
if (parameters.size() == 0)
{
// some plugins crash if initialiseAudioUnit() is called too soon (sigh..), so we'll
// only call it here if it seems like they it's one of the awkward plugins that can
// only create their parameters after it has been initialised.
initialiseAudioUnit();
refreshParameterList();
}
setPluginCallbacks();
}
//==============================================================================

@ -76,6 +76,7 @@ class AudioProcessor;
#include "processors/juce_AudioPlayHead.h"
#include "processors/juce_AudioProcessorEditor.h"
#include "processors/juce_AudioProcessorListener.h"
#include "processors/juce_AudioProcessorParameter.h"
#include "processors/juce_AudioProcessor.h"
#include "processors/juce_PluginDescription.h"
#include "processors/juce_AudioPluginInstance.h"

@ -118,20 +118,6 @@ void AudioProcessor::setParameterNotifyingHost (const int parameterIndex,
sendParamChangeMessageToListeners (parameterIndex, newValue);
}
String AudioProcessor::getParameterName (int parameterIndex, int maximumStringLength)
{
return getParameterName (parameterIndex).substring (0, maximumStringLength);
}
String AudioProcessor::getParameterText (int parameterIndex, int maximumStringLength)
{
return getParameterText (parameterIndex).substring (0, maximumStringLength);
}
int AudioProcessor::getDefaultNumParameterSteps() noexcept { return 0x7fffffff; }
int AudioProcessor::getParameterNumSteps (int /*parameterIndex*/) { return getDefaultNumParameterSteps(); }
float AudioProcessor::getParameterDefaultValue (int /*parameterIndex*/) { return 0.0f; }
AudioProcessorListener* AudioProcessor::getListenerLocked (const int index) const noexcept
{
const ScopedLock sl (listenerLock);
@ -202,10 +188,129 @@ void AudioProcessor::updateHostDisplay()
l->audioProcessorChanged (this);
}
String AudioProcessor::getParameterLabel (int) const { return String(); }
bool AudioProcessor::isParameterOrientationInverted (int) const { return false; }
bool AudioProcessor::isParameterAutomatable (int) const { return true; }
bool AudioProcessor::isMetaParameter (int) const { return false; }
const OwnedArray<AudioProcessorParameter>& AudioProcessor::getParameters() const noexcept
{
return managedParameters;
}
int AudioProcessor::getNumParameters()
{
return managedParameters.size();
}
float AudioProcessor::getParameter (int index)
{
if (AudioProcessorParameter* p = getParamChecked (index))
return p->getValue();
return 0;
}
void AudioProcessor::setParameter (int index, float newValue)
{
if (AudioProcessorParameter* p = getParamChecked (index))
p->setValue (newValue);
}
float AudioProcessor::getParameterDefaultValue (int index)
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->getDefaultValue();
return 0;
}
const String AudioProcessor::getParameterName (int index)
{
if (AudioProcessorParameter* p = getParamChecked (index))
return p->getName (512);
return String();
}
String AudioProcessor::getParameterName (int index, int maximumStringLength)
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->getName (maximumStringLength);
return getParameterName (index).substring (0, maximumStringLength);
}
const String AudioProcessor::getParameterText (int index)
{
return getParameterText (index, 1024);
}
String AudioProcessor::getParameterText (int index, int maximumStringLength)
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->getText (p->getValue(), maximumStringLength);
return getParameterText (index).substring (0, maximumStringLength);
}
int AudioProcessor::getParameterNumSteps (int index)
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->getNumSteps();
return AudioProcessor::getDefaultNumParameterSteps();
}
int AudioProcessor::getDefaultNumParameterSteps() noexcept
{
return 0x7fffffff;
}
String AudioProcessor::getParameterLabel (int index) const
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->getLabel();
return String();
}
bool AudioProcessor::isParameterAutomatable (int index) const
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->isAutomatable();
return true;
}
bool AudioProcessor::isParameterOrientationInverted (int index) const
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->isOrientationInverted();
return false;
}
bool AudioProcessor::isMetaParameter (int index) const
{
if (AudioProcessorParameter* p = managedParameters[index])
return p->isMetaParameter();
return false;
}
AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const noexcept
{
AudioProcessorParameter* p = managedParameters[index];
// If you hit this, then you're either trying to access parameters that are out-of-range,
// or you're not using addParameter and the managed parameter list, but have failed
// to override some essential virtual methods and implement them appropriately.
jassert (p != nullptr);
return p;
}
void AudioProcessor::addParameter (AudioProcessorParameter* p)
{
p->processor = this;
p->parameterIndex = managedParameters.size();
managedParameters.add (p);
}
void AudioProcessor::suspendProcessing (const bool shouldBeSuspended)
{
@ -296,6 +401,47 @@ XmlElement* AudioProcessor::getXmlFromBinary (const void* data, const int sizeIn
void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}
void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {}
//==============================================================================
AudioProcessorParameter::AudioProcessorParameter() noexcept
: processor (nullptr), parameterIndex (-1)
{}
AudioProcessorParameter::~AudioProcessorParameter() {}
void AudioProcessorParameter::setValueNotifyingHost (float newValue)
{
// This method can't be used until the parameter has been attached to a processor!
jassert (processor != nullptr && parameterIndex >= 0);
return processor->setParameterNotifyingHost (parameterIndex, newValue);
}
void AudioProcessorParameter::beginChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (processor != nullptr && parameterIndex >= 0);
processor->beginParameterChangeGesture (parameterIndex);
}
void AudioProcessorParameter::endChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (processor != nullptr && parameterIndex >= 0);
processor->endParameterChangeGesture (parameterIndex);
}
bool AudioProcessorParameter::isOrientationInverted() const { return false; }
bool AudioProcessorParameter::isAutomatable() const { return true; }
bool AudioProcessorParameter::isMetaParameter() const { return false; }
int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); }
String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const
{
return String (value, 2);
}
//==============================================================================
bool AudioPlayHead::CurrentPositionInfo::operator== (const CurrentPositionInfo& other) const noexcept
{

@ -377,10 +377,10 @@ public:
/** This must return the correct value immediately after the object has been
created, and mustn't change the number of parameters later.
*/
virtual int getNumParameters() = 0;
virtual int getNumParameters();
/** Returns the name of a particular parameter. */
virtual const String getParameterName (int parameterIndex) = 0;
virtual const String getParameterName (int parameterIndex);
/** Called by the host to find out the value of one of the filter's parameters.
@ -390,10 +390,10 @@ public:
It's also likely to be called by non-UI threads, so the code in here should
be thread-aware.
*/
virtual float getParameter (int parameterIndex) = 0;
virtual float getParameter (int parameterIndex);
/** Returns the value of a parameter as a text string. */
virtual const String getParameterText (int parameterIndex) = 0;
virtual const String getParameterText (int parameterIndex);
/** Returns the name of a parameter as a text string with a preferred maximum length.
If you want to provide customised short versions of your parameter names that
@ -455,7 +455,7 @@ public:
The value passed will be between 0 and 1.0.
*/
virtual void setParameter (int parameterIndex, float newValue) = 0;
virtual void setParameter (int parameterIndex, float newValue);
/** Your filter can call this when it needs to change one of its parameters.
@ -507,6 +507,16 @@ public:
*/
void updateHostDisplay();
//==============================================================================
/** Adds a parameter to the list.
The parameter object will be managed and deleted automatically by the list
when no longer needed.
*/
void addParameter (AudioProcessorParameter*);
/** Returns the current list of parameters. */
const OwnedArray<AudioProcessorParameter>& getParameters() const noexcept;
//==============================================================================
/** Returns the number of preset programs the filter supports.
@ -663,6 +673,9 @@ private:
CriticalSection callbackLock, listenerLock;
String inputSpeakerArrangement, outputSpeakerArrangement;
OwnedArray<AudioProcessorParameter> managedParameters;
AudioProcessorParameter* getParamChecked (int) const noexcept;
#if JUCE_DEBUG
BigInteger changingParams;
#endif

@ -38,7 +38,7 @@
The template parameter specifies the class of the object you want to point to - the easiest
way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject
or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable
class by implementing a set of mathods called incReferenceCount(), decReferenceCount(), and
class by implementing a set of methods called incReferenceCount(), decReferenceCount(), and
decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods
should behave.

@ -1659,7 +1659,7 @@ JavascriptEngine::JavascriptEngine() : maximumExecutionTime (15.0), root (new R
JavascriptEngine::~JavascriptEngine() {}
void JavascriptEngine::prepareTimeout() const { root->timeout = Time::getCurrentTime() + maximumExecutionTime; }
void JavascriptEngine::prepareTimeout() const noexcept { root->timeout = Time::getCurrentTime() + maximumExecutionTime; }
void JavascriptEngine::registerNativeObject (Identifier name, DynamicObject* object)
{
@ -1715,6 +1715,11 @@ var JavascriptEngine::callFunction (Identifier function, const var::NativeFuncti
return returnVal;
}
const NamedValueSet& JavascriptEngine::getRootObjectProperties() const noexcept
{
return root->getProperties();
}
#if JUCE_MSVC
#pragma warning (pop)
#endif

@ -96,10 +96,13 @@ public:
*/
RelativeTime maximumExecutionTime;
/** Provides access to the set of properties of the root namespace object. */
const NamedValueSet& getRootObjectProperties() const noexcept;
private:
JUCE_PUBLIC_IN_DLL_BUILD (struct RootObject)
ReferenceCountedObjectPtr<RootObject> root;
void prepareTimeout() const;
const ReferenceCountedObjectPtr<RootObject> root;
void prepareTimeout() const noexcept;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JavascriptEngine)
};

@ -194,6 +194,7 @@ extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noe
#include "threads/juce_ScopedLock.h"
#include "threads/juce_CriticalSection.h"
#include "maths/juce_Range.h"
#include "maths/juce_NormalisableRange.h"
#include "containers/juce_ElementComparator.h"
#include "containers/juce_ArrayAllocationBase.h"
#include "containers/juce_Array.h"
@ -244,6 +245,7 @@ extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noe
#include "misc/juce_Uuid.h"
#include "misc/juce_WindowsRegistry.h"
#include "system/juce_PlatformDefs.h"
#include "system/juce_CompilerSupport.h"
#include "system/juce_SystemStats.h"
#include "threads/juce_ChildProcess.h"
#include "threads/juce_DynamicLibrary.h"

@ -208,7 +208,7 @@ private:
The template parameter specifies the class of the object you want to point to - the easiest
way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject
or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable
class by implementing a set of mathods called incReferenceCount(), decReferenceCount(), and
class by implementing a set of methods called incReferenceCount(), decReferenceCount(), and
decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods
should behave.

@ -45,13 +45,14 @@ public:
address (address_), headers (headers_), postData (postData_), position (0),
finished (false), isPost (isPost_), timeOutMs (timeOutMs_)
{
createConnection (progressCallback, progressCallbackContext);
if (! isError())
for (int maxRedirects = 10; --maxRedirects >= 0;)
{
if (responseHeaders != nullptr)
createConnection (progressCallback, progressCallbackContext);
if (! isError())
{
DWORD bufferSizeBytes = 4096;
StringPairArray headers (false);
for (;;)
{
@ -65,11 +66,10 @@ public:
for (int i = 0; i < headersArray.size(); ++i)
{
const String& header = headersArray[i];
const String key (header.upToFirstOccurrenceOf (": ", false, false));
const String key (header.upToFirstOccurrenceOf (": ", false, false));
const String value (header.fromFirstOccurrenceOf (": ", false, false));
const String previousValue ((*responseHeaders) [key]);
responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value));
const String previousValue (headers[key]);
headers.set (key, previousValue.isEmpty() ? value : (previousValue + "," + value));
}
break;
@ -77,14 +77,34 @@ public:
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
break;
bufferSizeBytes += 4096;
}
}
DWORD status = 0;
DWORD statusSize = sizeof (status);
DWORD status = 0;
DWORD statusSize = sizeof (status);
if (HttpQueryInfo (request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &statusSize, 0))
{
statusCode = (int) status;
if (status == 301 || status == 302 || status == 303 || status == 307)
{
const String newLocation (headers["Location"]);
if (newLocation.isNotEmpty() && newLocation != address)
{
address = newLocation;
continue;
}
}
}
if (responseHeaders != nullptr)
responseHeaders->addArray (headers);
}
if (HttpQueryInfo (request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &statusSize, 0))
statusCode = (int) status;
break;
}
}

@ -263,6 +263,12 @@ namespace SocketHelpers
return true;
}
static void makeReusable (int handle) noexcept
{
const int reuse = 1;
setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse));
}
}
//==============================================================================
@ -419,8 +425,7 @@ bool StreamingSocket::createListener (const int newPortNumber, const String& loc
return false;
#if ! JUCE_WINDOWS // on windows, adding this option produces behaviour different to posix
const int reuse = 1;
setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse));
SocketHelpers::makeReusable (handle);
#endif
if (bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) < 0
@ -472,6 +477,7 @@ DatagramSocket::DatagramSocket (const int localPortNumber, const bool canBroadca
SocketHelpers::initSockets();
handle = (int) socket (AF_INET, SOCK_DGRAM, 0);
SocketHelpers::makeReusable (handle);
bindToPort (localPortNumber);
}

@ -94,20 +94,34 @@
#define JUCE_ANALYZER_NORETURN
#endif
//==============================================================================
#if JUCE_MSVC && ! DOXYGEN
#define MACRO_WITH_FORCED_SEMICOLON(x) \
__pragma(warning(push)) \
__pragma(warning(disable:4127)) \
do { x } while (false) \
__pragma(warning(pop))
#else
/** This is the good old C++ trick for creating a macro that forces the user to put
a semicolon after it when they use it.
*/
#define MACRO_WITH_FORCED_SEMICOLON(x) do { x } while (false)
#endif
//==============================================================================
#if JUCE_DEBUG || DOXYGEN
/** Writes a string to the standard error stream.
This is only compiled in a debug build.
@see Logger::outputDebugString
*/
#define DBG(dbgtext) { juce::String tempDbgBuf; tempDbgBuf << dbgtext; juce::Logger::outputDebugString (tempDbgBuf); }
#define DBG(dbgtext) MACRO_WITH_FORCED_SEMICOLON (juce::String tempDbgBuf; tempDbgBuf << dbgtext; juce::Logger::outputDebugString (tempDbgBuf);)
//==============================================================================
/** This will always cause an assertion failure.
It is only compiled in a debug build, (unless JUCE_LOG_ASSERTIONS is enabled for your build).
@see jassert
*/
#define jassertfalse { juce_LogCurrentAssertion; if (juce::juce_isRunningUnderDebugger()) juce_breakDebugger; JUCE_ANALYZER_NORETURN }
#define jassertfalse MACRO_WITH_FORCED_SEMICOLON (juce_LogCurrentAssertion; if (juce::juce_isRunningUnderDebugger()) juce_breakDebugger; JUCE_ANALYZER_NORETURN)
//==============================================================================
/** Platform-independent assertion macro.
@ -117,19 +131,19 @@
correct behaviour of your program!
@see jassertfalse
*/
#define jassert(expression) { if (! (expression)) jassertfalse; }
#define jassert(expression) MACRO_WITH_FORCED_SEMICOLON (if (! (expression)) jassertfalse;)
#else
//==============================================================================
// If debugging is disabled, these dummy debug and assertion macros are used..
#define DBG(dbgtext)
#define jassertfalse { juce_LogCurrentAssertion }
#define jassertfalse MACRO_WITH_FORCED_SEMICOLON (juce_LogCurrentAssertion)
#if JUCE_LOG_ASSERTIONS
#define jassert(expression) { if (! (expression)) jassertfalse; }
#define jassert(expression) MACRO_WITH_FORCED_SEMICOLON (if (! (expression)) jassertfalse;)
#else
#define jassert(a) {}
#define jassert(a) MACRO_WITH_FORCED_SEMICOLON ( ; )
#endif
#endif
@ -139,7 +153,7 @@
namespace juce
{
template <bool b> struct JuceStaticAssert;
template <> struct JuceStaticAssert <true> { static void dummy() {} };
template <> struct JuceStaticAssert<true> { static void dummy() {} };
}
#endif
@ -322,84 +336,4 @@ namespace juce
#define JUCE_PACKED
#endif
//==============================================================================
// Here, we'll check for C++11 compiler support, and if it's not available, define
// a few workarounds, so that we can still use some of the newer language features.
#if (__cplusplus >= 201103L || defined (__GXX_EXPERIMENTAL_CXX0X__)) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
#define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1
#define JUCE_COMPILER_SUPPORTS_NULLPTR 1
#define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1
#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL)
#define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1
#endif
#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (JUCE_DELETED_FUNCTION)
#define JUCE_DELETED_FUNCTION = delete
#endif
#endif
#if JUCE_CLANG && defined (__has_feature)
#if __has_feature (cxx_nullptr)
#define JUCE_COMPILER_SUPPORTS_NULLPTR 1
#endif
#if __has_feature (cxx_noexcept)
#define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1
#endif
#if __has_feature (cxx_rvalue_references)
#define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1
#endif
#if __has_feature (cxx_deleted_functions)
#define JUCE_DELETED_FUNCTION = delete
#endif
#ifndef JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL
#define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1
#endif
#ifndef JUCE_COMPILER_SUPPORTS_ARC
#define JUCE_COMPILER_SUPPORTS_ARC 1
#endif
#endif
#if defined (_MSC_VER) && _MSC_VER >= 1600
#define JUCE_COMPILER_SUPPORTS_NULLPTR 1
#define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1
#endif
#if defined (_MSC_VER) && _MSC_VER >= 1700
#define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1
#endif
#ifndef JUCE_DELETED_FUNCTION
#define JUCE_DELETED_FUNCTION
#endif
//==============================================================================
// Declare some fake versions of nullptr and noexcept, for older compilers:
#if ! (DOXYGEN || JUCE_COMPILER_SUPPORTS_NOEXCEPT)
#ifdef noexcept
#undef noexcept
#endif
#define noexcept throw()
#if defined (_MSC_VER) && _MSC_VER > 1600
#define _ALLOW_KEYWORD_MACROS 1 // (to stop VC2012 complaining)
#endif
#endif
#if ! (DOXYGEN || JUCE_COMPILER_SUPPORTS_NULLPTR)
#ifdef nullptr
#undef nullptr
#endif
#define nullptr (0)
#endif
#if ! (DOXYGEN || JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL)
#undef override
#define override
#endif
#endif // JUCE_PLATFORMDEFS_H_INCLUDED

@ -51,6 +51,7 @@
//==============================================================================
#include "juce_PlatformDefs.h"
#include "juce_CompilerSupport.h"
//==============================================================================
// Now we'll include some common OS headers..

@ -53,7 +53,7 @@ static void sanityCheckTagName (const String& tag)
(void) tag;
// the tag name mustn't be empty, or it'll look like a text element!
jassert (tag.containsNonWhitespaceChars())
jassert (tag.containsNonWhitespaceChars());
// The tag can't contain spaces or other characters that would create invalid XML!
jassert (! tag.containsAnyOf (" <>/&(){}"));

@ -39,6 +39,7 @@ namespace juce
#include "messages/juce_NotificationType.h"
#include "messages/juce_ApplicationBase.h"
#include "messages/juce_Initialisation.h"
#include "messages/juce_MountedVolumeListChangeDetector.h"
#include "broadcasters/juce_ListenerList.h"
#include "broadcasters/juce_ActionBroadcaster.h"
#include "broadcasters/juce_ActionListener.h"

@ -131,6 +131,7 @@ void MessageManager::stopDispatchLoop()
#endif
//==============================================================================
#if JUCE_COMPILER_SUPPORTS_LAMBDAS
struct AsyncFunction : private MessageManager::MessageBase
{
AsyncFunction (std::function<void(void)> f) : fn (f) { post(); }
@ -146,7 +147,9 @@ void MessageManager::callAsync (std::function<void(void)> f)
{
new AsyncFunction (f);
}
#endif
//==============================================================================
class AsyncFunctionCallback : public MessageManager::MessageBase
{
public:

@ -91,10 +91,12 @@ public:
#endif
//==============================================================================
#if JUCE_COMPILER_SUPPORTS_LAMBDAS
/** Asynchronously invokes a function or C++11 lambda on the message thread.
Internally this uses the CallbackMessage class to invoke the callback.
*/
static void callAsync (std::function<void(void)>);
#endif
/** Calls a function using the message-thread.

@ -365,3 +365,54 @@ void repostCurrentNSEvent()
(new EventReposter())->post();
}
//==============================================================================
#if JUCE_MAC
struct MountedVolumeListChangeDetector::Pimpl
{
Pimpl (MountedVolumeListChangeDetector& d) : owner (d)
{
static ObserverClass cls;
delegate = [cls.createInstance() init];
ObserverClass::setOwner (delegate, this);
NSNotificationCenter* nc = [[NSWorkspace sharedWorkspace] notificationCenter];
[nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidMountNotification object: nil];
[nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidUnmountNotification object: nil];
}
~Pimpl()
{
[[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver: delegate];
[delegate release];
}
private:
MountedVolumeListChangeDetector& owner;
id delegate;
struct ObserverClass : public ObjCClass<NSObject>
{
ObserverClass() : ObjCClass<NSObject> ("JUCEDriveObserver_")
{
addIvar<Pimpl*> ("owner");
addMethod (@selector (changed:), changed, "v@:@");
addProtocol (@protocol (NSTextInput));
registerClass();
}
static Pimpl* getOwner (id self) { return getIvar<Pimpl*> (self, "owner"); }
static void setOwner (id self, Pimpl* owner) { object_setInstanceVariable (self, "owner", owner); }
static void changed (id self, SEL, NSNotification*)
{
getOwner (self)->owner.mountedVolumeListChanged();
}
};
};
MountedVolumeListChangeDetector::MountedVolumeListChangeDetector() { pimpl = new Pimpl (*this); }
MountedVolumeListChangeDetector::~MountedVolumeListChangeDetector() {}
#endif

@ -100,7 +100,6 @@ public:
virtual ~DeviceChangeDetector() {}
protected:
virtual void systemDeviceChanged() = 0;
void triggerAsyncDeviceChangeCallback()

@ -188,3 +188,30 @@ void MessageManager::doPlatformSpecificShutdown()
OleUninitialize();
}
//==============================================================================
struct MountedVolumeListChangeDetector::Pimpl : private DeviceChangeDetector
{
Pimpl (MountedVolumeListChangeDetector& d) : DeviceChangeDetector (L"MountedVolumeList"), owner (d)
{
File::findFileSystemRoots (lastVolumeList);
}
void systemDeviceChanged() override
{
Array<File> newList;
File::findFileSystemRoots (newList);
if (lastVolumeList != newList)
{
lastVolumeList = newList;
owner.mountedVolumeListChanged();
}
}
MountedVolumeListChangeDetector& owner;
Array<File> lastVolumeList;
};
MountedVolumeListChangeDetector::MountedVolumeListChangeDetector() { pimpl = new Pimpl (*this); }
MountedVolumeListChangeDetector::~MountedVolumeListChangeDetector() {}

@ -384,7 +384,7 @@ void LowLevelGraphicsPostScriptRenderer::fillPath (const Path& path, const Affin
{
// this doesn't work correctly yet - it could be improved to handle solid gradients, but
// postscript can't do semi-transparent ones.
notPossibleInPostscriptAssert // you can disable this warning by setting the WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS flag at the top of this file
notPossibleInPostscriptAssert; // you can disable this warning by setting the WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS flag at the top of this file
writeClip();
out << "gsave ";

@ -193,9 +193,9 @@ AffineTransform AffineTransform::sheared (const float shearX, const float shearY
return AffineTransform (mat00 + shearX * mat10,
mat01 + shearX * mat11,
mat02 + shearX * mat12,
shearY * mat00 + mat10,
shearY * mat01 + mat11,
shearY * mat02 + mat12);
mat10 + shearY * mat00,
mat11 + shearY * mat01,
mat12 + shearY * mat02);
}
AffineTransform AffineTransform::verticalFlip (const float height) noexcept
@ -211,10 +211,10 @@ AffineTransform AffineTransform::inverted() const noexcept
{
determinant = 1.0 / determinant;
const float dst00 = (float) (mat11 * determinant);
const float dst00 = (float) ( mat11 * determinant);
const float dst10 = (float) (-mat10 * determinant);
const float dst01 = (float) (-mat01 * determinant);
const float dst11 = (float) (mat00 * determinant);
const float dst11 = (float) ( mat00 * determinant);
return AffineTransform (dst00, dst01, -mat02 * dst00 - mat12 * dst01,
dst10, dst11, -mat02 * dst10 - mat12 * dst11);
@ -258,5 +258,5 @@ bool AffineTransform::isOnlyTranslation() const noexcept
float AffineTransform::getScaleFactor() const noexcept
{
return (mat00 + mat11) / 2.0f;
return (std::abs (mat00) + std::abs (mat11)) / 2.0f;
}

@ -343,6 +343,9 @@ public:
*/
void setState (ButtonState newState);
/** Returns the button's current over/down/up state. */
ButtonState getState() const noexcept { return buttonState; }
// This method's parameters have changed - see the new version.
JUCE_DEPRECATED (void setToggleState (bool, bool));

@ -25,9 +25,7 @@
class ComponentAnimator::AnimationTask
{
public:
AnimationTask (Component* const comp) noexcept : component (comp)
{
}
AnimationTask (Component* c) noexcept : component (c) {}
void reset (const Rectangle<int>& finalBounds,
float finalAlpha,
@ -65,8 +63,8 @@ public:
bool useTimeslice (const int elapsed)
{
if (Component* const c = proxy != nullptr ? static_cast <Component*> (proxy)
: static_cast <Component*> (component))
if (Component* const c = proxy != nullptr ? static_cast<Component*> (proxy)
: static_cast<Component*> (component))
{
msElapsed += elapsed;
double newProgress = msElapsed / (double) msTotal;
@ -149,7 +147,10 @@ public:
else
jassertfalse; // seem to be trying to animate a component that's not visible..
image = c.createComponentSnapshot (c.getLocalBounds(), false, getDesktopScaleFactor());
const float scale = (float) Desktop::getInstance().getDisplays()
.getDisplayContaining (getScreenBounds().getCentre()).scale;
image = c.createComponentSnapshot (c.getLocalBounds(), false, scale);
setVisible (true);
toBehind (&c);
@ -189,14 +190,8 @@ private:
};
//==============================================================================
ComponentAnimator::ComponentAnimator()
: lastTime (0)
{
}
ComponentAnimator::~ComponentAnimator()
{
}
ComponentAnimator::ComponentAnimator() : lastTime (0) {}
ComponentAnimator::~ComponentAnimator() {}
//==============================================================================
ComponentAnimator::AnimationTask* ComponentAnimator::findTaskFor (Component* const component) const noexcept
@ -217,7 +212,7 @@ void ComponentAnimator::animateComponent (Component* const component,
const double endSpeed)
{
// the speeds must be 0 or greater!
jassert (startSpeed >= 0 && endSpeed >= 0)
jassert (startSpeed >= 0 && endSpeed >= 0);
if (component != nullptr)
{

@ -740,7 +740,7 @@ public:
void ensureItemIsVisible (const int itemID, int wantedY)
{
jassert (itemID != 0)
jassert (itemID != 0);
for (int i = items.size(); --i >= 0;)
{

@ -65,6 +65,12 @@ static void addKDialogArgs (StringArray& args, String& separator,
if (title.isNotEmpty())
args.add ("--title=" + title);
if (uint64 topWindowID = getTopWindowID())
{
args.add ("--attach");
args.add (String (topWindowID));
}
if (selectMultipleFiles)
{
separator = "\n";
@ -79,12 +85,6 @@ static void addKDialogArgs (StringArray& args, String& separator,
else args.add ("--getopenfilename");
}
if (uint64 topWindowID = getTopWindowID())
{
args.add ("--attach");
args.add (String (topWindowID));
}
File startPath;
if (file.exists())

@ -1372,7 +1372,7 @@ public:
const ModifierKeys oldMods (currentModifiers);
bool keyPressed = false;
if ((sym & 0xff00) == 0xff00 || sym == XK_ISO_Left_Tab)
if ((sym & 0xff00) == 0xff00 || keyCode == XK_ISO_Left_Tab)
{
switch (sym) // Translate keypad
{
@ -1431,6 +1431,11 @@ public:
keyCode &= 0xff;
break;
case XK_ISO_Left_Tab:
keyPressed = true;
keyCode = XK_Tab & 0xff;
break;
default:
if (sym >= XK_F1 && sym <= XK_F16)
{

@ -177,6 +177,7 @@ static void setWindowZOrder (HWND hwnd, HWND insertAfter)
//==============================================================================
static void setDPIAwareness()
{
#if ! JUCE_DISABLE_WIN32_DPI_AWARENESS
if (JUCEApplicationBase::isStandaloneApp())
{
if (setProcessDPIAwareness == nullptr)
@ -203,6 +204,7 @@ static void setDPIAwareness()
}
}
}
#endif
}
static double getGlobalDPI()

@ -887,7 +887,7 @@ void ListBox::repaintRow (const int rowNumber) noexcept
Image ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
{
Rectangle<int> imageArea;
const int firstRow = getRowContainingPosition (0, 0);
const int firstRow = getRowContainingPosition (0, viewport->getY());
for (int i = getNumRowsOnScreen() + 2; --i >= 0;)
{

@ -23,7 +23,7 @@
*/
CallOutBox::CallOutBox (Component& c, const Rectangle<int>& area, Component* const parent)
: arrowSize (16.0f), content (c)
: arrowSize (16.0f), content (c), dismissalMouseClicksAreAlwaysConsumed (false)
{
addAndMakeVisible (content);
@ -123,9 +123,8 @@ bool CallOutBox::hitTest (int x, int y)
void CallOutBox::inputAttemptWhenModal()
{
const Point<int> mousePos (getMouseXYRelative() + getBounds().getPosition());
if (targetArea.contains (mousePos))
if (dismissalMouseClicksAreAlwaysConsumed
|| targetArea.contains (getMouseXYRelative() + getBounds().getPosition()))
{
// if you click on the area that originally popped-up the callout, you expect it
// to get rid of the box, but deleting the box here allows the click to pass through and
@ -139,6 +138,11 @@ void CallOutBox::inputAttemptWhenModal()
}
}
void CallOutBox::setDismissalMouseClicksAreAlwaysConsumed (bool b) noexcept
{
dismissalMouseClicksAreAlwaysConsumed = b;
}
enum { callOutBoxDismissCommandId = 0x4f83a04b };
void CallOutBox::handleCommandMessage (int commandId)

@ -123,6 +123,16 @@ public:
*/
void dismiss();
/** Determines whether the mouse events for clicks outside the calloutbox are
consumed, or allowed to arrive at the other component that they were aimed at.
By default this is false, so that when you click on something outside the calloutbox,
that event will also be sent to the component that was clicked on. If you set it to
true, then the first click will always just dismiss the box and not be sent to
anything else.
*/
void setDismissalMouseClicksAreAlwaysConsumed (bool shouldAlwaysBeConsumed) noexcept;
//==============================================================================
/** This abstract base class is implemented by LookAndFeel classes. */
struct JUCE_API LookAndFeelMethods
@ -161,6 +171,7 @@ private:
Point<float> targetPoint;
Rectangle<int> availableArea, targetArea;
Image background;
bool dismissalMouseClicksAreAlwaysConsumed;
void refreshPath();

@ -142,7 +142,6 @@ public:
if (currentPeer != peer)
{
removeFromParent();
currentPeer = peer;
if (peer != nullptr)
@ -151,6 +150,10 @@ public:
[peerView addSubview: view];
componentMovedOrResized (false, false);
}
else
{
removeFromParent();
}
}
[view setHidden: ! owner.isShowing()];

@ -52,6 +52,12 @@ static float logsc(float param, const float min,const float max,const float roll
return ((expf(param * logf(rolloff+1)) - 1.0f) / (rolloff)) * (max-min) + min;
}
PluginFx::PluginFx() {
uiCutoff = 1;
uiReso = 0;
uiGain = 1;
}
void PluginFx::init(int sr) {
mm=0;
s1=s2=s3=s4=c=d=0;
@ -72,11 +78,7 @@ void PluginFx::init(int sr) {
rcor = (480.0 / 44000)*rcrate;
rcorInv = 1 / rcor;
bandPassSw = false;
uiCutoff = 1;
uiReso = 0;
uiGain = 1;
pCutoff = -1;
pReso = -1;
}

@ -63,6 +63,7 @@ class PluginFx {
int R;
public:
PluginFx();
ScopedPointer<ModuleFx> obxdFilter;

@ -140,6 +140,8 @@ float CtrlDX::getValueHost() {
}
void CtrlDX::setValueHost(float f) {
if ( f == 1 )
f = 0.999;
setValue((f * steps));
}

@ -239,16 +239,7 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi
}
// DX7 is a mono synth
for (int channel = 1; channel < getNumInputChannels(); ++channel) {
buffer.copyFrom(channel, 0, channelData, numSamples, 1);
}
// In case we have more outputs than inputs, we'll clear any output
// channels that didn't contain input data, (because these aren't
// guaranteed to be empty - they may contain garbage).
for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) {
buffer.clear (i, 0, buffer.getNumSamples());
}
buffer.copyFrom(1, 0, channelData, numSamples, 1);
}

Loading…
Cancel
Save