diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index e55cacd0f0..b76bc1b94b 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -1007,6 +1007,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -1383,6 +1384,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -1420,6 +1423,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
@@ -3099,6 +3103,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -3475,6 +3480,8 @@ set_source_files_properties(
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -3512,6 +3519,7 @@ set_source_files_properties(
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
index b4fc69c05c..c823578a85 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
@@ -1781,6 +1781,9 @@
true
+
+ true
+
true
@@ -3360,6 +3363,7 @@
+
@@ -3564,6 +3568,7 @@
+
@@ -3585,6 +3590,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
index 4e1b834288..b652c98be6 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
@@ -413,6 +413,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2434,6 +2437,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5217,6 +5223,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5829,6 +5838,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5892,6 +5904,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index ab9743eaa0..edc139f6d3 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -1781,6 +1781,9 @@
true
+
+ true
+
true
@@ -3360,6 +3363,7 @@
+
@@ -3564,6 +3568,7 @@
+
@@ -3585,6 +3590,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index d9e7f25579..2ebfa97940 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -413,6 +413,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2434,6 +2437,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5217,6 +5223,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5829,6 +5838,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5892,6 +5904,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index 3c8413e678..df3f9fcf6a 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -1781,6 +1781,9 @@
true
+
+ true
+
true
@@ -3360,6 +3363,7 @@
+
@@ -3564,6 +3568,7 @@
+
@@ -3585,6 +3590,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 8569a5e2d8..aed569e0e8 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -413,6 +413,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2434,6 +2437,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5217,6 +5223,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5829,6 +5838,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5892,6 +5904,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 45e4dcf95c..7a72fb9f61 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -883,6 +883,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -1162,6 +1163,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -1199,6 +1202,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
@@ -2675,6 +2679,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -2954,6 +2959,8 @@ set_source_files_properties(
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -2991,6 +2998,7 @@ set_source_files_properties(
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 8c9ad5f4cf..888360468b 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -1495,6 +1495,9 @@
true
+
+ true
+
true
@@ -2916,6 +2919,7 @@
+
@@ -3067,6 +3071,7 @@
+
@@ -3088,6 +3093,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index c04c73f1e2..7189235092 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -368,6 +368,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2011,6 +2014,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4497,6 +4503,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -4950,6 +4959,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5013,6 +5025,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index b9ca3a2f42..91508a03ab 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -916,6 +916,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -1292,6 +1293,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -1329,6 +1332,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
@@ -2861,6 +2865,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -3237,6 +3242,8 @@ set_source_files_properties(
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -3274,6 +3281,7 @@ set_source_files_properties(
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
index df76c0ac6b..69df81242f 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
@@ -1629,6 +1629,9 @@
true
+
+ true
+
true
@@ -3096,6 +3099,7 @@
+
@@ -3300,6 +3304,7 @@
+
@@ -3321,6 +3326,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
index 62e0f0e73c..8ed1c7a7ad 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2218,6 +2221,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4773,6 +4779,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5385,6 +5394,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5448,6 +5460,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index 83cbffa7ee..9f06930a86 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -1629,6 +1629,9 @@
true
+
+ true
+
true
@@ -3096,6 +3099,7 @@
+
@@ -3300,6 +3304,7 @@
+
@@ -3321,6 +3326,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 89152c40d4..85b5efc647 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2218,6 +2221,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4773,6 +4779,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5385,6 +5394,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5448,6 +5460,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 7a0679c4c4..122f7efc99 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -1629,6 +1629,9 @@
true
+
+ true
+
true
@@ -3096,6 +3099,7 @@
+
@@ -3300,6 +3304,7 @@
+
@@ -3321,6 +3326,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 1f7dc41254..ef1344ea23 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2218,6 +2221,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4773,6 +4779,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5385,6 +5394,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5448,6 +5460,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
index b56adc8f62..979fd5abe8 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
+++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
@@ -523,6 +523,7 @@
+
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
index 112fb4f767..b3b7616180 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
+++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
@@ -11,6 +11,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -531,6 +534,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index 75ae1200e3..d75c548634 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -887,6 +887,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -1181,6 +1182,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -1218,6 +1221,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
@@ -2759,6 +2763,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_SparseSet.h"
"../../../../../modules/juce_core/containers/juce_Variant.cpp"
"../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/detail/juce_CallbackListenerList.h"
"../../../../../modules/juce_core/files/juce_AndroidDocument.h"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp"
"../../../../../modules/juce_core/files/juce_common_MimeTypes.h"
@@ -3053,6 +3058,8 @@ set_source_files_properties(
"../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.cpp"
"../../../../../modules/juce_events/broadcasters/juce_LockingAsyncUpdater.h"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ChildProcessManager.h"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
"../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
@@ -3090,6 +3097,7 @@ set_source_files_properties(
"../../../../../modules/juce_events/native/juce_WinRTWrapper_windows.h"
"../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
"../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_TimedCallback.h"
"../../../../../modules/juce_events/timers/juce_Timer.cpp"
"../../../../../modules/juce_events/timers/juce_Timer.h"
"../../../../../modules/juce_events/juce_events.cpp"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index df7198a8d7..f620329254 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -1516,6 +1516,9 @@
true
+
+ true
+
true
@@ -3007,6 +3010,7 @@
+
@@ -3165,6 +3169,7 @@
+
@@ -3186,6 +3191,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index dbda31369a..100c39898a 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -368,6 +368,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2065,6 +2068,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4638,6 +4644,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5112,6 +5121,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5175,6 +5187,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
index b8a1c92e03..c720c388fe 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
@@ -698,6 +698,9 @@
true
+
+ true
+
true
@@ -1824,6 +1827,7 @@
+
@@ -1982,6 +1986,7 @@
+
@@ -2003,6 +2008,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
index 1f863a4e4d..b2fad07589 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
@@ -92,6 +92,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -1009,6 +1012,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -2616,6 +2622,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -3090,6 +3099,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -3153,6 +3165,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index c1ce605223..4fd4266322 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -698,6 +698,9 @@
true
+
+ true
+
true
@@ -1824,6 +1827,7 @@
+
@@ -1982,6 +1986,7 @@
+
@@ -2003,6 +2008,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index a85fab358a..77c915347c 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -92,6 +92,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -1009,6 +1012,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -2616,6 +2622,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -3090,6 +3099,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -3153,6 +3165,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
index e9946af14d..0b683eb37c 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
@@ -698,6 +698,9 @@
true
+
+ true
+
true
@@ -1824,6 +1827,7 @@
+
@@ -1982,6 +1986,7 @@
+
@@ -2003,6 +2008,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index 80a7ccab90..ec5e376047 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -92,6 +92,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -1009,6 +1012,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -2616,6 +2622,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -3090,6 +3099,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -3153,6 +3165,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
index 2fce56cebf..7864e32b19 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
@@ -1637,6 +1637,9 @@
true
+
+ true
+
true
@@ -3189,6 +3192,7 @@
+
@@ -3393,6 +3397,7 @@
+
@@ -3414,6 +3419,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
index d1ef796ce5..dbd4de241f 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2239,6 +2242,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4884,6 +4890,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5496,6 +5505,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5559,6 +5571,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index 9ccce5d41d..230ed2043e 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -1637,6 +1637,9 @@
true
+
+ true
+
true
@@ -3189,6 +3192,7 @@
+
@@ -3393,6 +3397,7 @@
+
@@ -3414,6 +3419,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 2943d2826e..8c47c01018 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2239,6 +2242,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4884,6 +4890,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5496,6 +5505,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5559,6 +5571,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index a1b0f08e88..9d8cc1fd32 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -1637,6 +1637,9 @@
true
+
+ true
+
true
@@ -3189,6 +3192,7 @@
+
@@ -3393,6 +3397,7 @@
+
@@ -3414,6 +3419,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index 3bc08b8856..1b933c237b 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -377,6 +377,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2239,6 +2242,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4884,6 +4890,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5496,6 +5505,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5559,6 +5571,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
index 08f3d609c6..3f0dafa8c3 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
@@ -1515,6 +1515,9 @@
true
+
+ true
+
true
@@ -2983,6 +2986,7 @@
+
@@ -3141,6 +3145,7 @@
+
@@ -3162,6 +3167,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
index f08337d711..0a7fc35d2f 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
@@ -362,6 +362,9 @@
{42F7BE9D-3C8A-AE26-289B-8F355C068036}
+
+ {4C5ED3D6-28D2-8BFF-F891-96201A9DE159}
+
{7868764A-6572-381A-906C-9C26792A4C29}
@@ -2062,6 +2065,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -4605,6 +4611,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\detail
+
JUCE Modules\juce_core\files
@@ -5079,6 +5088,9 @@
JUCE Modules\juce_events\broadcasters
+
+ JUCE Modules\juce_events\interprocess
+
JUCE Modules\juce_events\interprocess
@@ -5142,6 +5154,9 @@
JUCE Modules\juce_events\timers
+
+ JUCE Modules\juce_events\timers
+
JUCE Modules\juce_events\timers
diff --git a/modules/juce_core/detail/juce_CallbackListenerList.h b/modules/juce_core/detail/juce_CallbackListenerList.h
new file mode 100644
index 0000000000..cac43a1247
--- /dev/null
+++ b/modules/juce_core/detail/juce_CallbackListenerList.h
@@ -0,0 +1,69 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License
+ Agreement and JUCE Privacy Policy.
+
+ End User License Agreement: www.juce.com/juce-7-licence
+ Privacy Policy: www.juce.com/juce-privacy-policy
+
+ Or: You may also use this code under the terms of the GPL v3 (see
+ www.gnu.org/licenses).
+
+ 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::detail
+{
+
+template
+constexpr bool isValueOrLvalueReferenceToConst()
+{
+ return (( (! std::is_reference_v)
+ || (std::is_lvalue_reference_v && std::is_const_v>)) && ...);
+}
+
+template
+class CallbackListenerList
+{
+public:
+ static_assert (isValueOrLvalueReferenceToConst(),
+ "CallbackListenerList can only forward values or const lvalue references");
+
+ using Callback = std::function;
+
+ ErasedScopeGuard addListener (Callback callback)
+ {
+ jassert (callback != nullptr);
+
+ const auto it = callbacks.insert (callbacks.end(), std::move (callback));
+ listeners.add (&*it);
+
+ return ErasedScopeGuard { [this, it]
+ {
+ listeners.remove (&*it);
+ callbacks.erase (it);
+ } };
+ }
+
+ void call (Args... args)
+ {
+ listeners.call ([&] (auto& l) { l (std::forward (args)...); });
+ }
+
+private:
+ std::list callbacks;
+ ListenerList listeners;
+};
+
+} // namespace juce::detail
diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h
index 4ed2698dac..c99262e19f 100644
--- a/modules/juce_core/juce_core.h
+++ b/modules/juce_core/juce_core.h
@@ -354,6 +354,8 @@ JUCE_END_IGNORE_WARNINGS_MSVC
#include "files/juce_AndroidDocument.h"
#include "streams/juce_AndroidDocumentInputSource.h"
+#include "detail/juce_CallbackListenerList.h"
+
#if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS)
#include "native/juce_CFHelpers_mac.h"
#include "native/juce_ObjCHelpers_mac.h"
diff --git a/modules/juce_events/interprocess/juce_ChildProcessManager.cpp b/modules/juce_events/interprocess/juce_ChildProcessManager.cpp
new file mode 100644
index 0000000000..24a600c9b1
--- /dev/null
+++ b/modules/juce_events/interprocess/juce_ChildProcessManager.cpp
@@ -0,0 +1,52 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License
+ Agreement and JUCE Privacy Policy.
+
+ End User License Agreement: www.juce.com/juce-7-licence
+ Privacy Policy: www.juce.com/juce-privacy-policy
+
+ Or: You may also use this code under the terms of the GPL v3 (see
+ www.gnu.org/licenses).
+
+ 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
+{
+
+void ChildProcessManager::checkProcesses()
+{
+ for (auto it = processes.begin(); it != processes.end();)
+ {
+ auto processPtr = *it;
+
+ if (! processPtr->isRunning())
+ {
+ listeners.call (processPtr.get());
+ it = processes.erase (it);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+
+ if (processes.empty())
+ timer.stopTimer();
+}
+
+JUCE_IMPLEMENT_SINGLETON (ChildProcessManager)
+
+} // namespace juce
diff --git a/modules/juce_events/interprocess/juce_ChildProcessManager.h b/modules/juce_events/interprocess/juce_ChildProcessManager.h
new file mode 100644
index 0000000000..a154b0b565
--- /dev/null
+++ b/modules/juce_events/interprocess/juce_ChildProcessManager.h
@@ -0,0 +1,104 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License
+ Agreement and JUCE Privacy Policy.
+
+ End User License Agreement: www.juce.com/juce-7-licence
+ Privacy Policy: www.juce.com/juce-privacy-policy
+
+ Or: You may also use this code under the terms of the GPL v3 (see
+ www.gnu.org/licenses).
+
+ 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
+{
+ /** Manages a set of ChildProcesses and periodically checks their return value. Upon completion
+ it calls listeners added with addChildProcessExitedListener().
+
+ This class is mostly aimed for usage on Linux, where terminated child processes are only
+ cleaned up if their return code is read after termination. In order to ensure this one needs
+ to call ChildProcess::isFinished() until it returns false or
+ ChildProcess::waitForProcessToFinish() until it returns true.
+
+ This class will keep querying the return code on a Timer thread until the process
+ terminates. This can be handy if one wants to start and stop multiple ChildProcesses on
+ Linux that could take a long time to complete.
+
+ Since this class uses a Timer to check subprocess status, it's generally only safe to
+ access the returned ChildProcesses from the message thread.
+
+ @see ChildProcessManagerSingleton
+
+ @tags{Events}
+ */
+ class JUCE_API ChildProcessManager final : private DeletedAtShutdown
+ {
+ public:
+ #ifndef DOXYGEN
+ JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL (ChildProcessManager)
+ #endif
+
+ /** Creates a new ChildProcess and starts it with the provided arguments.
+
+ The arguments are the same as the overloads to ChildProcess::start().
+
+ The manager will keep the returned ChildProcess object alive until it terminates and its
+ return value has been queried. Calling ChildProcess::kill() on the returned object will
+ eventually cause its removal from the ChildProcessManager after it terminates.
+ */
+ template
+ std::shared_ptr createAndStartManagedChildProcess (Args&&... args)
+ {
+ auto p = std::make_shared();
+
+ if (! p->start (std::forward (args)...))
+ return nullptr;
+
+ processes.insert (p);
+ timer.startTimer (1000);
+
+ return p;
+ }
+
+ /** Registers a callback function that is called for every ChildProcess that terminated.
+
+ This registration is deleted when the returned ErasedScopedGuard is deleted.
+ */
+ auto addChildProcessExitedListener (std::function listener)
+ {
+ return listeners.addListener (std::move (listener));
+ }
+
+ /** Returns true if the ChildProcessManager contains any running ChildProcesses that it's
+ monitoring.
+ */
+ auto hasRunningProcess() const
+ {
+ return timer.isTimerRunning();
+ }
+
+ private:
+ ChildProcessManager() = default;
+ ~ChildProcessManager() override { clearSingletonInstance(); }
+
+ void checkProcesses();
+
+ std::set> processes;
+ detail::CallbackListenerList listeners;
+ TimedCallback timer { [this] { checkProcesses(); } };
+ };
+
+} // namespace juce
diff --git a/modules/juce_events/juce_events.cpp b/modules/juce_events/juce_events.cpp
index 67d555a942..3524bfaeb5 100644
--- a/modules/juce_events/juce_events.cpp
+++ b/modules/juce_events/juce_events.cpp
@@ -64,6 +64,7 @@
#include "broadcasters/juce_ChangeBroadcaster.cpp"
#include "timers/juce_MultiTimer.cpp"
#include "timers/juce_Timer.cpp"
+#include "interprocess/juce_ChildProcessManager.cpp"
#include "interprocess/juce_InterprocessConnection.cpp"
#include "interprocess/juce_InterprocessConnectionServer.cpp"
#include "interprocess/juce_ConnectedChildProcess.cpp"
diff --git a/modules/juce_events/juce_events.h b/modules/juce_events/juce_events.h
index a9f0f22663..590506423f 100644
--- a/modules/juce_events/juce_events.h
+++ b/modules/juce_events/juce_events.h
@@ -86,7 +86,9 @@
#include "broadcasters/juce_ChangeListener.h"
#include "broadcasters/juce_ChangeBroadcaster.h"
#include "timers/juce_Timer.h"
+#include "timers/juce_TimedCallback.h"
#include "timers/juce_MultiTimer.h"
+#include "interprocess/juce_ChildProcessManager.h"
#include "interprocess/juce_InterprocessConnection.h"
#include "interprocess/juce_InterprocessConnectionServer.h"
#include "interprocess/juce_ConnectedChildProcess.h"
diff --git a/modules/juce_events/timers/juce_TimedCallback.h b/modules/juce_events/timers/juce_TimedCallback.h
new file mode 100644
index 0000000000..ba1f5507a8
--- /dev/null
+++ b/modules/juce_events/timers/juce_TimedCallback.h
@@ -0,0 +1,63 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ By using JUCE, you agree to the terms of both the JUCE 7 End-User License
+ Agreement and JUCE Privacy Policy.
+
+ End User License Agreement: www.juce.com/juce-7-licence
+ Privacy Policy: www.juce.com/juce-privacy-policy
+
+ Or: You may also use this code under the terms of the GPL v3 (see
+ www.gnu.org/licenses).
+
+ 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
+{
+
+/** Utility class wrapping a single non-null callback called by a Timer.
+
+ You can use the usual Timer functions to start and stop the TimedCallback. Deleting the
+ TimedCallback will automatically stop the underlying Timer.
+
+ With this class you can use the Timer facility without inheritance.
+
+ @see Timer
+ @tags{Events}
+*/
+class TimedCallback final : private Timer
+{
+public:
+ /** Constructor. The passed in callback must be non-null. */
+ explicit TimedCallback (std::function callbackIn)
+ : callback (std::move (callbackIn))
+ {
+ jassert (callback);
+ }
+
+ /** Destructor. */
+ ~TimedCallback() noexcept override { stopTimer(); }
+
+ using Timer::startTimer;
+ using Timer::startTimerHz;
+ using Timer::stopTimer;
+ using Timer::isTimerRunning;
+
+private:
+ void timerCallback() override { callback(); }
+
+ std::function callback;
+};
+
+} // namespace juce