git subrepo clone --branch=sono6good https://github.com/essej/JUCE.git deps/juce
subrepo: subdir: "deps/juce" merged: "b13f9084e" upstream: origin: "https://github.com/essej/JUCE.git" branch: "sono6good" commit: "b13f9084e" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
This commit is contained in:
deps/juce
.gitattributesCMakeLists.txtDemoRunner.jucerCMakeLists.txtCMakeLists.txtCMakeLists.txtjucer_Project.cppjucer_Project.hCMakeLists.txt
.github
.gitignore.gitlab-ci.yml.gitrepoBREAKING-CHANGES.txtCMakeLists.txtChangeList.txtLICENSE.mdREADME.mddocs
examples
Assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlAudio
AudioAppDemo.hAudioLatencyDemo.hAudioPlaybackDemo.hAudioRecordingDemo.hAudioSettingsDemo.hAudioSynthesiserDemo.hCMakeLists.txtMPEDemo.hMidiDemo.hPluckedStringsDemo.hSimpleFFTDemo.h
CMake
CMakeLists.txtDSP
CMakeLists.txtConvolutionDemo.hFIRFilterDemo.hGainDemo.hIIRFilterDemo.hOscillatorDemo.hOverdriveDemo.hSIMDRegisterDemo.hStateVariableFilterDemo.hWaveShaperTanhDemo.h
DemoRunner
Builds
Android
app
CMakeLists.txtbuild.gradle
build.gradlesrc
debug
res
values
main
AndroidManifest.xml
assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlres
release
res
values
gradle
gradlewgradlew.batsettings.gradleLinuxMakefile
MacOSX
VisualStudio2015
VisualStudio2017
VisualStudio2019
iOS
App.entitlementsIcon.icnsInfo-App.plistLaunchScreen.storyboard
DemoRunner.xcodeproj
DemoRunner
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_analytics.cppinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_box2d.cppinclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cppinclude_juce_product_unlocking.cppinclude_juce_product_unlocking.mminclude_juce_video.cppinclude_juce_video.mm
Source
GUI
AccessibilityDemo.hAnimationAppDemo.hAnimationDemo.hBouncingBallWavetableDemo.hCMakeLists.txtCameraDemo.hCodeEditorDemo.hComponentDemo.hComponentTransformsDemo.hDialogsDemo.hFlexBoxDemo.hFontsDemo.hGraphicsDemo.hGridDemo.hHelloWorldDemo.hImagesDemo.hKeyMappingsDemo.hLookAndFeelDemo.hMDIDemo.hMenusDemo.hMultiTouchDemo.hOpenGLAppDemo.hOpenGLDemo.hOpenGLDemo2D.hPropertiesDemo.hVideoDemo.hWebBrowserDemo.hWidgetsDemo.hWindowsDemo.h
Plugins
AUv3SynthPluginDemo.hArpeggiatorPluginDemo.hAudioPluginDemo.hCMakeLists.txtDSPModulePluginDemo.hGainPluginDemo.hInterAppAudioEffectPluginDemo.hMidiLoggerPluginDemo.hMultiOutSynthPluginDemo.hNoiseGatePluginDemo.hReaperEmbeddedViewPluginDemo.hSamplerPluginDemo.hSurroundPluginDemo.h
extern
Utilities
extras
AudioPerformanceTest
AudioPerformanceTest.jucerInfo-App.plistLaunchScreen.storyboardCMakeLists.txt
Builds
Android
LinuxMakefile
MacOSX
VisualStudio2019
AudioPerformanceTest.slnAudioPerformanceTest_App.vcxprojAudioPerformanceTest_App.vcxproj.filtersresources.rc
iOS
AudioPerformanceTest.xcodeproj
AudioPerformanceTest
Images.xcassets
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mm
Source
AudioPluginHost
AudioPluginHost.jucerIcon.icnsInfo-App.plistLaunchScreen.storyboardCMakeLists.txt
Builds
Android
app
CMakeLists.txtbuild.gradle
build.gradlesrc
debug
res
values
main
AndroidManifest.xml
assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlres
release
res
values
gradle
gradlewgradlew.batsettings.gradleLinuxMakefile
MacOSX
VisualStudio2015
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
VisualStudio2017
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
VisualStudio2019
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
iOS
AudioPluginHost.xcodeproj
AudioPluginHost
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mm
Source
BinaryBuilder
Build
CMake
JUCECheckAtomic.cmakeJUCEConfig.cmake.inJUCEHelperTargets.cmakeJUCEModuleSupport.cmakeJUCEUtils.cmakeLaunchScreen.storyboardPIPAudioProcessor.cpp.inPIPComponent.cpp.inPIPConsole.cpp.inRecentFilesMenuTemplate.nibUnityPluginGUIScript.cs.incopyDir.cmakejuce_runtime_arch_detection.cpp
CMakeLists.txtjuce_build_tools
juce_build_tools.cppjuce_build_tools.h
utils
juce_BinaryResourceFile.cppjuce_BinaryResourceFile.hjuce_BuildHelperFunctions.cppjuce_BuildHelperFunctions.hjuce_CppTokeniserFunctions.cppjuce_Entitlements.cppjuce_Entitlements.hjuce_Icons.cppjuce_Icons.hjuce_PlistOptions.cppjuce_PlistOptions.hjuce_ProjectType.hjuce_RelativePath.hjuce_ResourceFileHelpers.cppjuce_ResourceFileHelpers.hjuce_ResourceRc.cppjuce_ResourceRc.hjuce_VersionNumbers.cppjuce_VersionNumbers.h
juceaide
NetworkGraphicsDemo
Builds
Android
LinuxMakefile
MacOSX
VisualStudio2019
NetworkGraphicsDemo.slnNetworkGraphicsDemo_App.vcxprojNetworkGraphicsDemo_App.vcxproj.filtersresources.rc
iOS
Icon.icnsInfo-App.plistLaunchScreen.storyboard
NetworkGraphicsDemo.xcodeproj
NetworkGraphicsDemo
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
BinaryData.cppBinaryData.hJuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cpp
NetworkGraphicsDemo.jucerREADME.txtSource
Projucer
Builds
LinuxMakefile
MacOSX
VisualStudio2015
VisualStudio2017
VisualStudio2019
JuceLibraryCode
BinaryData.cppBinaryData.hJuceHeader.hReadMe.txtinclude_juce_build_tools.cppinclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mm
Projucer.jucerSource
Application
StartPage
jucer_ContentComponents.hjucer_NewProjectTemplates.hjucer_NewProjectWizard.cppjucer_NewProjectWizard.hjucer_StartPageComponent.cppjucer_StartPageComponent.hjucer_StartPageTreeHolder.h
UserAccount
Windows
jucer_AboutWindowComponent.hjucer_EditorColourSchemeWindowComponent.hjucer_FloatingToolWindow.hjucer_GlobalPathsWindowComponent.hjucer_PIPCreatorWindowComponent.hjucer_SVGPathDataWindowComponent.hjucer_TranslationToolWindowComponent.hjucer_UTF8WindowComponent.h
jucer_Application.cppjucer_Application.hjucer_AutoUpdater.cppjucer_AutoUpdater.hjucer_CommandIDs.hjucer_CommandLine.cppjucer_CommandLine.hjucer_CommonHeaders.hjucer_Headers.hjucer_Main.cppjucer_MainWindow.cppjucer_MainWindow.hBinaryData
Icons
background_logo.svgexport_android.svgexport_clion.svgexport_codeBlocks.svgexport_linux.svgexport_visualStudio.svgexport_xcode.svggpl_logo.svgjuce_icon.pngwizard_AnimatedApp.svgwizard_AudioApp.svgwizard_AudioPlugin.svgwizard_ConsoleApp.svgwizard_DLL.svgwizard_GUI.svgwizard_Highlight.svgwizard_OpenGL.svgwizard_Openfile.svgwizard_StaticLibrary.svg
Templates
jucer_AnimatedComponentSimpleTemplate.hjucer_AnimatedComponentTemplate.cppjucer_AnimatedComponentTemplate.hjucer_AudioComponentSimpleTemplate.hjucer_AudioComponentTemplate.cppjucer_AudioComponentTemplate.hjucer_AudioPluginEditorTemplate.cppjucer_AudioPluginEditorTemplate.hjucer_AudioPluginFilterTemplate.cppjucer_AudioPluginFilterTemplate.hjucer_ComponentTemplate.cppjucer_ComponentTemplate.hjucer_ContentCompSimpleTemplate.hjucer_ContentCompTemplate.cppjucer_ContentCompTemplate.hjucer_InlineComponentTemplate.hjucer_MainConsoleAppTemplate.cppjucer_MainTemplate_NoWindow.cppjucer_MainTemplate_Window.cppjucer_NewComponentTemplate.cppjucer_NewComponentTemplate.hjucer_NewCppFileTemplate.cppjucer_NewCppFileTemplate.hjucer_NewInlineComponentTemplate.hjucer_OpenGLComponentSimpleTemplate.hjucer_OpenGLComponentTemplate.cppjucer_OpenGLComponentTemplate.hjucer_PIPAudioProcessorTemplate.hjucer_PIPTemplate.h
colourscheme_dark.xmlcolourscheme_light.xmlgradle
CodeEditor
jucer_DocumentEditorComponent.cppjucer_DocumentEditorComponent.hjucer_ItemPreviewComponent.hjucer_OpenDocumentManager.cppjucer_OpenDocumentManager.hjucer_SourceCodeEditor.cppjucer_SourceCodeEditor.h
ComponentEditor
Components
jucer_ButtonHandler.hjucer_ComboBoxHandler.hjucer_ComponentNameProperty.hjucer_ComponentTypeHandler.cppjucer_ComponentTypeHandler.hjucer_ComponentUndoableAction.hjucer_GenericComponentHandler.hjucer_GroupComponentHandler.hjucer_HyperlinkButtonHandler.hjucer_ImageButtonHandler.hjucer_JucerComponentHandler.hjucer_LabelHandler.hjucer_SliderHandler.hjucer_TabbedComponentHandler.hjucer_TextButtonHandler.hjucer_TextEditorHandler.hjucer_ToggleButtonHandler.hjucer_TreeViewHandler.hjucer_ViewportHandler.h
Documents
PaintElements
jucer_ColouredElement.cppjucer_ColouredElement.hjucer_ElementSiblingComponent.hjucer_FillType.hjucer_GradientPointComponent.hjucer_ImageResourceProperty.hjucer_PaintElement.cppjucer_PaintElement.hjucer_PaintElementEllipse.hjucer_PaintElementGroup.cppjucer_PaintElementGroup.hjucer_PaintElementImage.cppjucer_PaintElementImage.hjucer_PaintElementPath.cppjucer_PaintElementPath.hjucer_PaintElementRectangle.hjucer_PaintElementRoundedRectangle.hjucer_PaintElementText.hjucer_PaintElementUndoableAction.hjucer_PointComponent.hjucer_StrokeType.h
Properties
jucer_ColourPropertyComponent.hjucer_ComponentBooleanProperty.hjucer_ComponentChoiceProperty.hjucer_ComponentColourProperty.hjucer_ComponentTextProperty.hjucer_FilePropertyComponent.hjucer_FontPropertyComponent.hjucer_JustificationProperty.hjucer_PositionPropertyBase.h
UI
jucer_ComponentLayoutEditor.cppjucer_ComponentLayoutEditor.hjucer_ComponentLayoutPanel.hjucer_ComponentOverlayComponent.cppjucer_ComponentOverlayComponent.hjucer_EditingPanelBase.cppjucer_EditingPanelBase.hjucer_JucerCommandIDs.hjucer_JucerDocumentEditor.cppjucer_JucerDocumentEditor.hjucer_PaintRoutineEditor.cppjucer_PaintRoutineEditor.hjucer_PaintRoutinePanel.cppjucer_PaintRoutinePanel.hjucer_RelativePositionedRectangle.hjucer_ResourceEditorPanel.cppjucer_ResourceEditorPanel.hjucer_SnapGridPainter.hjucer_TestComponent.cppjucer_TestComponent.h
jucer_BinaryResources.cppjucer_BinaryResources.hjucer_ComponentLayout.cppjucer_ComponentLayout.hjucer_GeneratedCode.cppjucer_GeneratedCode.hjucer_JucerDocument.cppjucer_JucerDocument.hjucer_ObjectTypes.cppjucer_ObjectTypes.hjucer_PaintRoutine.cppjucer_PaintRoutine.hjucer_UtilityFunctions.hLicenses
LiveBuildEngine
Project
Modules
UI
Sidebar
jucer_ExporterTreeItems.hjucer_FileTreeItems.hjucer_ModuleTreeItems.hjucer_ProjectTreeItemBase.hjucer_Sidebar.hjucer_TreeItemTypes.h
jucer_ContentViewComponent.hjucer_ContentViewComponents.hjucer_FileGroupInformationComponent.hjucer_HeaderComponent.cppjucer_HeaderComponent.hjucer_ModulesInformationComponent.hjucer_ProjectContentComponent.cppjucer_ProjectContentComponent.hjucer_ProjectMessagesComponent.hjucer_UserAvatarComponent.hProjectSaving
jucer_ProjectExport_Android.hjucer_ProjectExport_CLion.hjucer_ProjectExport_CodeBlocks.hjucer_ProjectExport_MSVC.hjucer_ProjectExport_Make.hjucer_ProjectExport_Xcode.hjucer_ProjectExporter.cppjucer_ProjectExporter.hjucer_ProjectSaver.cppjucer_ProjectSaver.hjucer_ResourceFile.cppjucer_ResourceFile.hjucer_XcodeProjectParser.h
Settings
jucer_AppearanceSettings.cppjucer_AppearanceSettings.hjucer_StoredSettings.cppjucer_StoredSettings.h
Utility
Helpers
jucer_CodeHelpers.cppjucer_CodeHelpers.hjucer_Colours.hjucer_FileHelpers.cppjucer_FileHelpers.hjucer_MiscUtilities.cppjucer_MiscUtilities.hjucer_NewFileWizard.cppjucer_NewFileWizard.hjucer_PresetIDs.hjucer_TranslationHelpers.hjucer_ValueSourceHelpers.hjucer_ValueWithDefaultWrapper.hjucer_VersionInfo.cppjucer_VersionInfo.h
PIPs
UI
PropertyComponents
jucer_ColourPropertyComponent.hjucer_FilePathPropertyComponent.hjucer_LabelPropertyComponent.hjucer_PropertyComponentsWithEnablement.h
jucer_IconButton.hjucer_Icons.cppjucer_Icons.hjucer_JucerTreeViewBase.cppjucer_JucerTreeViewBase.hjucer_ProjucerLookAndFeel.cppjucer_ProjucerLookAndFeel.hjucer_SlidingPanelComponent.cppjucer_SlidingPanelComponent.hUnitTestRunner
Builds
LinuxMakefile
MacOSX
VisualStudio2017
UnitTestRunner.slnUnitTestRunner_ConsoleApp.vcxprojUnitTestRunner_ConsoleApp.vcxproj.filtersresources.rc
VisualStudio2019
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_analytics.cppinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cppinclude_juce_product_unlocking.cppinclude_juce_product_unlocking.mminclude_juce_video.cppinclude_juce_video.mm
Source
UnitTestRunner.jucerWindowsDLL
Builds
VisualStudio2019
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_video.cppinclude_juce_video.mm
WindowsDLL.jucermodules
CMakeLists.txtjuce_android_Audio.cppjuce_android_HighPerformanceAudioHelpers.hjuce_android_Midi.cppjuce_android_Oboe.cppjuce_android_OpenSL.cppjuce_ios_Audio.cppjuce_ios_Audio.hjuce_linux_ALSA.cppjuce_linux_Bela.cppjuce_linux_JackAudio.cppjuce_linux_Midi.cppjuce_mac_CoreAudio.cppjuce_mac_CoreMidi.mmjuce_win32_ASIO.cppjuce_win32_DirectSound.cppjuce_win32_Midi.cppjuce_win32_WASAPI.cppAUResources.rjuce_audio_processors.cppjuce_audio_processors.hjuce_audio_processors.mmjuce_MultiTouchMapper.hjuce_ScopedDPIAwarenessDisabler.hjuce_android_ContentSharer.cppjuce_android_FileChooser.cppjuce_android_Windowing.cppjuce_common_MimeTypes.cppjuce_ios_ContentSharer.cppjuce_ios_FileChooser.mmjuce_ios_UIViewComponentPeer.mmjuce_ios_Windowing.mmjuce_linux_FileChooser.cppjuce_linux_Windowing.cppjuce_mac_FileChooser.mmjuce_mac_MainMenu.mmjuce_mac_MouseCursor.mmjuce_mac_NSViewComponentPeer.mmjuce_mac_Windowing.mmjuce_win32_DragAndDrop.cppjuce_win32_FileChooser.cppjuce_win32_ScopedThreadDPIAwarenessSetter.hjuce_win32_Windowing.cppjuce_OpenGLExtensions.hjuce_OpenGL_android.hjuce_OpenGL_ios.hjuce_OpenGL_linux_X11.hjuce_OpenGL_osx.hjuce_OpenGL_win32.h
juce_analytics
juce_audio_basics
audio_play_head
buffers
juce_AudioChannelSet.cppjuce_AudioChannelSet.hjuce_AudioDataConverters.cppjuce_AudioDataConverters.hjuce_AudioProcessLoadMeasurer.cppjuce_AudioProcessLoadMeasurer.hjuce_AudioSampleBuffer.hjuce_FloatVectorOperations.cppjuce_FloatVectorOperations.h
juce_audio_basics.cppjuce_audio_basics.hjuce_audio_basics.mmmidi
juce_MidiBuffer.cppjuce_MidiBuffer.hjuce_MidiDataConcatenator.hjuce_MidiFile.cppjuce_MidiFile.hjuce_MidiKeyboardState.cppjuce_MidiKeyboardState.hjuce_MidiMessage.cppjuce_MidiMessage.hjuce_MidiMessageSequence.cppjuce_MidiMessageSequence.hjuce_MidiRPN.cppjuce_MidiRPN.h
ump
juce_UMP.hjuce_UMPConversion.hjuce_UMPConverters.hjuce_UMPDispatcher.hjuce_UMPFactory.hjuce_UMPIterator.hjuce_UMPMidi1ToBytestreamTranslator.hjuce_UMPMidi1ToMidi2DefaultTranslator.cppjuce_UMPMidi1ToMidi2DefaultTranslator.hjuce_UMPProtocols.hjuce_UMPReceiver.hjuce_UMPSysEx7.cppjuce_UMPSysEx7.hjuce_UMPTests.cppjuce_UMPUtils.cppjuce_UMPUtils.hjuce_UMPView.cppjuce_UMPView.hjuce_UMPacket.hjuce_UMPackets.h
mpe
juce_MPEInstrument.cppjuce_MPEInstrument.cpp.origjuce_MPEInstrument.hjuce_MPEInstrument.h.origjuce_MPEMessages.cppjuce_MPEMessages.hjuce_MPENote.cppjuce_MPENote.hjuce_MPESynthesiser.cppjuce_MPESynthesiser.hjuce_MPESynthesiserBase.cppjuce_MPESynthesiserBase.hjuce_MPESynthesiserVoice.cppjuce_MPESynthesiserVoice.hjuce_MPEUtils.cppjuce_MPEUtils.hjuce_MPEValue.cppjuce_MPEValue.hjuce_MPEZoneLayout.cppjuce_MPEZoneLayout.h
native
sources
juce_AudioSource.hjuce_BufferingAudioSource.cppjuce_BufferingAudioSource.hjuce_ChannelRemappingAudioSource.cppjuce_ChannelRemappingAudioSource.hjuce_IIRFilterAudioSource.cppjuce_IIRFilterAudioSource.hjuce_MemoryAudioSource.cppjuce_MemoryAudioSource.hjuce_MixerAudioSource.cppjuce_MixerAudioSource.hjuce_PositionableAudioSource.hjuce_ResamplingAudioSource.cppjuce_ResamplingAudioSource.hjuce_ReverbAudioSource.cppjuce_ReverbAudioSource.hjuce_ToneGeneratorAudioSource.cppjuce_ToneGeneratorAudioSource.h
synthesisers
utilities
juce_audio_devices
audio_io
juce_AudioDeviceManager.cppjuce_AudioDeviceManager.hjuce_AudioIODevice.cppjuce_AudioIODevice.hjuce_AudioIODeviceType.cppjuce_AudioIODeviceType.hjuce_SystemAudioVolume.h
juce_audio_devices.cppjuce_audio_devices.hjuce_audio_devices.mmmidi_io
native
java
app
com
rmsl
oboe
CMakeLists.txtLICENSEREADME.md
include
oboe
src
aaudio
common
AudioClock.hAudioSourceCaller.cppAudioSourceCaller.hAudioStream.cppAudioStreamBuilder.cppDataConversionFlowGraph.cppDataConversionFlowGraph.hFilterAudioStream.cppFilterAudioStream.hFixedBlockAdapter.cppFixedBlockAdapter.hFixedBlockReader.cppFixedBlockReader.hFixedBlockWriter.cppFixedBlockWriter.hLatencyTuner.cppMonotonicCounter.hOboeDebug.hQuirksManager.cppQuirksManager.hSourceFloatCaller.cppSourceFloatCaller.hSourceI16Caller.cppSourceI16Caller.hSourceI24Caller.cppSourceI24Caller.hSourceI32Caller.cppSourceI32Caller.hStabilizedCallback.cppTrace.cppTrace.hUtilities.cppVersion.cpp
fifo
FifoBuffer.cppFifoBuffer.hFifoController.cppFifoController.hFifoControllerBase.cppFifoControllerBase.hFifoControllerIndirect.cppFifoControllerIndirect.h
flowgraph
ChannelCountConverter.cppChannelCountConverter.hClipToRange.cppClipToRange.hFlowGraphNode.cppFlowGraphNode.hFlowgraphUtilities.hManyToMultiConverter.cppManyToMultiConverter.hMonoToMultiConverter.cppMonoToMultiConverter.hMultiToMonoConverter.cppMultiToMonoConverter.hRampLinear.cppRampLinear.hSampleRateConverter.cppSampleRateConverter.hSinkFloat.cppSinkFloat.hSinkI16.cppSinkI16.hSinkI24.cppSinkI24.hSinkI32.cppSinkI32.hSourceFloat.cppSourceFloat.hSourceI16.cppSourceI16.hSourceI24.cppSourceI24.hSourceI32.cppSourceI32.h
resampler
HyperbolicCosineWindow.hIntegerRatio.cppIntegerRatio.hKaiserWindow.hLinearResampler.cppLinearResampler.hMultiChannelResampler.cppMultiChannelResampler.hPolyphaseResampler.cppPolyphaseResampler.hPolyphaseResamplerMono.cppPolyphaseResamplerMono.hPolyphaseResamplerStereo.cppPolyphaseResamplerStereo.hSincResampler.cppSincResampler.hSincResamplerStereo.cppSincResamplerStereo.h
opensles
AudioInputStreamOpenSLES.cppAudioInputStreamOpenSLES.hAudioOutputStreamOpenSLES.cppAudioOutputStreamOpenSLES.hAudioStreamBuffered.cppAudioStreamBuffered.hAudioStreamOpenSLES.cppAudioStreamOpenSLES.hEngineOpenSLES.cppEngineOpenSLES.hOpenSLESUtilities.cppOpenSLESUtilities.hOutputMixerOpenSLES.cppOutputMixerOpenSLES.h
sources
juce_audio_formats
codecs
flac
Flac Licence.txtall.halloc.hassert.hcallback.hcompat.hendswap.hexport.hformat.h
juce_AiffAudioFormat.cppjuce_AiffAudioFormat.hjuce_CoreAudioFormat.cppjuce_CoreAudioFormat.hjuce_FlacAudioFormat.cppjuce_FlacAudioFormat.hjuce_LAMEEncoderAudioFormat.cppjuce_LAMEEncoderAudioFormat.hjuce_MP3AudioFormat.cppjuce_MP3AudioFormat.hjuce_OggVorbisAudioFormat.cppjuce_OggVorbisAudioFormat.hjuce_WavAudioFormat.cppjuce_WavAudioFormat.hjuce_WindowsMediaAudioFormat.cppjuce_WindowsMediaAudioFormat.hlibFLAC
bitmath.cbitreader.cbitwriter.ccpu.ccrc.cfixed.cfloat.cformat.clpc_flac.cmd5.cmemory.cstream_decoder.cstream_encoder.cstream_encoder_framing.cwindow_flac.c
metadata.hordinals.hstream_decoder.hstream_encoder.hwin_utf8_io.hinclude
private
all.hbitmath.hbitreader.hbitwriter.hcpu.hcrc.hfixed.hfloat.hformat.hlpc.hmd5.hmemory.hmetadata.hstream_encoder.hstream_encoder_framing.hwindow.h
protected
oggvorbis
Ogg Vorbis Licence.txtbitwise.ccodec.hconfig_types.hcrctable.hframing.c
libvorbis-1.3.7
AUTHORSCHANGESCOPYINGREADME.md
ogg.hos_types.hvorbisenc.hvorbisfile.hlib
analysis.cbackends.hbitrate.cbitrate.hblock.c
books
codebook.ccodebook.hcodec_internal.henvelope.cenvelope.hfloor0.cfloor1.chighlevel.hinfo.clookup.clookup.hlookup_data.hlpc.clpc.hlsp.clsp.hmapping0.cmasking.hmdct.cmdct.hmisc.cmisc.hmodes
floor_all.hpsych_11.hpsych_16.hpsych_44.hpsych_8.hresidue_16.hresidue_44.hresidue_44p51.hresidue_44u.hresidue_8.hsetup_11.hsetup_16.hsetup_22.hsetup_32.hsetup_44.hsetup_44p51.hsetup_44u.hsetup_8.hsetup_X.h
os.hpsy.cpsy.hregistry.cregistry.hres0.cscales.hsharedbook.csmallft.csmallft.hsynthesis.cvorbisenc.cvorbisfile.cwindow.cwindow.hformat
juce_AudioFormat.cppjuce_AudioFormat.hjuce_AudioFormatManager.cppjuce_AudioFormatManager.hjuce_AudioFormatReader.cppjuce_AudioFormatReader.hjuce_AudioFormatReaderSource.cppjuce_AudioFormatReaderSource.hjuce_AudioFormatWriter.cppjuce_AudioFormatWriter.hjuce_AudioSubsectionReader.cppjuce_AudioSubsectionReader.hjuce_BufferingAudioFormatReader.cppjuce_BufferingAudioFormatReader.hjuce_MemoryMappedAudioFormatReader.h
juce_audio_formats.cppjuce_audio_formats.hjuce_audio_formats.mmsampler
juce_audio_plugin_client
AAX
AU
CoreAudioUtilityClasses
AUBase.cppAUBase.hAUBaseHelper.hAUBuffer.cppAUBuffer.hAUCarbonViewBase.cppAUCarbonViewBase.hAUCarbonViewControl.cppAUCarbonViewControl.hAUCarbonViewDispatch.cppAUDispatch.cppAUDispatch.hAUInputElement.cppAUInputElement.hAUInputFormatConverter.hAUMIDIBase.cppAUMIDIBase.hAUOutputBase.cppAUOutputBase.hAUOutputElement.cppAUOutputElement.hAUPlugInDispatch.cppAUPlugInDispatch.hAUScopeElement.cppAUScopeElement.hAUSilentTimeout.hAUTimestampGenerator.hAUViewLocalizedStringKeys.hCAAUParameter.cppCAAUParameter.hCAAtomic.hCAAtomicStack.hCAAudioChannelLayout.cppCAAudioChannelLayout.hCAAutoDisposer.hCADebugMacros.hCADebugPrintf.hCAException.hCAHostTimeBase.hCAMath.hCAMutex.cppCAMutex.hCAReferenceCounted.hCAStreamBasicDescription.cppCAStreamBasicDescription.hCAThreadSafeList.hCAVectorUnit.cppCAVectorUnit.hCAVectorUnitTypes.hCAXException.hCarbonEventHandler.cppCarbonEventHandler.hComponentBase.cppComponentBase.hMusicDeviceBase.cppMusicDeviceBase.h
juce_AU_Wrapper.mmjuce_AUv3_Wrapper.mmRTAS
juce_RTAS_DigiCode1.cppjuce_RTAS_DigiCode2.cppjuce_RTAS_DigiCode3.cppjuce_RTAS_DigiCode_Header.hjuce_RTAS_MacUtilities.mmjuce_RTAS_WinExports.defjuce_RTAS_WinResources.rsrjuce_RTAS_WinUtilities.cppjuce_RTAS_Wrapper.cpp
Standalone
Unity
VST
VST3
juce_audio_plugin_client.hjuce_audio_plugin_client_AAX.cppjuce_audio_plugin_client_AAX.mmjuce_audio_plugin_client_AU.rjuce_audio_plugin_client_AU_1.mmjuce_audio_plugin_client_AU_2.mmjuce_audio_plugin_client_AUv3.mmjuce_audio_plugin_client_RTAS.rjuce_audio_plugin_client_RTAS_1.cppjuce_audio_plugin_client_RTAS_2.cppjuce_audio_plugin_client_RTAS_3.cppjuce_audio_plugin_client_RTAS_4.cppjuce_audio_plugin_client_RTAS_utils.cppjuce_audio_plugin_client_RTAS_utils.mmjuce_audio_plugin_client_Standalone.cppjuce_audio_plugin_client_Unity.cppjuce_audio_plugin_client_VST2.cppjuce_audio_plugin_client_VST3.cppjuce_audio_plugin_client_VST_utils.mmjuce_audio_plugin_client_utils.cpputility
juce_audio_processors
format
juce_AudioPluginFormat.cppjuce_AudioPluginFormat.hjuce_AudioPluginFormatManager.cppjuce_AudioPluginFormatManager.h
format_types
VST3_SDK
JUCE_README.mdLICENSE.txtREADME.mdVST3_License_Agreement.pdfVST3_Usage_Guidelines.pdf
juce_AU_Shared.hjuce_AudioUnitPluginFormat.hjuce_AudioUnitPluginFormat.mmjuce_LADSPAPluginFormat.cppjuce_LADSPAPluginFormat.hjuce_LegacyAudioParameter.cppjuce_VST3Common.hjuce_VST3Headers.hjuce_VST3PluginFormat.cppjuce_VST3PluginFormat.hjuce_VSTCommon.hjuce_VSTMidiEventList.hjuce_VSTPluginFormat.cppjuce_VSTPluginFormat.hbase
LICENSE.txtREADME.md
source
baseiids.cppclassfactoryhelpers.hfbuffer.cppfbuffer.hfdebug.cppfdebug.hfobject.cppfobject.hfstreamer.cppfstreamer.hfstring.cppfstring.hupdatehandler.cppupdatehandler.h
thread
pluginterfaces
LICENSE.txtREADME.md
base
conststringtable.cppconststringtable.hcoreiids.cppfalignpop.hfalignpush.hfplatform.hfstrdefs.hftypes.hfunknown.cppfunknown.hfutils.hfvariant.hibstream.hicloneable.hipersistent.hipluginbase.histringresult.hiupdatehandler.hsmartpointer.htypesizecheck.hustring.cppustring.h
gui
vst
ivstattributes.hivstaudioprocessor.hivstautomationstate.hivstchannelcontextinfo.hivstcomponent.hivstcontextmenu.hivsteditcontroller.hivstevents.hivsthostapplication.hivstinterappaudio.hivstmessage.hivstmidicontrollers.hivstmidilearn.hivstnoteexpression.hivstparameterchanges.hivstparameterfunctionname.hivstphysicalui.hivstpluginterfacesupport.hivstplugview.hivstprefetchablesupport.hivstprocesscontext.hivstrepresentation.hivsttestplugprovider.hivstunits.hvstpshpack4.hvstspeaker.hvsttypes.h
public.sdk
processors
juce_AudioPluginInstance.cppjuce_AudioPluginInstance.hjuce_AudioProcessor.cppjuce_AudioProcessor.hjuce_AudioProcessorEditor.cppjuce_AudioProcessorEditor.hjuce_AudioProcessorEditorHostContext.hjuce_AudioProcessorGraph.cppjuce_AudioProcessorGraph.hjuce_AudioProcessorListener.hjuce_AudioProcessorParameter.hjuce_AudioProcessorParameterGroup.cppjuce_AudioProcessorParameterGroup.hjuce_GenericAudioProcessorEditor.cppjuce_GenericAudioProcessorEditor.hjuce_PluginDescription.cppjuce_PluginDescription.h
scanning
juce_KnownPluginList.cppjuce_KnownPluginList.hjuce_PluginDirectoryScanner.cppjuce_PluginDirectoryScanner.hjuce_PluginListComponent.cppjuce_PluginListComponent.h
utilities
juce_AudioParameterBool.cppjuce_AudioParameterBool.hjuce_AudioParameterChoice.cppjuce_AudioParameterChoice.hjuce_AudioParameterFloat.cppjuce_AudioParameterFloat.hjuce_AudioParameterInt.cppjuce_AudioParameterInt.hjuce_AudioProcessorParameterWithID.cppjuce_AudioProcessorParameterWithID.hjuce_AudioProcessorValueTreeState.cppjuce_AudioProcessorValueTreeState.hjuce_ExtensionsVisitor.hjuce_ParameterAttachments.cppjuce_ParameterAttachments.hjuce_PluginHostType.cppjuce_PluginHostType.hjuce_RangedAudioParameter.cppjuce_RangedAudioParameter.hjuce_VST3ClientExtensions.hjuce_VSTCallbackHandler.h
juce_audio_utils
audio_cd
gui
juce_AudioAppComponent.cppjuce_AudioAppComponent.hjuce_AudioDeviceSelectorComponent.cppjuce_AudioDeviceSelectorComponent.hjuce_AudioThumbnail.cppjuce_AudioThumbnail.hjuce_AudioThumbnailBase.hjuce_AudioThumbnailCache.cppjuce_AudioThumbnailCache.hjuce_AudioVisualiserComponent.cppjuce_AudioVisualiserComponent.hjuce_BluetoothMidiDevicePairingDialogue.hjuce_MidiKeyboardComponent.cppjuce_MidiKeyboardComponent.h
juce_audio_utils.cppjuce_audio_utils.hjuce_audio_utils.mmnative
juce_android_BluetoothMidiDevicePairingDialogue.cppjuce_ios_BluetoothMidiDevicePairingDialogue.mmjuce_linux_AudioCDReader.cppjuce_linux_BluetoothMidiDevicePairingDialogue.cppjuce_mac_AudioCDBurner.mmjuce_mac_AudioCDReader.mmjuce_mac_BluetoothMidiDevicePairingDialogue.mmjuce_win32_AudioCDBurner.cppjuce_win32_AudioCDReader.cppjuce_win_BluetoothMidiDevicePairingDialogue.cpp
players
juce_box2d
box2d
Box2D.hREADME.txt
juce_box2d.cppjuce_box2d.hCollision
Shapes
b2ChainShape.cppb2ChainShape.hb2CircleShape.cppb2CircleShape.hb2EdgeShape.cppb2EdgeShape.hb2PolygonShape.cppb2PolygonShape.hb2Shape.h
b2BroadPhase.cppb2BroadPhase.hb2CollideCircle.cppb2CollideEdge.cppb2CollidePolygon.cppb2Collision.cppb2Collision.hb2Distance.cppb2Distance.hb2DynamicTree.cppb2DynamicTree.hb2TimeOfImpact.cppb2TimeOfImpact.hCommon
b2BlockAllocator.cppb2BlockAllocator.hb2Draw.cppb2Draw.hb2GrowableStack.hb2Math.cppb2Math.hb2Settings.cppb2Settings.hb2StackAllocator.cppb2StackAllocator.hb2Timer.cppb2Timer.h
Dynamics
Contacts
b2ChainAndCircleContact.cppb2ChainAndCircleContact.hb2ChainAndPolygonContact.cppb2ChainAndPolygonContact.hb2CircleContact.cppb2CircleContact.hb2Contact.cppb2Contact.hb2ContactSolver.cppb2ContactSolver.hb2EdgeAndCircleContact.cppb2EdgeAndCircleContact.hb2EdgeAndPolygonContact.cppb2EdgeAndPolygonContact.hb2PolygonAndCircleContact.cppb2PolygonAndCircleContact.hb2PolygonContact.cppb2PolygonContact.h
Joints
b2DistanceJoint.cppb2DistanceJoint.hb2FrictionJoint.cppb2FrictionJoint.hb2GearJoint.cppb2GearJoint.hb2Joint.cppb2Joint.hb2MouseJoint.cppb2MouseJoint.hb2PrismaticJoint.cppb2PrismaticJoint.hb2PulleyJoint.cppb2PulleyJoint.hb2RevoluteJoint.cppb2RevoluteJoint.hb2RopeJoint.cppb2RopeJoint.hb2WeldJoint.cppb2WeldJoint.hb2WheelJoint.cppb2WheelJoint.h
b2Body.cppb2Body.hb2ContactManager.cppb2ContactManager.hb2Fixture.cppb2Fixture.hb2Island.cppb2Island.hb2TimeStep.hb2World.cppb2World.hb2WorldCallbacks.cppb2WorldCallbacks.hRope
utils
juce_core
containers
juce_AbstractFifo.cppjuce_AbstractFifo.hjuce_Array.hjuce_ArrayAllocationBase.hjuce_ArrayBase.cppjuce_ArrayBase.hjuce_DynamicObject.cppjuce_DynamicObject.hjuce_ElementComparator.hjuce_HashMap.hjuce_HashMap_test.cppjuce_LinkedListPointer.hjuce_ListenerList.hjuce_NamedValueSet.cppjuce_NamedValueSet.hjuce_OwnedArray.cppjuce_OwnedArray.hjuce_PropertySet.cppjuce_PropertySet.hjuce_ReferenceCountedArray.cppjuce_ReferenceCountedArray.hjuce_ScopedValueSetter.hjuce_SingleThreadedAbstractFifo.hjuce_SortedSet.hjuce_SparseSet.cppjuce_SparseSet.hjuce_Variant.cppjuce_Variant.h
files
juce_DirectoryIterator.cppjuce_DirectoryIterator.hjuce_File.cppjuce_File.hjuce_FileFilter.cppjuce_FileFilter.hjuce_FileInputStream.cppjuce_FileInputStream.hjuce_FileOutputStream.cppjuce_FileOutputStream.hjuce_FileSearchPath.cppjuce_FileSearchPath.hjuce_MemoryMappedFile.hjuce_RangedDirectoryIterator.cppjuce_RangedDirectoryIterator.hjuce_TemporaryFile.cppjuce_TemporaryFile.hjuce_WildcardFileFilter.cppjuce_WildcardFileFilter.h
javascript
juce_core.cppjuce_core.hjuce_core.mmlogging
maths
juce_BigInteger.cppjuce_BigInteger.hjuce_Expression.cppjuce_Expression.hjuce_MathsFunctions.hjuce_NormalisableRange.hjuce_Random.cppjuce_Random.hjuce_Range.hjuce_StatisticsAccumulator.h
memory
juce_AllocationHooks.cppjuce_AllocationHooks.hjuce_Atomic.hjuce_ByteOrder.hjuce_ContainerDeletePolicy.hjuce_HeapBlock.hjuce_HeavyweightLeakedObjectDetector.hjuce_LeakedObjectDetector.hjuce_Memory.hjuce_MemoryBlock.cppjuce_MemoryBlock.hjuce_OptionalScopedPointer.hjuce_ReferenceCountedObject.hjuce_Reservoir.hjuce_ScopedPointer.hjuce_SharedResourcePointer.hjuce_Singleton.hjuce_WeakReference.h
misc
juce_ConsoleApplication.cppjuce_ConsoleApplication.hjuce_Functional.hjuce_Result.cppjuce_Result.hjuce_RuntimePermissions.cppjuce_RuntimePermissions.hjuce_Uuid.cppjuce_Uuid.hjuce_WindowsRegistry.h
native
java
javacore
juce_BasicNativeHeaders.hjuce_android_Files.cppjuce_android_JNIHelpers.cppjuce_android_JNIHelpers.hjuce_android_Misc.cppjuce_android_Network.cppjuce_android_RuntimePermissions.cppjuce_android_SystemStats.cppjuce_android_Threads.cppjuce_curl_Network.cppjuce_intel_SharedCode.hjuce_linux_CommonFile.cppjuce_linux_Files.cppjuce_linux_Network.cppjuce_linux_SystemStats.cppjuce_linux_Threads.cppjuce_mac_CFHelpers.hjuce_mac_Files.mmjuce_mac_Network.mmjuce_mac_ObjCHelpers.hjuce_mac_Strings.mmjuce_mac_SystemStats.mmjuce_mac_Threads.mmjuce_posix_IPAddress.hjuce_posix_NamedPipe.cppjuce_posix_SharedCode.hjuce_wasm_SystemStats.cppjuce_win32_ComSmartPtr.hjuce_win32_Files.cppjuce_win32_Network.cppjuce_win32_Registry.cppjuce_win32_SystemStats.cppjuce_win32_Threads.cppnetwork
juce_IPAddress.cppjuce_IPAddress.hjuce_MACAddress.cppjuce_MACAddress.hjuce_NamedPipe.cppjuce_NamedPipe.hjuce_Socket.cppjuce_Socket.hjuce_URL.cppjuce_URL.hjuce_WebInputStream.cppjuce_WebInputStream.h
streams
juce_BufferedInputStream.cppjuce_BufferedInputStream.hjuce_FileInputSource.cppjuce_FileInputSource.hjuce_InputSource.hjuce_InputStream.cppjuce_InputStream.hjuce_MemoryInputStream.cppjuce_MemoryInputStream.hjuce_MemoryOutputStream.cppjuce_MemoryOutputStream.hjuce_OutputStream.cppjuce_OutputStream.hjuce_SubregionStream.cppjuce_SubregionStream.hjuce_URLInputSource.cppjuce_URLInputSource.h
system
juce_CompilerSupport.hjuce_CompilerWarnings.hjuce_PlatformDefs.hjuce_StandardHeader.hjuce_SystemStats.cppjuce_SystemStats.hjuce_TargetPlatform.h
text
juce_Base64.cppjuce_Base64.hjuce_CharPointer_ASCII.hjuce_CharPointer_UTF16.hjuce_CharPointer_UTF32.hjuce_CharPointer_UTF8.hjuce_CharacterFunctions.cppjuce_CharacterFunctions.hjuce_Identifier.cppjuce_Identifier.hjuce_LocalisedStrings.cppjuce_LocalisedStrings.hjuce_NewLine.hjuce_String.cppjuce_String.hjuce_StringArray.cppjuce_StringArray.hjuce_StringPairArray.cppjuce_StringPairArray.hjuce_StringPool.cppjuce_StringPool.hjuce_StringRef.hjuce_TextDiff.cppjuce_TextDiff.h
threads
juce_ChildProcess.cppjuce_ChildProcess.hjuce_CriticalSection.hjuce_DynamicLibrary.hjuce_HighResolutionTimer.cppjuce_HighResolutionTimer.hjuce_InterProcessLock.hjuce_Process.hjuce_ReadWriteLock.cppjuce_ReadWriteLock.hjuce_ScopedLock.hjuce_ScopedReadLock.hjuce_ScopedWriteLock.hjuce_SpinLock.hjuce_Thread.cppjuce_Thread.hjuce_ThreadLocalValue.hjuce_ThreadPool.cppjuce_ThreadPool.hjuce_TimeSliceThread.cppjuce_TimeSliceThread.hjuce_WaitableEvent.cppjuce_WaitableEvent.h
time
juce_PerformanceCounter.cppjuce_PerformanceCounter.hjuce_RelativeTime.cppjuce_RelativeTime.hjuce_Time.cppjuce_Time.h
unit_tests
xml
zip
juce_cryptography
juce_data_structures
app_properties
juce_ApplicationProperties.cppjuce_ApplicationProperties.hjuce_PropertiesFile.cppjuce_PropertiesFile.h
juce_data_structures.cppjuce_data_structures.hjuce_data_structures.mmundomanager
values
juce_dsp
containers
juce_AudioBlock.hjuce_AudioBlock_test.cppjuce_FixedSizeFunction.hjuce_FixedSizeFunction_test.cppjuce_SIMDRegister.hjuce_SIMDRegister_Impl.hjuce_SIMDRegister_test.cpp
filter_design
frequency
juce_Convolution.cppjuce_Convolution.hjuce_Convolution_test.cppjuce_FFT.cppjuce_FFT.hjuce_FFT_test.cppjuce_Windowing.cppjuce_Windowing.h
juce_dsp.cppjuce_dsp.hjuce_dsp.mmmaths
juce_FastMathApproximations.hjuce_LogRampedValue.hjuce_LogRampedValue_test.cppjuce_LookupTable.cppjuce_LookupTable.hjuce_Matrix.cppjuce_Matrix.hjuce_Matrix_test.cppjuce_Phase.hjuce_Polynomial.hjuce_SpecialFunctions.cppjuce_SpecialFunctions.h
native
juce_avx_SIMDNativeOps.cppjuce_avx_SIMDNativeOps.hjuce_fallback_SIMDNativeOps.hjuce_neon_SIMDNativeOps.cppjuce_neon_SIMDNativeOps.hjuce_sse_SIMDNativeOps.cppjuce_sse_SIMDNativeOps.h
processors
juce_BallisticsFilter.cppjuce_BallisticsFilter.hjuce_DelayLine.cppjuce_DelayLine.hjuce_DryWetMixer.cppjuce_DryWetMixer.hjuce_FIRFilter.cppjuce_FIRFilter.hjuce_FIRFilter_test.cppjuce_FirstOrderTPTFilter.cppjuce_FirstOrderTPTFilter.hjuce_IIRFilter.cppjuce_IIRFilter.hjuce_IIRFilter_Impl.hjuce_LinkwitzRileyFilter.cppjuce_LinkwitzRileyFilter.hjuce_Oversampling.cppjuce_Oversampling.hjuce_Panner.cppjuce_Panner.hjuce_ProcessContext.hjuce_ProcessorChain.hjuce_ProcessorChain_test.cppjuce_ProcessorDuplicator.hjuce_ProcessorWrapper.hjuce_StateVariableFilter.hjuce_StateVariableTPTFilter.cppjuce_StateVariableTPTFilter.h
widgets
juce_events
broadcasters
juce_ActionBroadcaster.cppjuce_ActionBroadcaster.hjuce_ActionListener.hjuce_AsyncUpdater.cppjuce_AsyncUpdater.hjuce_ChangeBroadcaster.cppjuce_ChangeBroadcaster.hjuce_ChangeListener.h
interprocess
juce_ConnectedChildProcess.cppjuce_ConnectedChildProcess.hjuce_InterprocessConnection.cppjuce_InterprocessConnection.hjuce_InterprocessConnectionServer.cppjuce_InterprocessConnectionServer.hjuce_NetworkServiceDiscovery.cppjuce_NetworkServiceDiscovery.h
juce_events.cppjuce_events.hjuce_events.mmmessages
juce_ApplicationBase.cppjuce_ApplicationBase.hjuce_CallbackMessage.hjuce_DeletedAtShutdown.cppjuce_DeletedAtShutdown.hjuce_Initialisation.hjuce_Message.hjuce_MessageListener.cppjuce_MessageListener.hjuce_MessageManager.cppjuce_MessageManager.hjuce_MountedVolumeListChangeDetector.hjuce_NotificationType.h
native
juce_ScopedLowPowerModeDisabler.cppjuce_ScopedLowPowerModeDisabler.hjuce_android_Messaging.cppjuce_ios_MessageManager.mmjuce_linux_EventLoop.hjuce_linux_Messaging.cppjuce_mac_MessageManager.mmjuce_osx_MessageQueue.hjuce_win32_HiddenMessageWindow.hjuce_win32_Messaging.cppjuce_win32_WinRTWrapper.cppjuce_win32_WinRTWrapper.h
timers
juce_graphics
colour
juce_Colour.cppjuce_Colour.hjuce_ColourGradient.cppjuce_ColourGradient.hjuce_Colours.cppjuce_Colours.hjuce_FillType.cppjuce_FillType.hjuce_PixelFormats.h
contexts
juce_GraphicsContext.cppjuce_GraphicsContext.hjuce_LowLevelGraphicsContext.hjuce_LowLevelGraphicsPostScriptRenderer.cppjuce_LowLevelGraphicsPostScriptRenderer.hjuce_LowLevelGraphicsSoftwareRenderer.cppjuce_LowLevelGraphicsSoftwareRenderer.h
effects
juce_DropShadowEffect.cppjuce_DropShadowEffect.hjuce_GlowEffect.cppjuce_GlowEffect.hjuce_ImageEffectFilter.h
fonts
juce_AttributedString.cppjuce_AttributedString.hjuce_CustomTypeface.cppjuce_CustomTypeface.hjuce_Font.cppjuce_Font.hjuce_GlyphArrangement.cppjuce_GlyphArrangement.hjuce_TextLayout.cppjuce_TextLayout.hjuce_Typeface.cppjuce_Typeface.h
geometry
juce_AffineTransform.cppjuce_AffineTransform.hjuce_BorderSize.hjuce_EdgeTable.cppjuce_EdgeTable.hjuce_Line.hjuce_Parallelogram.hjuce_Path.cppjuce_Path.hjuce_PathIterator.cppjuce_PathIterator.hjuce_PathStrokeType.cppjuce_PathStrokeType.hjuce_Point.hjuce_Rectangle.hjuce_RectangleList.h
image_formats
jpglib
READMEcderror.hchanges to libjpeg for JUCE.txtjcapimin.cjcapistd.cjccoefct.cjccolor.cjcdctmgr.cjchuff.cjchuff.hjcinit.cjcmainct.cjcmarker.cjcmaster.cjcomapi.cjconfig.hjcparam.cjcphuff.cjcprepct.cjcsample.cjctrans.cjdapimin.cjdapistd.cjdatasrc.cjdcoefct.cjdcolor.cjdct.hjddctmgr.cjdhuff.cjdhuff.hjdinput.cjdmainct.cjdmarker.cjdmaster.cjdmerge.cjdphuff.cjdpostct.cjdsample.cjdtrans.cjerror.cjerror.hjfdctflt.cjfdctfst.cjfdctint.cjidctflt.cjidctfst.cjidctint.cjidctred.cjinclude.hjmemmgr.cjmemnobs.cjmemsys.hjmorecfg.hjpegint.hjpeglib.hjquant1.cjquant2.cjutils.cjversion.htransupp.ctransupp.h
juce_GIFLoader.cppjuce_JPEGLoader.cppjuce_PNGLoader.cpppnglib
images
juce_Image.cppjuce_Image.hjuce_ImageCache.cppjuce_ImageCache.hjuce_ImageConvolutionKernel.cppjuce_ImageConvolutionKernel.hjuce_ImageFileFormat.cppjuce_ImageFileFormat.h
juce_graphics.cppjuce_graphics.hjuce_graphics.mmnative
juce_RenderingHelpers.hjuce_android_Fonts.cppjuce_android_GraphicsContext.cppjuce_android_IconHelpers.cppjuce_freetype_Fonts.cppjuce_linux_Fonts.cppjuce_linux_IconHelpers.cppjuce_mac_CoreGraphicsContext.hjuce_mac_CoreGraphicsContext.mmjuce_mac_CoreGraphicsHelpers.hjuce_mac_Fonts.mmjuce_mac_IconHelpers.cppjuce_win32_Direct2DGraphicsContext.cppjuce_win32_Direct2DGraphicsContext.hjuce_win32_DirectWriteTypeLayout.cppjuce_win32_DirectWriteTypeface.cppjuce_win32_Fonts.cppjuce_win32_IconHelpers.cpp
placement
juce_gui_basics
accessibility
enums
interfaces
juce_AccessibilityCellInterface.hjuce_AccessibilityTableInterface.hjuce_AccessibilityTextInterface.hjuce_AccessibilityValueInterface.h
juce_AccessibilityHandler.cppjuce_AccessibilityHandler.hjuce_AccessibilityState.happlication
buttons
juce_ArrowButton.cppjuce_ArrowButton.hjuce_Button.cppjuce_Button.hjuce_DrawableButton.cppjuce_DrawableButton.hjuce_HyperlinkButton.cppjuce_HyperlinkButton.hjuce_ImageButton.cppjuce_ImageButton.hjuce_ShapeButton.cppjuce_ShapeButton.hjuce_TextButton.cppjuce_TextButton.hjuce_ToggleButton.cppjuce_ToggleButton.hjuce_ToolbarButton.cppjuce_ToolbarButton.h
commands
juce_ApplicationCommandID.hjuce_ApplicationCommandInfo.cppjuce_ApplicationCommandInfo.hjuce_ApplicationCommandManager.cppjuce_ApplicationCommandManager.hjuce_ApplicationCommandTarget.cppjuce_ApplicationCommandTarget.hjuce_KeyPressMappingSet.cppjuce_KeyPressMappingSet.h
components
juce_CachedComponentImage.hjuce_Component.cppjuce_Component.hjuce_ComponentListener.cppjuce_ComponentListener.hjuce_ComponentTraverser.hjuce_FocusTraverser.cppjuce_FocusTraverser.hjuce_ModalComponentManager.cppjuce_ModalComponentManager.h
desktop
drawables
juce_Drawable.cppjuce_Drawable.hjuce_DrawableComposite.cppjuce_DrawableComposite.hjuce_DrawableImage.cppjuce_DrawableImage.hjuce_DrawablePath.cppjuce_DrawablePath.hjuce_DrawableRectangle.cppjuce_DrawableRectangle.hjuce_DrawableShape.cppjuce_DrawableShape.hjuce_DrawableText.cppjuce_DrawableText.hjuce_SVGParser.cpp
filebrowser
juce_ContentSharer.cppjuce_ContentSharer.hjuce_DirectoryContentsDisplayComponent.cppjuce_DirectoryContentsDisplayComponent.hjuce_DirectoryContentsList.cppjuce_DirectoryContentsList.hjuce_FileBrowserComponent.cppjuce_FileBrowserComponent.hjuce_FileBrowserListener.hjuce_FileChooser.cppjuce_FileChooser.hjuce_FileChooserDialogBox.cppjuce_FileChooserDialogBox.hjuce_FileListComponent.cppjuce_FileListComponent.hjuce_FilePreviewComponent.hjuce_FileSearchPathListComponent.cppjuce_FileSearchPathListComponent.hjuce_FileTreeComponent.cppjuce_FileTreeComponent.hjuce_FilenameComponent.cppjuce_FilenameComponent.hjuce_ImagePreviewComponent.cppjuce_ImagePreviewComponent.h
juce_gui_basics.cppjuce_gui_basics.hjuce_gui_basics.mmkeyboard
juce_CaretComponent.cppjuce_CaretComponent.hjuce_KeyListener.cppjuce_KeyListener.hjuce_KeyPress.cppjuce_KeyPress.hjuce_KeyboardFocusTraverser.cppjuce_KeyboardFocusTraverser.hjuce_ModifierKeys.cppjuce_ModifierKeys.hjuce_SystemClipboard.hjuce_TextEditorKeyMapper.hjuce_TextInputTarget.h
layout
juce_AnimatedPosition.hjuce_AnimatedPositionBehaviours.hjuce_ComponentAnimator.cppjuce_ComponentAnimator.hjuce_ComponentBoundsConstrainer.cppjuce_ComponentBoundsConstrainer.hjuce_ComponentBuilder.cppjuce_ComponentBuilder.hjuce_ComponentMovementWatcher.cppjuce_ComponentMovementWatcher.hjuce_ConcertinaPanel.cppjuce_ConcertinaPanel.hjuce_FlexBox.cppjuce_FlexBox.hjuce_FlexItem.hjuce_Grid.cppjuce_Grid.hjuce_GridItem.cppjuce_GridItem.hjuce_GroupComponent.cppjuce_GroupComponent.hjuce_MultiDocumentPanel.cppjuce_MultiDocumentPanel.hjuce_ResizableBorderComponent.cppjuce_ResizableBorderComponent.hjuce_ResizableCornerComponent.cppjuce_ResizableCornerComponent.hjuce_ResizableEdgeComponent.cppjuce_ResizableEdgeComponent.hjuce_ScrollBar.cppjuce_ScrollBar.hjuce_SidePanel.cppjuce_SidePanel.hjuce_StretchableLayoutManager.cppjuce_StretchableLayoutManager.hjuce_StretchableLayoutResizerBar.cppjuce_StretchableLayoutResizerBar.hjuce_StretchableObjectResizer.cppjuce_StretchableObjectResizer.hjuce_TabbedButtonBar.cppjuce_TabbedButtonBar.hjuce_TabbedComponent.cppjuce_TabbedComponent.hjuce_Viewport.cppjuce_Viewport.h
lookandfeel
juce_LookAndFeel.cppjuce_LookAndFeel.hjuce_LookAndFeel_V1.cppjuce_LookAndFeel_V1.hjuce_LookAndFeel_V2.cppjuce_LookAndFeel_V2.hjuce_LookAndFeel_V3.cppjuce_LookAndFeel_V3.hjuce_LookAndFeel_V4.cppjuce_LookAndFeel_V4.h
menus
juce_BurgerMenuComponent.cppjuce_BurgerMenuComponent.hjuce_MenuBarComponent.cppjuce_MenuBarComponent.hjuce_MenuBarModel.cppjuce_MenuBarModel.hjuce_PopupMenu.cppjuce_PopupMenu.h
misc
juce_BubbleComponent.cppjuce_BubbleComponent.hjuce_DropShadower.cppjuce_DropShadower.hjuce_JUCESplashScreen.cppjuce_JUCESplashScreen.h
mouse
juce_ComponentDragger.cppjuce_ComponentDragger.hjuce_DragAndDropContainer.cppjuce_DragAndDropContainer.hjuce_DragAndDropTarget.hjuce_FileDragAndDropTarget.hjuce_LassoComponent.hjuce_MouseCursor.cppjuce_MouseCursor.hjuce_MouseEvent.cppjuce_MouseEvent.hjuce_MouseInactivityDetector.cppjuce_MouseInactivityDetector.hjuce_MouseInputSource.cppjuce_MouseInputSource.hjuce_MouseListener.cppjuce_MouseListener.hjuce_SelectedItemSet.hjuce_TextDragAndDropTarget.hjuce_TooltipClient.h
native
accessibility
juce_AccessibilityTextHelpers.hjuce_android_Accessibility.cppjuce_ios_Accessibility.mmjuce_mac_Accessibility.mmjuce_mac_AccessibilitySharedCode.mmjuce_win32_Accessibility.cppjuce_win32_AccessibilityElement.cppjuce_win32_AccessibilityElement.hjuce_win32_UIAExpandCollapseProvider.hjuce_win32_UIAGridItemProvider.hjuce_win32_UIAGridProvider.hjuce_win32_UIAHelpers.hjuce_win32_UIAInvokeProvider.hjuce_win32_UIAProviderBase.hjuce_win32_UIAProviders.hjuce_win32_UIARangeValueProvider.hjuce_win32_UIASelectionProvider.hjuce_win32_UIATextProvider.hjuce_win32_UIAToggleProvider.hjuce_win32_UIATransformProvider.hjuce_win32_UIAValueProvider.hjuce_win32_UIAWindowProvider.hjuce_win32_WindowsUIAWrapper.h
java
app
javaopt
app
x11
positioning
juce_MarkerList.cppjuce_MarkerList.hjuce_RelativeCoordinate.cppjuce_RelativeCoordinate.hjuce_RelativeCoordinatePositioner.cppjuce_RelativeCoordinatePositioner.hjuce_RelativeParallelogram.cppjuce_RelativeParallelogram.hjuce_RelativePoint.cppjuce_RelativePoint.hjuce_RelativePointPath.cppjuce_RelativePointPath.hjuce_RelativeRectangle.cppjuce_RelativeRectangle.h
properties
juce_BooleanPropertyComponent.cppjuce_BooleanPropertyComponent.hjuce_ButtonPropertyComponent.cppjuce_ButtonPropertyComponent.hjuce_ChoicePropertyComponent.cppjuce_ChoicePropertyComponent.hjuce_MultiChoicePropertyComponent.cppjuce_MultiChoicePropertyComponent.hjuce_PropertyComponent.cppjuce_PropertyComponent.hjuce_PropertyPanel.cppjuce_PropertyPanel.hjuce_SliderPropertyComponent.cppjuce_SliderPropertyComponent.hjuce_TextPropertyComponent.cppjuce_TextPropertyComponent.h
widgets
juce_ComboBox.cppjuce_ComboBox.hjuce_ImageComponent.cppjuce_ImageComponent.hjuce_Label.cppjuce_Label.hjuce_ListBox.cppjuce_ListBox.cpp.rejjuce_ListBox.hjuce_ProgressBar.cppjuce_ProgressBar.hjuce_Slider.cppjuce_Slider.hjuce_TableHeaderComponent.cppjuce_TableHeaderComponent.hjuce_TableListBox.cppjuce_TableListBox.hjuce_TextEditor.cppjuce_TextEditor.hjuce_Toolbar.cppjuce_Toolbar.hjuce_ToolbarItemComponent.cppjuce_ToolbarItemComponent.hjuce_ToolbarItemFactory.hjuce_ToolbarItemPalette.cppjuce_ToolbarItemPalette.hjuce_TreeView.cppjuce_TreeView.h
windows
juce_AlertWindow.cppjuce_AlertWindow.hjuce_CallOutBox.cppjuce_CallOutBox.hjuce_ComponentPeer.cppjuce_ComponentPeer.hjuce_DialogWindow.cppjuce_DialogWindow.hjuce_DocumentWindow.cppjuce_DocumentWindow.hjuce_MessageBoxOptions.hjuce_NativeMessageBox.hjuce_ResizableWindow.cppjuce_ResizableWindow.hjuce_ThreadWithProgressWindow.cppjuce_ThreadWithProgressWindow.hjuce_TooltipWindow.cppjuce_TooltipWindow.hjuce_TopLevelWindow.cppjuce_TopLevelWindow.h
juce_gui_extra
code_editor
juce_CPlusPlusCodeTokeniser.cppjuce_CPlusPlusCodeTokeniser.hjuce_CPlusPlusCodeTokeniserFunctions.hjuce_CodeDocument.cppjuce_CodeDocument.hjuce_CodeEditorComponent.cppjuce_CodeEditorComponent.hjuce_CodeTokeniser.hjuce_LuaCodeTokeniser.cppjuce_LuaCodeTokeniser.hjuce_XMLCodeTokeniser.cppjuce_XMLCodeTokeniser.h
documents
embedding
juce_ActiveXControlComponent.hjuce_AndroidViewComponent.hjuce_HWNDComponent.hjuce_NSViewComponent.hjuce_UIViewComponent.hjuce_XEmbedComponent.h
juce_gui_extra.cppjuce_gui_extra.hjuce_gui_extra.mmmisc
juce_AnimatedAppComponent.cppjuce_AnimatedAppComponent.hjuce_AppleRemote.hjuce_BubbleMessageComponent.cppjuce_BubbleMessageComponent.hjuce_ColourSelector.cppjuce_ColourSelector.hjuce_KeyMappingEditorComponent.cppjuce_KeyMappingEditorComponent.hjuce_LiveConstantEditor.cppjuce_LiveConstantEditor.hjuce_PreferencesPanel.cppjuce_PreferencesPanel.hjuce_PushNotifications.cppjuce_PushNotifications.hjuce_RecentlyOpenedFilesList.cppjuce_RecentlyOpenedFilesList.hjuce_SplashScreen.cppjuce_SplashScreen.hjuce_SystemTrayIconComponent.cppjuce_SystemTrayIconComponent.hjuce_WebBrowserComponent.h
native
java
app
com
javaopt
juce_AndroidViewComponent.cppjuce_android_PushNotifications.cppjuce_android_WebBrowserComponent.cppjuce_ios_PushNotifications.cppjuce_ios_UIViewComponent.mmjuce_linux_X11_SystemTrayIcon.cppjuce_linux_X11_WebBrowserComponent.cppjuce_linux_XEmbedComponent.cppjuce_mac_AppleRemote.mmjuce_mac_CarbonViewWrapperComponent.hjuce_mac_NSViewComponent.mmjuce_mac_PushNotifications.cppjuce_mac_SystemTrayIcon.cppjuce_mac_WebBrowserComponent.mmjuce_win32_ActiveXComponent.cppjuce_win32_HWNDComponent.cppjuce_win32_SystemTrayIcon.cppjuce_win32_WebBrowserComponent.cppjuce_opengl
geometry
juce_opengl.cppjuce_opengl.hjuce_opengl.mmnative
java
app
com
rmsl
opengl
juce_OpenGLContext.cppjuce_OpenGLContext.hjuce_OpenGLContext.h.rejjuce_OpenGLFrameBuffer.cppjuce_OpenGLFrameBuffer.hjuce_OpenGLGraphicsContext.cppjuce_OpenGLGraphicsContext.hjuce_OpenGLHelpers.cppjuce_OpenGLHelpers.hjuce_OpenGLImage.cppjuce_OpenGLImage.hjuce_OpenGLPixelFormat.cppjuce_OpenGLPixelFormat.hjuce_OpenGLRenderer.hjuce_OpenGLShaderProgram.cppjuce_OpenGLShaderProgram.hjuce_OpenGLTexture.cppjuce_OpenGLTexture.hjuce_gl.cppjuce_gl.hjuce_gles2.cppjuce_gles2.hjuce_khrplatform.hjuce_wgl.h
utils
juce_osc
juce_product_unlocking
in_app_purchases
juce_product_unlocking.cppjuce_product_unlocking.hjuce_product_unlocking.mmmarketplace
juce_KeyFileGeneration.hjuce_OnlineUnlockForm.cppjuce_OnlineUnlockForm.hjuce_OnlineUnlockStatus.cppjuce_OnlineUnlockStatus.hjuce_TracktionMarketplaceStatus.cppjuce_TracktionMarketplaceStatus.h
native
juce_video
267
deps/juce/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp
vendored
Normal file
267
deps/juce/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp
vendored
Normal file
@ -0,0 +1,267 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
enum { magicMastSlaveConnectionHeader = 0x712baf04 };
|
||||
|
||||
static const char* startMessage = "__ipc_st";
|
||||
static const char* killMessage = "__ipc_k_";
|
||||
static const char* pingMessage = "__ipc_p_";
|
||||
enum { specialMessageSize = 8, defaultTimeoutMs = 8000 };
|
||||
|
||||
static bool isMessageType (const MemoryBlock& mb, const char* messageType) noexcept
|
||||
{
|
||||
return mb.matches (messageType, (size_t) specialMessageSize);
|
||||
}
|
||||
|
||||
static String getCommandLinePrefix (const String& commandLineUniqueID)
|
||||
{
|
||||
return "--" + commandLineUniqueID + ":";
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// This thread sends and receives ping messages every second, so that it
|
||||
// can find out if the other process has stopped running.
|
||||
struct ChildProcessPingThread : public Thread,
|
||||
private AsyncUpdater
|
||||
{
|
||||
ChildProcessPingThread (int timeout) : Thread ("IPC ping"), timeoutMs (timeout)
|
||||
{
|
||||
pingReceived();
|
||||
}
|
||||
|
||||
void pingReceived() noexcept { countdown = timeoutMs / 1000 + 1; }
|
||||
void triggerConnectionLostMessage() { triggerAsyncUpdate(); }
|
||||
|
||||
virtual bool sendPingMessage (const MemoryBlock&) = 0;
|
||||
virtual void pingFailed() = 0;
|
||||
|
||||
int timeoutMs;
|
||||
|
||||
private:
|
||||
Atomic<int> countdown;
|
||||
|
||||
void handleAsyncUpdate() override { pingFailed(); }
|
||||
|
||||
void run() override
|
||||
{
|
||||
while (! threadShouldExit())
|
||||
{
|
||||
if (--countdown <= 0 || ! sendPingMessage ({ pingMessage, specialMessageSize }))
|
||||
{
|
||||
triggerConnectionLostMessage();
|
||||
break;
|
||||
}
|
||||
|
||||
wait (1000);
|
||||
}
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessPingThread)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct ChildProcessMaster::Connection : public InterprocessConnection,
|
||||
private ChildProcessPingThread
|
||||
{
|
||||
Connection (ChildProcessMaster& m, const String& pipeName, int timeout)
|
||||
: InterprocessConnection (false, magicMastSlaveConnectionHeader),
|
||||
ChildProcessPingThread (timeout),
|
||||
owner (m)
|
||||
{
|
||||
if (createPipe (pipeName, timeoutMs))
|
||||
startThread (4);
|
||||
}
|
||||
|
||||
~Connection() override
|
||||
{
|
||||
stopThread (10000);
|
||||
}
|
||||
|
||||
private:
|
||||
void connectionMade() override {}
|
||||
void connectionLost() override { owner.handleConnectionLost(); }
|
||||
|
||||
bool sendPingMessage (const MemoryBlock& m) override { return owner.sendMessageToSlave (m); }
|
||||
void pingFailed() override { connectionLost(); }
|
||||
|
||||
void messageReceived (const MemoryBlock& m) override
|
||||
{
|
||||
pingReceived();
|
||||
|
||||
if (m.getSize() != specialMessageSize || ! isMessageType (m, pingMessage))
|
||||
owner.handleMessageFromSlave (m);
|
||||
}
|
||||
|
||||
ChildProcessMaster& owner;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Connection)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
ChildProcessMaster::ChildProcessMaster() {}
|
||||
|
||||
ChildProcessMaster::~ChildProcessMaster()
|
||||
{
|
||||
killSlaveProcess();
|
||||
}
|
||||
|
||||
void ChildProcessMaster::handleConnectionLost() {}
|
||||
|
||||
bool ChildProcessMaster::sendMessageToSlave (const MemoryBlock& mb)
|
||||
{
|
||||
if (connection != nullptr)
|
||||
return connection->sendMessage (mb);
|
||||
|
||||
jassertfalse; // this can only be used when the connection is active!
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChildProcessMaster::launchSlaveProcess (const File& executable, const String& commandLineUniqueID,
|
||||
int timeoutMs, int streamFlags)
|
||||
{
|
||||
killSlaveProcess();
|
||||
|
||||
auto pipeName = "p" + String::toHexString (Random().nextInt64());
|
||||
|
||||
StringArray args;
|
||||
args.add (executable.getFullPathName());
|
||||
args.add (getCommandLinePrefix (commandLineUniqueID) + pipeName);
|
||||
|
||||
childProcess.reset (new ChildProcess());
|
||||
|
||||
if (childProcess->start (args, streamFlags))
|
||||
{
|
||||
connection.reset (new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs));
|
||||
|
||||
if (connection->isConnected())
|
||||
{
|
||||
sendMessageToSlave ({ startMessage, specialMessageSize });
|
||||
return true;
|
||||
}
|
||||
|
||||
connection.reset();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ChildProcessMaster::killSlaveProcess()
|
||||
{
|
||||
if (connection != nullptr)
|
||||
{
|
||||
sendMessageToSlave ({ killMessage, specialMessageSize });
|
||||
connection->disconnect();
|
||||
connection.reset();
|
||||
}
|
||||
|
||||
childProcess.reset();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct ChildProcessSlave::Connection : public InterprocessConnection,
|
||||
private ChildProcessPingThread
|
||||
{
|
||||
Connection (ChildProcessSlave& p, const String& pipeName, int timeout)
|
||||
: InterprocessConnection (false, magicMastSlaveConnectionHeader),
|
||||
ChildProcessPingThread (timeout),
|
||||
owner (p)
|
||||
{
|
||||
connectToPipe (pipeName, timeoutMs);
|
||||
startThread (4);
|
||||
}
|
||||
|
||||
~Connection() override
|
||||
{
|
||||
stopThread (10000);
|
||||
}
|
||||
|
||||
private:
|
||||
ChildProcessSlave& owner;
|
||||
|
||||
void connectionMade() override {}
|
||||
void connectionLost() override { owner.handleConnectionLost(); }
|
||||
|
||||
bool sendPingMessage (const MemoryBlock& m) override { return owner.sendMessageToMaster (m); }
|
||||
void pingFailed() override { connectionLost(); }
|
||||
|
||||
void messageReceived (const MemoryBlock& m) override
|
||||
{
|
||||
pingReceived();
|
||||
|
||||
if (isMessageType (m, pingMessage))
|
||||
return;
|
||||
|
||||
if (isMessageType (m, killMessage))
|
||||
return triggerConnectionLostMessage();
|
||||
|
||||
if (isMessageType (m, startMessage))
|
||||
return owner.handleConnectionMade();
|
||||
|
||||
owner.handleMessageFromMaster (m);
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Connection)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
ChildProcessSlave::ChildProcessSlave() {}
|
||||
ChildProcessSlave::~ChildProcessSlave() {}
|
||||
|
||||
void ChildProcessSlave::handleConnectionMade() {}
|
||||
void ChildProcessSlave::handleConnectionLost() {}
|
||||
|
||||
bool ChildProcessSlave::sendMessageToMaster (const MemoryBlock& mb)
|
||||
{
|
||||
if (connection != nullptr)
|
||||
return connection->sendMessage (mb);
|
||||
|
||||
jassertfalse; // this can only be used when the connection is active!
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ChildProcessSlave::initialiseFromCommandLine (const String& commandLine,
|
||||
const String& commandLineUniqueID,
|
||||
int timeoutMs)
|
||||
{
|
||||
auto prefix = getCommandLinePrefix (commandLineUniqueID);
|
||||
|
||||
if (commandLine.trim().startsWith (prefix))
|
||||
{
|
||||
auto pipeName = commandLine.fromFirstOccurrenceOf (prefix, false, false)
|
||||
.upToFirstOccurrenceOf (" ", false, false).trim();
|
||||
|
||||
if (pipeName.isNotEmpty())
|
||||
{
|
||||
connection.reset (new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs));
|
||||
|
||||
if (! connection->isConnected())
|
||||
connection.reset();
|
||||
}
|
||||
}
|
||||
|
||||
return connection != nullptr;
|
||||
}
|
||||
|
||||
} // namespace juce
|
200
deps/juce/modules/juce_events/interprocess/juce_ConnectedChildProcess.h
vendored
Normal file
200
deps/juce/modules/juce_events/interprocess/juce_ConnectedChildProcess.h
vendored
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Acts as the slave end of a master/slave pair of connected processes.
|
||||
|
||||
The ChildProcessSlave and ChildProcessMaster classes make it easy for an app
|
||||
to spawn a child process, and to manage a 2-way messaging connection to control it.
|
||||
|
||||
To use the system, you need to create subclasses of both ChildProcessSlave and
|
||||
ChildProcessMaster. To instantiate the ChildProcessSlave object, you must
|
||||
add some code to your main() or JUCEApplication::initialise() function that
|
||||
calls the initialiseFromCommandLine() method to check the app's command-line
|
||||
parameters to see whether it's being launched as a child process. If this returns
|
||||
true then the slave process can be allowed to run, and its handleMessageFromMaster()
|
||||
method will be called whenever a message arrives.
|
||||
|
||||
The juce demo app has a good example of this class in action.
|
||||
|
||||
@see ChildProcessMaster, InterprocessConnection, ChildProcess
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
class JUCE_API ChildProcessSlave
|
||||
{
|
||||
public:
|
||||
/** Creates a non-connected slave process.
|
||||
Use initialiseFromCommandLine to connect to a master process.
|
||||
*/
|
||||
ChildProcessSlave();
|
||||
|
||||
/** Destructor. */
|
||||
virtual ~ChildProcessSlave();
|
||||
|
||||
/** This checks some command-line parameters to see whether they were generated by
|
||||
ChildProcessMaster::launchSlaveProcess(), and if so, connects to that master process.
|
||||
|
||||
In an exe that can be used as a child process, you should add some code to your
|
||||
main() or JUCEApplication::initialise() that calls this method.
|
||||
|
||||
The commandLineUniqueID should be a short alphanumeric identifier (no spaces!)
|
||||
that matches the string passed to ChildProcessMaster::launchSlaveProcess().
|
||||
|
||||
The timeoutMs parameter lets you specify how long the child process is allowed
|
||||
to run without receiving a ping from the master before the master is considered to
|
||||
have died, and handleConnectionLost() will be called. Passing <= 0 for this timeout
|
||||
makes it use a default value.
|
||||
|
||||
Returns true if the command-line matches and the connection is made successfully.
|
||||
*/
|
||||
bool initialiseFromCommandLine (const String& commandLine,
|
||||
const String& commandLineUniqueID,
|
||||
int timeoutMs = 0);
|
||||
|
||||
//==============================================================================
|
||||
/** This will be called to deliver messages from the master process.
|
||||
The call will probably be made on a background thread, so be careful with your
|
||||
thread-safety! You may want to respond by sending back a message with
|
||||
sendMessageToMaster()
|
||||
*/
|
||||
virtual void handleMessageFromMaster (const MemoryBlock&) = 0;
|
||||
|
||||
/** This will be called when the master process finishes connecting to this slave.
|
||||
The call will probably be made on a background thread, so be careful with your thread-safety!
|
||||
*/
|
||||
virtual void handleConnectionMade();
|
||||
|
||||
/** This will be called when the connection to the master process is lost.
|
||||
The call may be made from any thread (including the message thread).
|
||||
Typically, if your process only exists to act as a slave, you should probably exit
|
||||
when this happens.
|
||||
*/
|
||||
virtual void handleConnectionLost();
|
||||
|
||||
/** Tries to send a message to the master process.
|
||||
This returns true if the message was sent, but doesn't check that it actually gets
|
||||
delivered at the other end. If successful, the data will emerge in a call to your
|
||||
ChildProcessMaster::handleMessageFromSlave().
|
||||
*/
|
||||
bool sendMessageToMaster (const MemoryBlock&);
|
||||
|
||||
private:
|
||||
struct Connection;
|
||||
std::unique_ptr<Connection> connection;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessSlave)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Acts as the master in a master/slave pair of connected processes.
|
||||
|
||||
The ChildProcessSlave and ChildProcessMaster classes make it easy for an app
|
||||
to spawn a child process, and to manage a 2-way messaging connection to control it.
|
||||
|
||||
To use the system, you need to create subclasses of both ChildProcessSlave and
|
||||
ChildProcessMaster. When you want your master process to launch the slave, you
|
||||
just call launchSlaveProcess(), and it'll attempt to launch the executable that
|
||||
you specify (which may be the same exe), and assuming it has been set-up to
|
||||
correctly parse the command-line parameters (see ChildProcessSlave) then a
|
||||
two-way connection will be created.
|
||||
|
||||
The juce demo app has a good example of this class in action.
|
||||
|
||||
@see ChildProcessSlave, InterprocessConnection, ChildProcess
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
class JUCE_API ChildProcessMaster
|
||||
{
|
||||
public:
|
||||
/** Creates an uninitialised master process object.
|
||||
Use launchSlaveProcess to launch and connect to a child process.
|
||||
*/
|
||||
ChildProcessMaster();
|
||||
|
||||
/** Destructor.
|
||||
Note that the destructor calls killSlaveProcess(), but doesn't wait for
|
||||
the child process to finish terminating.
|
||||
*/
|
||||
virtual ~ChildProcessMaster();
|
||||
|
||||
/** Attempts to launch and connect to a slave process.
|
||||
This will start the given executable, passing it a special command-line
|
||||
parameter based around the commandLineUniqueID string, which must be a
|
||||
short alphanumeric string (no spaces!) that identifies your app. The exe
|
||||
that gets launched must respond by calling ChildProcessSlave::initialiseFromCommandLine()
|
||||
in its startup code, and must use a matching ID to commandLineUniqueID.
|
||||
|
||||
The timeoutMs parameter lets you specify how long the child process is allowed
|
||||
to go without sending a ping before it is considered to have died and
|
||||
handleConnectionLost() will be called. Passing <= 0 for this timeout makes
|
||||
it use a default value.
|
||||
|
||||
If this all works, the method returns true, and you can begin sending and
|
||||
receiving messages with the slave process.
|
||||
|
||||
If a child process is already running, this will call killSlaveProcess() and
|
||||
start a new one.
|
||||
*/
|
||||
bool launchSlaveProcess (const File& executableToLaunch,
|
||||
const String& commandLineUniqueID,
|
||||
int timeoutMs = 0,
|
||||
int streamFlags = ChildProcess::wantStdOut | ChildProcess::wantStdErr);
|
||||
|
||||
/** Sends a kill message to the slave, and disconnects from it.
|
||||
Note that this won't wait for it to terminate.
|
||||
*/
|
||||
void killSlaveProcess();
|
||||
|
||||
/** This will be called to deliver a message from the slave process.
|
||||
The call will probably be made on a background thread, so be careful with your thread-safety!
|
||||
*/
|
||||
virtual void handleMessageFromSlave (const MemoryBlock&) = 0;
|
||||
|
||||
/** This will be called when the slave process dies or is somehow disconnected.
|
||||
The call will probably be made on a background thread, so be careful with your thread-safety!
|
||||
*/
|
||||
virtual void handleConnectionLost();
|
||||
|
||||
/** Attempts to send a message to the slave process.
|
||||
This returns true if the message was dispatched, but doesn't check that it actually
|
||||
gets delivered at the other end. If successful, the data will emerge in a call to
|
||||
your ChildProcessSlave::handleMessageFromMaster().
|
||||
*/
|
||||
bool sendMessageToSlave (const MemoryBlock&);
|
||||
|
||||
private:
|
||||
std::unique_ptr<ChildProcess> childProcess;
|
||||
|
||||
struct Connection;
|
||||
std::unique_ptr<Connection> connection;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessMaster)
|
||||
};
|
||||
|
||||
} // namespace juce
|
431
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnection.cpp
vendored
Normal file
431
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnection.cpp
vendored
Normal file
@ -0,0 +1,431 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
struct InterprocessConnection::ConnectionThread : public Thread
|
||||
{
|
||||
ConnectionThread (InterprocessConnection& c) : Thread ("JUCE IPC"), owner (c) {}
|
||||
void run() override { owner.runThread(); }
|
||||
|
||||
InterprocessConnection& owner;
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectionThread)
|
||||
};
|
||||
|
||||
class SafeActionImpl
|
||||
{
|
||||
public:
|
||||
explicit SafeActionImpl (InterprocessConnection& p)
|
||||
: ref (p) {}
|
||||
|
||||
template <typename Fn>
|
||||
void ifSafe (Fn&& fn)
|
||||
{
|
||||
const ScopedLock lock (mutex);
|
||||
|
||||
if (safe)
|
||||
fn (ref);
|
||||
}
|
||||
|
||||
void setSafe (bool s)
|
||||
{
|
||||
const ScopedLock lock (mutex);
|
||||
safe = s;
|
||||
}
|
||||
|
||||
bool isSafe()
|
||||
{
|
||||
const ScopedLock lock (mutex);
|
||||
return safe;
|
||||
}
|
||||
|
||||
private:
|
||||
CriticalSection mutex;
|
||||
InterprocessConnection& ref;
|
||||
bool safe = false;
|
||||
};
|
||||
|
||||
class InterprocessConnection::SafeAction : public SafeActionImpl
|
||||
{
|
||||
using SafeActionImpl::SafeActionImpl;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
InterprocessConnection::InterprocessConnection (bool callbacksOnMessageThread, uint32 magicMessageHeaderNumber)
|
||||
: useMessageThread (callbacksOnMessageThread),
|
||||
magicMessageHeader (magicMessageHeaderNumber),
|
||||
safeAction (std::make_shared<SafeAction> (*this))
|
||||
{
|
||||
thread.reset (new ConnectionThread (*this));
|
||||
}
|
||||
|
||||
InterprocessConnection::~InterprocessConnection()
|
||||
{
|
||||
// You *must* call `disconnect` in the destructor of your derived class to ensure
|
||||
// that any pending messages are not delivered. If the messages were delivered after
|
||||
// destroying the derived class, we'd end up calling the pure virtual implementations
|
||||
// of `messageReceived`, `connectionMade` and `connectionLost` which is definitely
|
||||
// not a good idea!
|
||||
jassert (! safeAction->isSafe());
|
||||
|
||||
callbackConnectionState = false;
|
||||
disconnect (4000, Notify::no);
|
||||
thread.reset();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool InterprocessConnection::connectToSocket (const String& hostName,
|
||||
int portNumber, int timeOutMillisecs)
|
||||
{
|
||||
disconnect();
|
||||
|
||||
auto s = std::make_unique<StreamingSocket>();
|
||||
|
||||
if (s->connect (hostName, portNumber, timeOutMillisecs))
|
||||
{
|
||||
const ScopedWriteLock sl (pipeAndSocketLock);
|
||||
initialiseWithSocket (std::move (s));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool InterprocessConnection::connectToPipe (const String& pipeName, int timeoutMs)
|
||||
{
|
||||
disconnect();
|
||||
|
||||
auto newPipe = std::make_unique<NamedPipe>();
|
||||
|
||||
if (newPipe->openExisting (pipeName))
|
||||
{
|
||||
const ScopedWriteLock sl (pipeAndSocketLock);
|
||||
pipeReceiveMessageTimeout = timeoutMs;
|
||||
initialiseWithPipe (std::move (newPipe));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool InterprocessConnection::createPipe (const String& pipeName, int timeoutMs, bool mustNotExist)
|
||||
{
|
||||
disconnect();
|
||||
|
||||
auto newPipe = std::make_unique<NamedPipe>();
|
||||
|
||||
if (newPipe->createNewPipe (pipeName, mustNotExist))
|
||||
{
|
||||
const ScopedWriteLock sl (pipeAndSocketLock);
|
||||
pipeReceiveMessageTimeout = timeoutMs;
|
||||
initialiseWithPipe (std::move (newPipe));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void InterprocessConnection::disconnect (int timeoutMs, Notify notify)
|
||||
{
|
||||
thread->signalThreadShouldExit();
|
||||
|
||||
{
|
||||
const ScopedReadLock sl (pipeAndSocketLock);
|
||||
if (socket != nullptr) socket->close();
|
||||
if (pipe != nullptr) pipe->close();
|
||||
}
|
||||
|
||||
thread->stopThread (timeoutMs);
|
||||
deletePipeAndSocket();
|
||||
|
||||
if (notify == Notify::yes)
|
||||
connectionLostInt();
|
||||
|
||||
callbackConnectionState = false;
|
||||
safeAction->setSafe (false);
|
||||
}
|
||||
|
||||
void InterprocessConnection::deletePipeAndSocket()
|
||||
{
|
||||
const ScopedWriteLock sl (pipeAndSocketLock);
|
||||
socket.reset();
|
||||
pipe.reset();
|
||||
}
|
||||
|
||||
bool InterprocessConnection::isConnected() const
|
||||
{
|
||||
const ScopedReadLock sl (pipeAndSocketLock);
|
||||
|
||||
return ((socket != nullptr && socket->isConnected())
|
||||
|| (pipe != nullptr && pipe->isOpen()))
|
||||
&& threadIsRunning;
|
||||
}
|
||||
|
||||
String InterprocessConnection::getConnectedHostName() const
|
||||
{
|
||||
{
|
||||
const ScopedReadLock sl (pipeAndSocketLock);
|
||||
|
||||
if (pipe == nullptr && socket == nullptr)
|
||||
return {};
|
||||
|
||||
if (socket != nullptr && ! socket->isLocal())
|
||||
return socket->getHostName();
|
||||
}
|
||||
|
||||
return IPAddress::local().toString();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool InterprocessConnection::sendMessage (const MemoryBlock& message)
|
||||
{
|
||||
uint32 messageHeader[2] = { ByteOrder::swapIfBigEndian (magicMessageHeader),
|
||||
ByteOrder::swapIfBigEndian ((uint32) message.getSize()) };
|
||||
|
||||
MemoryBlock messageData (sizeof (messageHeader) + message.getSize());
|
||||
messageData.copyFrom (messageHeader, 0, sizeof (messageHeader));
|
||||
messageData.copyFrom (message.getData(), sizeof (messageHeader), message.getSize());
|
||||
|
||||
return writeData (messageData.getData(), (int) messageData.getSize()) == (int) messageData.getSize();
|
||||
}
|
||||
|
||||
int InterprocessConnection::writeData (void* data, int dataSize)
|
||||
{
|
||||
const ScopedReadLock sl (pipeAndSocketLock);
|
||||
|
||||
if (socket != nullptr)
|
||||
return socket->write (data, dataSize);
|
||||
|
||||
if (pipe != nullptr)
|
||||
return pipe->write (data, dataSize, pipeReceiveMessageTimeout);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void InterprocessConnection::initialise()
|
||||
{
|
||||
safeAction->setSafe (true);
|
||||
threadIsRunning = true;
|
||||
connectionMadeInt();
|
||||
thread->startThread();
|
||||
}
|
||||
|
||||
void InterprocessConnection::initialiseWithSocket (std::unique_ptr<StreamingSocket> newSocket)
|
||||
{
|
||||
jassert (socket == nullptr && pipe == nullptr);
|
||||
socket = std::move (newSocket);
|
||||
initialise();
|
||||
}
|
||||
|
||||
void InterprocessConnection::initialiseWithPipe (std::unique_ptr<NamedPipe> newPipe)
|
||||
{
|
||||
jassert (socket == nullptr && pipe == nullptr);
|
||||
pipe = std::move (newPipe);
|
||||
initialise();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct ConnectionStateMessage : public MessageManager::MessageBase
|
||||
{
|
||||
ConnectionStateMessage (std::shared_ptr<SafeActionImpl> ipc, bool connected) noexcept
|
||||
: safeAction (ipc), connectionMade (connected)
|
||||
{}
|
||||
|
||||
void messageCallback() override
|
||||
{
|
||||
safeAction->ifSafe ([this] (InterprocessConnection& owner)
|
||||
{
|
||||
if (connectionMade)
|
||||
owner.connectionMade();
|
||||
else
|
||||
owner.connectionLost();
|
||||
});
|
||||
}
|
||||
|
||||
std::shared_ptr<SafeActionImpl> safeAction;
|
||||
bool connectionMade;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectionStateMessage)
|
||||
};
|
||||
|
||||
void InterprocessConnection::connectionMadeInt()
|
||||
{
|
||||
if (! callbackConnectionState)
|
||||
{
|
||||
callbackConnectionState = true;
|
||||
|
||||
if (useMessageThread)
|
||||
(new ConnectionStateMessage (safeAction, true))->post();
|
||||
else
|
||||
connectionMade();
|
||||
}
|
||||
}
|
||||
|
||||
void InterprocessConnection::connectionLostInt()
|
||||
{
|
||||
if (callbackConnectionState)
|
||||
{
|
||||
callbackConnectionState = false;
|
||||
|
||||
if (useMessageThread)
|
||||
(new ConnectionStateMessage (safeAction, false))->post();
|
||||
else
|
||||
connectionLost();
|
||||
}
|
||||
}
|
||||
|
||||
struct DataDeliveryMessage : public Message
|
||||
{
|
||||
DataDeliveryMessage (std::shared_ptr<SafeActionImpl> ipc, const MemoryBlock& d)
|
||||
: safeAction (ipc), data (d)
|
||||
{}
|
||||
|
||||
void messageCallback() override
|
||||
{
|
||||
safeAction->ifSafe ([this] (InterprocessConnection& owner)
|
||||
{
|
||||
owner.messageReceived (data);
|
||||
});
|
||||
}
|
||||
|
||||
std::shared_ptr<SafeActionImpl> safeAction;
|
||||
MemoryBlock data;
|
||||
};
|
||||
|
||||
void InterprocessConnection::deliverDataInt (const MemoryBlock& data)
|
||||
{
|
||||
jassert (callbackConnectionState);
|
||||
|
||||
if (useMessageThread)
|
||||
(new DataDeliveryMessage (safeAction, data))->post();
|
||||
else
|
||||
messageReceived (data);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
int InterprocessConnection::readData (void* data, int num)
|
||||
{
|
||||
const ScopedReadLock sl (pipeAndSocketLock);
|
||||
|
||||
if (socket != nullptr)
|
||||
return socket->read (data, num, true);
|
||||
|
||||
if (pipe != nullptr)
|
||||
return pipe->read (data, num, pipeReceiveMessageTimeout);
|
||||
|
||||
jassertfalse;
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool InterprocessConnection::readNextMessage()
|
||||
{
|
||||
uint32 messageHeader[2];
|
||||
auto bytes = readData (messageHeader, sizeof (messageHeader));
|
||||
|
||||
if (bytes == (int) sizeof (messageHeader)
|
||||
&& ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader)
|
||||
{
|
||||
auto bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]);
|
||||
|
||||
if (bytesInMessage > 0)
|
||||
{
|
||||
MemoryBlock messageData ((size_t) bytesInMessage, true);
|
||||
int bytesRead = 0;
|
||||
|
||||
while (bytesInMessage > 0)
|
||||
{
|
||||
if (thread->threadShouldExit())
|
||||
return false;
|
||||
|
||||
auto numThisTime = jmin (bytesInMessage, 65536);
|
||||
auto bytesIn = readData (addBytesToPointer (messageData.getData(), bytesRead), numThisTime);
|
||||
|
||||
if (bytesIn <= 0)
|
||||
break;
|
||||
|
||||
bytesRead += bytesIn;
|
||||
bytesInMessage -= bytesIn;
|
||||
}
|
||||
|
||||
if (bytesRead >= 0)
|
||||
deliverDataInt (messageData);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (bytes < 0)
|
||||
{
|
||||
if (socket != nullptr)
|
||||
deletePipeAndSocket();
|
||||
|
||||
connectionLostInt();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void InterprocessConnection::runThread()
|
||||
{
|
||||
while (! thread->threadShouldExit())
|
||||
{
|
||||
if (socket != nullptr)
|
||||
{
|
||||
auto ready = socket->waitUntilReady (true, 100);
|
||||
|
||||
if (ready < 0)
|
||||
{
|
||||
deletePipeAndSocket();
|
||||
connectionLostInt();
|
||||
break;
|
||||
}
|
||||
|
||||
if (ready == 0)
|
||||
{
|
||||
thread->wait (1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (pipe != nullptr)
|
||||
{
|
||||
if (! pipe->isOpen())
|
||||
{
|
||||
deletePipeAndSocket();
|
||||
connectionLostInt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (thread->threadShouldExit() || ! readNextMessage())
|
||||
break;
|
||||
}
|
||||
|
||||
threadIsRunning = false;
|
||||
}
|
||||
|
||||
} // namespace juce
|
226
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnection.h
vendored
Normal file
226
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnection.h
vendored
Normal file
@ -0,0 +1,226 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
class InterprocessConnectionServer;
|
||||
class MemoryBlock;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Manages a simple two-way messaging connection to another process, using either
|
||||
a socket or a named pipe as the transport medium.
|
||||
|
||||
To connect to a waiting socket or an open pipe, use the connectToSocket() or
|
||||
connectToPipe() methods. If this succeeds, messages can be sent to the other end,
|
||||
and incoming messages will result in a callback via the messageReceived()
|
||||
method.
|
||||
|
||||
To open a pipe and wait for another client to connect to it, use the createPipe()
|
||||
method.
|
||||
|
||||
To act as a socket server and create connections for one or more client, see the
|
||||
InterprocessConnectionServer class.
|
||||
|
||||
IMPORTANT NOTE: Your derived Connection class *must* call `disconnect` in its destructor
|
||||
in order to cancel any pending messages before the class is destroyed.
|
||||
|
||||
@see InterprocessConnectionServer, Socket, NamedPipe
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
class JUCE_API InterprocessConnection
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a connection.
|
||||
|
||||
Connections are created manually, connecting them with the connectToSocket()
|
||||
or connectToPipe() methods, or they are created automatically by a InterprocessConnectionServer
|
||||
when a client wants to connect.
|
||||
|
||||
@param callbacksOnMessageThread if true, callbacks to the connectionMade(),
|
||||
connectionLost() and messageReceived() methods will
|
||||
always be made using the message thread; if false,
|
||||
these will be called immediately on the connection's
|
||||
own thread.
|
||||
@param magicMessageHeaderNumber a magic number to use in the header to check the
|
||||
validity of the data blocks being sent and received. This
|
||||
can be any number, but the sender and receiver must obviously
|
||||
use matching values or they won't recognise each other.
|
||||
*/
|
||||
InterprocessConnection (bool callbacksOnMessageThread = true,
|
||||
uint32 magicMessageHeaderNumber = 0xf2b49e2c);
|
||||
|
||||
/** Destructor. */
|
||||
virtual ~InterprocessConnection();
|
||||
|
||||
//==============================================================================
|
||||
/** Tries to connect this object to a socket.
|
||||
|
||||
For this to work, the machine on the other end needs to have a InterprocessConnectionServer
|
||||
object waiting to receive client connections on this port number.
|
||||
|
||||
@param hostName the host computer, either a network address or name
|
||||
@param portNumber the socket port number to try to connect to
|
||||
@param timeOutMillisecs how long to keep trying before giving up
|
||||
@returns true if the connection is established successfully
|
||||
@see Socket
|
||||
*/
|
||||
bool connectToSocket (const String& hostName,
|
||||
int portNumber,
|
||||
int timeOutMillisecs);
|
||||
|
||||
/** Tries to connect the object to an existing named pipe.
|
||||
|
||||
For this to work, another process on the same computer must already have opened
|
||||
an InterprocessConnection object and used createPipe() to create a pipe for this
|
||||
to connect to.
|
||||
|
||||
@param pipeName the name to use for the pipe - this should be unique to your app
|
||||
@param pipeReceiveMessageTimeoutMs a timeout length to be used when reading or writing
|
||||
to the pipe, or -1 for an infinite timeout.
|
||||
@returns true if it connects successfully.
|
||||
@see createPipe, NamedPipe
|
||||
*/
|
||||
bool connectToPipe (const String& pipeName, int pipeReceiveMessageTimeoutMs);
|
||||
|
||||
/** Tries to create a new pipe for other processes to connect to.
|
||||
|
||||
This creates a pipe with the given name, so that other processes can use
|
||||
connectToPipe() to connect to the other end.
|
||||
|
||||
@param pipeName the name to use for the pipe - this should be unique to your app
|
||||
@param pipeReceiveMessageTimeoutMs a timeout length to be used when reading or writing
|
||||
to the pipe, or -1 for an infinite timeout
|
||||
@param mustNotExist if set to true, the method will fail if the pipe already exists
|
||||
@returns true if the pipe was created, or false if it fails (e.g. if another process is
|
||||
already using the pipe)
|
||||
*/
|
||||
bool createPipe (const String& pipeName, int pipeReceiveMessageTimeoutMs, bool mustNotExist = false);
|
||||
|
||||
/** Whether the disconnect call should trigger callbacks. */
|
||||
enum class Notify { no, yes };
|
||||
|
||||
/** Disconnects and closes any currently-open sockets or pipes.
|
||||
|
||||
Derived classes *must* call this in their destructors in order to avoid undefined
|
||||
behaviour.
|
||||
|
||||
@param timeoutMs the time in ms to wait before killing the thread by force
|
||||
@param notify whether or not to call `connectionLost`
|
||||
*/
|
||||
void disconnect (int timeoutMs = -1, Notify notify = Notify::yes);
|
||||
|
||||
/** True if a socket or pipe is currently active. */
|
||||
bool isConnected() const;
|
||||
|
||||
/** Returns the socket that this connection is using (or nullptr if it uses a pipe). */
|
||||
StreamingSocket* getSocket() const noexcept { return socket.get(); }
|
||||
|
||||
/** Returns the pipe that this connection is using (or nullptr if it uses a socket). */
|
||||
NamedPipe* getPipe() const noexcept { return pipe.get(); }
|
||||
|
||||
/** Returns the name of the machine at the other end of this connection.
|
||||
This may return an empty string if the name is unknown.
|
||||
*/
|
||||
String getConnectedHostName() const;
|
||||
|
||||
//==============================================================================
|
||||
/** Tries to send a message to the other end of this connection.
|
||||
|
||||
This will fail if it's not connected, or if there's some kind of write error. If
|
||||
it succeeds, the connection object at the other end will receive the message by
|
||||
a callback to its messageReceived() method.
|
||||
|
||||
@see messageReceived
|
||||
*/
|
||||
bool sendMessage (const MemoryBlock& message);
|
||||
|
||||
//==============================================================================
|
||||
/** Called when the connection is first connected.
|
||||
|
||||
If the connection was created with the callbacksOnMessageThread flag set, then
|
||||
this will be called on the message thread; otherwise it will be called on a server
|
||||
thread.
|
||||
*/
|
||||
virtual void connectionMade() = 0;
|
||||
|
||||
/** Called when the connection is broken.
|
||||
|
||||
If the connection was created with the callbacksOnMessageThread flag set, then
|
||||
this will be called on the message thread; otherwise it will be called on a server
|
||||
thread.
|
||||
*/
|
||||
virtual void connectionLost() = 0;
|
||||
|
||||
/** Called when a message arrives.
|
||||
|
||||
When the object at the other end of this connection sends us a message with sendMessage(),
|
||||
this callback is used to deliver it to us.
|
||||
|
||||
If the connection was created with the callbacksOnMessageThread flag set, then
|
||||
this will be called on the message thread; otherwise it will be called on a server
|
||||
thread.
|
||||
|
||||
@see sendMessage
|
||||
*/
|
||||
virtual void messageReceived (const MemoryBlock& message) = 0;
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
ReadWriteLock pipeAndSocketLock;
|
||||
std::unique_ptr<StreamingSocket> socket;
|
||||
std::unique_ptr<NamedPipe> pipe;
|
||||
bool callbackConnectionState = false;
|
||||
const bool useMessageThread;
|
||||
const uint32 magicMessageHeader;
|
||||
int pipeReceiveMessageTimeout = -1;
|
||||
|
||||
friend class InterprocessConnectionServer;
|
||||
void initialise();
|
||||
void initialiseWithSocket (std::unique_ptr<StreamingSocket>);
|
||||
void initialiseWithPipe (std::unique_ptr<NamedPipe>);
|
||||
void deletePipeAndSocket();
|
||||
void connectionMadeInt();
|
||||
void connectionLostInt();
|
||||
void deliverDataInt (const MemoryBlock&);
|
||||
bool readNextMessage();
|
||||
int readData (void*, int);
|
||||
|
||||
struct ConnectionThread;
|
||||
std::unique_ptr<ConnectionThread> thread;
|
||||
std::atomic<bool> threadIsRunning { false };
|
||||
|
||||
class SafeAction;
|
||||
std::shared_ptr<SafeAction> safeAction;
|
||||
|
||||
void runThread();
|
||||
int writeData (void*, int);
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnection)
|
||||
};
|
||||
|
||||
} // namespace juce
|
80
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp
vendored
Normal file
80
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
InterprocessConnectionServer::InterprocessConnectionServer() : Thread ("JUCE IPC server")
|
||||
{
|
||||
}
|
||||
|
||||
InterprocessConnectionServer::~InterprocessConnectionServer()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool InterprocessConnectionServer::beginWaitingForSocket (const int portNumber, const String& bindAddress)
|
||||
{
|
||||
stop();
|
||||
|
||||
socket.reset (new StreamingSocket());
|
||||
|
||||
if (socket->createListener (portNumber, bindAddress))
|
||||
{
|
||||
startThread();
|
||||
return true;
|
||||
}
|
||||
|
||||
socket.reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
void InterprocessConnectionServer::stop()
|
||||
{
|
||||
signalThreadShouldExit();
|
||||
|
||||
if (socket != nullptr)
|
||||
socket->close();
|
||||
|
||||
stopThread (4000);
|
||||
socket.reset();
|
||||
}
|
||||
|
||||
int InterprocessConnectionServer::getBoundPort() const noexcept
|
||||
{
|
||||
return (socket == nullptr) ? -1 : socket->getBoundPort();
|
||||
}
|
||||
|
||||
void InterprocessConnectionServer::run()
|
||||
{
|
||||
while ((! threadShouldExit()) && socket != nullptr)
|
||||
{
|
||||
std::unique_ptr<StreamingSocket> clientSocket (socket->waitForNextConnection());
|
||||
|
||||
if (clientSocket != nullptr)
|
||||
if (auto* newConnection = createConnectionObject())
|
||||
newConnection->initialiseWithSocket (std::move (clientSocket));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace juce
|
106
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h
vendored
Normal file
106
deps/juce/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
An object that waits for client sockets to connect to a port on this host, and
|
||||
creates InterprocessConnection objects for each one.
|
||||
|
||||
To use this, create a class derived from it which implements the createConnectionObject()
|
||||
method, so that it creates suitable connection objects for each client that tries
|
||||
to connect.
|
||||
|
||||
@see InterprocessConnection
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
class JUCE_API InterprocessConnectionServer : private Thread
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates an uninitialised server object.
|
||||
*/
|
||||
InterprocessConnectionServer();
|
||||
|
||||
/** Destructor. */
|
||||
~InterprocessConnectionServer() override;
|
||||
|
||||
//==============================================================================
|
||||
/** Starts an internal thread which listens on the given port number.
|
||||
|
||||
While this is running, if another process tries to connect with the
|
||||
InterprocessConnection::connectToSocket() method, this object will call
|
||||
createConnectionObject() to create a connection to that client.
|
||||
|
||||
Use stop() to stop the thread running.
|
||||
|
||||
@param portNumber The port on which the server will receive
|
||||
connections
|
||||
@param bindAddress The address on which the server will listen
|
||||
for connections. An empty string indicates
|
||||
that it should listen on all addresses
|
||||
assigned to this machine.
|
||||
|
||||
@see createConnectionObject, stop
|
||||
*/
|
||||
bool beginWaitingForSocket (int portNumber, const String& bindAddress = String());
|
||||
|
||||
/** Terminates the listener thread, if it's active.
|
||||
|
||||
@see beginWaitingForSocket
|
||||
*/
|
||||
void stop();
|
||||
|
||||
/** Returns the local port number to which this server is currently bound.
|
||||
|
||||
This is useful if you need to know to which port the OS has actually bound your
|
||||
socket when calling beginWaitingForSocket with a port number of zero.
|
||||
|
||||
Returns -1 if the function fails.
|
||||
*/
|
||||
int getBoundPort() const noexcept;
|
||||
|
||||
protected:
|
||||
/** Creates a suitable connection object for a client process that wants to
|
||||
connect to this one.
|
||||
|
||||
This will be called by the listener thread when a client process tries
|
||||
to connect, and must return a new InterprocessConnection object that will
|
||||
then run as this end of the connection.
|
||||
|
||||
@see InterprocessConnection
|
||||
*/
|
||||
virtual InterprocessConnection* createConnectionObject() = 0;
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
std::unique_ptr<StreamingSocket> socket;
|
||||
|
||||
void run() override;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnectionServer)
|
||||
};
|
||||
|
||||
} // namespace juce
|
212
deps/juce/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp
vendored
Normal file
212
deps/juce/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp
vendored
Normal file
@ -0,0 +1,212 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
#if JUCE_ANDROID
|
||||
extern void acquireMulticastLock();
|
||||
extern void releaseMulticastLock();
|
||||
#endif
|
||||
|
||||
NetworkServiceDiscovery::Advertiser::Advertiser (const String& serviceTypeUID,
|
||||
const String& serviceDescription,
|
||||
int broadcastPortToUse, int connectionPort,
|
||||
RelativeTime minTimeBetweenBroadcasts)
|
||||
: Thread ("Discovery_broadcast"),
|
||||
message (serviceTypeUID), broadcastPort (broadcastPortToUse),
|
||||
minInterval (minTimeBetweenBroadcasts)
|
||||
{
|
||||
message.setAttribute ("id", Uuid().toString());
|
||||
message.setAttribute ("name", serviceDescription);
|
||||
message.setAttribute ("address", String());
|
||||
message.setAttribute ("port", connectionPort);
|
||||
|
||||
startThread (2);
|
||||
}
|
||||
|
||||
NetworkServiceDiscovery::Advertiser::~Advertiser()
|
||||
{
|
||||
stopThread (2000);
|
||||
socket.shutdown();
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::Advertiser::run()
|
||||
{
|
||||
if (! socket.bindToPort (0))
|
||||
{
|
||||
jassertfalse;
|
||||
return;
|
||||
}
|
||||
|
||||
while (! threadShouldExit())
|
||||
{
|
||||
sendBroadcast();
|
||||
wait ((int) minInterval.inMilliseconds());
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::Advertiser::sendBroadcast()
|
||||
{
|
||||
static IPAddress local = IPAddress::local();
|
||||
|
||||
for (auto& address : IPAddress::getAllAddresses())
|
||||
{
|
||||
if (address == local)
|
||||
continue;
|
||||
|
||||
message.setAttribute ("address", address.toString());
|
||||
|
||||
auto broadcastAddress = IPAddress::getInterfaceBroadcastAddress (address);
|
||||
auto data = message.toString (XmlElement::TextFormat().singleLine().withoutHeader());
|
||||
|
||||
socket.write (broadcastAddress.toString(), broadcastPort, data.toRawUTF8(), (int) data.getNumBytesAsUTF8());
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
NetworkServiceDiscovery::AvailableServiceList::AvailableServiceList (const String& serviceType, int broadcastPort)
|
||||
: Thread ("Discovery_listen"), serviceTypeUID (serviceType)
|
||||
{
|
||||
#if JUCE_ANDROID
|
||||
acquireMulticastLock();
|
||||
#endif
|
||||
|
||||
socket.bindToPort (broadcastPort);
|
||||
startThread (2);
|
||||
}
|
||||
|
||||
NetworkServiceDiscovery::AvailableServiceList::~AvailableServiceList()
|
||||
{
|
||||
socket.shutdown();
|
||||
stopThread (2000);
|
||||
|
||||
#if JUCE_ANDROID
|
||||
releaseMulticastLock();
|
||||
#endif
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::run()
|
||||
{
|
||||
while (! threadShouldExit())
|
||||
{
|
||||
if (socket.waitUntilReady (true, 200) == 1)
|
||||
{
|
||||
char buffer[1024];
|
||||
auto bytesRead = socket.read (buffer, sizeof (buffer) - 1, false);
|
||||
|
||||
if (bytesRead > 10)
|
||||
if (auto xml = parseXML (String (CharPointer_UTF8 (buffer),
|
||||
CharPointer_UTF8 (buffer + bytesRead))))
|
||||
if (xml->hasTagName (serviceTypeUID))
|
||||
handleMessage (*xml);
|
||||
}
|
||||
|
||||
removeTimedOutServices();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<NetworkServiceDiscovery::Service> NetworkServiceDiscovery::AvailableServiceList::getServices() const
|
||||
{
|
||||
const ScopedLock sl (listLock);
|
||||
auto listCopy = services;
|
||||
return listCopy;
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::handleAsyncUpdate()
|
||||
{
|
||||
if (onChange != nullptr)
|
||||
onChange();
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const XmlElement& xml)
|
||||
{
|
||||
Service service;
|
||||
service.instanceID = xml.getStringAttribute ("id");
|
||||
|
||||
if (service.instanceID.trim().isNotEmpty())
|
||||
{
|
||||
service.description = xml.getStringAttribute ("name");
|
||||
service.address = IPAddress (xml.getStringAttribute ("address"));
|
||||
service.port = xml.getIntAttribute ("port");
|
||||
service.lastSeen = Time::getCurrentTime();
|
||||
|
||||
handleMessage (service);
|
||||
}
|
||||
}
|
||||
|
||||
static void sortServiceList (std::vector<NetworkServiceDiscovery::Service>& services)
|
||||
{
|
||||
auto compareServices = [] (const NetworkServiceDiscovery::Service& s1,
|
||||
const NetworkServiceDiscovery::Service& s2)
|
||||
{
|
||||
return s1.instanceID < s2.instanceID;
|
||||
};
|
||||
|
||||
std::sort (services.begin(), services.end(), compareServices);
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const Service& service)
|
||||
{
|
||||
const ScopedLock sl (listLock);
|
||||
|
||||
for (auto& s : services)
|
||||
{
|
||||
if (s.instanceID == service.instanceID)
|
||||
{
|
||||
if (s.description != service.description
|
||||
|| s.address != service.address
|
||||
|| s.port != service.port)
|
||||
{
|
||||
s = service;
|
||||
triggerAsyncUpdate();
|
||||
}
|
||||
|
||||
s.lastSeen = service.lastSeen;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
services.push_back (service);
|
||||
sortServiceList (services);
|
||||
triggerAsyncUpdate();
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::removeTimedOutServices()
|
||||
{
|
||||
const double timeoutSeconds = 5.0;
|
||||
auto oldestAllowedTime = Time::getCurrentTime() - RelativeTime::seconds (timeoutSeconds);
|
||||
|
||||
const ScopedLock sl (listLock);
|
||||
|
||||
auto oldEnd = std::end (services);
|
||||
auto newEnd = std::remove_if (std::begin (services), oldEnd,
|
||||
[=] (const Service& s) { return s.lastSeen < oldestAllowedTime; });
|
||||
|
||||
if (newEnd != oldEnd)
|
||||
{
|
||||
services.erase (newEnd, oldEnd);
|
||||
triggerAsyncUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace juce
|
138
deps/juce/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h
vendored
Normal file
138
deps/juce/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h
vendored
Normal file
@ -0,0 +1,138 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Contains classes that implement a simple protocol for broadcasting the availability
|
||||
and location of a discoverable service on the local network, and for maintaining a
|
||||
list of known services.
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
struct NetworkServiceDiscovery
|
||||
{
|
||||
/** An object which runs a thread to repeatedly broadcast the existence of a
|
||||
discoverable service.
|
||||
|
||||
To use, simply create an instance of an Advertiser and it'll broadcast until
|
||||
you delete it.
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
struct Advertiser : private Thread
|
||||
{
|
||||
/** Creates and starts an Advertiser thread, broadcasting with the given properties.
|
||||
@param serviceTypeUID A user-supplied string to define the type of service this represents
|
||||
@param serviceDescription A description string that will appear in the Service::description field for clients
|
||||
@param broadcastPort The port number on which to broadcast the service discovery packets
|
||||
@param connectionPort The port number that will be sent to appear in the Service::port field
|
||||
@param minTimeBetweenBroadcasts The interval to wait between sending broadcast messages
|
||||
*/
|
||||
Advertiser (const String& serviceTypeUID,
|
||||
const String& serviceDescription,
|
||||
int broadcastPort,
|
||||
int connectionPort,
|
||||
RelativeTime minTimeBetweenBroadcasts = RelativeTime::seconds (1.5));
|
||||
|
||||
/** Destructor */
|
||||
~Advertiser() override;
|
||||
|
||||
private:
|
||||
XmlElement message;
|
||||
const int broadcastPort;
|
||||
const RelativeTime minInterval;
|
||||
DatagramSocket socket { true };
|
||||
|
||||
void run() override;
|
||||
void sendBroadcast();
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Contains information about a service that has been found on the network.
|
||||
|
||||
@see AvailableServiceList, Advertiser
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
struct Service
|
||||
{
|
||||
String instanceID; /**< A UUID that identifies the particular instance of the Advertiser class. */
|
||||
String description; /**< The service description as sent by the Advertiser */
|
||||
IPAddress address; /**< The IP address of the advertiser */
|
||||
int port; /**< The port number of the advertiser */
|
||||
Time lastSeen; /**< The time of the last ping received from the advertiser */
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Watches the network for broadcasts from Advertiser objects, and keeps a list of
|
||||
all the currently active instances.
|
||||
|
||||
Just create an instance of AvailableServiceList and it will start listening - you
|
||||
can register a callback with its onChange member to find out when services
|
||||
appear/disappear, and you can call getServices() to find out the current list.
|
||||
|
||||
@see Service, Advertiser
|
||||
|
||||
@tags{Events}
|
||||
*/
|
||||
struct AvailableServiceList : private Thread,
|
||||
private AsyncUpdater
|
||||
{
|
||||
/** Creates an AvailableServiceList that will bind to the given port number and watch
|
||||
the network for Advertisers broadcasting the given service type.
|
||||
|
||||
This will only detect broadcasts from an Advertiser object with a matching
|
||||
serviceTypeUID value, and where the broadcastPort matches.
|
||||
*/
|
||||
AvailableServiceList (const String& serviceTypeUID, int broadcastPort);
|
||||
|
||||
/** Destructor */
|
||||
~AvailableServiceList() override;
|
||||
|
||||
/** A lambda that can be set to receive a callback when the list changes */
|
||||
std::function<void()> onChange;
|
||||
|
||||
/** Returns a list of the currently known services. */
|
||||
std::vector<Service> getServices() const;
|
||||
|
||||
private:
|
||||
DatagramSocket socket { true };
|
||||
String serviceTypeUID;
|
||||
CriticalSection listLock;
|
||||
std::vector<Service> services;
|
||||
|
||||
void run() override;
|
||||
void handleAsyncUpdate() override;
|
||||
void handleMessage (const XmlElement&);
|
||||
void handleMessage (const Service&);
|
||||
void removeTimedOutServices();
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AvailableServiceList)
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace juce
|
Reference in New Issue
Block a user