diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 53405c352d..3ed4365d7d 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -812,6 +812,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@@ -3474,6 +3475,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index ca973b4fb1..952fefe56a 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -1029,6 +1029,9 @@
true
+
+ true
+
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index a36e352160..b31b55b228 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -1732,6 +1732,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index 0537755935..41c71aee0f 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -1029,6 +1029,9 @@
true
+
+ true
+
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 47e2dbfa05..199a536b52 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -1732,6 +1732,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index e7a3dabda5..9f25515615 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -767,6 +767,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@@ -3043,6 +3044,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 16c03c9fb1..02e9187d3e 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -987,6 +987,9 @@
true
+
+ true
+
true
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index 9c5168a180..20f2802f08 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -1513,6 +1513,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index c166794e68..ee5c610d23 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -800,6 +800,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@@ -3229,6 +3230,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index a7be3d1522..a16b9084e1 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -995,6 +995,9 @@
true
+
+ true
+
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 12a2459b27..ad264c4143 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -1588,6 +1588,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 37a8c9fe26..f118e5e5ae 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -995,6 +995,9 @@
true
+
+ true
+
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 2683798e1b..d47bbe62ef 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -1588,6 +1588,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index 9ae92f19d5..97e3496b4a 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -771,6 +771,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@@ -3127,6 +3128,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
+ "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index fc0e97f1c0..7c7d21ec99 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -987,6 +987,9 @@
true
+
+ true
+
true
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index f0e9149811..6c0fbc226e 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -1543,6 +1543,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index a12918abd7..4258f0bac0 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -1003,6 +1003,9 @@
true
+
+ true
+
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index f0fc8fb7f6..168542acff 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1636,6 +1636,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index 3124bc734f..8baa176922 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -1003,6 +1003,9 @@
true
+
+ true
+
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index bbca4ac57b..4c8fc70387 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1636,6 +1636,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
index 16a1068990..5ec98a412f 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -986,6 +986,9 @@
true
+
+ true
+
true
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 89db1c617d..7029ea85c7 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -1540,6 +1540,9 @@
JUCE Modules\juce_audio_processors\processors
+
+ JUCE Modules\juce_audio_processors\processors
+
JUCE Modules\juce_audio_processors\processors
diff --git a/modules/juce_audio_processors/juce_audio_processors.cpp b/modules/juce_audio_processors/juce_audio_processors.cpp
index 0a9eaedfef..a8ff26282b 100644
--- a/modules/juce_audio_processors/juce_audio_processors.cpp
+++ b/modules/juce_audio_processors/juce_audio_processors.cpp
@@ -184,6 +184,7 @@ private:
#include "format/juce_AudioPluginFormat.cpp"
#include "format/juce_AudioPluginFormatManager.cpp"
#include "format_types/juce_LegacyAudioParameter.cpp"
+#include "processors/juce_AudioProcessorParameter.cpp"
#include "processors/juce_AudioProcessor.cpp"
#include "processors/juce_AudioPluginInstance.cpp"
#include "processors/juce_AudioProcessorEditor.cpp"
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
index 37eb89016a..48b8d5904d 100644
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
@@ -1429,139 +1429,4 @@ JUCE_END_IGNORE_DEPRECATION_WARNINGS
void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}
void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {}
-//==============================================================================
-AudioProcessorParameter::~AudioProcessorParameter()
-{
- #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
- // This will fail if you've called beginChangeGesture() without having made
- // a corresponding call to endChangeGesture...
- jassert (! isPerformingGesture);
- #endif
-}
-
-void AudioProcessorParameter::setValueNotifyingHost (float newValue)
-{
- setValue (newValue);
- sendValueChangedMessageToListeners (newValue);
-}
-
-void AudioProcessorParameter::beginChangeGesture()
-{
- // This method can't be used until the parameter has been attached to a processor!
- jassert (processor != nullptr && parameterIndex >= 0);
-
- #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
- // This means you've called beginChangeGesture twice in succession without
- // a matching call to endChangeGesture. That might be fine in most hosts,
- // but it would be better to avoid doing it.
- jassert (! isPerformingGesture);
- isPerformingGesture = true;
- #endif
-
- ScopedLock lock (listenerLock);
-
- for (int i = listeners.size(); --i >= 0;)
- if (auto* l = listeners[i])
- l->parameterGestureChanged (getParameterIndex(), true);
-
- if (processor != nullptr && parameterIndex >= 0)
- {
- // audioProcessorParameterChangeGestureBegin callbacks will shortly be deprecated and
- // this code will be removed.
- for (int i = processor->listeners.size(); --i >= 0;)
- if (auto* l = processor->listeners[i])
- l->audioProcessorParameterChangeGestureBegin (processor, getParameterIndex());
- }
-}
-
-void AudioProcessorParameter::endChangeGesture()
-{
- // This method can't be used until the parameter has been attached to a processor!
- jassert (processor != nullptr && parameterIndex >= 0);
-
- #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
- // This means you've called endChangeGesture without having previously
- // called beginChangeGesture. That might be fine in most hosts, but it
- // would be better to keep the calls matched correctly.
- jassert (isPerformingGesture);
- isPerformingGesture = false;
- #endif
-
- ScopedLock lock (listenerLock);
-
- for (int i = listeners.size(); --i >= 0;)
- if (auto* l = listeners[i])
- l->parameterGestureChanged (getParameterIndex(), false);
-
- if (processor != nullptr && parameterIndex >= 0)
- {
- // audioProcessorParameterChangeGestureEnd callbacks will shortly be deprecated and
- // this code will be removed.
- for (int i = processor->listeners.size(); --i >= 0;)
- if (auto* l = processor->listeners[i])
- l->audioProcessorParameterChangeGestureEnd (processor, getParameterIndex());
- }
-}
-
-void AudioProcessorParameter::sendValueChangedMessageToListeners (float newValue)
-{
- ScopedLock lock (listenerLock);
-
- for (int i = listeners.size(); --i >= 0;)
- if (auto* l = listeners [i])
- l->parameterValueChanged (getParameterIndex(), newValue);
-
- if (processor != nullptr && parameterIndex >= 0)
- {
- // audioProcessorParameterChanged callbacks will shortly be deprecated and
- // this code will be removed.
- for (int i = processor->listeners.size(); --i >= 0;)
- if (auto* l = processor->listeners[i])
- l->audioProcessorParameterChanged (processor, getParameterIndex(), newValue);
- }
-}
-
-bool AudioProcessorParameter::isOrientationInverted() const { return false; }
-bool AudioProcessorParameter::isAutomatable() const { return true; }
-bool AudioProcessorParameter::isMetaParameter() const { return false; }
-AudioProcessorParameter::Category AudioProcessorParameter::getCategory() const { return genericParameter; }
-int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); }
-bool AudioProcessorParameter::isDiscrete() const { return false; }
-bool AudioProcessorParameter::isBoolean() const { return false; }
-
-String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const
-{
- return String (value, 2);
-}
-
-String AudioProcessorParameter::getCurrentValueAsText() const
-{
- return getText (getValue(), 1024);
-}
-
-StringArray AudioProcessorParameter::getAllValueStrings() const
-{
- if (isDiscrete() && valueStrings.isEmpty())
- {
- auto maxIndex = getNumSteps() - 1;
-
- for (int i = 0; i < getNumSteps(); ++i)
- valueStrings.add (getText ((float) i / (float) maxIndex, 1024));
- }
-
- return valueStrings;
-}
-
-void AudioProcessorParameter::addListener (AudioProcessorParameter::Listener* newListener)
-{
- const ScopedLock sl (listenerLock);
- listeners.addIfNotAlreadyThere (newListener);
-}
-
-void AudioProcessorParameter::removeListener (AudioProcessorParameter::Listener* listenerToRemove)
-{
- const ScopedLock sl (listenerLock);
- listeners.removeFirstMatchingValue (listenerToRemove);
-}
-
} // namespace juce
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp
new file mode 100644
index 0000000000..259e9d014e
--- /dev/null
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp
@@ -0,0 +1,172 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE framework.
+ Copyright (c) Raw Material Software Limited
+
+ JUCE is an open source framework subject to commercial or open source
+ licensing.
+
+ By downloading, installing, or using the JUCE framework, or combining the
+ JUCE framework with any other source code, object code, content or any other
+ copyrightable work, you agree to the terms of the JUCE End User Licence
+ Agreement, and all incorporated terms including the JUCE Privacy Policy and
+ the JUCE Website Terms of Service, as applicable, which will bind you. If you
+ do not agree to the terms of these agreements, we will not license the JUCE
+ framework to you, and you must discontinue the installation or download
+ process and cease use of the JUCE framework.
+
+ JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
+ JUCE Privacy Policy: https://juce.com/juce-privacy-policy
+ JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
+
+ Or:
+
+ You may also use this code under the terms of the AGPLv3:
+ https://www.gnu.org/licenses/agpl-3.0.en.html
+
+ THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
+ WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+AudioProcessorParameter::~AudioProcessorParameter()
+{
+ #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
+ // This will fail if you've called beginChangeGesture() without having made
+ // a corresponding call to endChangeGesture...
+ jassert (! isPerformingGesture);
+ #endif
+}
+
+void AudioProcessorParameter::setValueNotifyingHost (float newValue)
+{
+ setValue (newValue);
+ sendValueChangedMessageToListeners (newValue);
+}
+
+void AudioProcessorParameter::beginChangeGesture()
+{
+ // This method can't be used until the parameter has been attached to a processor!
+ jassert (processor != nullptr && parameterIndex >= 0);
+
+ #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
+ // This means you've called beginChangeGesture twice in succession without
+ // a matching call to endChangeGesture. That might be fine in most hosts,
+ // but it would be better to avoid doing it.
+ jassert (! isPerformingGesture);
+ isPerformingGesture = true;
+ #endif
+
+ ScopedLock lock (listenerLock);
+
+ for (int i = listeners.size(); --i >= 0;)
+ if (auto* l = listeners[i])
+ l->parameterGestureChanged (getParameterIndex(), true);
+
+ if (processor != nullptr && parameterIndex >= 0)
+ {
+ // audioProcessorParameterChangeGestureBegin callbacks will shortly be deprecated and
+ // this code will be removed.
+ for (int i = processor->listeners.size(); --i >= 0;)
+ if (auto* l = processor->listeners[i])
+ l->audioProcessorParameterChangeGestureBegin (processor, getParameterIndex());
+ }
+}
+
+void AudioProcessorParameter::endChangeGesture()
+{
+ // This method can't be used until the parameter has been attached to a processor!
+ jassert (processor != nullptr && parameterIndex >= 0);
+
+ #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
+ // This means you've called endChangeGesture without having previously
+ // called beginChangeGesture. That might be fine in most hosts, but it
+ // would be better to keep the calls matched correctly.
+ jassert (isPerformingGesture);
+ isPerformingGesture = false;
+ #endif
+
+ ScopedLock lock (listenerLock);
+
+ for (int i = listeners.size(); --i >= 0;)
+ if (auto* l = listeners[i])
+ l->parameterGestureChanged (getParameterIndex(), false);
+
+ if (processor != nullptr && parameterIndex >= 0)
+ {
+ // audioProcessorParameterChangeGestureEnd callbacks will shortly be deprecated and
+ // this code will be removed.
+ for (int i = processor->listeners.size(); --i >= 0;)
+ if (auto* l = processor->listeners[i])
+ l->audioProcessorParameterChangeGestureEnd (processor, getParameterIndex());
+ }
+}
+
+void AudioProcessorParameter::sendValueChangedMessageToListeners (float newValue)
+{
+ ScopedLock lock (listenerLock);
+
+ for (int i = listeners.size(); --i >= 0;)
+ if (auto* l = listeners [i])
+ l->parameterValueChanged (getParameterIndex(), newValue);
+
+ if (processor != nullptr && parameterIndex >= 0)
+ {
+ // audioProcessorParameterChanged callbacks will shortly be deprecated and
+ // this code will be removed.
+ for (int i = processor->listeners.size(); --i >= 0;)
+ if (auto* l = processor->listeners[i])
+ l->audioProcessorParameterChanged (processor, getParameterIndex(), newValue);
+ }
+}
+
+bool AudioProcessorParameter::isOrientationInverted() const { return false; }
+bool AudioProcessorParameter::isAutomatable() const { return true; }
+bool AudioProcessorParameter::isMetaParameter() const { return false; }
+AudioProcessorParameter::Category AudioProcessorParameter::getCategory() const { return genericParameter; }
+int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); }
+bool AudioProcessorParameter::isDiscrete() const { return false; }
+bool AudioProcessorParameter::isBoolean() const { return false; }
+
+String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const
+{
+ return String (value, 2);
+}
+
+String AudioProcessorParameter::getCurrentValueAsText() const
+{
+ return getText (getValue(), 1024);
+}
+
+StringArray AudioProcessorParameter::getAllValueStrings() const
+{
+ if (isDiscrete() && valueStrings.isEmpty())
+ {
+ auto maxIndex = getNumSteps() - 1;
+
+ for (int i = 0; i < getNumSteps(); ++i)
+ valueStrings.add (getText ((float) i / (float) maxIndex, 1024));
+ }
+
+ return valueStrings;
+}
+
+void AudioProcessorParameter::addListener (AudioProcessorParameter::Listener* newListener)
+{
+ const ScopedLock sl (listenerLock);
+ listeners.addIfNotAlreadyThere (newListener);
+}
+
+void AudioProcessorParameter::removeListener (AudioProcessorParameter::Listener* listenerToRemove)
+{
+ const ScopedLock sl (listenerLock);
+ listeners.removeFirstMatchingValue (listenerToRemove);
+}
+
+} // namespace juce