1010#include < UI/ControlPanel.h>
1111#include < juce_audio_processors/juce_audio_processors.h>
1212#include < Processors/GenericProcessor/GenericProcessor.h>
13+ #include < stdexcept>
1314
1415enum class TestSourceNodeType
1516{
1617 Fake,
1718 Base
1819};
1920
21+ enum class ProcessorTesterMode
22+ {
23+ GraphOnly,
24+ FullApp
25+ };
26+
2027class TestSourceNodeBuilder
2128{
2229public:
@@ -64,7 +71,8 @@ class TestSourceNodeBuilder
6471class ProcessorTester
6572{
6673public:
67- ProcessorTester (TestSourceNodeBuilder sourceNodeBuilder)
74+ ProcessorTester (TestSourceNodeBuilder sourceNodeBuilder,
75+ ProcessorTesterMode mode = ProcessorTesterMode::GraphOnly)
6876 {
6977 // Singletons...
7078 MessageManager::deleteInstance ();
@@ -79,10 +87,14 @@ class ProcessorTester
7987 customLookAndFeel = std::make_unique<CustomLookAndFeel>();
8088 LookAndFeel::setDefaultLookAndFeel (customLookAndFeel.get ());
8189
82- // All of these sets the global state in AccessClass in their constructors
83- audioComponent = std::make_unique<AudioComponent>();
8490 processorGraph = std::make_unique<ProcessorGraph> (true );
85- controlPanel = std::make_unique<ControlPanel> (processorGraph.get (), audioComponent.get (), true );
91+
92+ if (mode == ProcessorTesterMode::FullApp)
93+ {
94+ // These set global state in AccessClass and require a real audio-capable test environment.
95+ audioComponent = std::make_unique<AudioComponent>();
96+ controlPanel = std::make_unique<ControlPanel> (processorGraph.get (), audioComponent.get (), true );
97+ }
8698
8799 SourceNode* snTemp = sourceNodeBuilder.buildSourceNode ();
88100 sourceNodeId = nextProcessorId++;
@@ -98,12 +110,14 @@ class ProcessorTester
98110 sn->initialize (false );
99111 sn->setDestNode (nullptr );
100112
101- controlPanel->updateRecordEngineList ();
113+ if (controlPanel != nullptr )
114+ controlPanel->updateRecordEngineList ();
102115
103116 // Refresh everything
104117 processorGraph->updateSettings (sn);
105118
106- controlPanel->colourChanged ();
119+ if (controlPanel != nullptr )
120+ controlPanel->colourChanged ();
107121 }
108122
109123 virtual ~ProcessorTester ()
@@ -159,6 +173,9 @@ class ProcessorTester
159173
160174 void startAcquisition (bool startRecording, bool forceRecording = false )
161175 {
176+ if (controlPanel == nullptr )
177+ throw std::logic_error (" ProcessorTester::startAcquisition requires FullApp mode" );
178+
162179 if (startRecording)
163180 {
164181 // Do it this way to ensure the GUI elements (which apparently control logic) are set properly
@@ -196,6 +213,9 @@ class ProcessorTester
196213
197214 void stopAcquisition ()
198215 {
216+ if (controlPanel == nullptr )
217+ throw std::logic_error (" ProcessorTester::stopAcquisition requires FullApp mode" );
218+
199219 controlPanel->stopAcquisition ();
200220 }
201221
@@ -304,7 +324,7 @@ class DataThreadTester : public ProcessorTester
304324{
305325public:
306326 DataThreadTester (TestSourceNodeBuilder sourceNodeBuilder) :
307- ProcessorTester (sourceNodeBuilder)
327+ ProcessorTester (sourceNodeBuilder, ProcessorTesterMode::GraphOnly )
308328 {}
309329
310330 template <
0 commit comments