test
is a temporary class, ExampleApp
is written using Pascal Case, and the variable uses Camel Case.
Here are the linker errors
2>none2.lib(PluginProcessor.obj) : error LNK2019: unresolved external symbol "public: __cdecl none2::processor::AudioData::AudioData(class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > >)" (??0AudioData@processor@none2@@QEAA@V?$vector@V?$vector@NV?$allocator@N@std@@@std@@V?$allocator@V?$vector@NV?$allocator@N@std@@@std@@@2@@std@@@Z) referenced in function "public: virtual class none2::processor::ProcessorResult __cdecl ExampleApp::processor(class none2::processor::AudioData,int,int)" (?processor@ExampleApp@@UEAA?AVProcessorResult@0none2@@VAudioData@03@HH@Z)
2>none2.lib(PluginProcessor.obj) : error LNK2019: unresolved external symbol "public: class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > > __cdecl none2::processor::AudioData::getData(void)const " (?getData@AudioData@processor@none2@@QEBA?AV?$vector@V?$vector@NV?$allocator@N@std@@@std@@V?$allocator@V?$vector@NV?$allocator@N@std@@@std@@@2@@std@@XZ) referenced in function "public: __cdecl none2::modulator::ModulatorResult::operator class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > >(void)const " (??BModulatorResult@modulator@none2@@QEBA?AV?$vector@V?$vector@NV?$allocator@N@std@@@std@@V?$allocator@V?$vector@NV?$allocator@N@std@@@std@@@2@@std@@XZ)
2>none2.lib(PluginProcessor.obj) : error LNK2019: unresolved external symbol "public: class std::shared_ptr<class juce::Slider> __cdecl none2::gui::GUI::Slider::getSlider(void)" (?getSlider@Slider@GUI@gui@none2@@QEAA?AV?$shared_ptr@VSlider@juce@@@std@@XZ) referenced in function "public: virtual class std::shared_ptr<class none2::gui::GUIResult> __cdecl ExampleApp::gui(void)" (?gui@ExampleApp@@UEAA?AV?$shared_ptr@VGUIResult@gui@none2@@@std@@XZ)
2>none2.lib(PluginProcessor.obj) : error LNK2019: unresolved external symbol "public: class none2::processor::AudioData __cdecl none2::modulator::Modulator::runModulator(int,class none2::processor::AudioData &)" (?runModulator@Modulator@modulator@none2@@QEAA?AVAudioData@processor@3@HAEAV453@@Z) referenced in function "public: virtual class none2::modulator::ModulatorResult __cdecl ExampleApp::runModulator(class none2::processor::AudioData,int,int)" (?runModulator@ExampleApp@@UEAA?AVModulatorResult@modulator@none2@@VAudioData@processor@4@HH@Z)
2>none2.lib(PluginProcessor.obj) : error LNK2001: unresolved external symbol "public: virtual class none2::processor::AudioData __cdecl none2::None2App::runProcessor(float * *,float * *,int,int,int)" (?runProcessor@None2App@none2@@UEAA?AVAudioData@processor@2@PEAPEAM0HHH@Z)
2>none2.lib(PluginProcessor.obj) : error LNK2001: unresolved external symbol "public: virtual class std::shared_ptr<class none2::gui::GUIResult> __cdecl none2::None2App::getGUI(void)" (?getGUI@None2App@none2@@UEAA?AV?$shared_ptr@VGUIResult@gui@none2@@@std@@XZ)
Here is ExampleApp.h
, a header-only document.
#pragma once
#include <vector>
#include <string>
#include <functional>
#include <cassert>
#include <JuceHeader.h>
#include "Framework/FrameworkHeader.h"
using namespace std;
using namespace juce;
using namespace none2;
class ExampleApp : public None2App
{
// Audio plugin is made of three major components
// 1) Processor
// 2) Modulators
// 3) GUI
modulator::Modulator modulator;
long long int runningSampleNum = 0;
public:
ExampleApp() : None2App() {};
processor::ProcessorResult processor (
processor::AudioData input,
int numChannels = 2,
int sampleNum = 0) override {
int sampleNumNow = sampleNum;
// Produce Sine Wave
for (auto& samples : input.getData()) {
for (int channel = 0; channel < numChannels; ++channel) {
samples[channel] = sin(sampleNumNow);
}
++sampleNumNow;
}
// Run modulator
input = static_cast<processor::AudioData>(runModulator(processor::AudioData(input), sampleNum, 1));
runningSampleNum = sampleNumNow;
return processor::ProcessorResult(input);
}
modulator::ModulatorResult runModulator(processor::AudioData input, int sampleNum, int modIdx) override {
sampleNum; // To clear unreferenced warning
// Run modulator on input
input = modulator.runModulator(modIdx, input);
return modulator::ModulatorResult(input);
}
shared_ptr<gui::GUIResult> gui() override {
// Make GUI with slider
shared_ptr<gui::GUI::Slider> slider;
shared_ptr<gui::GUIResult> result;
result->addComponent(slider->getSlider());
return result;
}
};
Here is the virtual, inherited, class, NoneApp.h
,
#pragma once
#include "AudioData.h"
#include "Modulator.h"
#include "GUI.h"
#include "Processor.h"
namespace none2 {
class None2App {
public:
virtual processor::ProcessorResult processor(processor::AudioData input, int numChannels, int sampleNum) = 0;
virtual modulator::ModulatorResult runModulator(processor::AudioData input, int sampleNum, int modIdx) = 0;
virtual shared_ptr<gui::GUIResult> gui() = 0;
None2App() {};
virtual processor::AudioData runProcessor(
float** writePointer,
float** readPointer,
int bufferSize,
int numChannels = 2,
int sampleNum = 0);
virtual shared_ptr <gui::GUIResult> getGUI();
operator juce::Component* ();
};
}
Here is its source file, NoneApp.cpp
:
#include "None2App.h"
using namespace none2;
inline processor::AudioData None2App::runProcessor(float** writePointer, float** readPointer, int bufferSize, int numChannels, int sampleNum) {
writePointer; // To clear unreferenced warning
return processor(processor::AudioData(readPointer, bufferSize, numChannels), numChannels, sampleNum);
}
inline shared_ptr<gui::GUIResult> None2App::getGUI() {
return gui();
}
inline None2App::operator juce::Component* () {
juce::Component* result = gui().get();
return result;
}
The real thing is, is I have not a clue why it would work in test.h
and not work in JUCE’s PluginProcessor
class.